From d41ccf1a04ca9f3cfee4459b068d42644ff55396 Mon Sep 17 00:00:00 2001 From: pedroksl Date: Wed, 21 Aug 2024 02:10:26 -0300 Subject: [PATCH] Spotless plugin install/run Initial work on porting registrations to AE2 standard --- aae.importorder | 9 + build.gradle | 30 + settings.gradle | 3 + .../net/pedroksl/advanced_ae/AAEConfig.java | 13 +- .../net/pedroksl/advanced_ae/AdvancedAE.java | 14 +- .../client/AAEClientRegistryHandler.java | 42 +- .../advanced_ae/client/AAESemantics.java | 25 +- .../common/AAERegistryHandler.java | 289 +-- .../advanced_ae/common/AAESingletons.java | 123 +- .../common/blocks/AAECraftingUnitType.java | 46 + .../blocks/AdvPatternProviderBlock.java | 137 +- .../common/blocks/ReactionChamberBlock.java | 27 +- .../blocks/SmallAdvPatternProviderBlock.java | 129 +- .../common/definitions/AAEBlockEntities.java | 63 + .../common/definitions/AAEBlocks.java | 65 + .../common/definitions/AAEItems.java | 40 + .../entities/AdvCoProcessingUnitEntity.java | 3 + .../entities/AdvPatternProviderEntity.java | 382 ++-- .../entities/ReactionChamberEntity.java | 212 +-- .../SmallAdvPatternProviderEntity.java | 37 +- .../common/helpers/NullableDirection.java | 127 +- .../helpers/NullableDirectionListCodec.java | 97 +- .../inventory/AdvPatternEncoderHost.java | 91 +- .../common/items/AAECraftingBlockItem.java | 14 + .../common/items/AdvPatternEncoderItem.java | 51 +- ...AdvPatternProviderCapacityUpgradeItem.java | 134 +- .../items/AdvPatternProviderUpgradeItem.java | 160 +- .../common/logic/AdvPatternProviderLogic.java | 1619 +++++++++-------- .../logic/AdvPatternProviderLogicHost.java | 154 +- .../logic/AdvPatternProviderTargetCache.java | 108 +- .../common/parts/AdvPatternProviderPart.java | 330 ++-- .../parts/SmallAdvPatternProviderPart.java | 34 +- .../common/patterns/AdvPatternDetails.java | 15 +- .../patterns/AdvPatternDetailsEncoder.java | 23 +- .../common/patterns/AdvProcessingPattern.java | 492 ++--- .../patterns/EncodedAdvProcessingPattern.java | 79 +- .../datagen/AAEBlockStateProvider.java | 2 + .../datagen/AAEBlockTagProvider.java | 23 +- .../advanced_ae/datagen/AAEDataGen.java | 24 +- .../datagen/AAEItemModelProvider.java | 32 +- .../datagen/AAEItemTagProvider.java | 39 +- .../datagen/AAELootTableProvider.java | 33 +- .../datagen/AAERecipeProvider.java | 134 +- .../AdvPatternProviderContainer.java | 15 +- .../AdvPatternProviderGui.java | 75 +- .../AdvPatternProviderLockReason.java | 174 +- .../AdvPatternProviderMenu.java | 156 +- .../SmallAdvPatternProviderContainer.java | 17 +- .../SmallAdvPatternProviderGui.java | 75 +- .../SmallAdvPatternProviderLockReason.java | 174 +- .../AdvPatternEncoderContainer.java | 298 +-- .../patternencoder/AdvPatternEncoderGui.java | 410 +++-- .../patternencoder/DirectionInputButton.java | 131 +- .../advanced_ae/mixins/AAEMixinPlugin.java | 118 +- .../mixins/MixinContainerPatternModifier.java | 341 ++-- .../mixins/MixinEncodedPatternItem.java | 204 ++- .../mixins/MixinPatternEncodingLogic.java | 52 +- .../mixins/MixinPatternEncodingTermMenu.java | 112 +- .../mixins/MixinPatternProviderLogic.java | 53 +- .../appflux/MixinAdvPatternProviderGui.java | 70 +- .../appflux/MixinAdvPatternProviderLogic.java | 171 +- .../MixinAdvPatternProviderLogicHost.java | 25 +- .../appflux/MixinAdvPatternProviderMenu.java | 88 +- .../MixinSmallAdvPatternProviderGui.java | 70 +- .../network/AAENetworkHandler.java | 15 +- ...dvPatternEncoderChangeDirectionPacket.java | 97 +- .../packet/AdvPatternEncoderPacket.java | 100 +- .../AdvPatternEncoderUpdateRequestPacket.java | 52 +- .../xmod/appflux/AFCommonLoad.java | 31 +- .../textures/block/adv_co_processing_unit.png | Bin 0 -> 370 bytes 70 files changed, 4534 insertions(+), 4094 deletions(-) create mode 100644 aae.importorder create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/blocks/AAECraftingUnitType.java create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlockEntities.java create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlocks.java create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEItems.java create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/entities/AdvCoProcessingUnitEntity.java create mode 100644 src/main/java/net/pedroksl/advanced_ae/common/items/AAECraftingBlockItem.java create mode 100644 src/main/resources/assets/advanced_ae/textures/block/adv_co_processing_unit.png diff --git a/aae.importorder b/aae.importorder new file mode 100644 index 00000000..632fe72c --- /dev/null +++ b/aae.importorder @@ -0,0 +1,9 @@ +0=java +2=org +1=com +5=net +3=it +6=cpw +7=appeng +9=me +10=de \ No newline at end of file diff --git a/build.gradle b/build.gradle index 410d19be..edfa2825 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java-library' id 'maven-publish' id 'net.neoforged.moddev' version '1.0.17' + id 'com.diffplug.spotless' } tasks.named('wrapper', Wrapper).configure { @@ -165,3 +166,32 @@ idea { downloadJavadoc = true } } + +spotless { +// kotlinGradle { +// target("*.kts") +// diktat() +// indentWithTabs(1) +// endWithNewline() +// } + + java { + target("/src/**/java/**/*.java") + endWithNewline() + indentWithTabs(1) + removeUnusedImports() + palantirJavaFormat() + importOrderFile(file("aae.importorder")) + toggleOffOn() + + bumpThisNumberIfACustomStepChanges(1) + } + + json { + target("src/**/resources/**/*.json") + targetExclude("src/generated/resources/**") + biome() + indentWithTabs(1) + endWithNewline() + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index fd1434c1..2607a1d2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,6 +4,9 @@ pluginManagement { gradlePluginPortal() maven { url = 'https://maven.neoforged.net/releases' } } + plugins { + id("com.diffplug.spotless") version "6.25.0" + } } plugins { diff --git a/src/main/java/net/pedroksl/advanced_ae/AAEConfig.java b/src/main/java/net/pedroksl/advanced_ae/AAEConfig.java index 7cb98d8a..91161957 100644 --- a/src/main/java/net/pedroksl/advanced_ae/AAEConfig.java +++ b/src/main/java/net/pedroksl/advanced_ae/AAEConfig.java @@ -8,13 +8,12 @@ @EventBusSubscriber(modid = AdvancedAE.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class AAEConfig { - private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); - public static final ModConfigSpec SPEC = BUILDER.build(); + public static final ModConfigSpec SPEC = BUILDER.build(); - @SubscribeEvent - static void onLoad(final ModConfigEvent event) { - if (event.getConfig().getSpec() == SPEC) { - } - } + @SubscribeEvent + static void onLoad(final ModConfigEvent event) { + if (event.getConfig().getSpec() == SPEC) {} + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/AdvancedAE.java b/src/main/java/net/pedroksl/advanced_ae/AdvancedAE.java index 1bc085f5..19e2e169 100644 --- a/src/main/java/net/pedroksl/advanced_ae/AdvancedAE.java +++ b/src/main/java/net/pedroksl/advanced_ae/AdvancedAE.java @@ -1,6 +1,12 @@ package net.pedroksl.advanced_ae; import com.mojang.logging.LogUtils; + +import net.pedroksl.advanced_ae.common.definitions.AAEBlockEntities; +import net.pedroksl.advanced_ae.common.definitions.AAEBlocks; +import net.pedroksl.advanced_ae.common.definitions.AAEItems; +import org.slf4j.Logger; + import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.neoforged.bus.api.IEventBus; @@ -12,10 +18,9 @@ import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.registries.RegisterEvent; import net.pedroksl.advanced_ae.client.AAEClientRegistryHandler; -import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.AAERegistryHandler; +import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.network.AAENetworkHandler; -import org.slf4j.Logger; // The value here should match an entry in the META-INF/neoforge.mods.toml file @Mod(AdvancedAE.MOD_ID) @@ -31,6 +36,11 @@ public AdvancedAE(IEventBus eventBus, ModContainer container) { if (!container.getModId().equals(MOD_ID)) { throw new IllegalArgumentException("Invalid ID: " + MOD_ID); } + + AAEItems.DR.register(eventBus); + AAEBlocks.DR.register(eventBus); + AAEBlockEntities.DR.register(eventBus); + container.registerConfig(ModConfig.Type.COMMON, AAEConfig.SPEC); eventBus.addListener((RegisterEvent e) -> { diff --git a/src/main/java/net/pedroksl/advanced_ae/client/AAEClientRegistryHandler.java b/src/main/java/net/pedroksl/advanced_ae/client/AAEClientRegistryHandler.java index cd21830e..46052351 100644 --- a/src/main/java/net/pedroksl/advanced_ae/client/AAEClientRegistryHandler.java +++ b/src/main/java/net/pedroksl/advanced_ae/client/AAEClientRegistryHandler.java @@ -1,6 +1,5 @@ package net.pedroksl.advanced_ae.client; -import appeng.init.client.InitScreens; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.ModelEvent; import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; @@ -13,26 +12,33 @@ import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderGui; -public class AAEClientRegistryHandler { - public static final AAEClientRegistryHandler INSTANCE = new AAEClientRegistryHandler(); +import appeng.init.client.InitScreens; - @SubscribeEvent - public void registerGui(RegisterMenuScreensEvent event) { - InitScreens.register(event, AdvPatternProviderContainer.TYPE, AdvPatternProviderGui::new, "/screens/adv_pattern_provider.json"); - InitScreens.register(event, SmallAdvPatternProviderContainer.TYPE, SmallAdvPatternProviderGui::new, "/screens/small_adv_pattern_provider.json"); - InitScreens.register(event, AdvPatternEncoderContainer.TYPE, AdvPatternEncoderGui::new, "/screens/adv_pattern_encoder.json"); - } +public class AAEClientRegistryHandler { + public static final AAEClientRegistryHandler INSTANCE = new AAEClientRegistryHandler(); - @SubscribeEvent - public void registerColorHandler(RegisterColorHandlersEvent.Item event) { - } + @SubscribeEvent + public void registerGui(RegisterMenuScreensEvent event) { + InitScreens.register( + event, + AdvPatternProviderContainer.TYPE, + AdvPatternProviderGui::new, + "/screens/adv_pattern_provider.json"); + InitScreens.register( + event, + SmallAdvPatternProviderContainer.TYPE, + SmallAdvPatternProviderGui::new, + "/screens/small_adv_pattern_provider.json"); + InitScreens.register( + event, AdvPatternEncoderContainer.TYPE, AdvPatternEncoderGui::new, "/screens/adv_pattern_encoder.json"); + } - @SubscribeEvent - public void registerModels(ModelEvent.RegisterGeometryLoaders event) { + @SubscribeEvent + public void registerColorHandler(RegisterColorHandlersEvent.Item event) {} - } + @SubscribeEvent + public void registerModels(ModelEvent.RegisterGeometryLoaders event) {} - @SubscribeEvent - public void registerHotKey(RegisterKeyMappingsEvent e) { - } + @SubscribeEvent + public void registerHotKey(RegisterKeyMappingsEvent e) {} } diff --git a/src/main/java/net/pedroksl/advanced_ae/client/AAESemantics.java b/src/main/java/net/pedroksl/advanced_ae/client/AAESemantics.java index 06285a26..73f870b0 100644 --- a/src/main/java/net/pedroksl/advanced_ae/client/AAESemantics.java +++ b/src/main/java/net/pedroksl/advanced_ae/client/AAESemantics.java @@ -5,17 +5,16 @@ public class AAESemantics { - public final static SlotSemantic OUTPUT_SLOT = SlotSemantics.register("OutputSlot", false); - public final static SlotSemantic EX_2 = SlotSemantics.register("EX_2", false); - public final static SlotSemantic EX_3 = SlotSemantics.register("EX_3", false); - public final static SlotSemantic EX_4 = SlotSemantics.register("EX_4", false); - public final static SlotSemantic EX_5 = SlotSemantics.register("EX_5", false); - public final static SlotSemantic EX_6 = SlotSemantics.register("EX_6", false); - public final static SlotSemantic EX_7 = SlotSemantics.register("EX_7", false); - public final static SlotSemantic EX_8 = SlotSemantics.register("EX_8", false); - public final static SlotSemantic EX_9 = SlotSemantics.register("EX_9", false); - public final static SlotSemantic EX_10 = SlotSemantics.register("EX_10", false); - public final static SlotSemantic EX_11 = SlotSemantics.register("EX_11", false); - public final static SlotSemantic EX_12 = SlotSemantics.register("EX_12", false); - + public static final SlotSemantic OUTPUT_SLOT = SlotSemantics.register("OutputSlot", false); + public static final SlotSemantic EX_2 = SlotSemantics.register("EX_2", false); + public static final SlotSemantic EX_3 = SlotSemantics.register("EX_3", false); + public static final SlotSemantic EX_4 = SlotSemantics.register("EX_4", false); + public static final SlotSemantic EX_5 = SlotSemantics.register("EX_5", false); + public static final SlotSemantic EX_6 = SlotSemantics.register("EX_6", false); + public static final SlotSemantic EX_7 = SlotSemantics.register("EX_7", false); + public static final SlotSemantic EX_8 = SlotSemantics.register("EX_8", false); + public static final SlotSemantic EX_9 = SlotSemantics.register("EX_9", false); + public static final SlotSemantic EX_10 = SlotSemantics.register("EX_10", false); + public static final SlotSemantic EX_11 = SlotSemantics.register("EX_11", false); + public static final SlotSemantic EX_12 = SlotSemantics.register("EX_12", false); } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java b/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java index bc431f73..68cab742 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/AAERegistryHandler.java @@ -1,35 +1,17 @@ package net.pedroksl.advanced_ae.common; -import appeng.api.AECapabilities; -import appeng.api.implementations.blockentities.ICraftingMachine; -import appeng.api.implementations.items.IAEItemPowerStorage; -import appeng.api.networking.IInWorldGridNodeHost; -import appeng.api.parts.PartModels; -import appeng.api.parts.RegisterPartCapabilitiesEvent; -import appeng.block.AEBaseBlockItem; -import appeng.block.AEBaseEntityBlock; -import appeng.blockentity.AEBaseBlockEntity; -import appeng.blockentity.AEBaseInvBlockEntity; -import appeng.blockentity.ClientTickingBlockEntity; -import appeng.blockentity.ServerTickingBlockEntity; -import appeng.blockentity.powersink.AEBasePoweredBlockEntity; -import appeng.items.AEBaseItem; -import appeng.items.tools.powered.powersink.PoweredItemCapabilities; +import java.util.Collection; + import com.glodblock.github.extendedae.api.caps.ICrankPowered; import com.glodblock.github.extendedae.api.caps.IGenericInvHost; import com.glodblock.github.extendedae.api.caps.IMEStorageAccess; -import net.minecraft.core.registries.BuiltInRegistries; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModList; -import net.neoforged.neoforge.capabilities.Capabilities; -import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; -import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; -import net.pedroksl.advanced_ae.common.parts.SmallAdvPatternProviderPart; -import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; -import net.pedroksl.advanced_ae.xmod.appflux.AFCommonLoad; import com.glodblock.github.glodium.registry.RegistryHandler; import com.glodblock.github.glodium.util.GlodUtil; + +import org.apache.commons.lang3.tuple.Pair; + import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; @@ -37,125 +19,158 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModList; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.pedroksl.advanced_ae.AdvancedAE; +import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; import net.pedroksl.advanced_ae.common.parts.AdvPatternProviderPart; +import net.pedroksl.advanced_ae.common.parts.SmallAdvPatternProviderPart; import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderContainer; +import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; -import org.apache.commons.lang3.tuple.Pair; +import net.pedroksl.advanced_ae.xmod.appflux.AFCommonLoad; -import java.util.Collection; +import appeng.api.AECapabilities; +import appeng.api.implementations.blockentities.ICraftingMachine; +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.api.networking.IInWorldGridNodeHost; +import appeng.api.parts.PartModels; +import appeng.api.parts.RegisterPartCapabilitiesEvent; +import appeng.block.AEBaseBlockItem; +import appeng.block.AEBaseEntityBlock; +import appeng.blockentity.AEBaseBlockEntity; +import appeng.blockentity.AEBaseInvBlockEntity; +import appeng.blockentity.ClientTickingBlockEntity; +import appeng.blockentity.ServerTickingBlockEntity; +import appeng.blockentity.powersink.AEBasePoweredBlockEntity; +import appeng.items.AEBaseItem; +import appeng.items.tools.powered.powersink.PoweredItemCapabilities; public class AAERegistryHandler extends RegistryHandler { - public static final AAERegistryHandler INSTANCE = new AAERegistryHandler(); - - @SuppressWarnings("UnstableApiUsage") - public AAERegistryHandler() { - super(AdvancedAE.MOD_ID); - this.cap(AEBaseInvBlockEntity.class, Capabilities.ItemHandler.BLOCK, AEBaseInvBlockEntity::getExposedItemHandler); - this.cap(AEBasePoweredBlockEntity.class, Capabilities.EnergyStorage.BLOCK, AEBasePoweredBlockEntity::getEnergyStorage); - this.cap(IInWorldGridNodeHost.class, AECapabilities.IN_WORLD_GRID_NODE_HOST, (object, context) -> object); - this.cap(IAEItemPowerStorage.class, Capabilities.EnergyStorage.ITEM, (object, context) -> new PoweredItemCapabilities(object, (IAEItemPowerStorage) object.getItem())); - this.cap(ICrankPowered.class, AECapabilities.CRANKABLE, ICrankPowered::getCrankable); - this.cap(ICraftingMachine.class, AECapabilities.CRAFTING_MACHINE, (object, context) -> object); - this.cap(IGenericInvHost.class, AECapabilities.GENERIC_INTERNAL_INV, IGenericInvHost::getGenericInv); - this.cap(IMEStorageAccess.class, AECapabilities.ME_STORAGE, IMEStorageAccess::getMEStorage); - this.cap(AdvPatternProviderEntity.class, AECapabilities.GENERIC_INTERNAL_INV, - (blockEntity, context) -> blockEntity.getLogic().getReturnInv()); - } - - public void block(String name, AEBaseEntityBlock block, Class clazz, - BlockEntityType.BlockEntitySupplier supplier) { - bindTileEntity(clazz, block, supplier); - block(name, block, b -> new AEBaseBlockItem(b, new Item.Properties())); - tile(name, block.getBlockEntityType()); - } - - @Override - public void runRegister() { - super.runRegister(); - this.onRegisterContainer(); - this.onRegisterModels(); // Parts - } - - public Collection getBlocks() { - return this.blocks.stream().map(Pair::getRight).toList(); - } - - @SubscribeEvent - public void onRegisterCapability(RegisterPartCapabilitiesEvent event) { - AdvPatternProviderPart.registerCapability(event); - } - - @SubscribeEvent - public void onRegisterCapabilities(RegisterCapabilitiesEvent event) { - super.onRegisterCapabilities(event); - } - - private void onRegisterContainer() { - Registry.register(BuiltInRegistries.MENU, AdvancedAE.id("adv_pattern_provider"), AdvPatternProviderContainer.TYPE); - Registry.register(BuiltInRegistries.MENU, AdvancedAE.id("small_adv_pattern_provider"), SmallAdvPatternProviderContainer.TYPE); - Registry.register(BuiltInRegistries.MENU, AdvancedAE.id("adv_pattern_encoder"), AdvPatternEncoderContainer.TYPE); - } - - private void bindTileEntity(Class clazz, AEBaseEntityBlock block, BlockEntityType.BlockEntitySupplier supplier) { - BlockEntityTicker serverTicker = null; - if (ServerTickingBlockEntity.class.isAssignableFrom(clazz)) { - serverTicker = (level, pos, state, entity) -> ((ServerTickingBlockEntity) entity).serverTick(); - } - BlockEntityTicker clientTicker = null; - if (ClientTickingBlockEntity.class.isAssignableFrom(clazz)) { - clientTicker = (level, pos, state, entity) -> ((ClientTickingBlockEntity) entity).clientTick(); - } - block.setBlockEntity(clazz, GlodUtil.getTileType(clazz, supplier, block), clientTicker, serverTicker); - } - - public void onInit() { - for (Pair entry : blocks) { - Block block = entry.getRight(); - if (block instanceof AEBaseEntityBlock) { - AEBaseBlockEntity.registerBlockEntityItem( - ((AEBaseEntityBlock) block).getBlockEntityType(), - block.asItem() - ); - } - } - this.registerAEUpgrade(); - this.registerPackagedItems(); - if (ModList.get().isLoaded("appflux")) { - AFCommonLoad.init(); - } - } - - private void registerAEUpgrade() { - } - - private void onRegisterModels() { - PartModels.registerModels(AdvPatternProviderPart.MODELS); - PartModels.registerModels(SmallAdvPatternProviderPart.MODELS); - } - - private void registerPackagedItems() { - - } - - public void registerTab(Registry registry) { - var tab = CreativeModeTab.builder() - .icon(() -> new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER)) - .title(Component.translatable("itemGroup.app")) - .displayItems((p, o) -> { - for (Pair entry : items) { - if (entry.getRight() instanceof AEBaseItem aeItem) { - aeItem.addToMainCreativeTab(p, o); - } else { - o.accept(entry.getRight()); - } - } - for (Pair entry : blocks) { - o.accept(entry.getRight()); - } - }) - .build(); - Registry.register(registry, AdvancedAE.id("tab_main"), tab); - } + public static final AAERegistryHandler INSTANCE = new AAERegistryHandler(); + + @SuppressWarnings("UnstableApiUsage") + public AAERegistryHandler() { + super(AdvancedAE.MOD_ID); + this.cap( + AEBaseInvBlockEntity.class, + Capabilities.ItemHandler.BLOCK, + AEBaseInvBlockEntity::getExposedItemHandler); + this.cap( + AEBasePoweredBlockEntity.class, + Capabilities.EnergyStorage.BLOCK, + AEBasePoweredBlockEntity::getEnergyStorage); + this.cap(IInWorldGridNodeHost.class, AECapabilities.IN_WORLD_GRID_NODE_HOST, (object, context) -> object); + this.cap( + IAEItemPowerStorage.class, + Capabilities.EnergyStorage.ITEM, + (object, context) -> new PoweredItemCapabilities(object, (IAEItemPowerStorage) object.getItem())); + this.cap(ICrankPowered.class, AECapabilities.CRANKABLE, ICrankPowered::getCrankable); + this.cap(ICraftingMachine.class, AECapabilities.CRAFTING_MACHINE, (object, context) -> object); + this.cap(IGenericInvHost.class, AECapabilities.GENERIC_INTERNAL_INV, IGenericInvHost::getGenericInv); + this.cap(IMEStorageAccess.class, AECapabilities.ME_STORAGE, IMEStorageAccess::getMEStorage); + this.cap( + AdvPatternProviderEntity.class, + AECapabilities.GENERIC_INTERNAL_INV, + (blockEntity, context) -> blockEntity.getLogic().getReturnInv()); + } + + public void block( + String name, AEBaseEntityBlock block, Class clazz, BlockEntityType.BlockEntitySupplier supplier) { + bindTileEntity(clazz, block, supplier); + block(name, block, b -> new AEBaseBlockItem(b, new Item.Properties())); + tile(name, block.getBlockEntityType()); + } + + @Override + public void runRegister() { + super.runRegister(); + this.onRegisterContainer(); + this.onRegisterModels(); // Parts + } + + public Collection getBlocks() { + return this.blocks.stream().map(Pair::getRight).toList(); + } + + @SubscribeEvent + public void onRegisterCapability(RegisterPartCapabilitiesEvent event) { + AdvPatternProviderPart.registerCapability(event); + } + + @SubscribeEvent + public void onRegisterCapabilities(RegisterCapabilitiesEvent event) { + super.onRegisterCapabilities(event); + } + + private void onRegisterContainer() { + Registry.register( + BuiltInRegistries.MENU, AdvancedAE.id("adv_pattern_provider"), AdvPatternProviderContainer.TYPE); + Registry.register( + BuiltInRegistries.MENU, + AdvancedAE.id("small_adv_pattern_provider"), + SmallAdvPatternProviderContainer.TYPE); + Registry.register( + BuiltInRegistries.MENU, AdvancedAE.id("adv_pattern_encoder"), AdvPatternEncoderContainer.TYPE); + } + + private void bindTileEntity( + Class clazz, AEBaseEntityBlock block, BlockEntityType.BlockEntitySupplier supplier) { + BlockEntityTicker serverTicker = null; + if (ServerTickingBlockEntity.class.isAssignableFrom(clazz)) { + serverTicker = (level, pos, state, entity) -> ((ServerTickingBlockEntity) entity).serverTick(); + } + BlockEntityTicker clientTicker = null; + if (ClientTickingBlockEntity.class.isAssignableFrom(clazz)) { + clientTicker = (level, pos, state, entity) -> ((ClientTickingBlockEntity) entity).clientTick(); + } + block.setBlockEntity(clazz, GlodUtil.getTileType(clazz, supplier, block), clientTicker, serverTicker); + } + + public void onInit() { + for (Pair entry : blocks) { + Block block = entry.getRight(); + if (block instanceof AEBaseEntityBlock) { + AEBaseBlockEntity.registerBlockEntityItem( + ((AEBaseEntityBlock) block).getBlockEntityType(), block.asItem()); + } + } + this.registerAEUpgrade(); + this.registerPackagedItems(); + if (ModList.get().isLoaded("appflux")) { + AFCommonLoad.init(); + } + } + + private void registerAEUpgrade() {} + + private void onRegisterModels() { + PartModels.registerModels(AdvPatternProviderPart.MODELS); + PartModels.registerModels(SmallAdvPatternProviderPart.MODELS); + } + + private void registerPackagedItems() {} + + public void registerTab(Registry registry) { + var tab = CreativeModeTab.builder() + .icon(() -> new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER)) + .title(Component.translatable("itemGroup.app")) + .displayItems((p, o) -> { + for (Pair entry : items) { + if (entry.getRight() instanceof AEBaseItem aeItem) { + aeItem.addToMainCreativeTab(p, o); + } else { + o.accept(entry.getRight()); + } + } + for (Pair entry : blocks) { + o.accept(entry.getRight()); + } + }) + .build(); + Registry.register(registry, AdvancedAE.id("tab_main"), tab); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java b/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java index 2f5a49b4..8564b1d6 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/AAESingletons.java @@ -1,9 +1,8 @@ package net.pedroksl.advanced_ae.common; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.items.parts.PartItem; import com.glodblock.github.glodium.util.GlodCodecs; import com.glodblock.github.glodium.util.GlodUtil; + import net.minecraft.core.component.DataComponentType; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; @@ -21,62 +20,70 @@ import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; import net.pedroksl.advanced_ae.common.patterns.EncodedAdvProcessingPattern; -public class AAESingletons { - - public static DataComponentType ENCODED_ADV_PROCESSING_PATTERN; - public static DataComponentType STACK_TAG; - - public static AdvPatternProviderBlock ADV_PATTERN_PROVIDER; - public static SmallAdvPatternProviderBlock SMALL_ADV_PATTERN_PROVIDER; - public static PartItem ADV_PATTERN_PROVIDER_PART; - public static PartItem SMALL_ADV_PATTERN_PROVIDER_PART; - public static ReactionChamberBlock REACTION_CHAMBER; - - public static Item ADV_PROCESSING_PATTERN; - public static Item ADV_PATTERN_PROVIDER_UPGRADE; - public static Item ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE; - - public static AdvPatternEncoderItem ADV_PATTERN_ENCODER; - - public static void init(AAERegistryHandler handler) { - STACK_TAG = GlodUtil.getComponentType(CompoundTag.CODEC, GlodCodecs.NBT_STREAM_CODEC); - - ENCODED_ADV_PROCESSING_PATTERN = GlodUtil.getComponentType(EncodedAdvProcessingPattern.CODEC, - EncodedAdvProcessingPattern.STREAM_CODEC); - - ADV_PATTERN_PROVIDER = new AdvPatternProviderBlock(); - SMALL_ADV_PATTERN_PROVIDER = new SmallAdvPatternProviderBlock(); - ADV_PATTERN_PROVIDER_PART = new PartItem<>(new Item.Properties(), AdvPatternProviderPart.class, - AdvPatternProviderPart::new); - SMALL_ADV_PATTERN_PROVIDER_PART = new PartItem<>(new Item.Properties(), SmallAdvPatternProviderPart.class, - SmallAdvPatternProviderPart::new); - - REACTION_CHAMBER = new ReactionChamberBlock(); - - ADV_PROCESSING_PATTERN = - PatternDetailsHelper.encodedPatternItemBuilder(AdvProcessingPattern::new) - .invalidPatternTooltip(AdvProcessingPattern::getInvalidPatternTooltip).build(); - ADV_PATTERN_PROVIDER_UPGRADE = new AdvPatternProviderUpgradeItem(); - ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE = new AdvPatternProviderCapacityUpgradeItem(); - - ADV_PATTERN_ENCODER = new AdvPatternEncoderItem(); - - - handler.comp("encoded_adv_processing_pattern", ENCODED_ADV_PROCESSING_PATTERN); - handler.comp("generic_nbt", STACK_TAG); - - handler.block("adv_pattern_provider", ADV_PATTERN_PROVIDER, AdvPatternProviderEntity.class, - AdvPatternProviderEntity::new); - handler.block("small_adv_pattern_provider", SMALL_ADV_PATTERN_PROVIDER, SmallAdvPatternProviderEntity.class, - SmallAdvPatternProviderEntity::new); - handler.item("adv_pattern_provider_part", ADV_PATTERN_PROVIDER_PART); - handler.item("small_adv_pattern_provider_part", SMALL_ADV_PATTERN_PROVIDER_PART); +import appeng.api.crafting.PatternDetailsHelper; +import appeng.items.parts.PartItem; - handler.block("reaction_chamber", REACTION_CHAMBER, ReactionChamberEntity.class, ReactionChamberEntity::new); +public class AAESingletons { - handler.item("adv_processing_pattern", ADV_PROCESSING_PATTERN); - handler.item("adv_pattern_encoder", ADV_PATTERN_ENCODER); - handler.item("adv_pattern_provider_upgrade", ADV_PATTERN_PROVIDER_UPGRADE); - handler.item("adv_pattern_provider_capacity_upgrade", ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE); - } + public static DataComponentType ENCODED_ADV_PROCESSING_PATTERN; + public static DataComponentType STACK_TAG; + + public static AdvPatternProviderBlock ADV_PATTERN_PROVIDER; + public static SmallAdvPatternProviderBlock SMALL_ADV_PATTERN_PROVIDER; + public static PartItem ADV_PATTERN_PROVIDER_PART; + public static PartItem SMALL_ADV_PATTERN_PROVIDER_PART; + public static ReactionChamberBlock REACTION_CHAMBER; + + public static Item ADV_PROCESSING_PATTERN; + public static Item ADV_PATTERN_PROVIDER_UPGRADE; + public static Item ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE; + + public static AdvPatternEncoderItem ADV_PATTERN_ENCODER; + + public static void init(AAERegistryHandler handler) { + STACK_TAG = GlodUtil.getComponentType(CompoundTag.CODEC, GlodCodecs.NBT_STREAM_CODEC); + + ENCODED_ADV_PROCESSING_PATTERN = + GlodUtil.getComponentType(EncodedAdvProcessingPattern.CODEC, EncodedAdvProcessingPattern.STREAM_CODEC); + + ADV_PATTERN_PROVIDER = new AdvPatternProviderBlock(); + SMALL_ADV_PATTERN_PROVIDER = new SmallAdvPatternProviderBlock(); + ADV_PATTERN_PROVIDER_PART = + new PartItem<>(new Item.Properties(), AdvPatternProviderPart.class, AdvPatternProviderPart::new); + SMALL_ADV_PATTERN_PROVIDER_PART = new PartItem<>( + new Item.Properties(), SmallAdvPatternProviderPart.class, SmallAdvPatternProviderPart::new); + + REACTION_CHAMBER = new ReactionChamberBlock(); + + ADV_PROCESSING_PATTERN = PatternDetailsHelper.encodedPatternItemBuilder(AdvProcessingPattern::new) + .invalidPatternTooltip(AdvProcessingPattern::getInvalidPatternTooltip) + .build(); + ADV_PATTERN_PROVIDER_UPGRADE = new AdvPatternProviderUpgradeItem(); + ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE = new AdvPatternProviderCapacityUpgradeItem(); + + ADV_PATTERN_ENCODER = new AdvPatternEncoderItem(); + + handler.comp("encoded_adv_processing_pattern", ENCODED_ADV_PROCESSING_PATTERN); + handler.comp("generic_nbt", STACK_TAG); + + handler.block( + "adv_pattern_provider", + ADV_PATTERN_PROVIDER, + AdvPatternProviderEntity.class, + AdvPatternProviderEntity::new); + handler.block( + "small_adv_pattern_provider", + SMALL_ADV_PATTERN_PROVIDER, + SmallAdvPatternProviderEntity.class, + SmallAdvPatternProviderEntity::new); + handler.item("adv_pattern_provider_part", ADV_PATTERN_PROVIDER_PART); + handler.item("small_adv_pattern_provider_part", SMALL_ADV_PATTERN_PROVIDER_PART); + + handler.block("reaction_chamber", REACTION_CHAMBER, ReactionChamberEntity.class, ReactionChamberEntity::new); + + handler.item("adv_processing_pattern", ADV_PROCESSING_PATTERN); + handler.item("adv_pattern_encoder", ADV_PATTERN_ENCODER); + handler.item("adv_pattern_provider_upgrade", ADV_PATTERN_PROVIDER_UPGRADE); + handler.item("adv_pattern_provider_capacity_upgrade", ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/blocks/AAECraftingUnitType.java b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AAECraftingUnitType.java new file mode 100644 index 00000000..7e91fef2 --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AAECraftingUnitType.java @@ -0,0 +1,46 @@ +package net.pedroksl.advanced_ae.common.blocks; + +import net.minecraft.world.item.Item; +import net.pedroksl.advanced_ae.common.definitions.AAEBlocks; + +import appeng.block.crafting.ICraftingUnitType; +import appeng.core.definitions.BlockDefinition; + +public enum AAECraftingUnitType implements ICraftingUnitType { + UNIT(0, "unit"), + ACCELERATOR(0, "accelerator"); + + private final int storageMb; + private final String affix; + + AAECraftingUnitType(int storageMb, String affix) { + this.storageMb = storageMb; + this.affix = affix; + } + + @Override + public long getStorageBytes() { + return 1024L * 1024 * storageMb; + } + + @Override + public int getAcceleratorThreads() { + return this == ACCELERATOR ? 4 : 0; + } + + public String getAffix() { + return this.affix; + } + + public BlockDefinition getDefinition() { + return switch (this) { + case UNIT -> AAEBlocks.ADV_CRAFTING_UNIT; + case ACCELERATOR -> AAEBlocks.ADV_CRAFTING_ACCELERATOR; + }; + } + + @Override + public Item getItemFromType() { + return getDefinition().asItem(); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java index aecd876b..13253a57 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/blocks/AdvPatternProviderBlock.java @@ -1,11 +1,13 @@ package net.pedroksl.advanced_ae.common.blocks; -import appeng.block.crafting.PatternProviderBlock; -import appeng.block.crafting.PushDirection; -import appeng.menu.locator.MenuLocators; -import appeng.util.InteractionUtil; -import appeng.util.Platform; +import static appeng.block.crafting.PatternProviderBlock.PUSH_DIRECTION; + +import javax.annotation.Nonnull; + import com.glodblock.github.extendedae.common.blocks.BlockBaseGui; + +import org.jetbrains.annotations.NotNull; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.ItemInteractionResult; @@ -18,66 +20,75 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraft.world.phys.BlockHitResult; import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; -import org.jetbrains.annotations.NotNull; - -import static appeng.block.crafting.PatternProviderBlock.PUSH_DIRECTION; -import javax.annotation.Nonnull; +import appeng.block.crafting.PatternProviderBlock; +import appeng.block.crafting.PushDirection; +import appeng.menu.locator.MenuLocators; +import appeng.util.InteractionUtil; +import appeng.util.Platform; public class AdvPatternProviderBlock extends BlockBaseGui { - public static final BooleanProperty CONNECTION_STATE = BooleanProperty.create("connection_state"); - - public AdvPatternProviderBlock() { - super(metalProps()); - this.registerDefaultState(this.defaultBlockState().setValue(PatternProviderBlock.PUSH_DIRECTION, PushDirection.ALL).setValue(CONNECTION_STATE, false)); - } - - @Override - public void openGui(AdvPatternProviderEntity advPatternProviderEntity, Player player) { - advPatternProviderEntity.openMenu(player, MenuLocators.forBlockEntity(advPatternProviderEntity)); - } - - @Override - protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(PUSH_DIRECTION); - builder.add(CONNECTION_STATE); - } - - @Override - public void neighborChanged(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, - @NotNull Block block, @NotNull BlockPos fromPos, boolean isMoving) { - var be = this.getBlockEntity(level, pos); - if (be != null) { - be.getLogic().updateRedstoneState(); - } - } - - @Override - public ItemInteractionResult check(AdvPatternProviderEntity tile, ItemStack stack, Level world, BlockPos pos, BlockHitResult hit, Player p) { - if (stack != null && InteractionUtil.canWrenchRotate(stack)) { - this.setSide(world, pos, hit.getDirection()); - return ItemInteractionResult.sidedSuccess(world.isClientSide); - } - return null; - } - - public void setSide(Level level, BlockPos pos, Direction facing) { - var currentState = level.getBlockState(pos); - var pushSide = currentState.getValue(PUSH_DIRECTION).getDirection(); - - PushDirection newPushDirection; - if (pushSide == facing.getOpposite()) { - newPushDirection = PushDirection.fromDirection(facing); - } else if (pushSide == facing) { - newPushDirection = PushDirection.ALL; - } else if (pushSide == null) { - newPushDirection = PushDirection.fromDirection(facing.getOpposite()); - } else { - newPushDirection = PushDirection.fromDirection(Platform.rotateAround(pushSide, facing)); - } - - level.setBlockAndUpdate(pos, currentState.setValue(PUSH_DIRECTION, newPushDirection)); - } + public static final BooleanProperty CONNECTION_STATE = BooleanProperty.create("connection_state"); + + public AdvPatternProviderBlock() { + super(metalProps()); + this.registerDefaultState(this.defaultBlockState() + .setValue(PatternProviderBlock.PUSH_DIRECTION, PushDirection.ALL) + .setValue(CONNECTION_STATE, false)); + } + + @Override + public void openGui(AdvPatternProviderEntity advPatternProviderEntity, Player player) { + advPatternProviderEntity.openMenu(player, MenuLocators.forBlockEntity(advPatternProviderEntity)); + } + + @Override + protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(PUSH_DIRECTION); + builder.add(CONNECTION_STATE); + } + + @Override + public void neighborChanged( + @NotNull BlockState state, + @NotNull Level level, + @NotNull BlockPos pos, + @NotNull Block block, + @NotNull BlockPos fromPos, + boolean isMoving) { + var be = this.getBlockEntity(level, pos); + if (be != null) { + be.getLogic().updateRedstoneState(); + } + } + + @Override + public ItemInteractionResult check( + AdvPatternProviderEntity tile, ItemStack stack, Level world, BlockPos pos, BlockHitResult hit, Player p) { + if (stack != null && InteractionUtil.canWrenchRotate(stack)) { + this.setSide(world, pos, hit.getDirection()); + return ItemInteractionResult.sidedSuccess(world.isClientSide); + } + return null; + } + + public void setSide(Level level, BlockPos pos, Direction facing) { + var currentState = level.getBlockState(pos); + var pushSide = currentState.getValue(PUSH_DIRECTION).getDirection(); + + PushDirection newPushDirection; + if (pushSide == facing.getOpposite()) { + newPushDirection = PushDirection.fromDirection(facing); + } else if (pushSide == facing) { + newPushDirection = PushDirection.ALL; + } else if (pushSide == null) { + newPushDirection = PushDirection.fromDirection(facing.getOpposite()); + } else { + newPushDirection = PushDirection.fromDirection(Platform.rotateAround(pushSide, facing)); + } + + level.setBlockAndUpdate(pos, currentState.setValue(PUSH_DIRECTION, newPushDirection)); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/blocks/ReactionChamberBlock.java b/src/main/java/net/pedroksl/advanced_ae/common/blocks/ReactionChamberBlock.java index 622f9880..a70adc68 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/blocks/ReactionChamberBlock.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/blocks/ReactionChamberBlock.java @@ -1,28 +1,27 @@ package net.pedroksl.advanced_ae.common.blocks; +import javax.annotation.Nonnull; + import com.glodblock.github.extendedae.common.blocks.BlockBaseGui; + import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.pedroksl.advanced_ae.common.entities.ReactionChamberEntity; -import javax.annotation.Nonnull; - public class ReactionChamberBlock extends BlockBaseGui { - public ReactionChamberBlock() { - super(metalProps().noOcclusion()); - this.registerDefaultState(this.defaultBlockState()); - } - - @Override - protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - } + public ReactionChamberBlock() { + super(metalProps().noOcclusion()); + this.registerDefaultState(this.defaultBlockState()); + } - @Override - public void openGui(ReactionChamberEntity reactionChamberEntity, Player player) { + @Override + protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + } - } + @Override + public void openGui(ReactionChamberEntity reactionChamberEntity, Player player) {} } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/blocks/SmallAdvPatternProviderBlock.java b/src/main/java/net/pedroksl/advanced_ae/common/blocks/SmallAdvPatternProviderBlock.java index 854d5ef4..be9160af 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/blocks/SmallAdvPatternProviderBlock.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/blocks/SmallAdvPatternProviderBlock.java @@ -1,11 +1,14 @@ package net.pedroksl.advanced_ae.common.blocks; -import appeng.block.crafting.PatternProviderBlock; -import appeng.block.crafting.PushDirection; -import appeng.menu.locator.MenuLocators; -import appeng.util.InteractionUtil; -import appeng.util.Platform; +import static appeng.block.crafting.PatternProviderBlock.PUSH_DIRECTION; +import static net.pedroksl.advanced_ae.common.blocks.AdvPatternProviderBlock.CONNECTION_STATE; + +import javax.annotation.Nonnull; + import com.glodblock.github.extendedae.common.blocks.BlockBaseGui; + +import org.jetbrains.annotations.NotNull; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.ItemInteractionResult; @@ -17,67 +20,77 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.phys.BlockHitResult; import net.pedroksl.advanced_ae.common.entities.SmallAdvPatternProviderEntity; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nonnull; -import static appeng.block.crafting.PatternProviderBlock.PUSH_DIRECTION; -import static net.pedroksl.advanced_ae.common.blocks.AdvPatternProviderBlock.CONNECTION_STATE; +import appeng.block.crafting.PatternProviderBlock; +import appeng.block.crafting.PushDirection; +import appeng.menu.locator.MenuLocators; +import appeng.util.InteractionUtil; +import appeng.util.Platform; public class SmallAdvPatternProviderBlock extends BlockBaseGui { - public SmallAdvPatternProviderBlock() { - super(metalProps()); - this.registerDefaultState(this.defaultBlockState() - .setValue(PatternProviderBlock.PUSH_DIRECTION, PushDirection.ALL) - .setValue(AdvPatternProviderBlock.CONNECTION_STATE, false) - ); - } + public SmallAdvPatternProviderBlock() { + super(metalProps()); + this.registerDefaultState(this.defaultBlockState() + .setValue(PatternProviderBlock.PUSH_DIRECTION, PushDirection.ALL) + .setValue(AdvPatternProviderBlock.CONNECTION_STATE, false)); + } - @Override - public void openGui(SmallAdvPatternProviderEntity advPatternProviderEntity, Player player) { - advPatternProviderEntity.openMenu(player, MenuLocators.forBlockEntity(advPatternProviderEntity)); - } + @Override + public void openGui(SmallAdvPatternProviderEntity advPatternProviderEntity, Player player) { + advPatternProviderEntity.openMenu(player, MenuLocators.forBlockEntity(advPatternProviderEntity)); + } - @Override - protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(PUSH_DIRECTION); - builder.add(CONNECTION_STATE); - } + @Override + protected void createBlockStateDefinition(@Nonnull StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(PUSH_DIRECTION); + builder.add(CONNECTION_STATE); + } - @Override - public void neighborChanged(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, - @NotNull Block block, @NotNull BlockPos fromPos, boolean isMoving) { - var be = this.getBlockEntity(level, pos); - if (be != null) { - be.getLogic().updateRedstoneState(); - } - } + @Override + public void neighborChanged( + @NotNull BlockState state, + @NotNull Level level, + @NotNull BlockPos pos, + @NotNull Block block, + @NotNull BlockPos fromPos, + boolean isMoving) { + var be = this.getBlockEntity(level, pos); + if (be != null) { + be.getLogic().updateRedstoneState(); + } + } - @Override - public ItemInteractionResult check(SmallAdvPatternProviderEntity tile, ItemStack stack, Level world, BlockPos pos, BlockHitResult hit, Player p) { - if (stack != null && InteractionUtil.canWrenchRotate(stack)) { - this.setSide(world, pos, hit.getDirection()); - return ItemInteractionResult.sidedSuccess(world.isClientSide); - } - return null; - } + @Override + public ItemInteractionResult check( + SmallAdvPatternProviderEntity tile, + ItemStack stack, + Level world, + BlockPos pos, + BlockHitResult hit, + Player p) { + if (stack != null && InteractionUtil.canWrenchRotate(stack)) { + this.setSide(world, pos, hit.getDirection()); + return ItemInteractionResult.sidedSuccess(world.isClientSide); + } + return null; + } - public void setSide(Level level, BlockPos pos, Direction facing) { - var currentState = level.getBlockState(pos); - var pushSide = currentState.getValue(PUSH_DIRECTION).getDirection(); + public void setSide(Level level, BlockPos pos, Direction facing) { + var currentState = level.getBlockState(pos); + var pushSide = currentState.getValue(PUSH_DIRECTION).getDirection(); - PushDirection newPushDirection; - if (pushSide == facing.getOpposite()) { - newPushDirection = PushDirection.fromDirection(facing); - } else if (pushSide == facing) { - newPushDirection = PushDirection.ALL; - } else if (pushSide == null) { - newPushDirection = PushDirection.fromDirection(facing.getOpposite()); - } else { - newPushDirection = PushDirection.fromDirection(Platform.rotateAround(pushSide, facing)); - } + PushDirection newPushDirection; + if (pushSide == facing.getOpposite()) { + newPushDirection = PushDirection.fromDirection(facing); + } else if (pushSide == facing) { + newPushDirection = PushDirection.ALL; + } else if (pushSide == null) { + newPushDirection = PushDirection.fromDirection(facing.getOpposite()); + } else { + newPushDirection = PushDirection.fromDirection(Platform.rotateAround(pushSide, facing)); + } - level.setBlockAndUpdate(pos, currentState.setValue(PUSH_DIRECTION, newPushDirection)); - } + level.setBlockAndUpdate(pos, currentState.setValue(PUSH_DIRECTION, newPushDirection)); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlockEntities.java b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlockEntities.java new file mode 100644 index 00000000..4c95f56f --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlockEntities.java @@ -0,0 +1,63 @@ +package net.pedroksl.advanced_ae.common.definitions; + +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.pedroksl.advanced_ae.AdvancedAE; + +import appeng.block.AEBaseEntityBlock; +import appeng.blockentity.AEBaseBlockEntity; +import appeng.blockentity.crafting.CraftingBlockEntity; +import appeng.core.definitions.BlockDefinition; + +@SuppressWarnings("unused") +public final class AAEBlockEntities { + public static final DeferredRegister> DR = + DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, AdvancedAE.MOD_ID); + + public static final Supplier> ADV_CRAFTING_UNIT = create( + "adv_crafting_unit", + CraftingBlockEntity.class, + CraftingBlockEntity::new, + AAEBlocks.ADV_CRAFTING_UNIT, + AAEBlocks.ADV_CRAFTING_ACCELERATOR); + + @SuppressWarnings({"DataFlowIssue", "unchecked"}) + @SafeVarargs + private static Supplier> create( + String id, + Class entityClass, + BlockEntityFactory factory, + BlockDefinition>... blockDefs) { + if (blockDefs.length == 0) { + throw new IllegalArgumentException(); + } + + return DR.register(id, () -> { + var blocks = Arrays.stream(blockDefs).map(BlockDefinition::block).toArray(AEBaseEntityBlock[]::new); + + var typeHolder = new AtomicReference>(); + var type = BlockEntityType.Builder.of((pos, state) -> factory.create(typeHolder.get(), pos, state), blocks) + .build(null); + typeHolder.set(type); + + AEBaseBlockEntity.registerBlockEntityItem(type, blockDefs[0].asItem()); + + for (var block : blocks) { + block.setBlockEntity(entityClass, type, null, null); + } + + return type; + }); + } + + private interface BlockEntityFactory { + T create(BlockEntityType type, BlockPos pos, BlockState state); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlocks.java b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlocks.java new file mode 100644 index 00000000..f88fe0d3 --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEBlocks.java @@ -0,0 +1,65 @@ +package net.pedroksl.advanced_ae.common.definitions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Supplier; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.pedroksl.advanced_ae.AdvancedAE; +import net.pedroksl.advanced_ae.common.blocks.AAECraftingUnitType; +import net.pedroksl.advanced_ae.common.items.AAECraftingBlockItem; + +import appeng.block.AEBaseBlockItem; +import appeng.block.crafting.CraftingUnitBlock; +import appeng.core.definitions.AEItems; +import appeng.core.definitions.BlockDefinition; +import appeng.core.definitions.ItemDefinition; + +public class AAEBlocks { + public static final DeferredRegister.Blocks DR = DeferredRegister.createBlocks(AdvancedAE.MOD_ID); + + private static final List> BLOCKS = new ArrayList<>(); + + public static List> getBlocks() { + return Collections.unmodifiableList(BLOCKS); + } + + public static final BlockDefinition ADV_CRAFTING_UNIT = block( + "Advanced Crafting Unit", + "adv_crafting_unit", + () -> new CraftingUnitBlock(AAECraftingUnitType.UNIT), + AEBaseBlockItem::new); + public static final BlockDefinition ADV_CRAFTING_ACCELERATOR = craftingBlock( + "Advanced Crafting Co-Processing Unit", + "adv_crafting_accelerator", + () -> new CraftingUnitBlock(AAECraftingUnitType.ACCELERATOR), + () -> AEItems.ENGINEERING_PROCESSOR); + + private static BlockDefinition craftingBlock( + String englishName, String id, Supplier blockSupplier, Supplier disassemblyExtra) { + return block( + englishName, + id, + blockSupplier, + (block, props) -> new AAECraftingBlockItem(block, props, disassemblyExtra)); + } + + private static BlockDefinition block( + String englishName, + String id, + Supplier blockSupplier, + BiFunction itemFactory) { + var block = DR.register(id, blockSupplier); + var item = AAEItems.DR.register(id, () -> itemFactory.apply(block.get(), new Item.Properties())); + + var definition = new BlockDefinition<>(englishName, block, new ItemDefinition<>(englishName, item)); + BLOCKS.add(definition); + return definition; + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEItems.java b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEItems.java new file mode 100644 index 00000000..d88a3afc --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/definitions/AAEItems.java @@ -0,0 +1,40 @@ +package net.pedroksl.advanced_ae.common.definitions; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +import net.minecraft.world.item.Item; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.pedroksl.advanced_ae.AdvancedAE; + +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import appeng.api.parts.PartModels; +import appeng.core.definitions.ItemDefinition; +import appeng.items.parts.PartItem; +import appeng.items.parts.PartModelsHelper; + +public class AAEItems { + public static final DeferredRegister.Items DR = DeferredRegister.createItems(AdvancedAE.MOD_ID); + + private static final List> ITEMS = new ArrayList<>(); + + public static List> getItems() { + return Collections.unmodifiableList(ITEMS); + } + + private static ItemDefinition item( + String englishName, String id, Function factory) { + var definition = new ItemDefinition<>(englishName, DR.registerItem(id, factory)); + ITEMS.add(definition); + return definition; + } + + private static ItemDefinition> part( + String englishName, String id, Class partClass, Function, T> factory) { + PartModels.registerModels(PartModelsHelper.createModels(partClass)); + return item(englishName, id, p -> new PartItem<>(p, partClass, factory)); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvCoProcessingUnitEntity.java b/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvCoProcessingUnitEntity.java new file mode 100644 index 00000000..4dc93b83 --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvCoProcessingUnitEntity.java @@ -0,0 +1,3 @@ +package net.pedroksl.advanced_ae.common.entities; + +public class AdvCoProcessingUnitEntity {} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvPatternProviderEntity.java b/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvPatternProviderEntity.java index 1b4cb436..9ea5cd7e 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvPatternProviderEntity.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/entities/AdvPatternProviderEntity.java @@ -1,16 +1,11 @@ package net.pedroksl.advanced_ae.common.entities; -import appeng.api.ids.AEComponents; -import appeng.api.networking.IGridNodeListener; -import appeng.api.orientation.BlockOrientation; -import appeng.api.stacks.AEItemKey; -import appeng.api.util.AECableType; -import appeng.block.crafting.PatternProviderBlock; -import appeng.block.crafting.PushDirection; -import appeng.blockentity.grid.AENetworkedBlockEntity; -import appeng.util.Platform; -import appeng.util.SettingsFrom; +import java.util.*; + import com.glodblock.github.glodium.util.GlodUtil; + +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; @@ -26,185 +21,196 @@ import net.pedroksl.advanced_ae.common.blocks.AdvPatternProviderBlock; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; -import org.jetbrains.annotations.Nullable; -import java.util.*; +import appeng.api.ids.AEComponents; +import appeng.api.networking.IGridNodeListener; +import appeng.api.orientation.BlockOrientation; +import appeng.api.stacks.AEItemKey; +import appeng.api.util.AECableType; +import appeng.block.crafting.PatternProviderBlock; +import appeng.block.crafting.PushDirection; +import appeng.blockentity.grid.AENetworkedBlockEntity; +import appeng.util.Platform; +import appeng.util.SettingsFrom; public class AdvPatternProviderEntity extends AENetworkedBlockEntity implements AdvPatternProviderLogicHost { - protected final AdvPatternProviderLogic logic; - - public AdvPatternProviderEntity(BlockPos pos, BlockState blockState) { - super(GlodUtil.getTileType(AdvPatternProviderEntity.class, AdvPatternProviderEntity::new, AAESingletons.ADV_PATTERN_PROVIDER), - pos, - blockState); - - this.logic = createLogic(); - } - - protected AdvPatternProviderEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState blockState, - int slots) { - super(blockEntityType, - pos, - blockState); - - this.logic = createLogic(slots); - } - - protected AdvPatternProviderLogic createLogic() { - return createLogic(36); - } - - protected AdvPatternProviderLogic createLogic(int slots) { - return new AdvPatternProviderLogic(this.getMainNode(), this, slots); - } - - @Override - public void onMainNodeStateChanged(IGridNodeListener.State reason) { - this.logic.onMainNodeStateChanged(); - this.updateState(); - } - - public void updateState() { - if (!this.getMainNode().isReady()) { - return; - } - - var connected = false; - var grid = getMainNode().getGrid(); - if (grid != null) { - if (grid.getEnergyService().isNetworkPowered()) { - connected = true; - } - } - - if (this.checkPosition(this.worldPosition) && this.level.getBlockState(this.worldPosition) - .getValue(AdvPatternProviderBlock.CONNECTION_STATE) != connected) { - this.level.setBlock(this.worldPosition, - this.level.getBlockState(this.worldPosition).setValue(AdvPatternProviderBlock.CONNECTION_STATE, - connected), Block.UPDATE_CLIENTS); - } - } - - private boolean checkPosition(BlockPos pos) { - return Platform.getTickingBlockEntity(getLevel(), pos) instanceof AdvPatternProviderEntity; - } - - private PushDirection getPushDirection() { - return getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION); - } - - @Override - public Set getGridConnectableSides(BlockOrientation orientation) { - // In omnidirectional mode, every side is grid-connectable - var pushDirection = getPushDirection().getDirection(); - if (pushDirection == null) { - return EnumSet.allOf(Direction.class); - } - - // Otherwise all sides *except* the target side are connectable - return EnumSet.complementOf(EnumSet.of(pushDirection)); - } - - @Override - public void addAdditionalDrops(Level level, BlockPos pos, List drops) { - super.addAdditionalDrops(level, pos, drops); - this.logic.addDrops(drops); - } - - @Override - public void clearContent() { - super.clearContent(); - this.logic.clearContent(); - } - - @Override - public void onReady() { - super.onReady(); - this.logic.updatePatterns(); - - this.updateState(); - } - - @Override - public void saveAdditional(CompoundTag data, HolderLookup.Provider registries) { - super.saveAdditional(data, registries); - this.logic.writeToNBT(data, registries); - } - - @Override - public void loadTag(CompoundTag data, HolderLookup.Provider registries) { - super.loadTag(data, registries); - this.logic.readFromNBT(data, registries); - } - - @Override - public AECableType getCableConnectionType(Direction dir) { - return AECableType.SMART; - } - - @Override - public AdvPatternProviderLogic getLogic() { - return logic; - } - - @Override - public EnumSet getTargets() { - var pushDirection = getPushDirection(); - if (pushDirection.getDirection() == null) { - return EnumSet.allOf(Direction.class); - } else { - return EnumSet.of(pushDirection.getDirection()); - } - } - - - @Override - public AEItemKey getTerminalIcon() { - return AEItemKey.of(AAESingletons.ADV_PATTERN_PROVIDER); - } - - @Override - public void exportSettings(SettingsFrom mode, DataComponentMap.Builder builder, - @Nullable Player player) { - super.exportSettings(mode, builder, player); - - if (mode == SettingsFrom.MEMORY_CARD) { - logic.exportSettings(builder); - - var pushDirection = getPushDirection(); - builder.set(AEComponents.EXPORTED_PUSH_DIRECTION, pushDirection); - } - } - - @Override - public void importSettings(SettingsFrom mode, DataComponentMap input, - @Nullable Player player) { - super.importSettings(mode, input, player); - - if (mode == SettingsFrom.MEMORY_CARD) { - logic.importSettings(input, player); - - // Restore push direction blockstate - var pushDirection = input.get(AEComponents.EXPORTED_PUSH_DIRECTION); - if (pushDirection != null) { - var level = getLevel(); - if (level != null) { - level.setBlockAndUpdate(getBlockPos(), getBlockState().setValue( - PatternProviderBlock.PUSH_DIRECTION, - pushDirection)); - } - } - } - } - - @Override - public ItemStack getMainMenuIcon() { - return new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER); - } - - @Override - public void setBlockState(BlockState state) { - super.setBlockState(state); - onGridConnectableSidesChanged(); - } + protected final AdvPatternProviderLogic logic; + + public AdvPatternProviderEntity(BlockPos pos, BlockState blockState) { + super( + GlodUtil.getTileType( + AdvPatternProviderEntity.class, + AdvPatternProviderEntity::new, + AAESingletons.ADV_PATTERN_PROVIDER), + pos, + blockState); + + this.logic = createLogic(); + } + + protected AdvPatternProviderEntity( + BlockEntityType blockEntityType, BlockPos pos, BlockState blockState, int slots) { + super(blockEntityType, pos, blockState); + + this.logic = createLogic(slots); + } + + protected AdvPatternProviderLogic createLogic() { + return createLogic(36); + } + + protected AdvPatternProviderLogic createLogic(int slots) { + return new AdvPatternProviderLogic(this.getMainNode(), this, slots); + } + + @Override + public void onMainNodeStateChanged(IGridNodeListener.State reason) { + this.logic.onMainNodeStateChanged(); + this.updateState(); + } + + public void updateState() { + if (!this.getMainNode().isReady()) { + return; + } + + var connected = false; + var grid = getMainNode().getGrid(); + if (grid != null) { + if (grid.getEnergyService().isNetworkPowered()) { + connected = true; + } + } + + if (this.checkPosition(this.worldPosition) + && this.level.getBlockState(this.worldPosition).getValue(AdvPatternProviderBlock.CONNECTION_STATE) + != connected) { + this.level.setBlock( + this.worldPosition, + this.level + .getBlockState(this.worldPosition) + .setValue(AdvPatternProviderBlock.CONNECTION_STATE, connected), + Block.UPDATE_CLIENTS); + } + } + + private boolean checkPosition(BlockPos pos) { + return Platform.getTickingBlockEntity(getLevel(), pos) instanceof AdvPatternProviderEntity; + } + + private PushDirection getPushDirection() { + return getBlockState().getValue(PatternProviderBlock.PUSH_DIRECTION); + } + + @Override + public Set getGridConnectableSides(BlockOrientation orientation) { + // In omnidirectional mode, every side is grid-connectable + var pushDirection = getPushDirection().getDirection(); + if (pushDirection == null) { + return EnumSet.allOf(Direction.class); + } + + // Otherwise all sides *except* the target side are connectable + return EnumSet.complementOf(EnumSet.of(pushDirection)); + } + + @Override + public void addAdditionalDrops(Level level, BlockPos pos, List drops) { + super.addAdditionalDrops(level, pos, drops); + this.logic.addDrops(drops); + } + + @Override + public void clearContent() { + super.clearContent(); + this.logic.clearContent(); + } + + @Override + public void onReady() { + super.onReady(); + this.logic.updatePatterns(); + + this.updateState(); + } + + @Override + public void saveAdditional(CompoundTag data, HolderLookup.Provider registries) { + super.saveAdditional(data, registries); + this.logic.writeToNBT(data, registries); + } + + @Override + public void loadTag(CompoundTag data, HolderLookup.Provider registries) { + super.loadTag(data, registries); + this.logic.readFromNBT(data, registries); + } + + @Override + public AECableType getCableConnectionType(Direction dir) { + return AECableType.SMART; + } + + @Override + public AdvPatternProviderLogic getLogic() { + return logic; + } + + @Override + public EnumSet getTargets() { + var pushDirection = getPushDirection(); + if (pushDirection.getDirection() == null) { + return EnumSet.allOf(Direction.class); + } else { + return EnumSet.of(pushDirection.getDirection()); + } + } + + @Override + public AEItemKey getTerminalIcon() { + return AEItemKey.of(AAESingletons.ADV_PATTERN_PROVIDER); + } + + @Override + public void exportSettings(SettingsFrom mode, DataComponentMap.Builder builder, @Nullable Player player) { + super.exportSettings(mode, builder, player); + + if (mode == SettingsFrom.MEMORY_CARD) { + logic.exportSettings(builder); + + var pushDirection = getPushDirection(); + builder.set(AEComponents.EXPORTED_PUSH_DIRECTION, pushDirection); + } + } + + @Override + public void importSettings(SettingsFrom mode, DataComponentMap input, @Nullable Player player) { + super.importSettings(mode, input, player); + + if (mode == SettingsFrom.MEMORY_CARD) { + logic.importSettings(input, player); + + // Restore push direction blockstate + var pushDirection = input.get(AEComponents.EXPORTED_PUSH_DIRECTION); + if (pushDirection != null) { + var level = getLevel(); + if (level != null) { + level.setBlockAndUpdate( + getBlockPos(), + getBlockState().setValue(PatternProviderBlock.PUSH_DIRECTION, pushDirection)); + } + } + } + } + + @Override + public ItemStack getMainMenuIcon() { + return new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER); + } + + @Override + public void setBlockState(BlockState state) { + super.setBlockState(state); + onGridConnectableSidesChanged(); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/entities/ReactionChamberEntity.java b/src/main/java/net/pedroksl/advanced_ae/common/entities/ReactionChamberEntity.java index 5a3643be..0d562afb 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/entities/ReactionChamberEntity.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/entities/ReactionChamberEntity.java @@ -1,5 +1,19 @@ package net.pedroksl.advanced_ae.common.entities; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import com.glodblock.github.glodium.util.GlodUtil; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.pedroksl.advanced_ae.common.AAESingletons; + import appeng.api.config.Setting; import appeng.api.config.Settings; import appeng.api.config.YesNo; @@ -16,110 +30,98 @@ import appeng.api.util.IConfigurableObject; import appeng.blockentity.grid.AENetworkedPoweredBlockEntity; import appeng.util.inv.AppEngInternalInventory; -import com.glodblock.github.glodium.util.GlodUtil; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; -import net.pedroksl.advanced_ae.common.AAESingletons; - -import java.util.EnumSet; -import java.util.List; -import java.util.Set; -public class ReactionChamberEntity extends AENetworkedPoweredBlockEntity implements IGridTickable, - IUpgradeableObject, IConfigurableObject { - - private final IUpgradeInventory upgrades; - private final IConfigManager configManager; - - private final AppEngInternalInventory inputInv = new AppEngInternalInventory(this, 3, 64); - - public ReactionChamberEntity(BlockPos pos, BlockState blockState) { - super(GlodUtil.getTileType(ReactionChamberEntity.class, ReactionChamberEntity::new, AAESingletons.REACTION_CHAMBER), - pos, - blockState); - - this.getMainNode() - .setIdlePowerUsage(0) - .addService(IGridTickable.class, this); - this.setInternalMaxPower(1600); - - this.upgrades = UpgradeInventories.forMachine(AAESingletons.REACTION_CHAMBER, 4, this::saveChanges); - this.configManager = IConfigManager.builder(this::onConfigChanged) - .registerSetting(Settings.AUTO_EXPORT, YesNo.NO) - .build(); - } - - @Override - public Set getGridConnectableSides(BlockOrientation orientation) { - // In omnidirectional mode, every side is grid-connectable - return EnumSet.complementOf(EnumSet.of(Direction.UP)); - } - - @Override - public InternalInventory getInternalInventory() { - return this.inputInv; - } - - @Override - public TickingRequest getTickingRequest(IGridNode iGridNode) { - return new TickingRequest(1, 20, true); - } - - @Override - public TickRateModulation tickingRequest(IGridNode iGridNode, int i) { - return TickRateModulation.SLEEP; - } - - @Override - public IConfigManager getConfigManager() { - return this.configManager; - } - - @Override - protected boolean readFromStream(RegistryFriendlyByteBuf data) { - var c = super.readFromStream(data); - - for (int i = 0; i < this.inputInv.size(); i++) { - this.inputInv.setItemDirect(i, ItemStack.OPTIONAL_STREAM_CODEC.decode(data)); - } - - return c; - } - - @Override - protected void writeToStream(RegistryFriendlyByteBuf data) { - super.writeToStream(data); - - for (int i = 0; i < this.inputInv.size(); i++) { - ItemStack.OPTIONAL_STREAM_CODEC.encode(data, this.inputInv.getStackInSlot(i)); - } - } - - private void onConfigChanged(IConfigManager manager, Setting setting) { - saveChanges(); - } - - @Override - public void addAdditionalDrops(Level level, BlockPos pos, List drops) { - super.addAdditionalDrops(level, pos, drops); - - for (var upgrade : upgrades) { - drops.add(upgrade); - } - } - - @Override - public void clearContent() { - super.clearContent(); - upgrades.clear(); - } - - @Override - public IUpgradeInventory getUpgrades() { - return upgrades; - } +public class ReactionChamberEntity extends AENetworkedPoweredBlockEntity + implements IGridTickable, IUpgradeableObject, IConfigurableObject { + + private final IUpgradeInventory upgrades; + private final IConfigManager configManager; + + private final AppEngInternalInventory inputInv = new AppEngInternalInventory(this, 3, 64); + + public ReactionChamberEntity(BlockPos pos, BlockState blockState) { + super( + GlodUtil.getTileType( + ReactionChamberEntity.class, ReactionChamberEntity::new, AAESingletons.REACTION_CHAMBER), + pos, + blockState); + + this.getMainNode().setIdlePowerUsage(0).addService(IGridTickable.class, this); + this.setInternalMaxPower(1600); + + this.upgrades = UpgradeInventories.forMachine(AAESingletons.REACTION_CHAMBER, 4, this::saveChanges); + this.configManager = IConfigManager.builder(this::onConfigChanged) + .registerSetting(Settings.AUTO_EXPORT, YesNo.NO) + .build(); + } + + @Override + public Set getGridConnectableSides(BlockOrientation orientation) { + // In omnidirectional mode, every side is grid-connectable + return EnumSet.complementOf(EnumSet.of(Direction.UP)); + } + + @Override + public InternalInventory getInternalInventory() { + return this.inputInv; + } + + @Override + public TickingRequest getTickingRequest(IGridNode iGridNode) { + return new TickingRequest(1, 20, true); + } + + @Override + public TickRateModulation tickingRequest(IGridNode iGridNode, int i) { + return TickRateModulation.SLEEP; + } + + @Override + public IConfigManager getConfigManager() { + return this.configManager; + } + + @Override + protected boolean readFromStream(RegistryFriendlyByteBuf data) { + var c = super.readFromStream(data); + + for (int i = 0; i < this.inputInv.size(); i++) { + this.inputInv.setItemDirect(i, ItemStack.OPTIONAL_STREAM_CODEC.decode(data)); + } + + return c; + } + + @Override + protected void writeToStream(RegistryFriendlyByteBuf data) { + super.writeToStream(data); + + for (int i = 0; i < this.inputInv.size(); i++) { + ItemStack.OPTIONAL_STREAM_CODEC.encode(data, this.inputInv.getStackInSlot(i)); + } + } + + private void onConfigChanged(IConfigManager manager, Setting setting) { + saveChanges(); + } + + @Override + public void addAdditionalDrops(Level level, BlockPos pos, List drops) { + super.addAdditionalDrops(level, pos, drops); + + for (var upgrade : upgrades) { + drops.add(upgrade); + } + } + + @Override + public void clearContent() { + super.clearContent(); + upgrades.clear(); + } + + @Override + public IUpgradeInventory getUpgrades() { + return upgrades; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/entities/SmallAdvPatternProviderEntity.java b/src/main/java/net/pedroksl/advanced_ae/common/entities/SmallAdvPatternProviderEntity.java index 772a4c24..5fd63c51 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/entities/SmallAdvPatternProviderEntity.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/entities/SmallAdvPatternProviderEntity.java @@ -1,29 +1,34 @@ package net.pedroksl.advanced_ae.common.entities; -import appeng.api.stacks.AEItemKey; import com.glodblock.github.glodium.util.GlodUtil; + import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.pedroksl.advanced_ae.common.AAESingletons; +import appeng.api.stacks.AEItemKey; + public class SmallAdvPatternProviderEntity extends AdvPatternProviderEntity { - public SmallAdvPatternProviderEntity(BlockPos pos, BlockState blockState) { - super(GlodUtil.getTileType(SmallAdvPatternProviderEntity.class, SmallAdvPatternProviderEntity::new, - AAESingletons.SMALL_ADV_PATTERN_PROVIDER), - pos, - blockState, - 9); - } + public SmallAdvPatternProviderEntity(BlockPos pos, BlockState blockState) { + super( + GlodUtil.getTileType( + SmallAdvPatternProviderEntity.class, + SmallAdvPatternProviderEntity::new, + AAESingletons.SMALL_ADV_PATTERN_PROVIDER), + pos, + blockState, + 9); + } - @Override - public AEItemKey getTerminalIcon() { - return AEItemKey.of(AAESingletons.SMALL_ADV_PATTERN_PROVIDER); - } + @Override + public AEItemKey getTerminalIcon() { + return AEItemKey.of(AAESingletons.SMALL_ADV_PATTERN_PROVIDER); + } - @Override - public ItemStack getMainMenuIcon() { - return new ItemStack(AAESingletons.SMALL_ADV_PATTERN_PROVIDER); - } + @Override + public ItemStack getMainMenuIcon() { + return new ItemStack(AAESingletons.SMALL_ADV_PATTERN_PROVIDER); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java index 36315446..e1cc0005 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirection.java @@ -1,76 +1,77 @@ package net.pedroksl.advanced_ae.common.helpers; +import java.util.List; +import java.util.function.IntFunction; + import com.mojang.serialization.Codec; -import io.netty.buffer.ByteBuf; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.Direction; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.ByIdMap; import net.minecraft.util.StringRepresentable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.function.IntFunction; +import io.netty.buffer.ByteBuf; public enum NullableDirection implements StringRepresentable { + DOWN(0, Direction.DOWN), + UP(1, Direction.UP), + NORTH(2, Direction.NORTH), + SOUTH(3, Direction.SOUTH), + WEST(4, Direction.WEST), + EAST(5, Direction.EAST), + NULLDIR(6, null); + + public static final IntFunction BY_ID = + ByIdMap.continuous(NullableDirection::getIndex, values(), ByIdMap.OutOfBoundsStrategy.WRAP); + private final int index; + private final Direction dir; + + NullableDirection(int index, @Nullable Direction dir) { + this.index = index; + this.dir = dir; + } + + public int getIndex() { + return this.index; + } + + public Direction getDirection() { + return this.dir; + } + + public static NullableDirection fromDirection(Direction dir) { + if (dir == null) return NULLDIR; + + return switch (dir) { + case Direction.DOWN -> DOWN; + case Direction.UP -> UP; + case Direction.NORTH -> NORTH; + case Direction.SOUTH -> SOUTH; + case Direction.WEST -> WEST; + case Direction.EAST -> EAST; + }; + } + + @SuppressWarnings("deprecation") + public static final StringRepresentable.EnumCodec CODEC = + StringRepresentable.fromEnum(NullableDirection::values); + + public static final StreamCodec STREAM_CODEC = + ByteBufCodecs.idMapper(BY_ID, NullableDirection::getIndex); + + public static final Codec> FAULT_TOLERANT_NULLABLE_LIST_CODEC = + new NullableDirectionListCodec(CODEC); + + @Override + public @NotNull String getSerializedName() { + if (this.dir == null) { + return "null"; + } - DOWN(0, Direction.DOWN), - UP(1, Direction.UP), - NORTH(2, Direction.NORTH), - SOUTH(3, Direction.SOUTH), - WEST(4, Direction.WEST), - EAST(5, Direction.EAST), - NULLDIR(6, null); - - public static final IntFunction BY_ID = - ByIdMap.continuous(NullableDirection::getIndex, values(), ByIdMap.OutOfBoundsStrategy.WRAP); - private final int index; - private final Direction dir; - - NullableDirection(int index, @Nullable Direction dir) { - this.index = index; - this.dir = dir; - } - - public int getIndex() { - return this.index; - } - - public Direction getDirection() { - return this.dir; - } - - public static NullableDirection fromDirection(Direction dir) { - if (dir == null) - return NULLDIR; - - return switch (dir) { - case Direction.DOWN -> DOWN; - case Direction.UP -> UP; - case Direction.NORTH -> NORTH; - case Direction.SOUTH -> SOUTH; - case Direction.WEST -> WEST; - case Direction.EAST -> EAST; - }; - } - - @SuppressWarnings("deprecation") - public static final StringRepresentable.EnumCodec CODEC = - StringRepresentable.fromEnum(NullableDirection::values); - - public static final StreamCodec STREAM_CODEC = - ByteBufCodecs.idMapper(BY_ID, NullableDirection::getIndex); - - public static final Codec> FAULT_TOLERANT_NULLABLE_LIST_CODEC = new NullableDirectionListCodec(CODEC); - - @Override - public @NotNull String getSerializedName() { - if (this.dir == null) { - return "null"; - } - - return this.dir.name(); - } + return this.dir.name(); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java index ec57cb39..3a01c6b3 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/helpers/NullableDirectionListCodec.java @@ -1,66 +1,69 @@ package net.pedroksl.advanced_ae.common.helpers; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + import com.mojang.datafixers.util.Pair; import com.mojang.datafixers.util.Unit; import com.mojang.serialization.*; + import org.apache.commons.lang3.mutable.MutableObject; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; - public class NullableDirectionListCodec implements Codec> { - private final Codec innerCodec; - - public NullableDirectionListCodec(Codec innerCodec) { - this.innerCodec = innerCodec; - } + private final Codec innerCodec; - @Override - public DataResult encode(List<@Nullable NullableDirection> input, DynamicOps ops, T prefix) { - final ListBuilder builder = ops.listBuilder(); + public NullableDirectionListCodec(Codec innerCodec) { + this.innerCodec = innerCodec; + } - for (var dir : input) { - if (dir == null) { - builder.add(ops.emptyMap()); - } else { - builder.add(innerCodec.encodeStart(ops, dir)); - } - } + @Override + public DataResult encode(List<@Nullable NullableDirection> input, DynamicOps ops, T prefix) { + final ListBuilder builder = ops.listBuilder(); - return builder.build(prefix); - } + for (var dir : input) { + if (dir == null) { + builder.add(ops.emptyMap()); + } else { + builder.add(innerCodec.encodeStart(ops, dir)); + } + } - @Override - public DataResult, T>> decode(DynamicOps ops, T input) { + return builder.build(prefix); + } - return ops.getList(input).setLifecycle(Lifecycle.stable()).flatMap(stream -> { - var elements = new ArrayList(); - final Stream.Builder failed = Stream.builder(); - final MutableObject> result = new MutableObject<>( - DataResult.success(Unit.INSTANCE, Lifecycle.stable())); + @Override + public DataResult, T>> decode(DynamicOps ops, T input) { - stream.accept(t -> { - if (ops.emptyMap().equals(t)) { - elements.add(null); - } else { - DataResult> element = innerCodec.decode(ops, t); - element.error().ifPresent(e -> failed.add(t)); - result.setValue(result.getValue().apply2stable((r, v) -> { - elements.add(v.getFirst()); - return r; - }, element)); - } - }); + return ops.getList(input).setLifecycle(Lifecycle.stable()).flatMap(stream -> { + var elements = new ArrayList(); + final Stream.Builder failed = Stream.builder(); + final MutableObject> result = + new MutableObject<>(DataResult.success(Unit.INSTANCE, Lifecycle.stable())); - final T errors = ops.createList(failed.build()); + stream.accept(t -> { + if (ops.emptyMap().equals(t)) { + elements.add(null); + } else { + DataResult> element = innerCodec.decode(ops, t); + element.error().ifPresent(e -> failed.add(t)); + result.setValue(result.getValue() + .apply2stable( + (r, v) -> { + elements.add(v.getFirst()); + return r; + }, + element)); + } + }); - final Pair, T> pair = Pair.of(Collections.unmodifiableList(elements), errors); + final T errors = ops.createList(failed.build()); - return result.getValue().map(unit -> pair).setPartial(pair); - }); - } + final Pair, T> pair = Pair.of(Collections.unmodifiableList(elements), errors); -} \ No newline at end of file + return result.getValue().map(unit -> pair).setPartial(pair); + }); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java b/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java index 96bf6fed..6c8bee18 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/inventory/AdvPatternEncoderHost.java @@ -1,65 +1,66 @@ package net.pedroksl.advanced_ae.common.inventory; -import appeng.api.implementations.menuobjects.ItemMenuHost; -import appeng.menu.locator.ItemMenuHostLocator; -import appeng.util.inv.AppEngInternalInventory; -import appeng.util.inv.InternalInventoryHost; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.items.AdvPatternEncoderItem; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; +import appeng.api.implementations.menuobjects.ItemMenuHost; +import appeng.menu.locator.ItemMenuHostLocator; +import appeng.util.inv.AppEngInternalInventory; +import appeng.util.inv.InternalInventoryHost; + public class AdvPatternEncoderHost extends ItemMenuHost implements InternalInventoryHost { - private final AppEngInternalInventory inOutInventory = new AppEngInternalInventory(this, 2); - private AdvPatternEncoderContainer.inventoryChangedHandler invChangeHandler; + private final AppEngInternalInventory inOutInventory = new AppEngInternalInventory(this, 2); + private AdvPatternEncoderContainer.inventoryChangedHandler invChangeHandler; - public AdvPatternEncoderHost(AdvPatternEncoderItem item, Player player, ItemMenuHostLocator locator) { - super(item, player, locator); + public AdvPatternEncoderHost(AdvPatternEncoderItem item, Player player, ItemMenuHostLocator locator) { + super(item, player, locator); - var itemTag = this.getItemStack().get(AAESingletons.STACK_TAG); - var registry = player.registryAccess(); - if (itemTag != null) { - this.inOutInventory.readFromNBT(itemTag, "inOutInventory", registry); - } - } + var itemTag = this.getItemStack().get(AAESingletons.STACK_TAG); + var registry = player.registryAccess(); + if (itemTag != null) { + this.inOutInventory.readFromNBT(itemTag, "inOutInventory", registry); + } + } - @Override - public void saveChangedInventory(AppEngInternalInventory inv) { - var itemTag = new CompoundTag(); - var registry = this.getPlayer().registryAccess(); - this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); + @Override + public void saveChangedInventory(AppEngInternalInventory inv) { + var itemTag = new CompoundTag(); + var registry = this.getPlayer().registryAccess(); + this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); - if (!itemTag.isEmpty()) { - this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); - } else { - this.getItemStack().remove(AAESingletons.STACK_TAG); - } - } + if (!itemTag.isEmpty()) { + this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); + } else { + this.getItemStack().remove(AAESingletons.STACK_TAG); + } + } - @Override - public void onChangeInventory(AppEngInternalInventory inv, int slot) { - var itemTag = this.getItemStack().getOrDefault(AAESingletons.STACK_TAG, new CompoundTag()); - var registry = this.getPlayer().registryAccess(); - if (this.inOutInventory == inv) { - this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); - } + @Override + public void onChangeInventory(AppEngInternalInventory inv, int slot) { + var itemTag = this.getItemStack().getOrDefault(AAESingletons.STACK_TAG, new CompoundTag()); + var registry = this.getPlayer().registryAccess(); + if (this.inOutInventory == inv) { + this.inOutInventory.writeToNBT(itemTag, "inOutInventory", registry); + } - if (!itemTag.isEmpty()) { - this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); - } else { - this.getItemStack().remove(AAESingletons.STACK_TAG); - } + if (!itemTag.isEmpty()) { + this.getItemStack().set(AAESingletons.STACK_TAG, itemTag); + } else { + this.getItemStack().remove(AAESingletons.STACK_TAG); + } - invChangeHandler.handleChange(inv, slot); - } + invChangeHandler.handleChange(inv, slot); + } - public AppEngInternalInventory getInventory() { - return this.inOutInventory; - } + public AppEngInternalInventory getInventory() { + return this.inOutInventory; + } - public void setInventoryChangedHandler(AdvPatternEncoderContainer.inventoryChangedHandler handler) { - invChangeHandler = handler; - } + public void setInventoryChangedHandler(AdvPatternEncoderContainer.inventoryChangedHandler handler) { + invChangeHandler = handler; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/items/AAECraftingBlockItem.java b/src/main/java/net/pedroksl/advanced_ae/common/items/AAECraftingBlockItem.java new file mode 100644 index 00000000..2840ad4b --- /dev/null +++ b/src/main/java/net/pedroksl/advanced_ae/common/items/AAECraftingBlockItem.java @@ -0,0 +1,14 @@ +package net.pedroksl.advanced_ae.common.items; + +import java.util.function.Supplier; + +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; + +import appeng.block.crafting.CraftingBlockItem; + +public class AAECraftingBlockItem extends CraftingBlockItem { + public AAECraftingBlockItem(Block id, Properties props, Supplier disassemblyExtra) { + super(id, props, disassemblyExtra); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternEncoderItem.java b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternEncoderItem.java index d251abb0..aaca5332 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternEncoderItem.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternEncoderItem.java @@ -1,11 +1,8 @@ package net.pedroksl.advanced_ae.common.items; -import appeng.api.implementations.menuobjects.IMenuItem; -import appeng.api.implementations.menuobjects.ItemMenuHost; -import appeng.items.AEBaseItem; -import appeng.menu.MenuOpener; -import appeng.menu.locator.ItemMenuHostLocator; -import appeng.menu.locator.MenuLocators; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; @@ -16,27 +13,33 @@ import net.minecraft.world.phys.BlockHitResult; import net.pedroksl.advanced_ae.common.inventory.AdvPatternEncoderHost; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class AdvPatternEncoderItem extends AEBaseItem implements IMenuItem { +import appeng.api.implementations.menuobjects.IMenuItem; +import appeng.api.implementations.menuobjects.ItemMenuHost; +import appeng.items.AEBaseItem; +import appeng.menu.MenuOpener; +import appeng.menu.locator.ItemMenuHostLocator; +import appeng.menu.locator.MenuLocators; - public AdvPatternEncoderItem() { - super(new Item.Properties().stacksTo(1)); - } +public class AdvPatternEncoderItem extends AEBaseItem implements IMenuItem { - @Override - public @NotNull InteractionResultHolder use(@NotNull Level level, @NotNull Player p, @NotNull InteractionHand hand) { - if (!level.isClientSide()) { - MenuOpener.open(AdvPatternEncoderContainer.TYPE, p, MenuLocators.forHand(p, hand)); - } - return new InteractionResultHolder<>(InteractionResult.sidedSuccess(level.isClientSide()), p.getItemInHand(hand)); - } + public AdvPatternEncoderItem() { + super(new Item.Properties().stacksTo(1)); + } - @Override - public @Nullable ItemMenuHost getMenuHost(Player player, ItemMenuHostLocator locator, @Nullable BlockHitResult hitResult) { - return new AdvPatternEncoderHost(this, player, locator); - } + @Override + public @NotNull InteractionResultHolder use( + @NotNull Level level, @NotNull Player p, @NotNull InteractionHand hand) { + if (!level.isClientSide()) { + MenuOpener.open(AdvPatternEncoderContainer.TYPE, p, MenuLocators.forHand(p, hand)); + } + return new InteractionResultHolder<>( + InteractionResult.sidedSuccess(level.isClientSide()), p.getItemInHand(hand)); + } + @Override + public @Nullable ItemMenuHost getMenuHost( + Player player, ItemMenuHostLocator locator, @Nullable BlockHitResult hitResult) { + return new AdvPatternEncoderHost(this, player, locator); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderCapacityUpgradeItem.java b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderCapacityUpgradeItem.java index 75ae7605..58941158 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderCapacityUpgradeItem.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderCapacityUpgradeItem.java @@ -1,8 +1,10 @@ package net.pedroksl.advanced_ae.common.items; -import appeng.blockentity.networking.CableBusBlockEntity; -import appeng.parts.AEBasePart; +import java.util.List; +import javax.annotation.Nonnull; + import com.glodblock.github.extendedae.util.FCUtil; + import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; @@ -19,75 +21,77 @@ import net.pedroksl.advanced_ae.common.entities.SmallAdvPatternProviderEntity; import net.pedroksl.advanced_ae.common.parts.SmallAdvPatternProviderPart; -import javax.annotation.Nonnull; -import java.util.List; +import appeng.blockentity.networking.CableBusBlockEntity; +import appeng.parts.AEBasePart; public class AdvPatternProviderCapacityUpgradeItem extends Item { - public AdvPatternProviderCapacityUpgradeItem() { - super(new Item.Properties()); - } + public AdvPatternProviderCapacityUpgradeItem() { + super(new Item.Properties()); + } - @SuppressWarnings({"rawtypes", "unchecked"}) - @Nonnull - @Override - public InteractionResult useOn(@Nonnull UseOnContext context) { - var pos = context.getClickedPos(); - var world = context.getLevel(); - var entity = world.getBlockEntity(pos); - if (entity != null) { - var ctx = new BlockPlaceContext(context); - var tClazz = entity.getClass(); - if (tClazz == SmallAdvPatternProviderEntity.class) { - var originState = world.getBlockState(pos); - var state = AAESingletons.ADV_PATTERN_PROVIDER.getStateForPlacement(ctx); - if (state == null) { - return InteractionResult.PASS; - } - for (var sp : originState.getValues().entrySet()) { - var pt = sp.getKey(); - var va = sp.getValue(); - try { - if (state.hasProperty(pt)) { - state = state.setValue((Property) pt, va); - } - } catch (Exception ignore) { - // NO-OP - } - } - BlockEntity te = new AdvPatternProviderEntity(pos, state); - FCUtil.replaceTile(world, pos, entity, te, state); - context.getItemInHand().shrink(1); - return InteractionResult.CONSUME; + @SuppressWarnings({"rawtypes", "unchecked"}) + @Nonnull + @Override + public InteractionResult useOn(@Nonnull UseOnContext context) { + var pos = context.getClickedPos(); + var world = context.getLevel(); + var entity = world.getBlockEntity(pos); + if (entity != null) { + var ctx = new BlockPlaceContext(context); + var tClazz = entity.getClass(); + if (tClazz == SmallAdvPatternProviderEntity.class) { + var originState = world.getBlockState(pos); + var state = AAESingletons.ADV_PATTERN_PROVIDER.getStateForPlacement(ctx); + if (state == null) { + return InteractionResult.PASS; + } + for (var sp : originState.getValues().entrySet()) { + var pt = sp.getKey(); + var va = sp.getValue(); + try { + if (state.hasProperty(pt)) { + state = state.setValue((Property) pt, va); + } + } catch (Exception ignore) { + // NO-OP + } + } + BlockEntity te = new AdvPatternProviderEntity(pos, state); + FCUtil.replaceTile(world, pos, entity, te, state); + context.getItemInHand().shrink(1); + return InteractionResult.CONSUME; - } else if (entity instanceof CableBusBlockEntity cable) { - Vec3 hitVec = context.getClickLocation(); - Vec3 hitInBlock = new Vec3(hitVec.x - pos.getX(), hitVec.y - pos.getY(), hitVec.z - pos.getZ()); - var part = cable.getCableBus().selectPartLocal(hitInBlock).part; - if (part instanceof AEBasePart basePart && (part.getClass() == SmallAdvPatternProviderPart.class)) { - var side = basePart.getSide(); - var contents = new CompoundTag(); + } else if (entity instanceof CableBusBlockEntity cable) { + Vec3 hitVec = context.getClickLocation(); + Vec3 hitInBlock = new Vec3(hitVec.x - pos.getX(), hitVec.y - pos.getY(), hitVec.z - pos.getZ()); + var part = cable.getCableBus().selectPartLocal(hitInBlock).part; + if (part instanceof AEBasePart basePart && (part.getClass() == SmallAdvPatternProviderPart.class)) { + var side = basePart.getSide(); + var contents = new CompoundTag(); - var partItem = AAESingletons.ADV_PATTERN_PROVIDER_PART; + var partItem = AAESingletons.ADV_PATTERN_PROVIDER_PART; - part.writeToNBT(contents, world.registryAccess()); - var p = cable.replacePart(partItem, side, context.getPlayer(), null); - if (p != null) { - p.readFromNBT(contents, world.registryAccess()); - } - } else { - return InteractionResult.PASS; - } - context.getItemInHand().shrink(1); - return InteractionResult.sidedSuccess(world.isClientSide); - } - } - return InteractionResult.PASS; - } + part.writeToNBT(contents, world.registryAccess()); + var p = cable.replacePart(partItem, side, context.getPlayer(), null); + if (p != null) { + p.readFromNBT(contents, world.registryAccess()); + } + } else { + return InteractionResult.PASS; + } + context.getItemInHand().shrink(1); + return InteractionResult.sidedSuccess(world.isClientSide); + } + } + return InteractionResult.PASS; + } - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { - super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + @Override + public void appendHoverText( + ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - tooltipComponents.add(Component.empty().append("§7Upgrades an Advanced Pattern Provider to the maximum amount of pattern slots")); - } + tooltipComponents.add(Component.empty() + .append("§7Upgrades an Advanced Pattern Provider to the maximum amount of pattern slots")); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderUpgradeItem.java b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderUpgradeItem.java index 38033ad6..a3dff640 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderUpgradeItem.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/items/AdvPatternProviderUpgradeItem.java @@ -1,13 +1,13 @@ package net.pedroksl.advanced_ae.common.items; -import appeng.blockentity.crafting.PatternProviderBlockEntity; -import appeng.blockentity.networking.CableBusBlockEntity; -import appeng.parts.AEBasePart; -import appeng.parts.crafting.PatternProviderPart; +import java.util.List; +import javax.annotation.Nonnull; + import com.glodblock.github.extendedae.common.parts.PartExPatternProvider; import com.glodblock.github.extendedae.common.tileentities.TileExPatternProvider; import com.glodblock.github.extendedae.util.FCUtil; import com.glodblock.github.glodium.util.GlodUtil; + import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; @@ -24,89 +24,95 @@ import net.pedroksl.advanced_ae.common.entities.AdvPatternProviderEntity; import net.pedroksl.advanced_ae.common.entities.SmallAdvPatternProviderEntity; -import javax.annotation.Nonnull; -import java.util.List; +import appeng.blockentity.crafting.PatternProviderBlockEntity; +import appeng.blockentity.networking.CableBusBlockEntity; +import appeng.parts.AEBasePart; +import appeng.parts.crafting.PatternProviderPart; public class AdvPatternProviderUpgradeItem extends Item { - public AdvPatternProviderUpgradeItem() { - super(new Item.Properties()); - } + public AdvPatternProviderUpgradeItem() { + super(new Item.Properties()); + } - @SuppressWarnings({"rawtypes", "unchecked"}) - @Nonnull - @Override - public InteractionResult useOn(@Nonnull UseOnContext context) { - var pos = context.getClickedPos(); - var world = context.getLevel(); - var entity = world.getBlockEntity(pos); - if (entity != null) { - var ctx = new BlockPlaceContext(context); - var tClazz = entity.getClass(); - if (tClazz == PatternProviderBlockEntity.class || - tClazz == TileExPatternProvider.class) { + @SuppressWarnings({"rawtypes", "unchecked"}) + @Nonnull + @Override + public InteractionResult useOn(@Nonnull UseOnContext context) { + var pos = context.getClickedPos(); + var world = context.getLevel(); + var entity = world.getBlockEntity(pos); + if (entity != null) { + var ctx = new BlockPlaceContext(context); + var tClazz = entity.getClass(); + if (tClazz == PatternProviderBlockEntity.class || tClazz == TileExPatternProvider.class) { - var originState = world.getBlockState(pos); - var isSmall = tClazz == PatternProviderBlockEntity.class; + var originState = world.getBlockState(pos); + var isSmall = tClazz == PatternProviderBlockEntity.class; - var state = isSmall ? - AAESingletons.SMALL_ADV_PATTERN_PROVIDER.getStateForPlacement(ctx) : - AAESingletons.ADV_PATTERN_PROVIDER.getStateForPlacement(ctx); - if (state == null) { - return InteractionResult.PASS; - } - for (var sp : originState.getValues().entrySet()) { - var pt = sp.getKey(); - var va = sp.getValue(); - try { - if (state.hasProperty(pt)) { - state = state.setValue((Property) pt, va); - } - } catch (Exception ignore) { - // NO-OP - } - } + var state = isSmall + ? AAESingletons.SMALL_ADV_PATTERN_PROVIDER.getStateForPlacement(ctx) + : AAESingletons.ADV_PATTERN_PROVIDER.getStateForPlacement(ctx); + if (state == null) { + return InteractionResult.PASS; + } + for (var sp : originState.getValues().entrySet()) { + var pt = sp.getKey(); + var va = sp.getValue(); + try { + if (state.hasProperty(pt)) { + state = state.setValue((Property) pt, va); + } + } catch (Exception ignore) { + // NO-OP + } + } - BlockEntityType tileType = isSmall ? - GlodUtil.getTileType(SmallAdvPatternProviderEntity.class) : - GlodUtil.getTileType(AdvPatternProviderEntity.class); - BlockEntity te = tileType.create(pos, state); - FCUtil.replaceTile(world, pos, entity, te, state); - context.getItemInHand().shrink(1); - return InteractionResult.CONSUME; + BlockEntityType tileType = isSmall + ? GlodUtil.getTileType(SmallAdvPatternProviderEntity.class) + : GlodUtil.getTileType(AdvPatternProviderEntity.class); + BlockEntity te = tileType.create(pos, state); + FCUtil.replaceTile(world, pos, entity, te, state); + context.getItemInHand().shrink(1); + return InteractionResult.CONSUME; - } else if (entity instanceof CableBusBlockEntity cable) { - Vec3 hitVec = context.getClickLocation(); - Vec3 hitInBlock = new Vec3(hitVec.x - pos.getX(), hitVec.y - pos.getY(), hitVec.z - pos.getZ()); - var part = cable.getCableBus().selectPartLocal(hitInBlock).part; - if (part instanceof AEBasePart basePart && (part.getClass() == PatternProviderPart.class || part.getClass() == PartExPatternProvider.class)) { - var side = basePart.getSide(); - var contents = new CompoundTag(); + } else if (entity instanceof CableBusBlockEntity cable) { + Vec3 hitVec = context.getClickLocation(); + Vec3 hitInBlock = new Vec3(hitVec.x - pos.getX(), hitVec.y - pos.getY(), hitVec.z - pos.getZ()); + var part = cable.getCableBus().selectPartLocal(hitInBlock).part; + if (part instanceof AEBasePart basePart + && (part.getClass() == PatternProviderPart.class + || part.getClass() == PartExPatternProvider.class)) { + var side = basePart.getSide(); + var contents = new CompoundTag(); - var isSmall = part.getClass() == PatternProviderPart.class; + var isSmall = part.getClass() == PatternProviderPart.class; - var partItem = isSmall ? AAESingletons.SMALL_ADV_PATTERN_PROVIDER_PART : - AAESingletons.ADV_PATTERN_PROVIDER_PART; + var partItem = isSmall + ? AAESingletons.SMALL_ADV_PATTERN_PROVIDER_PART + : AAESingletons.ADV_PATTERN_PROVIDER_PART; - part.writeToNBT(contents, world.registryAccess()); - var p = cable.replacePart(partItem, side, context.getPlayer(), null); - if (p != null) { - p.readFromNBT(contents, world.registryAccess()); - } - } else { - return InteractionResult.PASS; - } - context.getItemInHand().shrink(1); - return InteractionResult.sidedSuccess(world.isClientSide); - } - } - return InteractionResult.PASS; - } + part.writeToNBT(contents, world.registryAccess()); + var p = cable.replacePart(partItem, side, context.getPlayer(), null); + if (p != null) { + p.readFromNBT(contents, world.registryAccess()); + } + } else { + return InteractionResult.PASS; + } + context.getItemInHand().shrink(1); + return InteractionResult.sidedSuccess(world.isClientSide); + } + } + return InteractionResult.PASS; + } - @Override - public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { - super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + @Override + public void appendHoverText( + ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); - tooltipComponents.add(Component.empty().append("§7Upgrades a normal or extended pattern provider to the " + - "advanced version with the same amount of pattern slots")); - } + tooltipComponents.add(Component.empty() + .append("§7Upgrades a normal or extended pattern provider to the " + + "advanced version with the same amount of pattern slots")); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogic.java b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogic.java index 3cfa5a96..e1505fec 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogic.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogic.java @@ -2,18 +2,14 @@ import java.util.*; -import appeng.api.ids.AEComponents; -import appeng.helpers.patternprovider.*; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.component.DataComponentMap; -import net.minecraft.world.item.component.ItemContainerContents; -import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetails; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponentMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -22,8 +18,10 @@ import net.minecraft.world.Nameable; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ItemContainerContents; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetails; import appeng.api.config.Actionable; import appeng.api.config.LockCraftingMode; @@ -32,6 +30,7 @@ import appeng.api.config.YesNo; import appeng.api.crafting.IPatternDetails; import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.ids.AEComponents; import appeng.api.implementations.blockentities.ICraftingMachine; import appeng.api.implementations.blockentities.PatternContainerGroup; import appeng.api.inventories.InternalInventory; @@ -54,6 +53,7 @@ import appeng.core.localization.PlayerMessages; import appeng.core.settings.TickRates; import appeng.helpers.InterfaceLogicHost; +import appeng.helpers.patternprovider.*; import appeng.me.helpers.MachineSource; import appeng.util.inv.AppEngInternalInventory; import appeng.util.inv.InternalInventoryHost; @@ -63,805 +63,810 @@ * Shared code between the pattern provider block and part. */ public class AdvPatternProviderLogic implements InternalInventoryHost, ICraftingProvider { - private static final Logger LOGGER = LoggerFactory.getLogger(AdvPatternProviderLogic.class); - - public static final String NBT_MEMORY_CARD_PATTERNS = "patterns"; - public static final String NBT_UNLOCK_EVENT = "unlockEvent"; - public static final String NBT_UNLOCK_STACK = "unlockStack"; - public static final String NBT_PRIORITY = "priority"; - public static final String NBT_SEND_LIST = "sendList"; - public static final String NBT_SEND_DIRECTION = "sendDirection"; - public static final String NBT_DIRECTION_MAP = "directionMap"; - public static final String NBT_RETURN_INV = "returnInv"; - - private final AdvPatternProviderLogicHost host; - private final IManagedGridNode mainNode; - private final IActionSource actionSource; - private final IConfigManager configManager; - - private int priority; - - // Pattern storing logic - private final AppEngInternalInventory patternInventory; - private final List patterns = new ArrayList<>(); - /** - * Keeps track of the inputs of all the patterns. When blocking mode is enabled, if any of these is contained in the - * target, the pattern won't be pushed. Always contains keys with the secondary component dropped. - */ - private final Set patternInputs = new HashSet<>(); - // Pattern sending logic - private final List sendList = new ArrayList<>(); - private Direction sendDirection; - private HashMap directionMap = new HashMap<>(); - // Stack returning logic - private final PatternProviderReturnInventory returnInv; - - private final AdvPatternProviderTargetCache[] targetCaches = new AdvPatternProviderTargetCache[6]; - - private YesNo redstoneState = YesNo.UNDECIDED; - - @Nullable - private UnlockCraftingEvent unlockEvent; - @Nullable - private GenericStack unlockStack; - private int roundRobinIndex = 0; - - public AdvPatternProviderLogic(IManagedGridNode mainNode, AdvPatternProviderLogicHost host) { - this(mainNode, host, 36); - } - - public AdvPatternProviderLogic(IManagedGridNode mainNode, AdvPatternProviderLogicHost host, - int patternInventorySize) { - this.patternInventory = new AppEngInternalInventory(this, patternInventorySize); - this.host = host; - this.mainNode = mainNode - .setFlags(GridFlags.REQUIRE_CHANNEL) - .addService(IGridTickable.class, new Ticker()) - .addService(ICraftingProvider.class, this); - this.actionSource = new MachineSource(mainNode::getNode); - - configManager = IConfigManager.builder(this::configChanged) - .registerSetting(Settings.BLOCKING_MODE, YesNo.NO) - .registerSetting(Settings.PATTERN_ACCESS_TERMINAL, YesNo.YES) - .registerSetting(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE) - .build(); - - this.returnInv = new PatternProviderReturnInventory(() -> { - this.mainNode.ifPresent((grid, node) -> grid.getTickManager().alertDevice(node)); - this.host.saveChanges(); - }); - } - - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - this.host.saveChanges(); - - ICraftingProvider.requestUpdate(mainNode); - } - - public void writeToNBT(CompoundTag tag, HolderLookup.Provider registries) { - this.configManager.writeToNBT(tag, registries); - this.patternInventory.writeToNBT(tag, NBT_MEMORY_CARD_PATTERNS, registries); - tag.putInt(NBT_PRIORITY, this.priority); - if (unlockEvent == UnlockCraftingEvent.PULSE) { - tag.putByte(NBT_UNLOCK_EVENT, (byte) 1); - } else if (unlockEvent == UnlockCraftingEvent.RESULT) { - if (unlockStack != null) { - tag.putByte(NBT_UNLOCK_EVENT, (byte) 2); - tag.put(NBT_UNLOCK_STACK, GenericStack.writeTag(registries, unlockStack)); - } else { - LOGGER.error("Saving pattern provider {}, locked waiting for stack, but stack is null!", host); - } - } - - ListTag sendListTag = new ListTag(); - for (var toSend : sendList) { - sendListTag.add(GenericStack.writeTag(registries, toSend)); - } - tag.put(NBT_SEND_LIST, sendListTag); - - if (sendDirection != null) { - tag.putByte(NBT_SEND_DIRECTION, (byte) sendDirection.get3DDataValue()); - } - - ListTag dirListTag = new ListTag(); - if (directionMap != null) { - for (var entry : this.directionMap.entrySet()) { - CompoundTag dirTag = new CompoundTag(); - dirTag.put("aekey", entry.getKey().toTagGeneric(registries)); - Direction dir = entry.getValue(); - if (dir == null) { - dirTag.putByte("dir", (byte) -1); - } else { - dirTag.putByte("dir", (byte) dir.get3DDataValue()); - } - dirListTag.add(dirTag); - } - - } - tag.put(NBT_DIRECTION_MAP, dirListTag); - - tag.put(NBT_RETURN_INV, this.returnInv.writeToTag(registries)); - } - - public void readFromNBT(CompoundTag tag, HolderLookup.Provider registries) { - this.configManager.readFromNBT(tag, registries); - this.patternInventory.readFromNBT(tag, NBT_MEMORY_CARD_PATTERNS, registries); - this.priority = tag.getInt(NBT_PRIORITY); - - var unlockEventType = tag.getByte(NBT_UNLOCK_EVENT); - this.unlockEvent = switch (unlockEventType) { - case 0 -> null; - case 1 -> UnlockCraftingEvent.PULSE; - case 2 -> UnlockCraftingEvent.RESULT; - default -> { - LOGGER.error("Unknown unlock event type {} in NBT for pattern provider: {}", unlockEventType, tag); - yield null; - } - }; - if (this.unlockEvent == UnlockCraftingEvent.RESULT) { - this.unlockStack = GenericStack.readTag(registries, tag.getCompound(NBT_UNLOCK_STACK)); - if (this.unlockStack == null) { - LOGGER.error("Could not load unlock stack for pattern provider from NBT: {}", tag); - } - } else { - this.unlockStack = null; - } - - var sendListTag = tag.getList(NBT_SEND_LIST, Tag.TAG_COMPOUND); - for (int i = 0; i < sendListTag.size(); ++i) { - var stack = GenericStack.readTag(registries, sendListTag.getCompound(i)); - if (stack != null) { - this.addToSendList(stack.what(), stack.amount()); - } - } - if (tag.contains(NBT_SEND_DIRECTION)) { - sendDirection = Direction.from3DDataValue(tag.getByte(NBT_SEND_DIRECTION)); - } - - ListTag listTag = tag.getList(NBT_DIRECTION_MAP, Tag.TAG_COMPOUND); - for (int x = 0; x < listTag.size(); x++) { - CompoundTag compTag = listTag.getCompound(x); - AEKey key = AEKey.fromTagGeneric(registries, compTag.getCompound("aekey")); - - var dirTag = compTag.getByte("dir"); - Direction dir = dirTag == -1 ? null : Direction.from3DDataValue(dirTag); - - this.directionMap.put(key, dir); - } - - this.returnInv.readFromTag(tag.getList(NBT_RETURN_INV, Tag.TAG_COMPOUND), registries); - } - - public IConfigManager getConfigManager() { - return this.configManager; - } - - public void saveChanges() { - this.host.saveChanges(); - } - - @Override - public void saveChangedInventory(AppEngInternalInventory inv) { - this.host.saveChanges(); - } - - @Override - public void onChangeInventory(AppEngInternalInventory inv, int slot) { - this.saveChanges(); - this.updatePatterns(); - } - - @Override - public boolean isClientSide() { - Level level = this.host.getBlockEntity().getLevel(); - return level == null || level.isClientSide(); - } - - public void updatePatterns() { - patterns.clear(); - patternInputs.clear(); - - for (var stack : this.patternInventory) { - var details = PatternDetailsHelper.decodePattern(stack, this.host.getBlockEntity().getLevel()); - - if (details != null) { - patterns.add(details); - - for (var iinput : details.getInputs()) { - for (var inputCandidate : iinput.getPossibleInputs()) { - patternInputs.add(inputCandidate.what().dropSecondary()); - } - } - } - } - - ICraftingProvider.requestUpdate(mainNode); - } - - @Override - public List getAvailablePatterns() { - return this.patterns; - } - - @Override - public int getPatternPriority() { - return this.priority; - } - - /** - * Apply round-robin to list. - */ - private void rearrangeRoundRobin(List list) { - if (list.isEmpty()) { - return; - } - - roundRobinIndex %= list.size(); - for (int i = 0; i < roundRobinIndex; ++i) { - list.add(list.get(i)); - } - list.subList(0, roundRobinIndex).clear(); - } - - @Override - public boolean pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { - if (!sendList.isEmpty() || !this.mainNode.isActive() || !this.patterns.contains(patternDetails)) { - return false; - } - - var be = host.getBlockEntity(); - var level = be.getLevel(); - var advPattern = patternDetails instanceof AdvPatternDetails; - - if (getCraftingLockedReason() != LockCraftingMode.NONE) { - return false; - } - - record PushTarget(Direction direction, PatternProviderTarget target) { - } - var possibleTargets = new ArrayList(); - - // Push to crafting machines first - for (var direction : getActiveSides()) { - var adjPos = be.getBlockPos().relative(direction); - var adjBeSide = direction.getOpposite(); - - var craftingMachine = ICraftingMachine.of(level, adjPos, adjBeSide); - if (craftingMachine != null && craftingMachine.acceptsPlans()) { - if (craftingMachine.pushPattern(patternDetails, inputHolder, adjBeSide)) { - onPushPatternSuccess(patternDetails); - return true; - } - continue; - } - - var adapter = findAdapter(direction); - if (adapter == null) - continue; - - possibleTargets.add(new PushTarget(direction, adapter)); - } - - // If no dedicated crafting machine could be found, and the pattern does not support - // generic external inventories, stop here. - if (!patternDetails.supportsPushInputsToExternalInventory()) { - return false; - } - - // Rearrange for round-robin - rearrangeRoundRobin(possibleTargets); - - // Push to other kinds of blocks - for (var target : possibleTargets) { - var direction = target.direction(); - var adapter = target.target(); - - if (this.isBlocking() && adapter.containsPatternInput(this.patternInputs)) { - continue; - } - - if (advPattern && ((AdvPatternDetails) patternDetails).directionalInputsSet()) { - if (this.pushInputsDirectionally(direction, inputHolder, (AdvPatternDetails) patternDetails)) { - return true; - } - } - - if (this.adapterAcceptsAll(adapter, inputHolder)) { - patternDetails.pushInputsToExternalInventory(inputHolder, (what, amount) -> { - var inserted = adapter.insert(what, amount, Actionable.MODULATE); - if (inserted < amount) { - this.addToSendList(what, amount - inserted); - } - }); - onPushPatternSuccess(patternDetails); - this.sendDirection = direction; - this.directionMap = null; - this.sendStacksOut(); - ++roundRobinIndex; - return true; - } - } - - return false; - } - - private boolean pushInputsDirectionally(Direction direction, KeyCounter[] inputHolder, - AdvPatternDetails patternDetails) { - HashMap adapterMap = new HashMap<>(); - for (KeyCounter inputList : inputHolder) { - Direction fromSide = patternDetails.getDirectionSideForInputKey(inputList.getFirstKey()); - var adapter = findAdapter(direction, fromSide); - adapterMap.put(inputList.getFirstKey(), adapter); - - if (!this.adapterAcceptsItem(adapter, inputList)) { - // If one of the inputs fail, we can't input the items directionally - return false; - } - } - patternDetails.pushInputsToExternalInventory(inputHolder, (what, amount) -> { - var inserted = adapterMap.get(what).insert(what, amount, Actionable.MODULATE); - if (inserted < amount) { - this.addToSendList(what, amount - inserted); - } - }); - onPushPatternSuccess((IPatternDetails) patternDetails); - this.sendDirection = direction; - this.directionMap = patternDetails.getDirectionMap(); - this.sendStacksOut(); - ++roundRobinIndex; - return true; - } - - public void resetCraftingLock() { - if (unlockEvent != null) { - unlockEvent = null; - unlockStack = null; - saveChanges(); - } - } - - private void onPushPatternSuccess(IPatternDetails pattern) { - resetCraftingLock(); - - var lockMode = configManager.getSetting(Settings.LOCK_CRAFTING_MODE); - switch (lockMode) { - case LOCK_UNTIL_PULSE -> { - unlockEvent = UnlockCraftingEvent.PULSE; - saveChanges(); - } - case LOCK_UNTIL_RESULT -> { - unlockEvent = UnlockCraftingEvent.RESULT; - unlockStack = pattern.getPrimaryOutput(); - saveChanges(); - } - } - } - - /** - * Gets if the crafting lock is in effect and why. - * - * @return null if the lock isn't in effect - */ - public LockCraftingMode getCraftingLockedReason() { - var lockMode = configManager.getSetting(Settings.LOCK_CRAFTING_MODE); - if (lockMode == LockCraftingMode.LOCK_WHILE_LOW && !getRedstoneState()) { - // Crafting locked by redstone signal - return LockCraftingMode.LOCK_WHILE_LOW; - } else if (lockMode == LockCraftingMode.LOCK_WHILE_HIGH && getRedstoneState()) { - return LockCraftingMode.LOCK_WHILE_HIGH; - } else if (unlockEvent != null) { - // Crafting locked by waiting for unlock event - switch (unlockEvent) { - case PULSE -> { - return LockCraftingMode.LOCK_UNTIL_PULSE; - } - case RESULT -> { - return LockCraftingMode.LOCK_UNTIL_RESULT; - } - } - } - return LockCraftingMode.NONE; - } - - /** - * @return Null if {@linkplain #getCraftingLockedReason()} is not {@link LockCraftingMode#LOCK_UNTIL_RESULT}. - */ - @Nullable - public GenericStack getUnlockStack() { - return unlockStack; - } - - private Set getActiveSides() { - var sides = host.getTargets(); - - // Skip sides with grid connections to other pattern providers and to interfaces connected to the same network - var node = mainNode.getNode(); - if (node != null) { - for (var entry : node.getInWorldConnections().entrySet()) { - var otherNode = entry.getValue().getOtherSide(node); - if (otherNode.getOwner() instanceof PatternProviderLogicHost - || otherNode.getOwner() instanceof AdvPatternProviderLogicHost - || (otherNode.getOwner() instanceof InterfaceLogicHost - && otherNode.getGrid().equals(mainNode.getGrid()))) { - sides.remove(entry.getKey()); - } - } - } - - return sides; - } - - public boolean isBlocking() { - return this.configManager.getSetting(Settings.BLOCKING_MODE) == YesNo.YES; - } - - @Nullable - private PatternProviderTarget findAdapter(Direction side) { - return findAdapter(side, null); - } - - @Nullable - private PatternProviderTarget findAdapter(Direction side, Direction fromSide) { - if (targetCaches[side.get3DDataValue()] == null) { - var thisBe = host.getBlockEntity(); - targetCaches[side.get3DDataValue()] = new AdvPatternProviderTargetCache( - (ServerLevel) thisBe.getLevel(), - thisBe.getBlockPos().relative(side), - side.getOpposite(), - actionSource); - } - return targetCaches[side.get3DDataValue()].find(fromSide); - } - - private boolean adapterAcceptsAll(PatternProviderTarget target, KeyCounter[] inputHolder) { - for (var inputList : inputHolder) { - for (var input : inputList) { - var inserted = target.insert(input.getKey(), input.getLongValue(), Actionable.SIMULATE); - if (inserted == 0) { - return false; - } - } - } - return true; - } - - private boolean adapterAcceptsItem(PatternProviderTarget target, KeyCounter inputList) { - for (var input : inputList) { - var inserted = target.insert(input.getKey(), input.getLongValue(), Actionable.SIMULATE); - if (inserted == 0) { - return false; - } - } - return true; - } - - private void addToSendList(AEKey what, long amount) { - if (amount > 0) { - this.sendList.add(new GenericStack(what, amount)); - - this.mainNode.ifPresent((grid, node) -> grid.getTickManager().alertDevice(node)); - } - } - - private boolean sendStacksOut() { - if (sendDirection == null) { - if (!sendList.isEmpty()) { - throw new IllegalStateException("Invalid pattern provider state, this is a bug."); - } - return false; - } - - var adapter = findAdapter(sendDirection); - if (adapter == null) { - return false; - } - - boolean didSomething = false; - - for (var it = sendList.listIterator(); it.hasNext(); ) { - var stack = it.next(); - var what = stack.what(); - long amount = stack.amount(); - - if (directionMap != null) { - Direction dir = directionMap.get(what); - var newAdapter = findAdapter(sendDirection, dir); - if (newAdapter != null) { - adapter = newAdapter; - } - } - - var inserted = adapter.insert(what, amount, Actionable.MODULATE); - if (inserted >= amount) { - it.remove(); - didSomething = true; - } else if (inserted > 0) { - it.set(new GenericStack(what, amount - inserted)); - didSomething = true; - } - } - - if (sendList.isEmpty()) { - sendDirection = null; - directionMap = null; - } - - return didSomething; - } - - @Override - public boolean isBusy() { - return !sendList.isEmpty(); - } - - private boolean hasWorkToDo() { - return !sendList.isEmpty() || !returnInv.isEmpty(); - } - - private boolean doWork() { - // Note: bitwise OR to avoid short-circuiting. - return returnInv.injectIntoNetwork( - mainNode.getGrid().getStorageService().getInventory(), actionSource, this::onStackReturnedToNetwork) - | sendStacksOut(); - } - - public InternalInventory getPatternInv() { - return this.patternInventory; - } - - public void onMainNodeStateChanged() { - if (this.mainNode.isActive()) { - this.mainNode.ifPresent((grid, node) -> { - grid.getTickManager().alertDevice(node); - }); - } - } - - public void addDrops(List drops) { - for (var stack : this.patternInventory) { - drops.add(stack); - } - - for (var stack : this.sendList) { - stack.what().addDrops(stack.amount(), drops, this.host.getBlockEntity().getLevel(), - this.host.getBlockEntity().getBlockPos()); - } - - this.returnInv.addDrops(drops, this.host.getBlockEntity().getLevel(), this.host.getBlockEntity().getBlockPos()); - } - - public void clearContent() { - this.patternInventory.clear(); - this.sendList.clear(); - this.returnInv.clear(); - } - - public PatternProviderReturnInventory getReturnInv() { - return this.returnInv; - } - - public void exportSettings(DataComponentMap.Builder builder) { - builder.set(AEComponents.EXPORTED_PATTERNS, patternInventory.toItemContainerContents()); - } - - public void importSettings(DataComponentMap input, @Nullable Player player) { - var patterns = input.getOrDefault(AEComponents.EXPORTED_PATTERNS, ItemContainerContents.EMPTY); - - if (player != null && !player.level().isClientSide) { - clearPatternInventory(player); - - var desiredPatterns = new AppEngInternalInventory(patternInventory.size()); - desiredPatterns.fromItemContainerContents(patterns); - - // Restore from blank patterns in the player inv - var playerInv = player.getInventory(); - var blankPatternsAvailable = player.getAbilities().instabuild ? Integer.MAX_VALUE - : playerInv.countItem(AEItems.BLANK_PATTERN.asItem()); - var blankPatternsUsed = 0; - for (int i = 0; i < desiredPatterns.size(); i++) { - if (desiredPatterns.getStackInSlot(i).isEmpty()) { - continue; - } - - // Don't restore junk - var pattern = PatternDetailsHelper.decodePattern(desiredPatterns.getStackInSlot(i), - host.getBlockEntity().getLevel()); - if (pattern == null) { - continue; // Skip junk / broken recipes - } - - // Keep track of how many blank patterns we need - ++blankPatternsUsed; - if (blankPatternsAvailable >= blankPatternsUsed) { - if (!patternInventory.addItems(pattern.getDefinition().toStack()).isEmpty()) { - AELog.warn("Failed to add pattern to pattern provider"); - blankPatternsUsed--; - } - } - } - - // Deduct the used blank patterns - if (blankPatternsUsed > 0 && !player.getAbilities().instabuild) { - new PlayerInternalInventory(playerInv) - .removeItems(blankPatternsUsed, AEItems.BLANK_PATTERN.stack(), null); - } - - // Warn about not being able to restore all patterns due to lack of blank patterns - if (blankPatternsUsed > blankPatternsAvailable) { - player.sendSystemMessage( - PlayerMessages.MissingBlankPatterns.text(blankPatternsUsed - blankPatternsAvailable)); - } - } - } - - // Converts all patterns in this provider to blank patterns and give them to the player - private void clearPatternInventory(Player player) { - // Just clear it for creative mode players - if (player.getAbilities().instabuild) { - for (int i = 0; i < patternInventory.size(); i++) { - patternInventory.setItemDirect(i, ItemStack.EMPTY); - } - return; - } - - var playerInv = player.getInventory(); - - // Clear out any existing patterns and give them to the player - var blankPatternCount = 0; - for (int i = 0; i < patternInventory.size(); i++) { - var pattern = patternInventory.getStackInSlot(i); - // Auto-Clear encoded patterns to allow them to stack - if (pattern.is(AEItems.CRAFTING_PATTERN.asItem()) - || pattern.is(AEItems.PROCESSING_PATTERN.asItem()) - || pattern.is(AEItems.SMITHING_TABLE_PATTERN.asItem()) - || pattern.is(AEItems.STONECUTTING_PATTERN.asItem()) - || pattern.is(AEItems.BLANK_PATTERN.asItem())) { - blankPatternCount += pattern.getCount(); - } else { - // Give back any non-blank-patterns individually - playerInv.placeItemBackInInventory(pattern); - } - patternInventory.setItemDirect(i, ItemStack.EMPTY); - } - - // Place back the removed blank patterns all at once - if (blankPatternCount > 0) { - playerInv.placeItemBackInInventory(AEItems.BLANK_PATTERN.stack(blankPatternCount), false); - } - } - - private void onStackReturnedToNetwork(GenericStack genericStack) { - if (unlockEvent != UnlockCraftingEvent.RESULT) { - return; // If we're not waiting for the result, we don't care - } - - if (unlockStack == null) { - // Actually an error state... - LOGGER.error("pattern provider was waiting for RESULT, but no result was set"); - unlockEvent = null; - } else if (unlockStack.what().equals(genericStack.what())) { - var remainingAmount = unlockStack.amount() - genericStack.amount(); - if (remainingAmount <= 0) { - unlockEvent = null; - unlockStack = null; - } else { - unlockStack = new GenericStack(unlockStack.what(), remainingAmount); - } - } - } - - private class Ticker implements IGridTickable { - - @Override - public TickingRequest getTickingRequest(IGridNode node) { - return new TickingRequest(TickRates.Interface, !hasWorkToDo()); - } - - @Override - public TickRateModulation tickingRequest(IGridNode node, int ticksSinceLastCall) { - if (!mainNode.isActive()) { - return TickRateModulation.SLEEP; - } - boolean couldDoWork = doWork(); - return hasWorkToDo() ? couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER - : TickRateModulation.SLEEP; - } - } - - /** - * @return Gets the name used to show this pattern provider in the - * {@link appeng.menu.implementations.PatternAccessTermMenu}. - */ - public PatternContainerGroup getTerminalGroup() { - var host = this.host.getBlockEntity(); - var hostLevel = host.getLevel(); - - // Prefer own custom name / icon if player has named it - if (this.host instanceof Nameable nameable && nameable.hasCustomName()) { - var name = nameable.getCustomName(); - return new PatternContainerGroup( - this.host.getTerminalIcon(), - name, - List.of()); - } - - var sides = getActiveSides(); - var groups = new LinkedHashSet(sides.size()); - for (var side : sides) { - var sidePos = host.getBlockPos().relative(side); - var group = PatternContainerGroup.fromMachine(hostLevel, sidePos, side.getOpposite()); - if (group != null) { - groups.add(group); - } - } - - // If there's just one group, group by that - if (groups.size() == 1) { - return groups.iterator().next(); - } - - List tooltip = List.of(); - // If there are multiple groups, show that in the tooltip - if (groups.size() > 1) { - tooltip = new ArrayList<>(); - tooltip.add(GuiText.AdjacentToDifferentMachines.text().withStyle(ChatFormatting.BOLD)); - for (var group : groups) { - tooltip.add(group.name()); - for (var line : group.tooltip()) { - tooltip.add(Component.literal(" ").append(line)); - } - } - } - - // If nothing is adjacent, just use itself - var hostIcon = this.host.getTerminalIcon(); - return new PatternContainerGroup( - hostIcon, - hostIcon.getDisplayName(), - tooltip); - } - - public long getSortValue() { - final BlockEntity te = this.host.getBlockEntity(); - return te.getBlockPos().getZ() << 24 ^ te.getBlockPos().getX() << 8 ^ te.getBlockPos().getY(); - } - - @Nullable - public IGrid getGrid() { - return mainNode.getGrid(); - } - - public void updateRedstoneState() { - // If we're waiting for a pulse, update immediately - if (unlockEvent == UnlockCraftingEvent.PULSE && getRedstoneState()) { - unlockEvent = null; // Unlocked! - saveChanges(); - } else { - // Otherwise, just reset back to undecided - redstoneState = YesNo.UNDECIDED; - } - } - - private void configChanged(IConfigManager manager, Setting setting) { - if (setting == Settings.LOCK_CRAFTING_MODE) { - resetCraftingLock(); - } else { - saveChanges(); - } - } - - private boolean getRedstoneState() { - if (redstoneState == YesNo.UNDECIDED) { - var be = this.host.getBlockEntity(); - redstoneState = be.getLevel().hasNeighborSignal(be.getBlockPos()) - ? YesNo.YES - : YesNo.NO; - } - return redstoneState == YesNo.YES; - } + private static final Logger LOGGER = LoggerFactory.getLogger(AdvPatternProviderLogic.class); + + public static final String NBT_MEMORY_CARD_PATTERNS = "patterns"; + public static final String NBT_UNLOCK_EVENT = "unlockEvent"; + public static final String NBT_UNLOCK_STACK = "unlockStack"; + public static final String NBT_PRIORITY = "priority"; + public static final String NBT_SEND_LIST = "sendList"; + public static final String NBT_SEND_DIRECTION = "sendDirection"; + public static final String NBT_DIRECTION_MAP = "directionMap"; + public static final String NBT_RETURN_INV = "returnInv"; + + private final AdvPatternProviderLogicHost host; + private final IManagedGridNode mainNode; + private final IActionSource actionSource; + private final IConfigManager configManager; + + private int priority; + + // Pattern storing logic + private final AppEngInternalInventory patternInventory; + private final List patterns = new ArrayList<>(); + /** + * Keeps track of the inputs of all the patterns. When blocking mode is enabled, if any of these is contained in the + * target, the pattern won't be pushed. Always contains keys with the secondary component dropped. + */ + private final Set patternInputs = new HashSet<>(); + // Pattern sending logic + private final List sendList = new ArrayList<>(); + private Direction sendDirection; + private HashMap directionMap = new HashMap<>(); + // Stack returning logic + private final PatternProviderReturnInventory returnInv; + + private final AdvPatternProviderTargetCache[] targetCaches = new AdvPatternProviderTargetCache[6]; + + private YesNo redstoneState = YesNo.UNDECIDED; + + @Nullable + private UnlockCraftingEvent unlockEvent; + + @Nullable + private GenericStack unlockStack; + + private int roundRobinIndex = 0; + + public AdvPatternProviderLogic(IManagedGridNode mainNode, AdvPatternProviderLogicHost host) { + this(mainNode, host, 36); + } + + public AdvPatternProviderLogic( + IManagedGridNode mainNode, AdvPatternProviderLogicHost host, int patternInventorySize) { + this.patternInventory = new AppEngInternalInventory(this, patternInventorySize); + this.host = host; + this.mainNode = mainNode.setFlags(GridFlags.REQUIRE_CHANNEL) + .addService(IGridTickable.class, new Ticker()) + .addService(ICraftingProvider.class, this); + this.actionSource = new MachineSource(mainNode::getNode); + + configManager = IConfigManager.builder(this::configChanged) + .registerSetting(Settings.BLOCKING_MODE, YesNo.NO) + .registerSetting(Settings.PATTERN_ACCESS_TERMINAL, YesNo.YES) + .registerSetting(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE) + .build(); + + this.returnInv = new PatternProviderReturnInventory(() -> { + this.mainNode.ifPresent((grid, node) -> grid.getTickManager().alertDevice(node)); + this.host.saveChanges(); + }); + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; + this.host.saveChanges(); + + ICraftingProvider.requestUpdate(mainNode); + } + + public void writeToNBT(CompoundTag tag, HolderLookup.Provider registries) { + this.configManager.writeToNBT(tag, registries); + this.patternInventory.writeToNBT(tag, NBT_MEMORY_CARD_PATTERNS, registries); + tag.putInt(NBT_PRIORITY, this.priority); + if (unlockEvent == UnlockCraftingEvent.PULSE) { + tag.putByte(NBT_UNLOCK_EVENT, (byte) 1); + } else if (unlockEvent == UnlockCraftingEvent.RESULT) { + if (unlockStack != null) { + tag.putByte(NBT_UNLOCK_EVENT, (byte) 2); + tag.put(NBT_UNLOCK_STACK, GenericStack.writeTag(registries, unlockStack)); + } else { + LOGGER.error("Saving pattern provider {}, locked waiting for stack, but stack is null!", host); + } + } + + ListTag sendListTag = new ListTag(); + for (var toSend : sendList) { + sendListTag.add(GenericStack.writeTag(registries, toSend)); + } + tag.put(NBT_SEND_LIST, sendListTag); + + if (sendDirection != null) { + tag.putByte(NBT_SEND_DIRECTION, (byte) sendDirection.get3DDataValue()); + } + + ListTag dirListTag = new ListTag(); + if (directionMap != null) { + for (var entry : this.directionMap.entrySet()) { + CompoundTag dirTag = new CompoundTag(); + dirTag.put("aekey", entry.getKey().toTagGeneric(registries)); + Direction dir = entry.getValue(); + if (dir == null) { + dirTag.putByte("dir", (byte) -1); + } else { + dirTag.putByte("dir", (byte) dir.get3DDataValue()); + } + dirListTag.add(dirTag); + } + } + tag.put(NBT_DIRECTION_MAP, dirListTag); + + tag.put(NBT_RETURN_INV, this.returnInv.writeToTag(registries)); + } + + public void readFromNBT(CompoundTag tag, HolderLookup.Provider registries) { + this.configManager.readFromNBT(tag, registries); + this.patternInventory.readFromNBT(tag, NBT_MEMORY_CARD_PATTERNS, registries); + this.priority = tag.getInt(NBT_PRIORITY); + + var unlockEventType = tag.getByte(NBT_UNLOCK_EVENT); + this.unlockEvent = switch (unlockEventType) { + case 0 -> null; + case 1 -> UnlockCraftingEvent.PULSE; + case 2 -> UnlockCraftingEvent.RESULT; + default -> { + LOGGER.error("Unknown unlock event type {} in NBT for pattern provider: {}", unlockEventType, tag); + yield null; + }}; + if (this.unlockEvent == UnlockCraftingEvent.RESULT) { + this.unlockStack = GenericStack.readTag(registries, tag.getCompound(NBT_UNLOCK_STACK)); + if (this.unlockStack == null) { + LOGGER.error("Could not load unlock stack for pattern provider from NBT: {}", tag); + } + } else { + this.unlockStack = null; + } + + var sendListTag = tag.getList(NBT_SEND_LIST, Tag.TAG_COMPOUND); + for (int i = 0; i < sendListTag.size(); ++i) { + var stack = GenericStack.readTag(registries, sendListTag.getCompound(i)); + if (stack != null) { + this.addToSendList(stack.what(), stack.amount()); + } + } + if (tag.contains(NBT_SEND_DIRECTION)) { + sendDirection = Direction.from3DDataValue(tag.getByte(NBT_SEND_DIRECTION)); + } + + ListTag listTag = tag.getList(NBT_DIRECTION_MAP, Tag.TAG_COMPOUND); + for (int x = 0; x < listTag.size(); x++) { + CompoundTag compTag = listTag.getCompound(x); + AEKey key = AEKey.fromTagGeneric(registries, compTag.getCompound("aekey")); + + var dirTag = compTag.getByte("dir"); + Direction dir = dirTag == -1 ? null : Direction.from3DDataValue(dirTag); + + this.directionMap.put(key, dir); + } + + this.returnInv.readFromTag(tag.getList(NBT_RETURN_INV, Tag.TAG_COMPOUND), registries); + } + + public IConfigManager getConfigManager() { + return this.configManager; + } + + public void saveChanges() { + this.host.saveChanges(); + } + + @Override + public void saveChangedInventory(AppEngInternalInventory inv) { + this.host.saveChanges(); + } + + @Override + public void onChangeInventory(AppEngInternalInventory inv, int slot) { + this.saveChanges(); + this.updatePatterns(); + } + + @Override + public boolean isClientSide() { + Level level = this.host.getBlockEntity().getLevel(); + return level == null || level.isClientSide(); + } + + public void updatePatterns() { + patterns.clear(); + patternInputs.clear(); + + for (var stack : this.patternInventory) { + var details = PatternDetailsHelper.decodePattern( + stack, this.host.getBlockEntity().getLevel()); + + if (details != null) { + patterns.add(details); + + for (var iinput : details.getInputs()) { + for (var inputCandidate : iinput.getPossibleInputs()) { + patternInputs.add(inputCandidate.what().dropSecondary()); + } + } + } + } + + ICraftingProvider.requestUpdate(mainNode); + } + + @Override + public List getAvailablePatterns() { + return this.patterns; + } + + @Override + public int getPatternPriority() { + return this.priority; + } + + /** + * Apply round-robin to list. + */ + private void rearrangeRoundRobin(List list) { + if (list.isEmpty()) { + return; + } + + roundRobinIndex %= list.size(); + for (int i = 0; i < roundRobinIndex; ++i) { + list.add(list.get(i)); + } + list.subList(0, roundRobinIndex).clear(); + } + + @Override + public boolean pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { + if (!sendList.isEmpty() || !this.mainNode.isActive() || !this.patterns.contains(patternDetails)) { + return false; + } + + var be = host.getBlockEntity(); + var level = be.getLevel(); + var advPattern = patternDetails instanceof AdvPatternDetails; + + if (getCraftingLockedReason() != LockCraftingMode.NONE) { + return false; + } + + record PushTarget(Direction direction, PatternProviderTarget target) {} + var possibleTargets = new ArrayList(); + + // Push to crafting machines first + for (var direction : getActiveSides()) { + var adjPos = be.getBlockPos().relative(direction); + var adjBeSide = direction.getOpposite(); + + var craftingMachine = ICraftingMachine.of(level, adjPos, adjBeSide); + if (craftingMachine != null && craftingMachine.acceptsPlans()) { + if (craftingMachine.pushPattern(patternDetails, inputHolder, adjBeSide)) { + onPushPatternSuccess(patternDetails); + return true; + } + continue; + } + + var adapter = findAdapter(direction); + if (adapter == null) continue; + + possibleTargets.add(new PushTarget(direction, adapter)); + } + + // If no dedicated crafting machine could be found, and the pattern does not support + // generic external inventories, stop here. + if (!patternDetails.supportsPushInputsToExternalInventory()) { + return false; + } + + // Rearrange for round-robin + rearrangeRoundRobin(possibleTargets); + + // Push to other kinds of blocks + for (var target : possibleTargets) { + var direction = target.direction(); + var adapter = target.target(); + + if (this.isBlocking() && adapter.containsPatternInput(this.patternInputs)) { + continue; + } + + if (advPattern && ((AdvPatternDetails) patternDetails).directionalInputsSet()) { + if (this.pushInputsDirectionally(direction, inputHolder, (AdvPatternDetails) patternDetails)) { + return true; + } + } + + if (this.adapterAcceptsAll(adapter, inputHolder)) { + patternDetails.pushInputsToExternalInventory(inputHolder, (what, amount) -> { + var inserted = adapter.insert(what, amount, Actionable.MODULATE); + if (inserted < amount) { + this.addToSendList(what, amount - inserted); + } + }); + onPushPatternSuccess(patternDetails); + this.sendDirection = direction; + this.directionMap = null; + this.sendStacksOut(); + ++roundRobinIndex; + return true; + } + } + + return false; + } + + private boolean pushInputsDirectionally( + Direction direction, KeyCounter[] inputHolder, AdvPatternDetails patternDetails) { + HashMap adapterMap = new HashMap<>(); + for (KeyCounter inputList : inputHolder) { + Direction fromSide = patternDetails.getDirectionSideForInputKey(inputList.getFirstKey()); + var adapter = findAdapter(direction, fromSide); + adapterMap.put(inputList.getFirstKey(), adapter); + + if (!this.adapterAcceptsItem(adapter, inputList)) { + // If one of the inputs fail, we can't input the items directionally + return false; + } + } + patternDetails.pushInputsToExternalInventory(inputHolder, (what, amount) -> { + var inserted = adapterMap.get(what).insert(what, amount, Actionable.MODULATE); + if (inserted < amount) { + this.addToSendList(what, amount - inserted); + } + }); + onPushPatternSuccess((IPatternDetails) patternDetails); + this.sendDirection = direction; + this.directionMap = patternDetails.getDirectionMap(); + this.sendStacksOut(); + ++roundRobinIndex; + return true; + } + + public void resetCraftingLock() { + if (unlockEvent != null) { + unlockEvent = null; + unlockStack = null; + saveChanges(); + } + } + + private void onPushPatternSuccess(IPatternDetails pattern) { + resetCraftingLock(); + + var lockMode = configManager.getSetting(Settings.LOCK_CRAFTING_MODE); + switch (lockMode) { + case LOCK_UNTIL_PULSE -> { + unlockEvent = UnlockCraftingEvent.PULSE; + saveChanges(); + } + case LOCK_UNTIL_RESULT -> { + unlockEvent = UnlockCraftingEvent.RESULT; + unlockStack = pattern.getPrimaryOutput(); + saveChanges(); + } + } + } + + /** + * Gets if the crafting lock is in effect and why. + * + * @return null if the lock isn't in effect + */ + public LockCraftingMode getCraftingLockedReason() { + var lockMode = configManager.getSetting(Settings.LOCK_CRAFTING_MODE); + if (lockMode == LockCraftingMode.LOCK_WHILE_LOW && !getRedstoneState()) { + // Crafting locked by redstone signal + return LockCraftingMode.LOCK_WHILE_LOW; + } else if (lockMode == LockCraftingMode.LOCK_WHILE_HIGH && getRedstoneState()) { + return LockCraftingMode.LOCK_WHILE_HIGH; + } else if (unlockEvent != null) { + // Crafting locked by waiting for unlock event + switch (unlockEvent) { + case PULSE -> { + return LockCraftingMode.LOCK_UNTIL_PULSE; + } + case RESULT -> { + return LockCraftingMode.LOCK_UNTIL_RESULT; + } + } + } + return LockCraftingMode.NONE; + } + + /** + * @return Null if {@linkplain #getCraftingLockedReason()} is not {@link LockCraftingMode#LOCK_UNTIL_RESULT}. + */ + @Nullable + public GenericStack getUnlockStack() { + return unlockStack; + } + + private Set getActiveSides() { + var sides = host.getTargets(); + + // Skip sides with grid connections to other pattern providers and to interfaces connected to the same network + var node = mainNode.getNode(); + if (node != null) { + for (var entry : node.getInWorldConnections().entrySet()) { + var otherNode = entry.getValue().getOtherSide(node); + if (otherNode.getOwner() instanceof PatternProviderLogicHost + || otherNode.getOwner() instanceof AdvPatternProviderLogicHost + || (otherNode.getOwner() instanceof InterfaceLogicHost + && otherNode.getGrid().equals(mainNode.getGrid()))) { + sides.remove(entry.getKey()); + } + } + } + + return sides; + } + + public boolean isBlocking() { + return this.configManager.getSetting(Settings.BLOCKING_MODE) == YesNo.YES; + } + + @Nullable + private PatternProviderTarget findAdapter(Direction side) { + return findAdapter(side, null); + } + + @Nullable + private PatternProviderTarget findAdapter(Direction side, Direction fromSide) { + if (targetCaches[side.get3DDataValue()] == null) { + var thisBe = host.getBlockEntity(); + targetCaches[side.get3DDataValue()] = new AdvPatternProviderTargetCache( + (ServerLevel) thisBe.getLevel(), + thisBe.getBlockPos().relative(side), + side.getOpposite(), + actionSource); + } + return targetCaches[side.get3DDataValue()].find(fromSide); + } + + private boolean adapterAcceptsAll(PatternProviderTarget target, KeyCounter[] inputHolder) { + for (var inputList : inputHolder) { + for (var input : inputList) { + var inserted = target.insert(input.getKey(), input.getLongValue(), Actionable.SIMULATE); + if (inserted == 0) { + return false; + } + } + } + return true; + } + + private boolean adapterAcceptsItem(PatternProviderTarget target, KeyCounter inputList) { + for (var input : inputList) { + var inserted = target.insert(input.getKey(), input.getLongValue(), Actionable.SIMULATE); + if (inserted == 0) { + return false; + } + } + return true; + } + + private void addToSendList(AEKey what, long amount) { + if (amount > 0) { + this.sendList.add(new GenericStack(what, amount)); + + this.mainNode.ifPresent((grid, node) -> grid.getTickManager().alertDevice(node)); + } + } + + private boolean sendStacksOut() { + if (sendDirection == null) { + if (!sendList.isEmpty()) { + throw new IllegalStateException("Invalid pattern provider state, this is a bug."); + } + return false; + } + + var adapter = findAdapter(sendDirection); + if (adapter == null) { + return false; + } + + boolean didSomething = false; + + for (var it = sendList.listIterator(); it.hasNext(); ) { + var stack = it.next(); + var what = stack.what(); + long amount = stack.amount(); + + if (directionMap != null) { + Direction dir = directionMap.get(what); + var newAdapter = findAdapter(sendDirection, dir); + if (newAdapter != null) { + adapter = newAdapter; + } + } + + var inserted = adapter.insert(what, amount, Actionable.MODULATE); + if (inserted >= amount) { + it.remove(); + didSomething = true; + } else if (inserted > 0) { + it.set(new GenericStack(what, amount - inserted)); + didSomething = true; + } + } + + if (sendList.isEmpty()) { + sendDirection = null; + directionMap = null; + } + + return didSomething; + } + + @Override + public boolean isBusy() { + return !sendList.isEmpty(); + } + + private boolean hasWorkToDo() { + return !sendList.isEmpty() || !returnInv.isEmpty(); + } + + private boolean doWork() { + // Note: bitwise OR to avoid short-circuiting. + return returnInv.injectIntoNetwork( + mainNode.getGrid().getStorageService().getInventory(), + actionSource, + this::onStackReturnedToNetwork) + | sendStacksOut(); + } + + public InternalInventory getPatternInv() { + return this.patternInventory; + } + + public void onMainNodeStateChanged() { + if (this.mainNode.isActive()) { + this.mainNode.ifPresent((grid, node) -> { + grid.getTickManager().alertDevice(node); + }); + } + } + + public void addDrops(List drops) { + for (var stack : this.patternInventory) { + drops.add(stack); + } + + for (var stack : this.sendList) { + stack.what() + .addDrops( + stack.amount(), + drops, + this.host.getBlockEntity().getLevel(), + this.host.getBlockEntity().getBlockPos()); + } + + this.returnInv.addDrops( + drops, + this.host.getBlockEntity().getLevel(), + this.host.getBlockEntity().getBlockPos()); + } + + public void clearContent() { + this.patternInventory.clear(); + this.sendList.clear(); + this.returnInv.clear(); + } + + public PatternProviderReturnInventory getReturnInv() { + return this.returnInv; + } + + public void exportSettings(DataComponentMap.Builder builder) { + builder.set(AEComponents.EXPORTED_PATTERNS, patternInventory.toItemContainerContents()); + } + + public void importSettings(DataComponentMap input, @Nullable Player player) { + var patterns = input.getOrDefault(AEComponents.EXPORTED_PATTERNS, ItemContainerContents.EMPTY); + + if (player != null && !player.level().isClientSide) { + clearPatternInventory(player); + + var desiredPatterns = new AppEngInternalInventory(patternInventory.size()); + desiredPatterns.fromItemContainerContents(patterns); + + // Restore from blank patterns in the player inv + var playerInv = player.getInventory(); + var blankPatternsAvailable = player.getAbilities().instabuild + ? Integer.MAX_VALUE + : playerInv.countItem(AEItems.BLANK_PATTERN.asItem()); + var blankPatternsUsed = 0; + for (int i = 0; i < desiredPatterns.size(); i++) { + if (desiredPatterns.getStackInSlot(i).isEmpty()) { + continue; + } + + // Don't restore junk + var pattern = PatternDetailsHelper.decodePattern( + desiredPatterns.getStackInSlot(i), host.getBlockEntity().getLevel()); + if (pattern == null) { + continue; // Skip junk / broken recipes + } + + // Keep track of how many blank patterns we need + ++blankPatternsUsed; + if (blankPatternsAvailable >= blankPatternsUsed) { + if (!patternInventory + .addItems(pattern.getDefinition().toStack()) + .isEmpty()) { + AELog.warn("Failed to add pattern to pattern provider"); + blankPatternsUsed--; + } + } + } + + // Deduct the used blank patterns + if (blankPatternsUsed > 0 && !player.getAbilities().instabuild) { + new PlayerInternalInventory(playerInv) + .removeItems(blankPatternsUsed, AEItems.BLANK_PATTERN.stack(), null); + } + + // Warn about not being able to restore all patterns due to lack of blank patterns + if (blankPatternsUsed > blankPatternsAvailable) { + player.sendSystemMessage( + PlayerMessages.MissingBlankPatterns.text(blankPatternsUsed - blankPatternsAvailable)); + } + } + } + + // Converts all patterns in this provider to blank patterns and give them to the player + private void clearPatternInventory(Player player) { + // Just clear it for creative mode players + if (player.getAbilities().instabuild) { + for (int i = 0; i < patternInventory.size(); i++) { + patternInventory.setItemDirect(i, ItemStack.EMPTY); + } + return; + } + + var playerInv = player.getInventory(); + + // Clear out any existing patterns and give them to the player + var blankPatternCount = 0; + for (int i = 0; i < patternInventory.size(); i++) { + var pattern = patternInventory.getStackInSlot(i); + // Auto-Clear encoded patterns to allow them to stack + if (pattern.is(AEItems.CRAFTING_PATTERN.asItem()) + || pattern.is(AEItems.PROCESSING_PATTERN.asItem()) + || pattern.is(AEItems.SMITHING_TABLE_PATTERN.asItem()) + || pattern.is(AEItems.STONECUTTING_PATTERN.asItem()) + || pattern.is(AEItems.BLANK_PATTERN.asItem())) { + blankPatternCount += pattern.getCount(); + } else { + // Give back any non-blank-patterns individually + playerInv.placeItemBackInInventory(pattern); + } + patternInventory.setItemDirect(i, ItemStack.EMPTY); + } + + // Place back the removed blank patterns all at once + if (blankPatternCount > 0) { + playerInv.placeItemBackInInventory(AEItems.BLANK_PATTERN.stack(blankPatternCount), false); + } + } + + private void onStackReturnedToNetwork(GenericStack genericStack) { + if (unlockEvent != UnlockCraftingEvent.RESULT) { + return; // If we're not waiting for the result, we don't care + } + + if (unlockStack == null) { + // Actually an error state... + LOGGER.error("pattern provider was waiting for RESULT, but no result was set"); + unlockEvent = null; + } else if (unlockStack.what().equals(genericStack.what())) { + var remainingAmount = unlockStack.amount() - genericStack.amount(); + if (remainingAmount <= 0) { + unlockEvent = null; + unlockStack = null; + } else { + unlockStack = new GenericStack(unlockStack.what(), remainingAmount); + } + } + } + + private class Ticker implements IGridTickable { + + @Override + public TickingRequest getTickingRequest(IGridNode node) { + return new TickingRequest(TickRates.Interface, !hasWorkToDo()); + } + + @Override + public TickRateModulation tickingRequest(IGridNode node, int ticksSinceLastCall) { + if (!mainNode.isActive()) { + return TickRateModulation.SLEEP; + } + boolean couldDoWork = doWork(); + return hasWorkToDo() + ? couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER + : TickRateModulation.SLEEP; + } + } + + /** + * @return Gets the name used to show this pattern provider in the + * {@link appeng.menu.implementations.PatternAccessTermMenu}. + */ + public PatternContainerGroup getTerminalGroup() { + var host = this.host.getBlockEntity(); + var hostLevel = host.getLevel(); + + // Prefer own custom name / icon if player has named it + if (this.host instanceof Nameable nameable && nameable.hasCustomName()) { + var name = nameable.getCustomName(); + return new PatternContainerGroup(this.host.getTerminalIcon(), name, List.of()); + } + + var sides = getActiveSides(); + var groups = new LinkedHashSet(sides.size()); + for (var side : sides) { + var sidePos = host.getBlockPos().relative(side); + var group = PatternContainerGroup.fromMachine(hostLevel, sidePos, side.getOpposite()); + if (group != null) { + groups.add(group); + } + } + + // If there's just one group, group by that + if (groups.size() == 1) { + return groups.iterator().next(); + } + + List tooltip = List.of(); + // If there are multiple groups, show that in the tooltip + if (groups.size() > 1) { + tooltip = new ArrayList<>(); + tooltip.add(GuiText.AdjacentToDifferentMachines.text().withStyle(ChatFormatting.BOLD)); + for (var group : groups) { + tooltip.add(group.name()); + for (var line : group.tooltip()) { + tooltip.add(Component.literal(" ").append(line)); + } + } + } + + // If nothing is adjacent, just use itself + var hostIcon = this.host.getTerminalIcon(); + return new PatternContainerGroup(hostIcon, hostIcon.getDisplayName(), tooltip); + } + + public long getSortValue() { + final BlockEntity te = this.host.getBlockEntity(); + return te.getBlockPos().getZ() << 24 + ^ te.getBlockPos().getX() << 8 + ^ te.getBlockPos().getY(); + } + + @Nullable + public IGrid getGrid() { + return mainNode.getGrid(); + } + + public void updateRedstoneState() { + // If we're waiting for a pulse, update immediately + if (unlockEvent == UnlockCraftingEvent.PULSE && getRedstoneState()) { + unlockEvent = null; // Unlocked! + saveChanges(); + } else { + // Otherwise, just reset back to undecided + redstoneState = YesNo.UNDECIDED; + } + } + + private void configChanged(IConfigManager manager, Setting setting) { + if (setting == Settings.LOCK_CRAFTING_MODE) { + resetCraftingLock(); + } else { + saveChanges(); + } + } + + private boolean getRedstoneState() { + if (redstoneState == YesNo.UNDECIDED) { + var be = this.host.getBlockEntity(); + redstoneState = be.getLevel().hasNeighborSignal(be.getBlockPos()) ? YesNo.YES : YesNo.NO; + } + return redstoneState == YesNo.YES; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost.java b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost.java index 9d4fc619..6f15c1c2 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost.java @@ -2,16 +2,14 @@ import java.util.EnumSet; -import appeng.menu.locator.MenuHostLocator; -import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderContainer; -import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; import org.jetbrains.annotations.Nullable; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderContainer; +import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; -import appeng.helpers.patternprovider.PatternContainer; import appeng.api.config.Settings; import appeng.api.config.YesNo; import appeng.api.implementations.blockentities.PatternContainerGroup; @@ -21,80 +19,82 @@ import appeng.api.util.IConfigManager; import appeng.api.util.IConfigurableObject; import appeng.helpers.IPriorityHost; +import appeng.helpers.patternprovider.PatternContainer; import appeng.menu.ISubMenu; import appeng.menu.MenuOpener; +import appeng.menu.locator.MenuHostLocator; public interface AdvPatternProviderLogicHost extends IConfigurableObject, IPriorityHost, PatternContainer { - AdvPatternProviderLogic getLogic(); - - /** - * @return The block entity that is in-world and hosts the interface. - */ - BlockEntity getBlockEntity(); - - EnumSet getTargets(); - - void saveChanges(); - - default int numberOfPatternSlots() { - return getLogic().getPatternInv().size(); - } - - @Override - default IConfigManager getConfigManager() { - return getLogic().getConfigManager(); - } - - @Override - default int getPriority() { - return getLogic().getPriority(); - } - - @Override - default void setPriority(int newValue) { - getLogic().setPriority(newValue); - } - - default void openMenu(Player player, MenuHostLocator locator) { - if (numberOfPatternSlots() == 36) { - MenuOpener.open(AdvPatternProviderContainer.TYPE, player, locator); - } else { - MenuOpener.open(SmallAdvPatternProviderContainer.TYPE, player, locator); - } - } - - @Override - default void returnToMainMenu(Player player, ISubMenu subMenu) { - if (numberOfPatternSlots() == 36) { - MenuOpener.returnTo(AdvPatternProviderContainer.TYPE, player, subMenu.getLocator()); - } else { - MenuOpener.returnTo(SmallAdvPatternProviderContainer.TYPE, player, subMenu.getLocator()); - } - } - - @Override - default @Nullable IGrid getGrid() { - return getLogic().getGrid(); - } - - AEItemKey getTerminalIcon(); - - @Override - default boolean isVisibleInTerminal() { - return getLogic().getConfigManager().getSetting(Settings.PATTERN_ACCESS_TERMINAL) == YesNo.YES; - } - - @Override - default InternalInventory getTerminalPatternInventory() { - return getLogic().getPatternInv(); - } - - @Override - default long getTerminalSortOrder() { - return getLogic().getSortValue(); - } - - default PatternContainerGroup getTerminalGroup() { - return getLogic().getTerminalGroup(); - } -} \ No newline at end of file + AdvPatternProviderLogic getLogic(); + + /** + * @return The block entity that is in-world and hosts the interface. + */ + BlockEntity getBlockEntity(); + + EnumSet getTargets(); + + void saveChanges(); + + default int numberOfPatternSlots() { + return getLogic().getPatternInv().size(); + } + + @Override + default IConfigManager getConfigManager() { + return getLogic().getConfigManager(); + } + + @Override + default int getPriority() { + return getLogic().getPriority(); + } + + @Override + default void setPriority(int newValue) { + getLogic().setPriority(newValue); + } + + default void openMenu(Player player, MenuHostLocator locator) { + if (numberOfPatternSlots() == 36) { + MenuOpener.open(AdvPatternProviderContainer.TYPE, player, locator); + } else { + MenuOpener.open(SmallAdvPatternProviderContainer.TYPE, player, locator); + } + } + + @Override + default void returnToMainMenu(Player player, ISubMenu subMenu) { + if (numberOfPatternSlots() == 36) { + MenuOpener.returnTo(AdvPatternProviderContainer.TYPE, player, subMenu.getLocator()); + } else { + MenuOpener.returnTo(SmallAdvPatternProviderContainer.TYPE, player, subMenu.getLocator()); + } + } + + @Override + default @Nullable IGrid getGrid() { + return getLogic().getGrid(); + } + + AEItemKey getTerminalIcon(); + + @Override + default boolean isVisibleInTerminal() { + return getLogic().getConfigManager().getSetting(Settings.PATTERN_ACCESS_TERMINAL) == YesNo.YES; + } + + @Override + default InternalInventory getTerminalPatternInventory() { + return getLogic().getPatternInv(); + } + + @Override + default long getTerminalSortOrder() { + return getLogic().getSortValue(); + } + + default PatternContainerGroup getTerminalGroup() { + return getLogic().getTerminalGroup(); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderTargetCache.java b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderTargetCache.java index 02625eb0..84d4fefa 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderTargetCache.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/logic/AdvPatternProviderTargetCache.java @@ -5,82 +5,80 @@ import java.util.Map; import java.util.Set; -import appeng.api.AECapabilities; -import appeng.helpers.patternprovider.PatternProviderTarget; -import net.neoforged.neoforge.capabilities.BlockCapabilityCache; import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.neoforged.neoforge.capabilities.BlockCapabilityCache; +import appeng.api.AECapabilities; import appeng.api.behaviors.ExternalStorageStrategy; import appeng.api.config.Actionable; import appeng.api.networking.security.IActionSource; import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKeyType; import appeng.api.storage.MEStorage; +import appeng.helpers.patternprovider.PatternProviderTarget; import appeng.me.storage.CompositeStorage; import appeng.parts.automation.StackWorldBehaviors; class AdvPatternProviderTargetCache { - private final BlockCapabilityCache cache; - private final Direction direction; - private final IActionSource src; - private final HashMap> strategiesMap = new HashMap<>(); + private final BlockCapabilityCache cache; + private final Direction direction; + private final IActionSource src; + private final HashMap> strategiesMap = new HashMap<>(); - AdvPatternProviderTargetCache(ServerLevel l, BlockPos pos, Direction direction, IActionSource src) { - this.cache = BlockCapabilityCache.create(AECapabilities.ME_STORAGE, l, pos, direction); - this.direction = direction; - this.src = src; - for (Direction dir : Direction.values()) { - this.strategiesMap.put(dir, StackWorldBehaviors.createExternalStorageStrategies(l, pos, dir)); - } - } + AdvPatternProviderTargetCache(ServerLevel l, BlockPos pos, Direction direction, IActionSource src) { + this.cache = BlockCapabilityCache.create(AECapabilities.ME_STORAGE, l, pos, direction); + this.direction = direction; + this.src = src; + for (Direction dir : Direction.values()) { + this.strategiesMap.put(dir, StackWorldBehaviors.createExternalStorageStrategies(l, pos, dir)); + } + } - @Nullable - PatternProviderTarget find(Direction fromSide) { - // our capability first: allows any storage channel - Direction side = fromSide == null ? direction : fromSide; - var meStorage = cache.getCapability(); - if (meStorage != null) { - return wrapMeStorage(meStorage); - } + @Nullable + PatternProviderTarget find(Direction fromSide) { + // our capability first: allows any storage channel + Direction side = fromSide == null ? direction : fromSide; + var meStorage = cache.getCapability(); + if (meStorage != null) { + return wrapMeStorage(meStorage); + } - // otherwise fall back to the platform capability - var externalStorages = new IdentityHashMap(2); - for (var entry : strategiesMap.get(side).entrySet()) { - var wrapper = entry.getValue().createWrapper(false, () -> { - }); - if (wrapper != null) { - externalStorages.put(entry.getKey(), wrapper); - } - } + // otherwise fall back to the platform capability + var externalStorages = new IdentityHashMap(2); + for (var entry : strategiesMap.get(side).entrySet()) { + var wrapper = entry.getValue().createWrapper(false, () -> {}); + if (wrapper != null) { + externalStorages.put(entry.getKey(), wrapper); + } + } - if (!externalStorages.isEmpty()) { - return wrapMeStorage(new CompositeStorage(externalStorages)); - } + if (!externalStorages.isEmpty()) { + return wrapMeStorage(new CompositeStorage(externalStorages)); + } - return null; - } + return null; + } - private PatternProviderTarget wrapMeStorage(MEStorage storage) { - return new PatternProviderTarget() { - @Override - public long insert(AEKey what, long amount, Actionable type) { - return storage.insert(what, amount, type, src); - } + private PatternProviderTarget wrapMeStorage(MEStorage storage) { + return new PatternProviderTarget() { + @Override + public long insert(AEKey what, long amount, Actionable type) { + return storage.insert(what, amount, type, src); + } - @Override - public boolean containsPatternInput(Set patternInputs) { - for (var stack : storage.getAvailableStacks()) { - if (patternInputs.contains(stack.getKey().dropSecondary())) { - return true; - } - } - return false; - } - }; - } + @Override + public boolean containsPatternInput(Set patternInputs) { + for (var stack : storage.getAvailableStacks()) { + if (patternInputs.contains(stack.getKey().dropSecondary())) { + return true; + } + } + return false; + } + }; + } } - diff --git a/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java b/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java index 26c6d1a0..a25e47a4 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/parts/AdvPatternProviderPart.java @@ -1,19 +1,11 @@ package net.pedroksl.advanced_ae.common.parts; -import appeng.api.AECapabilities; -import appeng.api.networking.GridFlags; -import appeng.api.networking.IGridNodeListener; -import appeng.api.parts.IPartCollisionHelper; -import appeng.api.parts.IPartItem; -import appeng.api.parts.IPartModel; -import appeng.api.parts.RegisterPartCapabilitiesEvent; -import appeng.api.stacks.AEItemKey; -import appeng.api.util.AECableType; -import appeng.core.AppEngBase; -import appeng.menu.locator.MenuLocators; -import appeng.parts.AEBasePart; -import appeng.parts.PartModel; -import appeng.util.SettingsFrom; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; + +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; @@ -28,159 +20,167 @@ import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; -import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; +import appeng.api.AECapabilities; +import appeng.api.networking.GridFlags; +import appeng.api.networking.IGridNodeListener; +import appeng.api.parts.IPartCollisionHelper; +import appeng.api.parts.IPartItem; +import appeng.api.parts.IPartModel; +import appeng.api.parts.RegisterPartCapabilitiesEvent; +import appeng.api.stacks.AEItemKey; +import appeng.api.util.AECableType; +import appeng.core.AppEngBase; +import appeng.menu.locator.MenuLocators; +import appeng.parts.AEBasePart; +import appeng.parts.PartModel; +import appeng.util.SettingsFrom; public class AdvPatternProviderPart extends AEBasePart implements AdvPatternProviderLogicHost { - public static List MODELS = Arrays.asList( - ResourceLocation.fromNamespaceAndPath(AdvancedAE.MOD_ID, "part/adv_pattern_provider_base"), - ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_on"), - ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_off"), - ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_has_channel") - ); - - public static final PartModel MODELS_OFF = new PartModel(MODELS.getFirst(), MODELS.get(2)); - public static final PartModel MODELS_ON = new PartModel(MODELS.getFirst(), MODELS.get(1)); - public static final PartModel MODELS_HAS_CHANNEL = new PartModel(MODELS.getFirst(), MODELS.get(3)); - - protected final AdvPatternProviderLogic logic; - - public AdvPatternProviderPart(IPartItem partItem) { - super(partItem); - this.getMainNode().setFlags(GridFlags.REQUIRE_CHANNEL); - - this.logic = this.createLogic(); - } - - public AdvPatternProviderPart(IPartItem partItem, int slots) { - super(partItem); - this.getMainNode().setFlags(GridFlags.REQUIRE_CHANNEL); - - this.logic = this.createLogic(slots); - } - - @Override - public void onMainNodeStateChanged(IGridNodeListener.State reason) { - super.onMainNodeStateChanged(reason); - this.logic.onMainNodeStateChanged(); - } - - @Override - public void getBoxes(IPartCollisionHelper bch) { - bch.addBox(2.0, 2.0, 14.0, 14.0, 14.0, 16.0); - bch.addBox(5.0, 5.0, 12.0, 11.0, 11.0, 14.0); - } - - @Override - public void readFromNBT(CompoundTag data, HolderLookup.Provider registries) { - super.readFromNBT(data, registries); - this.logic.readFromNBT(data, registries); - } - - @Override - public void writeToNBT(CompoundTag data, HolderLookup.Provider registries) { - super.writeToNBT(data, registries); - this.logic.writeToNBT(data, registries); - } - - @Override - public void addToWorld() { - super.addToWorld(); - this.logic.updatePatterns(); - } - - @Override - public void addAdditionalDrops(List drops, boolean wrenched) { - super.addAdditionalDrops(drops, wrenched); - this.logic.addDrops(drops); - } - - @Override - public float getCableConnectionLength(AECableType cable) { - return 4.0F; - } - - @Override - public void exportSettings(SettingsFrom mode, DataComponentMap.Builder builder) { - super.exportSettings(mode, builder); - if (mode == SettingsFrom.MEMORY_CARD) { - this.logic.exportSettings(builder); - } - } - - @Override - public void importSettings(SettingsFrom mode, DataComponentMap input, @Nullable Player player) { - super.importSettings(mode, input, player); - if (mode == SettingsFrom.MEMORY_CARD) { - this.logic.importSettings(input, player); - } - } - - @Override - public void onNeighborChanged(BlockGetter level, BlockPos pos, BlockPos neighbor) { - this.logic.updateRedstoneState(); - } - - @Override - public boolean onUseWithoutItem(Player p, Vec3 pos) { - if (!p.getCommandSenderWorld().isClientSide()) { - this.openMenu(p, MenuLocators.forPart(this)); - } - return true; - } - - protected AdvPatternProviderLogic createLogic() { - return createLogic(36); - } - - protected AdvPatternProviderLogic createLogic(int slots) { - return new AdvPatternProviderLogic(this.getMainNode(), this, slots); - } - - @Override - public AdvPatternProviderLogic getLogic() { - return this.logic; - } - - @Override - public EnumSet getTargets() { - return EnumSet.of(this.getSide()); - } - - @Override - public void saveChanges() { - this.getHost().markForSave(); - } - - @Override - public AEItemKey getTerminalIcon() { - return AEItemKey.of(this.getPartItem()); - } - - @Override - public IPartModel getStaticModels() { - if (this.isActive() && this.isPowered()) { - return MODELS_HAS_CHANNEL; - } else { - return this.isPowered() ? MODELS_ON : MODELS_OFF; - } - } - - @SuppressWarnings("UnstableApiUsage") - public static void registerCapability(RegisterPartCapabilitiesEvent event) { - event.register( - AECapabilities.GENERIC_INTERNAL_INV, - (part, context) -> part.logic.getReturnInv(), - AdvPatternProviderPart.class - ); - } - - @Override - public ItemStack getMainMenuIcon() { - return new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER_PART); - } + public static List MODELS = Arrays.asList( + ResourceLocation.fromNamespaceAndPath(AdvancedAE.MOD_ID, "part/adv_pattern_provider_base"), + ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_on"), + ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_off"), + ResourceLocation.fromNamespaceAndPath(AppEngBase.MOD_ID, "part/interface_has_channel")); + + public static final PartModel MODELS_OFF = new PartModel(MODELS.getFirst(), MODELS.get(2)); + public static final PartModel MODELS_ON = new PartModel(MODELS.getFirst(), MODELS.get(1)); + public static final PartModel MODELS_HAS_CHANNEL = new PartModel(MODELS.getFirst(), MODELS.get(3)); + + protected final AdvPatternProviderLogic logic; + + public AdvPatternProviderPart(IPartItem partItem) { + super(partItem); + this.getMainNode().setFlags(GridFlags.REQUIRE_CHANNEL); + + this.logic = this.createLogic(); + } + + public AdvPatternProviderPart(IPartItem partItem, int slots) { + super(partItem); + this.getMainNode().setFlags(GridFlags.REQUIRE_CHANNEL); + + this.logic = this.createLogic(slots); + } + + @Override + public void onMainNodeStateChanged(IGridNodeListener.State reason) { + super.onMainNodeStateChanged(reason); + this.logic.onMainNodeStateChanged(); + } + + @Override + public void getBoxes(IPartCollisionHelper bch) { + bch.addBox(2.0, 2.0, 14.0, 14.0, 14.0, 16.0); + bch.addBox(5.0, 5.0, 12.0, 11.0, 11.0, 14.0); + } + + @Override + public void readFromNBT(CompoundTag data, HolderLookup.Provider registries) { + super.readFromNBT(data, registries); + this.logic.readFromNBT(data, registries); + } + + @Override + public void writeToNBT(CompoundTag data, HolderLookup.Provider registries) { + super.writeToNBT(data, registries); + this.logic.writeToNBT(data, registries); + } + + @Override + public void addToWorld() { + super.addToWorld(); + this.logic.updatePatterns(); + } + + @Override + public void addAdditionalDrops(List drops, boolean wrenched) { + super.addAdditionalDrops(drops, wrenched); + this.logic.addDrops(drops); + } + + @Override + public float getCableConnectionLength(AECableType cable) { + return 4.0F; + } + + @Override + public void exportSettings(SettingsFrom mode, DataComponentMap.Builder builder) { + super.exportSettings(mode, builder); + if (mode == SettingsFrom.MEMORY_CARD) { + this.logic.exportSettings(builder); + } + } + + @Override + public void importSettings(SettingsFrom mode, DataComponentMap input, @Nullable Player player) { + super.importSettings(mode, input, player); + if (mode == SettingsFrom.MEMORY_CARD) { + this.logic.importSettings(input, player); + } + } + + @Override + public void onNeighborChanged(BlockGetter level, BlockPos pos, BlockPos neighbor) { + this.logic.updateRedstoneState(); + } + + @Override + public boolean onUseWithoutItem(Player p, Vec3 pos) { + if (!p.getCommandSenderWorld().isClientSide()) { + this.openMenu(p, MenuLocators.forPart(this)); + } + return true; + } + + protected AdvPatternProviderLogic createLogic() { + return createLogic(36); + } + + protected AdvPatternProviderLogic createLogic(int slots) { + return new AdvPatternProviderLogic(this.getMainNode(), this, slots); + } + + @Override + public AdvPatternProviderLogic getLogic() { + return this.logic; + } + + @Override + public EnumSet getTargets() { + return EnumSet.of(this.getSide()); + } + + @Override + public void saveChanges() { + this.getHost().markForSave(); + } + + @Override + public AEItemKey getTerminalIcon() { + return AEItemKey.of(this.getPartItem()); + } + + @Override + public IPartModel getStaticModels() { + if (this.isActive() && this.isPowered()) { + return MODELS_HAS_CHANNEL; + } else { + return this.isPowered() ? MODELS_ON : MODELS_OFF; + } + } + + @SuppressWarnings("UnstableApiUsage") + public static void registerCapability(RegisterPartCapabilitiesEvent event) { + event.register( + AECapabilities.GENERIC_INTERNAL_INV, + (part, context) -> part.logic.getReturnInv(), + AdvPatternProviderPart.class); + } + + @Override + public ItemStack getMainMenuIcon() { + return new ItemStack(AAESingletons.ADV_PATTERN_PROVIDER_PART); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/parts/SmallAdvPatternProviderPart.java b/src/main/java/net/pedroksl/advanced_ae/common/parts/SmallAdvPatternProviderPart.java index e2da38cc..f1f5db4a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/parts/SmallAdvPatternProviderPart.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/parts/SmallAdvPatternProviderPart.java @@ -1,27 +1,27 @@ package net.pedroksl.advanced_ae.common.parts; +import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.common.AAESingletons; + import appeng.api.AECapabilities; import appeng.api.parts.IPartItem; import appeng.api.parts.RegisterPartCapabilitiesEvent; -import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.AAESingletons; public class SmallAdvPatternProviderPart extends AdvPatternProviderPart { - public SmallAdvPatternProviderPart(IPartItem partItem) { - super(partItem, 9); - } + public SmallAdvPatternProviderPart(IPartItem partItem) { + super(partItem, 9); + } - @SuppressWarnings("UnstableApiUsage") - public static void registerCapability(RegisterPartCapabilitiesEvent event) { - event.register( - AECapabilities.GENERIC_INTERNAL_INV, - (part, context) -> part.logic.getReturnInv(), - SmallAdvPatternProviderPart.class - ); - } + @SuppressWarnings("UnstableApiUsage") + public static void registerCapability(RegisterPartCapabilitiesEvent event) { + event.register( + AECapabilities.GENERIC_INTERNAL_INV, + (part, context) -> part.logic.getReturnInv(), + SmallAdvPatternProviderPart.class); + } - @Override - public ItemStack getMainMenuIcon() { - return new ItemStack(AAESingletons.SMALL_ADV_PATTERN_PROVIDER_PART); - } + @Override + public ItemStack getMainMenuIcon() { + return new ItemStack(AAESingletons.SMALL_ADV_PATTERN_PROVIDER_PART); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetails.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetails.java index db9692b4..3113b79c 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetails.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetails.java @@ -1,18 +1,19 @@ package net.pedroksl.advanced_ae.common.patterns; +import java.util.HashMap; + +import net.minecraft.core.Direction; + import appeng.api.crafting.IPatternDetails; import appeng.api.stacks.AEKey; import appeng.api.stacks.KeyCounter; -import net.minecraft.core.Direction; - -import java.util.HashMap; public interface AdvPatternDetails { - boolean directionalInputsSet(); + boolean directionalInputsSet(); - HashMap getDirectionMap(); + HashMap getDirectionMap(); - Direction getDirectionSideForInputKey(AEKey key); + Direction getDirectionSideForInputKey(AEKey key); - void pushInputsToExternalInventory(KeyCounter[] inputHolder, IPatternDetails.PatternInputSink inputSink); + void pushInputsToExternalInventory(KeyCounter[] inputHolder, IPatternDetails.PatternInputSink inputSink); } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetailsEncoder.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetailsEncoder.java index 7ce6cdfc..2ec29f1c 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetailsEncoder.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvPatternDetailsEncoder.java @@ -1,20 +1,21 @@ package net.pedroksl.advanced_ae.common.patterns; -import appeng.api.stacks.AEKey; -import appeng.api.stacks.GenericStack; +import java.util.HashMap; +import java.util.List; + import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.pedroksl.advanced_ae.common.AAESingletons; -import java.util.HashMap; -import java.util.List; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; public final class AdvPatternDetailsEncoder { - public static ItemStack encodeProcessingPattern(List sparseInputs, List sparseOutputs, - HashMap dirMap) { - ItemStack stack = new ItemStack(AAESingletons.ADV_PROCESSING_PATTERN); - AdvProcessingPattern.encode(stack, sparseInputs, sparseOutputs, dirMap); - return stack; - } -} \ No newline at end of file + public static ItemStack encodeProcessingPattern( + List sparseInputs, List sparseOutputs, HashMap dirMap) { + ItemStack stack = new ItemStack(AAESingletons.ADV_PROCESSING_PATTERN); + AdvProcessingPattern.encode(stack, sparseInputs, sparseOutputs, dirMap); + return stack; + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java index ab65e170..b53fca93 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/AdvProcessingPattern.java @@ -1,15 +1,10 @@ package net.pedroksl.advanced_ae.common.patterns; -import appeng.api.crafting.IPatternDetails; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.api.crafting.PatternDetailsTooltip; -import appeng.api.ids.AEComponents; -import appeng.api.stacks.AEItemKey; -import appeng.api.stacks.AEKey; -import appeng.api.stacks.GenericStack; -import appeng.api.stacks.KeyCounter; -import appeng.crafting.pattern.AEProcessingPattern; +import java.util.*; +import javax.annotation.Nullable; + import com.google.common.base.Preconditions; + import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.ListTag; @@ -19,240 +14,253 @@ import net.pedroksl.advanced_ae.common.AAESingletons; import net.pedroksl.advanced_ae.common.helpers.NullableDirection; -import javax.annotation.Nullable; -import java.util.*; +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.crafting.PatternDetailsTooltip; +import appeng.api.ids.AEComponents; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.stacks.KeyCounter; +import appeng.crafting.pattern.AEProcessingPattern; public class AdvProcessingPattern implements IPatternDetails, AdvPatternDetails { - private final AEItemKey definition; - private final List sparseInputs, sparseOutputs; - private final AdvProcessingPattern.Input[] inputs; - private final List condensedOutputs; - private final HashMap dirMap = new HashMap<>(); - - public AdvProcessingPattern(AEItemKey definition) { - this.definition = definition; - - EncodedAdvProcessingPattern encodedPattern = definition.get(AAESingletons.ENCODED_ADV_PROCESSING_PATTERN); - if (encodedPattern == null) { - throw new IllegalArgumentException("Given item does not encode an advanced processing pattern: " + definition); - } else if (encodedPattern.containsMissingContent()) { - throw new IllegalArgumentException("Pattern references missing content"); - } - this.sparseInputs = encodedPattern.sparseInputs(); - this.sparseOutputs = encodedPattern.sparseOutputs(); - var condensedInputs = condenseStacks(sparseInputs); - this.inputs = new AdvProcessingPattern.Input[condensedInputs.size()]; - for (int i = 0; i < inputs.length; ++i) { - inputs[i] = new AdvProcessingPattern.Input(condensedInputs.get(i)); - } - - // Ordering is preserved by condenseStacks - this.condensedOutputs = condenseStacks(sparseOutputs); - - var inputs = encodedPattern.sparseInputs(); - var directions = encodedPattern.directionList(); - for (var x = 0; x < inputs.size(); x++) { - var input = inputs.get(x); - var direction = directions.get(x); - - if (input != null) { - this.dirMap.put(input.what(), direction.getDirection()); - } - } - } - - public static void encode(ItemStack stack, List sparseInputs, List sparseOutputs, - @Nullable HashMap dirMap) { - if (sparseInputs.stream().noneMatch(Objects::nonNull)) { - throw new IllegalArgumentException("At least one input must be non-null."); - } else { - Objects.requireNonNull(sparseOutputs.getFirst(), "The first (primary) output must be non-null."); - - NullableDirection[] nullDirArray = new NullableDirection[sparseInputs.size()]; - Arrays.fill(nullDirArray, NullableDirection.NULLDIR); - List directionList = Arrays.asList(nullDirArray); - if (dirMap != null) { - for (var x = 0; x < sparseInputs.size(); x++) { - var input = sparseInputs.get(x); - if (input != null) { - directionList.set(x, NullableDirection.fromDirection(dirMap.get(input.what()))); - } - } - } - stack.set(AAESingletons.ENCODED_ADV_PROCESSING_PATTERN, new EncodedAdvProcessingPattern(sparseInputs, - sparseOutputs, directionList)); - } - } - - public AEProcessingPattern getAEProcessingPattern(Level level) { - var stack = PatternDetailsHelper.encodeProcessingPattern(this.getSparseInputs(), this.getSparseOutputs()); - if (stack == null) - return null; - - var pattern = PatternDetailsHelper.decodePattern(stack, level); - if (!(pattern instanceof AEProcessingPattern aePattern)) { - return null; - } - - return aePattern; - } - - @Override - public int hashCode() { - return definition.hashCode(); - } - - @Override - public boolean equals(Object obj) { - return obj != null && obj.getClass() == getClass() && ((AdvProcessingPattern) obj).definition.equals(definition); - } - - @Override - public AEItemKey getDefinition() { - return definition; - } - - @Override - public IInput[] getInputs() { - return inputs; - } - - @Override - public List getOutputs() { - return condensedOutputs; - } - - public List getSparseInputs() { - return sparseInputs; - } - - public List getSparseOutputs() { - return sparseOutputs; - } - - public HashMap getDirectionMap() { - return dirMap; - } - - @Override - public boolean directionalInputsSet() { - return !dirMap.isEmpty(); - } - - @Override - public Direction getDirectionSideForInputKey(AEKey key) { - return this.dirMap.get(key); - } - - @Override - public void pushInputsToExternalInventory(KeyCounter[] inputHolder, PatternInputSink inputSink) { - if (sparseInputs.size() == inputs.length) { - // No compression -> no need to reorder - IPatternDetails.super.pushInputsToExternalInventory(inputHolder, inputSink); - return; - } - - var allInputs = new KeyCounter(); - for (var counter : inputHolder) { - allInputs.addAll(counter); - } - - // Push according to sparse input order - for (var sparseInput : sparseInputs) { - if (sparseInput == null) { - continue; - } - - var key = sparseInput.what(); - var amount = sparseInput.amount(); - long available = allInputs.get(key); - - if (available < amount) { - throw new RuntimeException("Expected at least %d of %s when pushing pattern, but only %d available" - .formatted(amount, key, available)); - } - - inputSink.pushInput(key, amount); - allInputs.remove(key, amount); - } - } - - public static PatternDetailsTooltip getInvalidPatternTooltip(ItemStack stack, Level level, - @org.jetbrains.annotations.Nullable Exception cause, TooltipFlag flags) { - var tooltip = new PatternDetailsTooltip(PatternDetailsTooltip.OUTPUT_TEXT_PRODUCES); - - var encodedPattern = stack.get(AEComponents.ENCODED_PROCESSING_PATTERN); - if (encodedPattern != null) { - encodedPattern.sparseInputs().stream().filter(Objects::nonNull).forEach(tooltip::addInput); - encodedPattern.sparseOutputs().stream().filter(Objects::nonNull).forEach(tooltip::addOutput); - } - - return tooltip; - } - - private static class Input implements IInput { - private final GenericStack[] template; - private final long multiplier; - - private Input(GenericStack stack) { - this.template = new GenericStack[]{new GenericStack(stack.what(), 1)}; - this.multiplier = stack.amount(); - } - - @Override - public GenericStack[] getPossibleInputs() { - return template; - } - - @Override - public long getMultiplier() { - return multiplier; - } - - @Override - public boolean isValid(AEKey input, Level level) { - return input.matches(template[0]); - } - - @org.jetbrains.annotations.Nullable - @Override - public AEKey getRemainingKey(AEKey template) { - return null; - } - } - - private static ListTag encodeStackList(GenericStack[] stacks, HolderLookup.Provider registries) { - ListTag tag = new ListTag(); - boolean foundStack = false; - for (var stack : stacks) { - tag.add(GenericStack.writeTag(registries, stack)); - if (stack != null && stack.amount() > 0) { - foundStack = true; - } - } - Preconditions.checkArgument(foundStack, "List passed to pattern must contain at least one stack."); - return tag; - } - - private static List condenseStacks(List sparseInput) { - // Use a linked map to preserve ordering. - var map = new LinkedHashMap(); - - for (var input : sparseInput) { - if (input != null) { - map.merge(input.what(), input.amount(), Long::sum); - } - } - - if (map.isEmpty()) { - throw new IllegalStateException("No pattern here!"); - } - - List out = new ArrayList<>(map.size()); - for (var entry : map.entrySet()) { - out.add(new GenericStack(entry.getKey(), entry.getValue())); - } - return out; - } + private final AEItemKey definition; + private final List sparseInputs, sparseOutputs; + private final AdvProcessingPattern.Input[] inputs; + private final List condensedOutputs; + private final HashMap dirMap = new HashMap<>(); + + public AdvProcessingPattern(AEItemKey definition) { + this.definition = definition; + + EncodedAdvProcessingPattern encodedPattern = definition.get(AAESingletons.ENCODED_ADV_PROCESSING_PATTERN); + if (encodedPattern == null) { + throw new IllegalArgumentException( + "Given item does not encode an advanced processing pattern: " + definition); + } else if (encodedPattern.containsMissingContent()) { + throw new IllegalArgumentException("Pattern references missing content"); + } + this.sparseInputs = encodedPattern.sparseInputs(); + this.sparseOutputs = encodedPattern.sparseOutputs(); + var condensedInputs = condenseStacks(sparseInputs); + this.inputs = new AdvProcessingPattern.Input[condensedInputs.size()]; + for (int i = 0; i < inputs.length; ++i) { + inputs[i] = new AdvProcessingPattern.Input(condensedInputs.get(i)); + } + + // Ordering is preserved by condenseStacks + this.condensedOutputs = condenseStacks(sparseOutputs); + + var inputs = encodedPattern.sparseInputs(); + var directions = encodedPattern.directionList(); + for (var x = 0; x < inputs.size(); x++) { + var input = inputs.get(x); + var direction = directions.get(x); + + if (input != null) { + this.dirMap.put(input.what(), direction.getDirection()); + } + } + } + + public static void encode( + ItemStack stack, + List sparseInputs, + List sparseOutputs, + @Nullable HashMap dirMap) { + if (sparseInputs.stream().noneMatch(Objects::nonNull)) { + throw new IllegalArgumentException("At least one input must be non-null."); + } else { + Objects.requireNonNull(sparseOutputs.getFirst(), "The first (primary) output must be non-null."); + + NullableDirection[] nullDirArray = new NullableDirection[sparseInputs.size()]; + Arrays.fill(nullDirArray, NullableDirection.NULLDIR); + List directionList = Arrays.asList(nullDirArray); + if (dirMap != null) { + for (var x = 0; x < sparseInputs.size(); x++) { + var input = sparseInputs.get(x); + if (input != null) { + directionList.set(x, NullableDirection.fromDirection(dirMap.get(input.what()))); + } + } + } + stack.set( + AAESingletons.ENCODED_ADV_PROCESSING_PATTERN, + new EncodedAdvProcessingPattern(sparseInputs, sparseOutputs, directionList)); + } + } + + public AEProcessingPattern getAEProcessingPattern(Level level) { + var stack = PatternDetailsHelper.encodeProcessingPattern(this.getSparseInputs(), this.getSparseOutputs()); + if (stack == null) return null; + + var pattern = PatternDetailsHelper.decodePattern(stack, level); + if (!(pattern instanceof AEProcessingPattern aePattern)) { + return null; + } + + return aePattern; + } + + @Override + public int hashCode() { + return definition.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj != null + && obj.getClass() == getClass() + && ((AdvProcessingPattern) obj).definition.equals(definition); + } + + @Override + public AEItemKey getDefinition() { + return definition; + } + + @Override + public IInput[] getInputs() { + return inputs; + } + + @Override + public List getOutputs() { + return condensedOutputs; + } + + public List getSparseInputs() { + return sparseInputs; + } + + public List getSparseOutputs() { + return sparseOutputs; + } + + public HashMap getDirectionMap() { + return dirMap; + } + + @Override + public boolean directionalInputsSet() { + return !dirMap.isEmpty(); + } + + @Override + public Direction getDirectionSideForInputKey(AEKey key) { + return this.dirMap.get(key); + } + + @Override + public void pushInputsToExternalInventory(KeyCounter[] inputHolder, PatternInputSink inputSink) { + if (sparseInputs.size() == inputs.length) { + // No compression -> no need to reorder + IPatternDetails.super.pushInputsToExternalInventory(inputHolder, inputSink); + return; + } + + var allInputs = new KeyCounter(); + for (var counter : inputHolder) { + allInputs.addAll(counter); + } + + // Push according to sparse input order + for (var sparseInput : sparseInputs) { + if (sparseInput == null) { + continue; + } + + var key = sparseInput.what(); + var amount = sparseInput.amount(); + long available = allInputs.get(key); + + if (available < amount) { + throw new RuntimeException("Expected at least %d of %s when pushing pattern, but only %d available" + .formatted(amount, key, available)); + } + + inputSink.pushInput(key, amount); + allInputs.remove(key, amount); + } + } + + public static PatternDetailsTooltip getInvalidPatternTooltip( + ItemStack stack, Level level, @org.jetbrains.annotations.Nullable Exception cause, TooltipFlag flags) { + var tooltip = new PatternDetailsTooltip(PatternDetailsTooltip.OUTPUT_TEXT_PRODUCES); + + var encodedPattern = stack.get(AEComponents.ENCODED_PROCESSING_PATTERN); + if (encodedPattern != null) { + encodedPattern.sparseInputs().stream().filter(Objects::nonNull).forEach(tooltip::addInput); + encodedPattern.sparseOutputs().stream().filter(Objects::nonNull).forEach(tooltip::addOutput); + } + + return tooltip; + } + + private static class Input implements IInput { + private final GenericStack[] template; + private final long multiplier; + + private Input(GenericStack stack) { + this.template = new GenericStack[] {new GenericStack(stack.what(), 1)}; + this.multiplier = stack.amount(); + } + + @Override + public GenericStack[] getPossibleInputs() { + return template; + } + + @Override + public long getMultiplier() { + return multiplier; + } + + @Override + public boolean isValid(AEKey input, Level level) { + return input.matches(template[0]); + } + + @org.jetbrains.annotations.Nullable + @Override + public AEKey getRemainingKey(AEKey template) { + return null; + } + } + + private static ListTag encodeStackList(GenericStack[] stacks, HolderLookup.Provider registries) { + ListTag tag = new ListTag(); + boolean foundStack = false; + for (var stack : stacks) { + tag.add(GenericStack.writeTag(registries, stack)); + if (stack != null && stack.amount() > 0) { + foundStack = true; + } + } + Preconditions.checkArgument(foundStack, "List passed to pattern must contain at least one stack."); + return tag; + } + + private static List condenseStacks(List sparseInput) { + // Use a linked map to preserve ordering. + var map = new LinkedHashMap(); + + for (var input : sparseInput) { + if (input != null) { + map.merge(input.what(), input.amount(), Long::sum); + } + } + + if (map.isEmpty()) { + throw new IllegalStateException("No pattern here!"); + } + + List out = new ArrayList<>(map.size()); + for (var entry : map.entrySet()) { + out.add(new GenericStack(entry.getKey(), entry.getValue())); + } + return out; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java b/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java index f5976982..c7787789 100644 --- a/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java +++ b/src/main/java/net/pedroksl/advanced_ae/common/patterns/EncodedAdvProcessingPattern.java @@ -1,49 +1,52 @@ package net.pedroksl.advanced_ae.common.patterns; -import appeng.api.stacks.GenericStack; -import appeng.core.definitions.AEItems; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; + import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.pedroksl.advanced_ae.common.helpers.NullableDirection; -import java.util.Collections; -import java.util.List; -import java.util.stream.Stream; +import appeng.api.stacks.GenericStack; +import appeng.core.definitions.AEItems; public record EncodedAdvProcessingPattern( - List sparseInputs, - List sparseOutputs, - List directionList) { - public EncodedAdvProcessingPattern { - sparseInputs = Collections.unmodifiableList(sparseInputs); - sparseOutputs = Collections.unmodifiableList(sparseOutputs); - directionList = Collections.unmodifiableList(directionList); - } - - public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( - GenericStack.FAULT_TOLERANT_NULLABLE_LIST_CODEC.fieldOf("sparseInputs") - .forGetter(EncodedAdvProcessingPattern::sparseInputs), - GenericStack.FAULT_TOLERANT_NULLABLE_LIST_CODEC.fieldOf("sparseOutputs") - .forGetter(EncodedAdvProcessingPattern::sparseOutputs), - NullableDirection.FAULT_TOLERANT_NULLABLE_LIST_CODEC.fieldOf("directionMap") - .forGetter(EncodedAdvProcessingPattern::directionList)) - .apply(builder, EncodedAdvProcessingPattern::new)); - - public static final StreamCodec STREAM_CODEC = StreamCodec - .composite( - GenericStack.STREAM_CODEC.apply(ByteBufCodecs.list()), - EncodedAdvProcessingPattern::sparseInputs, - GenericStack.STREAM_CODEC.apply(ByteBufCodecs.list()), - EncodedAdvProcessingPattern::sparseOutputs, - NullableDirection.STREAM_CODEC.apply(ByteBufCodecs.list()), - EncodedAdvProcessingPattern::directionList, - EncodedAdvProcessingPattern::new); - - public boolean containsMissingContent() { - return Stream.concat(sparseInputs.stream(), sparseOutputs.stream()) - .anyMatch(stack -> stack != null && AEItems.MISSING_CONTENT.is(stack.what())); - } -} \ No newline at end of file + List sparseInputs, List sparseOutputs, List directionList) { + public EncodedAdvProcessingPattern { + sparseInputs = Collections.unmodifiableList(sparseInputs); + sparseOutputs = Collections.unmodifiableList(sparseOutputs); + directionList = Collections.unmodifiableList(directionList); + } + + public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( + GenericStack.FAULT_TOLERANT_NULLABLE_LIST_CODEC + .fieldOf("sparseInputs") + .forGetter(EncodedAdvProcessingPattern::sparseInputs), + GenericStack.FAULT_TOLERANT_NULLABLE_LIST_CODEC + .fieldOf("sparseOutputs") + .forGetter(EncodedAdvProcessingPattern::sparseOutputs), + NullableDirection.FAULT_TOLERANT_NULLABLE_LIST_CODEC + .fieldOf("directionMap") + .forGetter(EncodedAdvProcessingPattern::directionList)) + .apply(builder, EncodedAdvProcessingPattern::new)); + + public static final StreamCodec STREAM_CODEC = + StreamCodec.composite( + GenericStack.STREAM_CODEC.apply(ByteBufCodecs.list()), + EncodedAdvProcessingPattern::sparseInputs, + GenericStack.STREAM_CODEC.apply(ByteBufCodecs.list()), + EncodedAdvProcessingPattern::sparseOutputs, + NullableDirection.STREAM_CODEC.apply(ByteBufCodecs.list()), + EncodedAdvProcessingPattern::directionList, + EncodedAdvProcessingPattern::new); + + public boolean containsMissingContent() { + return Stream.concat(sparseInputs.stream(), sparseOutputs.stream()) + .anyMatch(stack -> stack != null && AEItems.MISSING_CONTENT.is(stack.what())); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockStateProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockStateProvider.java index bf00027b..77f93fd1 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockStateProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockStateProvider.java @@ -5,6 +5,7 @@ import net.neoforged.neoforge.client.model.generators.BlockStateProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.pedroksl.advanced_ae.AdvancedAE; +import net.pedroksl.advanced_ae.common.AAESingletons; public class AAEBlockStateProvider extends BlockStateProvider { public AAEBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) { @@ -13,6 +14,7 @@ public AAEBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) @Override protected void registerStatesAndModels() { + //blockWithItem(AAESingletons.ADV_CO_PROCESSING_UNIT); } private void blockWithItem(Block blockRegistryObject) { diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockTagProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockTagProvider.java index 34c31fcf..3b511fda 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockTagProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEBlockTagProvider.java @@ -1,23 +1,24 @@ package net.pedroksl.advanced_ae.datagen; +import java.util.concurrent.CompletableFuture; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.neoforged.neoforge.common.data.BlockTagsProvider; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.pedroksl.advanced_ae.AdvancedAE; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.CompletableFuture; public class AAEBlockTagProvider extends BlockTagsProvider { - public AAEBlockTagProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, AdvancedAE.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(HolderLookup.@NotNull Provider provider) { + public AAEBlockTagProvider( + PackOutput output, + CompletableFuture lookupProvider, + @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, AdvancedAE.MOD_ID, existingFileHelper); + } - } + @Override + protected void addTags(HolderLookup.@NotNull Provider provider) {} } diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEDataGen.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEDataGen.java index c12437b3..17c9c2a0 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEDataGen.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEDataGen.java @@ -8,16 +8,16 @@ @EventBusSubscriber(modid = AdvancedAE.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class AAEDataGen { - @SubscribeEvent - public static void onGatherData(GatherDataEvent dataEvent) { - var pack = dataEvent.getGenerator().getVanillaPack(true); - var fileHelper = dataEvent.getExistingFileHelper(); - var lookup = dataEvent.getLookupProvider(); - pack.addProvider(p -> new AAEBlockStateProvider(p, fileHelper)); - var blockTagsProvider = pack.addProvider(p -> new AAEBlockTagProvider(p, lookup, fileHelper)); - pack.addProvider(p -> new AAEItemModelProvider(p, fileHelper)); - pack.addProvider(p -> new AAEItemTagProvider(p, lookup, blockTagsProvider.contentsGetter(), fileHelper)); - pack.addProvider(p -> new AAELootTableProvider(p, lookup)); - pack.addProvider(p -> new AAERecipeProvider(p, lookup)); - } + @SubscribeEvent + public static void onGatherData(GatherDataEvent dataEvent) { + var pack = dataEvent.getGenerator().getVanillaPack(true); + var fileHelper = dataEvent.getExistingFileHelper(); + var lookup = dataEvent.getLookupProvider(); + pack.addProvider(p -> new AAEBlockStateProvider(p, fileHelper)); + var blockTagsProvider = pack.addProvider(p -> new AAEBlockTagProvider(p, lookup, fileHelper)); + pack.addProvider(p -> new AAEItemModelProvider(p, fileHelper)); + pack.addProvider(p -> new AAEItemTagProvider(p, lookup, blockTagsProvider.contentsGetter(), fileHelper)); + pack.addProvider(p -> new AAELootTableProvider(p, lookup)); + pack.addProvider(p -> new AAERecipeProvider(p, lookup)); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java index a56d5e75..b5890f9b 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemModelProvider.java @@ -6,24 +6,20 @@ import net.pedroksl.advanced_ae.common.AAESingletons; public class AAEItemModelProvider extends net.neoforged.neoforge.client.model.generators.ItemModelProvider { - public AAEItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { - super(output, AdvancedAE.MOD_ID, existingFileHelper); - } + public AAEItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { + super(output, AdvancedAE.MOD_ID, existingFileHelper); + } - @Override - protected void registerModels() { - flatSingleLayer("adv_processing_pattern"); - flatSingleLayer(AAESingletons.ADV_PATTERN_ENCODER.getRegistryName().getPath()); - flatSingleLayer("adv_pattern_provider_upgrade"); - flatSingleLayer("adv_pattern_provider_capacity_upgrade"); - } + @Override + protected void registerModels() { + flatSingleLayer("adv_processing_pattern"); + flatSingleLayer(AAESingletons.ADV_PATTERN_ENCODER.getRegistryName().getPath()); + flatSingleLayer("adv_pattern_provider_upgrade"); + flatSingleLayer("adv_pattern_provider_capacity_upgrade"); + } - private void flatSingleLayer(String item) { - var id = AdvancedAE.id(item); - singleTexture( - id.getPath(), - mcLoc("item/generated"), - "layer0", - AdvancedAE.id("item/" + item)); - } + private void flatSingleLayer(String item) { + var id = AdvancedAE.id(item); + singleTexture(id.getPath(), mcLoc("item/generated"), "layer0", AdvancedAE.id("item/" + item)); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemTagProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemTagProvider.java index 8a8479ff..197a17ea 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemTagProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAEItemTagProvider.java @@ -1,28 +1,33 @@ package net.pedroksl.advanced_ae.datagen; +import java.util.concurrent.CompletableFuture; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.ItemTagsProvider; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.pedroksl.advanced_ae.AdvancedAE; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.concurrent.CompletableFuture; public class AAEItemTagProvider extends ItemTagsProvider { - public AAEItemTagProvider(PackOutput pOutput, CompletableFuture pLookupProvider, CompletableFuture> pBlockTags, @Nullable ExistingFileHelper existingFileHelper) { - super(pOutput, pLookupProvider, pBlockTags, AdvancedAE.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(HolderLookup.@NotNull Provider provider) { -// tag(AAETags.EX_PATTERN_PROVIDER) -// .add(AAEItemAndBlock.ADV_PATTERN_PROVIDER_PART) -// .add(AAEItemAndBlock.ADV_PATTERN_PROVIDER.asItem()); -// tag(AAETags.EX_INTERFACE) -// .add(AAEItemAndBlock.ADV_INTERFACE_PART) -// .add(AAEItemAndBlock.ADV_INTERFACE.asItem()); - } + public AAEItemTagProvider( + PackOutput pOutput, + CompletableFuture pLookupProvider, + CompletableFuture> pBlockTags, + @Nullable ExistingFileHelper existingFileHelper) { + super(pOutput, pLookupProvider, pBlockTags, AdvancedAE.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.@NotNull Provider provider) { + // tag(AAETags.EX_PATTERN_PROVIDER) + // .add(AAEItemAndBlock.ADV_PATTERN_PROVIDER_PART) + // .add(AAEItemAndBlock.ADV_PATTERN_PROVIDER.asItem()); + // tag(AAETags.EX_INTERFACE) + // .add(AAEItemAndBlock.ADV_INTERFACE_PART) + // .add(AAEItemAndBlock.ADV_INTERFACE.asItem()); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAELootTableProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAELootTableProvider.java index 1b12567e..01550827 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAELootTableProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAELootTableProvider.java @@ -1,5 +1,8 @@ package net.pedroksl.advanced_ae.datagen; +import java.util.*; +import java.util.concurrent.CompletableFuture; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.loot.BlockLootSubProvider; @@ -7,24 +10,24 @@ import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import java.util.*; -import java.util.concurrent.CompletableFuture; - public class AAELootTableProvider extends LootTableProvider { - public AAELootTableProvider(PackOutput p, CompletableFuture provider) { - super(p, Collections.emptySet(), Collections.singletonList(new LootTableProvider.SubProviderEntry(AAESubProvider::new, LootContextParamSets.BLOCK)), provider); - } - - public static class AAESubProvider extends BlockLootSubProvider { + public AAELootTableProvider(PackOutput p, CompletableFuture provider) { + super( + p, + Collections.emptySet(), + Collections.singletonList( + new LootTableProvider.SubProviderEntry(AAESubProvider::new, LootContextParamSets.BLOCK)), + provider); + } - protected AAESubProvider(HolderLookup.Provider provider) { - super(Collections.emptySet(), FeatureFlagSet.of(), provider); - } + public static class AAESubProvider extends BlockLootSubProvider { - @Override - protected void generate() { + protected AAESubProvider(HolderLookup.Provider provider) { + super(Collections.emptySet(), FeatureFlagSet.of(), provider); + } - } - } + @Override + protected void generate() {} + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/datagen/AAERecipeProvider.java b/src/main/java/net/pedroksl/advanced_ae/datagen/AAERecipeProvider.java index c0e04c86..9ab16e31 100644 --- a/src/main/java/net/pedroksl/advanced_ae/datagen/AAERecipeProvider.java +++ b/src/main/java/net/pedroksl/advanced_ae/datagen/AAERecipeProvider.java @@ -1,10 +1,12 @@ package net.pedroksl.advanced_ae.datagen; -import appeng.core.definitions.AEBlocks; -import appeng.core.definitions.AEItems; -import appeng.datagen.providers.tags.ConventionTags; +import java.util.concurrent.CompletableFuture; + import com.glodblock.github.extendedae.common.EAESingletons; import com.glodblock.github.extendedae.recipe.CrystalAssemblerRecipeBuilder; + +import org.jetbrains.annotations.NotNull; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.*; @@ -12,74 +14,68 @@ import net.neoforged.neoforge.common.Tags; import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.common.AAESingletons; -import org.jetbrains.annotations.NotNull; -import java.util.concurrent.CompletableFuture; +import appeng.core.definitions.AEBlocks; +import appeng.core.definitions.AEItems; +import appeng.datagen.providers.tags.ConventionTags; public class AAERecipeProvider extends RecipeProvider { - public AAERecipeProvider(PackOutput p, CompletableFuture provider) { - super(p, provider); - } + public AAERecipeProvider(PackOutput p, CompletableFuture provider) { + super(p, provider); + } - @Override - protected void buildRecipes(@NotNull RecipeOutput c) { - ShapedRecipeBuilder - .shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER) - .pattern("PR") - .pattern("EL") - .define('P', EAESingletons.EX_PATTERN_PROVIDER) - .define('R', Items.REDSTONE) - .define('E', Items.ENDER_PEARL) - .define('L', AEItems.LOGIC_PROCESSOR) - .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) - .save(c, "advpatpro"); - ShapedRecipeBuilder - .shaped(RecipeCategory.MISC, AAESingletons.SMALL_ADV_PATTERN_PROVIDER) - .pattern("PR") - .pattern("EL") - .define('P', AEBlocks.PATTERN_PROVIDER) - .define('R', Items.REDSTONE) - .define('E', Items.ENDER_PEARL) - .define('L', AEItems.LOGIC_PROCESSOR) - .unlockedBy("hasItem", has(AEBlocks.PATTERN_PROVIDER)) - .save(c, "smalladvpatpro"); - ShapelessRecipeBuilder - .shapeless(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER) - .requires(AAESingletons.ADV_PATTERN_PROVIDER_PART) - .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) - .save(c, "advpatpro2"); - ShapelessRecipeBuilder - .shapeless(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER_PART) - .requires(AAESingletons.ADV_PATTERN_PROVIDER) - .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) - .save(c, "advpatpropart"); - ShapedRecipeBuilder - .shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_ENCODER) - .pattern("QRQ") - .pattern("RER") - .pattern("QRQ") - .define('Q', AEItems.CERTUS_QUARTZ_CRYSTAL_CHARGED) - .define('R', Items.REDSTONE) - .define('E', AEItems.ENGINEERING_PROCESSOR) - .unlockedBy("hasItem", has(AEItems.BLANK_PATTERN)) - .save(c, "advpartenc"); - ShapedRecipeBuilder - .shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER_UPGRADE) - .pattern("IR") - .pattern("EL") - .define('I', Tags.Items.INGOTS) - .define('R', Items.REDSTONE) - .define('E', Items.ENDER_PEARL) - .define('L', AEItems.LOGIC_PROCESSOR) - .unlockedBy("hasItem", has(AEItems.BLANK_PATTERN)) - .save(c, "smallappupgrade"); - CrystalAssemblerRecipeBuilder - .assemble(AAESingletons.ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE) - .input(Tags.Items.INGOTS) - .input(AEItems.CAPACITY_CARD, 3) - .input(Items.CRAFTING_TABLE, 3) - .input(EAESingletons.CONCURRENT_PROCESSOR) - .input(ConventionTags.GLASS_CABLE, 6) - .save(c, AdvancedAE.id("largeappupgrade")); - } + @Override + protected void buildRecipes(@NotNull RecipeOutput c) { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER) + .pattern("PR") + .pattern("EL") + .define('P', EAESingletons.EX_PATTERN_PROVIDER) + .define('R', Items.REDSTONE) + .define('E', Items.ENDER_PEARL) + .define('L', AEItems.LOGIC_PROCESSOR) + .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) + .save(c, "advpatpro"); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, AAESingletons.SMALL_ADV_PATTERN_PROVIDER) + .pattern("PR") + .pattern("EL") + .define('P', AEBlocks.PATTERN_PROVIDER) + .define('R', Items.REDSTONE) + .define('E', Items.ENDER_PEARL) + .define('L', AEItems.LOGIC_PROCESSOR) + .unlockedBy("hasItem", has(AEBlocks.PATTERN_PROVIDER)) + .save(c, "smalladvpatpro"); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER) + .requires(AAESingletons.ADV_PATTERN_PROVIDER_PART) + .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) + .save(c, "advpatpro2"); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER_PART) + .requires(AAESingletons.ADV_PATTERN_PROVIDER) + .unlockedBy("hasItem", has(EAESingletons.EX_PATTERN_PROVIDER)) + .save(c, "advpatpropart"); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_ENCODER) + .pattern("QRQ") + .pattern("RER") + .pattern("QRQ") + .define('Q', AEItems.CERTUS_QUARTZ_CRYSTAL_CHARGED) + .define('R', Items.REDSTONE) + .define('E', AEItems.ENGINEERING_PROCESSOR) + .unlockedBy("hasItem", has(AEItems.BLANK_PATTERN)) + .save(c, "advpartenc"); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, AAESingletons.ADV_PATTERN_PROVIDER_UPGRADE) + .pattern("IR") + .pattern("EL") + .define('I', Tags.Items.INGOTS) + .define('R', Items.REDSTONE) + .define('E', Items.ENDER_PEARL) + .define('L', AEItems.LOGIC_PROCESSOR) + .unlockedBy("hasItem", has(AEItems.BLANK_PATTERN)) + .save(c, "smallappupgrade"); + CrystalAssemblerRecipeBuilder.assemble(AAESingletons.ADV_PATTERN_PROVIDER_CAPACITY_UPGRADE) + .input(Tags.Items.INGOTS) + .input(AEItems.CAPACITY_CARD, 3) + .input(Items.CRAFTING_TABLE, 3) + .input(EAESingletons.CONCURRENT_PROCESSOR) + .input(ConventionTags.GLASS_CABLE, 6) + .save(c, AdvancedAE.id("largeappupgrade")); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderContainer.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderContainer.java index 0990bb20..f8e6005d 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderContainer.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderContainer.java @@ -1,17 +1,18 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; -import appeng.menu.implementations.MenuTypeBuilder; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import appeng.menu.implementations.MenuTypeBuilder; + public class AdvPatternProviderContainer extends AdvPatternProviderMenu { - public static final MenuType TYPE = MenuTypeBuilder - .create(AdvPatternProviderContainer::new, AdvPatternProviderLogicHost.class) - .build("adv_pattern_provider"); + public static final MenuType TYPE = MenuTypeBuilder.create( + AdvPatternProviderContainer::new, AdvPatternProviderLogicHost.class) + .build("adv_pattern_provider"); - public AdvPatternProviderContainer(int id, Inventory playerInventory, AdvPatternProviderLogicHost host) { - super(TYPE, id, playerInventory, host); - } + public AdvPatternProviderContainer(int id, Inventory playerInventory, AdvPatternProviderLogicHost host) { + super(TYPE, id, playerInventory, host); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderGui.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderGui.java index 697bb665..9923fb9b 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderGui.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderGui.java @@ -1,5 +1,9 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.neoforged.neoforge.network.PacketDistributor; + import appeng.api.config.LockCraftingMode; import appeng.api.config.Settings; import appeng.api.config.YesNo; @@ -10,52 +14,51 @@ import appeng.core.localization.GuiText; import appeng.core.network.ServerboundPacket; import appeng.core.network.serverbound.ConfigButtonPacket; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.neoforged.neoforge.network.PacketDistributor; public class AdvPatternProviderGui extends AEBaseScreen { - private final SettingToggleButton blockingModeButton; - private final SettingToggleButton lockCraftingModeButton; - private final ToggleButton showInPatternAccessTerminalButton; - private final AdvPatternProviderLockReason lockReason; + private final SettingToggleButton blockingModeButton; + private final SettingToggleButton lockCraftingModeButton; + private final ToggleButton showInPatternAccessTerminalButton; + private final AdvPatternProviderLockReason lockReason; - public AdvPatternProviderGui(AdvPatternProviderContainer menu, Inventory playerInventory, Component title, - ScreenStyle style) { - super(menu, playerInventory, title, style); + public AdvPatternProviderGui( + AdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); - this.blockingModeButton = new ServerSettingToggleButton<>(Settings.BLOCKING_MODE, YesNo.NO); - this.addToLeftToolbar(this.blockingModeButton); + this.blockingModeButton = new ServerSettingToggleButton<>(Settings.BLOCKING_MODE, YesNo.NO); + this.addToLeftToolbar(this.blockingModeButton); - lockCraftingModeButton = new ServerSettingToggleButton<>(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE); - this.addToLeftToolbar(lockCraftingModeButton); + lockCraftingModeButton = new ServerSettingToggleButton<>(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE); + this.addToLeftToolbar(lockCraftingModeButton); - widgets.addOpenPriorityButton(); + widgets.addOpenPriorityButton(); - this.showInPatternAccessTerminalButton = new ToggleButton(Icon.PATTERN_ACCESS_SHOW, - Icon.PATTERN_ACCESS_HIDE, - GuiText.PatternAccessTerminal.text(), GuiText.PatternAccessTerminalHint.text(), - btn -> selectNextPatternProviderMode()); - this.addToLeftToolbar(this.showInPatternAccessTerminalButton); + this.showInPatternAccessTerminalButton = new ToggleButton( + Icon.PATTERN_ACCESS_SHOW, + Icon.PATTERN_ACCESS_HIDE, + GuiText.PatternAccessTerminal.text(), + GuiText.PatternAccessTerminalHint.text(), + btn -> selectNextPatternProviderMode()); + this.addToLeftToolbar(this.showInPatternAccessTerminalButton); - this.lockReason = new AdvPatternProviderLockReason(this); - widgets.add("lockReason", this.lockReason); - } + this.lockReason = new AdvPatternProviderLockReason(this); + widgets.add("lockReason", this.lockReason); + } - @Override - protected void updateBeforeRender() { - super.updateBeforeRender(); + @Override + protected void updateBeforeRender() { + super.updateBeforeRender(); - this.lockReason.setVisible(menu.getLockCraftingMode() != LockCraftingMode.NONE); - this.blockingModeButton.set(this.menu.getBlockingMode()); - this.lockCraftingModeButton.set(this.menu.getLockCraftingMode()); - this.showInPatternAccessTerminalButton.setState(this.menu.getShowInAccessTerminal() == YesNo.YES); - } + this.lockReason.setVisible(menu.getLockCraftingMode() != LockCraftingMode.NONE); + this.blockingModeButton.set(this.menu.getBlockingMode()); + this.lockCraftingModeButton.set(this.menu.getLockCraftingMode()); + this.showInPatternAccessTerminalButton.setState(this.menu.getShowInAccessTerminal() == YesNo.YES); + } - private void selectNextPatternProviderMode() { - final boolean backwards = isHandlingRightClick(); - ServerboundPacket message = new ConfigButtonPacket(Settings.PATTERN_ACCESS_TERMINAL, backwards); - PacketDistributor.sendToServer(message); - } + private void selectNextPatternProviderMode() { + final boolean backwards = isHandlingRightClick(); + ServerboundPacket message = new ConfigButtonPacket(Settings.PATTERN_ACCESS_TERMINAL, backwards); + PacketDistributor.sendToServer(message); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderLockReason.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderLockReason.java index a745dd34..3d96dd7a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderLockReason.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderLockReason.java @@ -1,5 +1,13 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; + import appeng.api.client.AEKeyRendering; import appeng.api.config.LockCraftingMode; import appeng.api.stacks.AmountFormat; @@ -9,93 +17,85 @@ import appeng.client.gui.Tooltip; import appeng.core.localization.GuiText; import appeng.core.localization.InGameTooltip; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.Nullable; public class AdvPatternProviderLockReason implements ICompositeWidget { - protected boolean visible = false; - protected int x; - protected int y; - - private final AdvPatternProviderGui gui; - - public AdvPatternProviderLockReason(AdvPatternProviderGui gui) { - this.gui = gui; - } - - @Override - public void setPosition(Point position) { - x = position.getX(); - y = position.getY(); - } - - @Override - public void setSize(int width, int height) { - } - - @Override - public Rect2i getBounds() { - return new Rect2i(x, y, 126, 16); - } - - @Override - public final boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - - @Override - public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { - var menu = gui.getMenu(); - - Icon icon; - Component lockStatusText; - if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { - icon = Icon.UNLOCKED; - lockStatusText = GuiText.CraftingLockIsUnlocked.text() - .withStyle(ChatFormatting.DARK_GREEN); - } else { - icon = Icon.LOCKED; - lockStatusText = GuiText.CraftingLockIsLocked.text() - .withStyle(ChatFormatting.DARK_RED); - } - - icon.getBlitter().dest(x, y).blit(guiGraphics); - guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); - } - - @Nullable - @Override - public Tooltip getTooltip(int mouseX, int mouseY) { - var menu = gui.getMenu(); - var tooltip = switch (menu.getCraftingLockedReason()) { - case NONE -> null; - case LOCK_UNTIL_PULSE -> InGameTooltip.CraftingLockedUntilPulse.text(); - case LOCK_WHILE_HIGH -> InGameTooltip.CraftingLockedByRedstoneSignal.text(); - case LOCK_WHILE_LOW -> InGameTooltip.CraftingLockedByLackOfRedstoneSignal.text(); - case LOCK_UNTIL_RESULT -> { - var stack = menu.getUnlockStack(); - Component stackName; - Component stackAmount; - if (stack != null) { - stackName = AEKeyRendering.getDisplayName(stack.what()); - stackAmount = Component.literal(stack.what().formatAmount(stack.amount(), AmountFormat.FULL)); - } else { - stackName = Component.literal("ERROR"); - stackAmount = Component.literal("ERROR"); - - } - yield InGameTooltip.CraftingLockedUntilResult.text(stackName, stackAmount); - } - }; - - return tooltip != null ? new Tooltip(tooltip) : null; - } + protected boolean visible = false; + protected int x; + protected int y; + + private final AdvPatternProviderGui gui; + + public AdvPatternProviderLockReason(AdvPatternProviderGui gui) { + this.gui = gui; + } + + @Override + public void setPosition(Point position) { + x = position.getX(); + y = position.getY(); + } + + @Override + public void setSize(int width, int height) {} + + @Override + public Rect2i getBounds() { + return new Rect2i(x, y, 126, 16); + } + + @Override + public final boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + + @Override + public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { + var menu = gui.getMenu(); + + Icon icon; + Component lockStatusText; + if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { + icon = Icon.UNLOCKED; + lockStatusText = GuiText.CraftingLockIsUnlocked.text().withStyle(ChatFormatting.DARK_GREEN); + } else { + icon = Icon.LOCKED; + lockStatusText = GuiText.CraftingLockIsLocked.text().withStyle(ChatFormatting.DARK_RED); + } + + icon.getBlitter().dest(x, y).blit(guiGraphics); + guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); + } + + @Nullable + @Override + public Tooltip getTooltip(int mouseX, int mouseY) { + var menu = gui.getMenu(); + var tooltip = + switch (menu.getCraftingLockedReason()) { + case NONE -> null; + case LOCK_UNTIL_PULSE -> InGameTooltip.CraftingLockedUntilPulse.text(); + case LOCK_WHILE_HIGH -> InGameTooltip.CraftingLockedByRedstoneSignal.text(); + case LOCK_WHILE_LOW -> InGameTooltip.CraftingLockedByLackOfRedstoneSignal.text(); + case LOCK_UNTIL_RESULT -> { + var stack = menu.getUnlockStack(); + Component stackName; + Component stackAmount; + if (stack != null) { + stackName = AEKeyRendering.getDisplayName(stack.what()); + stackAmount = + Component.literal(stack.what().formatAmount(stack.amount(), AmountFormat.FULL)); + } else { + stackName = Component.literal("ERROR"); + stackAmount = Component.literal("ERROR"); + } + yield InGameTooltip.CraftingLockedUntilResult.text(stackName, stackAmount); + } + }; + + return tooltip != null ? new Tooltip(tooltip) : null; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu.java index f9252aaf..b3db0ed6 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu.java @@ -2,6 +2,8 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; import appeng.api.config.LockCraftingMode; import appeng.api.config.Settings; @@ -14,85 +16,89 @@ import appeng.menu.guisync.GuiSync; import appeng.menu.slot.AppEngSlot; import appeng.menu.slot.RestrictedInputSlot; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; /** * @see appeng.client.gui.implementations.PatternProviderScreen */ public class AdvPatternProviderMenu extends AEBaseMenu { - protected final AdvPatternProviderLogic logic; - - @GuiSync(3) - public YesNo blockingMode = YesNo.NO; - @GuiSync(4) - public YesNo showInAccessTerminal = YesNo.YES; - @GuiSync(5) - public LockCraftingMode lockCraftingMode = LockCraftingMode.NONE; - @GuiSync(6) - public LockCraftingMode craftingLockedReason = LockCraftingMode.NONE; - @GuiSync(7) - public GenericStack unlockStack = null; - - protected AdvPatternProviderMenu(MenuType menuType, - int id, Inventory playerInventory, - AdvPatternProviderLogicHost host) { - super(menuType, id, playerInventory, host); - this.createPlayerInventorySlots(playerInventory); - - this.logic = host.getLogic(); - - var patternInv = logic.getPatternInv(); - for (int x = 0; x < patternInv.size(); x++) { - this.addSlot(new RestrictedInputSlot(RestrictedInputSlot.PlacableItemType.ENCODED_PATTERN, - patternInv, x), - SlotSemantics.ENCODED_PATTERN); - } - - // Show first few entries of the return inv - var returnInv = logic.getReturnInv().createMenuWrapper(); - for (int i = 0; i < PatternProviderReturnInventory.NUMBER_OF_SLOTS; i++) { - if (i < returnInv.size()) { - this.addSlot(new AppEngSlot(returnInv, i), SlotSemantics.STORAGE); - } - } - } - - @Override - public void broadcastChanges() { - if (isServerSide()) { - blockingMode = logic.getConfigManager().getSetting(Settings.BLOCKING_MODE); - showInAccessTerminal = logic.getConfigManager().getSetting(Settings.PATTERN_ACCESS_TERMINAL); - lockCraftingMode = logic.getConfigManager().getSetting(Settings.LOCK_CRAFTING_MODE); - craftingLockedReason = logic.getCraftingLockedReason(); - unlockStack = logic.getUnlockStack(); - } - - super.broadcastChanges(); - } - - public GenericStackInv getReturnInv() { - return logic.getReturnInv(); - } - - public YesNo getBlockingMode() { - return blockingMode; - } - - public LockCraftingMode getLockCraftingMode() { - return lockCraftingMode; - } - - public LockCraftingMode getCraftingLockedReason() { - return craftingLockedReason; - } - - public GenericStack getUnlockStack() { - return unlockStack; - } - - public YesNo getShowInAccessTerminal() { - return showInAccessTerminal; - } + protected final AdvPatternProviderLogic logic; + + @GuiSync(3) + public YesNo blockingMode = YesNo.NO; + + @GuiSync(4) + public YesNo showInAccessTerminal = YesNo.YES; + + @GuiSync(5) + public LockCraftingMode lockCraftingMode = LockCraftingMode.NONE; + + @GuiSync(6) + public LockCraftingMode craftingLockedReason = LockCraftingMode.NONE; + + @GuiSync(7) + public GenericStack unlockStack = null; + + protected AdvPatternProviderMenu( + MenuType menuType, + int id, + Inventory playerInventory, + AdvPatternProviderLogicHost host) { + super(menuType, id, playerInventory, host); + this.createPlayerInventorySlots(playerInventory); + + this.logic = host.getLogic(); + + var patternInv = logic.getPatternInv(); + for (int x = 0; x < patternInv.size(); x++) { + this.addSlot( + new RestrictedInputSlot(RestrictedInputSlot.PlacableItemType.ENCODED_PATTERN, patternInv, x), + SlotSemantics.ENCODED_PATTERN); + } + + // Show first few entries of the return inv + var returnInv = logic.getReturnInv().createMenuWrapper(); + for (int i = 0; i < PatternProviderReturnInventory.NUMBER_OF_SLOTS; i++) { + if (i < returnInv.size()) { + this.addSlot(new AppEngSlot(returnInv, i), SlotSemantics.STORAGE); + } + } + } + + @Override + public void broadcastChanges() { + if (isServerSide()) { + blockingMode = logic.getConfigManager().getSetting(Settings.BLOCKING_MODE); + showInAccessTerminal = logic.getConfigManager().getSetting(Settings.PATTERN_ACCESS_TERMINAL); + lockCraftingMode = logic.getConfigManager().getSetting(Settings.LOCK_CRAFTING_MODE); + craftingLockedReason = logic.getCraftingLockedReason(); + unlockStack = logic.getUnlockStack(); + } + + super.broadcastChanges(); + } + + public GenericStackInv getReturnInv() { + return logic.getReturnInv(); + } + + public YesNo getBlockingMode() { + return blockingMode; + } + + public LockCraftingMode getLockCraftingMode() { + return lockCraftingMode; + } + + public LockCraftingMode getCraftingLockedReason() { + return craftingLockedReason; + } + + public GenericStack getUnlockStack() { + return unlockStack; + } + + public YesNo getShowInAccessTerminal() { + return showInAccessTerminal; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderContainer.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderContainer.java index 6838d407..497d0722 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderContainer.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderContainer.java @@ -1,17 +1,18 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; -import appeng.menu.implementations.MenuTypeBuilder; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import appeng.menu.implementations.MenuTypeBuilder; + public class SmallAdvPatternProviderContainer extends AdvPatternProviderMenu { - public static final MenuType TYPE = MenuTypeBuilder - .create(SmallAdvPatternProviderContainer::new, AdvPatternProviderLogicHost.class) - .build("small_adv_pattern_provider"); + public static final MenuType TYPE = MenuTypeBuilder.create( + SmallAdvPatternProviderContainer::new, AdvPatternProviderLogicHost.class) + .build("small_adv_pattern_provider"); - protected SmallAdvPatternProviderContainer(int id, Inventory playerInventory, AdvPatternProviderLogicHost host) { - super(TYPE, id, playerInventory, host); - } -} \ No newline at end of file + protected SmallAdvPatternProviderContainer(int id, Inventory playerInventory, AdvPatternProviderLogicHost host) { + super(TYPE, id, playerInventory, host); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderGui.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderGui.java index 07f26011..2d66188a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderGui.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderGui.java @@ -1,5 +1,9 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.neoforged.neoforge.network.PacketDistributor; + import appeng.api.config.LockCraftingMode; import appeng.api.config.Settings; import appeng.api.config.YesNo; @@ -12,52 +16,51 @@ import appeng.core.localization.GuiText; import appeng.core.network.ServerboundPacket; import appeng.core.network.serverbound.ConfigButtonPacket; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.neoforged.neoforge.network.PacketDistributor; public class SmallAdvPatternProviderGui extends AEBaseScreen { - private final SettingToggleButton blockingModeButton; - private final SettingToggleButton lockCraftingModeButton; - private final ToggleButton showInPatternAccessTerminalButton; - private final SmallAdvPatternProviderLockReason lockReason; + private final SettingToggleButton blockingModeButton; + private final SettingToggleButton lockCraftingModeButton; + private final ToggleButton showInPatternAccessTerminalButton; + private final SmallAdvPatternProviderLockReason lockReason; - public SmallAdvPatternProviderGui(SmallAdvPatternProviderContainer menu, Inventory playerInventory, Component title, - ScreenStyle style) { - super(menu, playerInventory, title, style); + public SmallAdvPatternProviderGui( + SmallAdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); - this.blockingModeButton = new ServerSettingToggleButton<>(Settings.BLOCKING_MODE, YesNo.NO); - this.addToLeftToolbar(this.blockingModeButton); + this.blockingModeButton = new ServerSettingToggleButton<>(Settings.BLOCKING_MODE, YesNo.NO); + this.addToLeftToolbar(this.blockingModeButton); - lockCraftingModeButton = new ServerSettingToggleButton<>(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE); - this.addToLeftToolbar(lockCraftingModeButton); + lockCraftingModeButton = new ServerSettingToggleButton<>(Settings.LOCK_CRAFTING_MODE, LockCraftingMode.NONE); + this.addToLeftToolbar(lockCraftingModeButton); - widgets.addOpenPriorityButton(); + widgets.addOpenPriorityButton(); - this.showInPatternAccessTerminalButton = new ToggleButton(Icon.PATTERN_ACCESS_SHOW, - Icon.PATTERN_ACCESS_HIDE, - GuiText.PatternAccessTerminal.text(), GuiText.PatternAccessTerminalHint.text(), - btn -> selectNextPatternProviderMode()); - this.addToLeftToolbar(this.showInPatternAccessTerminalButton); + this.showInPatternAccessTerminalButton = new ToggleButton( + Icon.PATTERN_ACCESS_SHOW, + Icon.PATTERN_ACCESS_HIDE, + GuiText.PatternAccessTerminal.text(), + GuiText.PatternAccessTerminalHint.text(), + btn -> selectNextPatternProviderMode()); + this.addToLeftToolbar(this.showInPatternAccessTerminalButton); - this.lockReason = new SmallAdvPatternProviderLockReason(this); - widgets.add("lockReason", this.lockReason); - } + this.lockReason = new SmallAdvPatternProviderLockReason(this); + widgets.add("lockReason", this.lockReason); + } - @Override - protected void updateBeforeRender() { - super.updateBeforeRender(); + @Override + protected void updateBeforeRender() { + super.updateBeforeRender(); - this.lockReason.setVisible(menu.getLockCraftingMode() != LockCraftingMode.NONE); - this.blockingModeButton.set(this.menu.getBlockingMode()); - this.lockCraftingModeButton.set(this.menu.getLockCraftingMode()); - this.showInPatternAccessTerminalButton.setState(this.menu.getShowInAccessTerminal() == YesNo.YES); - } + this.lockReason.setVisible(menu.getLockCraftingMode() != LockCraftingMode.NONE); + this.blockingModeButton.set(this.menu.getBlockingMode()); + this.lockCraftingModeButton.set(this.menu.getLockCraftingMode()); + this.showInPatternAccessTerminalButton.setState(this.menu.getShowInAccessTerminal() == YesNo.YES); + } - private void selectNextPatternProviderMode() { - final boolean backwards = isHandlingRightClick(); - ServerboundPacket message = new ConfigButtonPacket(Settings.PATTERN_ACCESS_TERMINAL, backwards); - PacketDistributor.sendToServer(message); - } + private void selectNextPatternProviderMode() { + final boolean backwards = isHandlingRightClick(); + ServerboundPacket message = new ConfigButtonPacket(Settings.PATTERN_ACCESS_TERMINAL, backwards); + PacketDistributor.sendToServer(message); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderLockReason.java b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderLockReason.java index e1dcdd0f..70810f7d 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderLockReason.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/advpatternprovider/SmallAdvPatternProviderLockReason.java @@ -1,5 +1,13 @@ package net.pedroksl.advanced_ae.gui.advpatternprovider; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.Rect2i; +import net.minecraft.network.chat.Component; + import appeng.api.client.AEKeyRendering; import appeng.api.config.LockCraftingMode; import appeng.api.stacks.AmountFormat; @@ -9,93 +17,85 @@ import appeng.client.gui.Tooltip; import appeng.core.localization.GuiText; import appeng.core.localization.InGameTooltip; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.Rect2i; -import net.minecraft.network.chat.Component; -import org.jetbrains.annotations.Nullable; public class SmallAdvPatternProviderLockReason implements ICompositeWidget { - protected boolean visible = false; - protected int x; - protected int y; - - private final SmallAdvPatternProviderGui gui; - - public SmallAdvPatternProviderLockReason(SmallAdvPatternProviderGui gui) { - this.gui = gui; - } - - @Override - public void setPosition(Point position) { - x = position.getX(); - y = position.getY(); - } - - @Override - public void setSize(int width, int height) { - } - - @Override - public Rect2i getBounds() { - return new Rect2i(x, y, 126, 16); - } - - @Override - public final boolean isVisible() { - return visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - - @Override - public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { - var menu = gui.getMenu(); - - Icon icon; - Component lockStatusText; - if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { - icon = Icon.UNLOCKED; - lockStatusText = GuiText.CraftingLockIsUnlocked.text() - .withStyle(ChatFormatting.DARK_GREEN); - } else { - icon = Icon.LOCKED; - lockStatusText = GuiText.CraftingLockIsLocked.text() - .withStyle(ChatFormatting.DARK_RED); - } - - icon.getBlitter().dest(x, y).blit(guiGraphics); - guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); - } - - @Nullable - @Override - public Tooltip getTooltip(int mouseX, int mouseY) { - var menu = gui.getMenu(); - var tooltip = switch (menu.getCraftingLockedReason()) { - case NONE -> null; - case LOCK_UNTIL_PULSE -> InGameTooltip.CraftingLockedUntilPulse.text(); - case LOCK_WHILE_HIGH -> InGameTooltip.CraftingLockedByRedstoneSignal.text(); - case LOCK_WHILE_LOW -> InGameTooltip.CraftingLockedByLackOfRedstoneSignal.text(); - case LOCK_UNTIL_RESULT -> { - var stack = menu.getUnlockStack(); - Component stackName; - Component stackAmount; - if (stack != null) { - stackName = AEKeyRendering.getDisplayName(stack.what()); - stackAmount = Component.literal(stack.what().formatAmount(stack.amount(), AmountFormat.FULL)); - } else { - stackName = Component.literal("ERROR"); - stackAmount = Component.literal("ERROR"); - - } - yield InGameTooltip.CraftingLockedUntilResult.text(stackName, stackAmount); - } - }; - - return tooltip != null ? new Tooltip(tooltip) : null; - } + protected boolean visible = false; + protected int x; + protected int y; + + private final SmallAdvPatternProviderGui gui; + + public SmallAdvPatternProviderLockReason(SmallAdvPatternProviderGui gui) { + this.gui = gui; + } + + @Override + public void setPosition(Point position) { + x = position.getX(); + y = position.getY(); + } + + @Override + public void setSize(int width, int height) {} + + @Override + public Rect2i getBounds() { + return new Rect2i(x, y, 126, 16); + } + + @Override + public final boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + + @Override + public void drawForegroundLayer(GuiGraphics guiGraphics, Rect2i bounds, Point mouse) { + var menu = gui.getMenu(); + + Icon icon; + Component lockStatusText; + if (menu.getCraftingLockedReason() == LockCraftingMode.NONE) { + icon = Icon.UNLOCKED; + lockStatusText = GuiText.CraftingLockIsUnlocked.text().withStyle(ChatFormatting.DARK_GREEN); + } else { + icon = Icon.LOCKED; + lockStatusText = GuiText.CraftingLockIsLocked.text().withStyle(ChatFormatting.DARK_RED); + } + + icon.getBlitter().dest(x, y).blit(guiGraphics); + guiGraphics.drawString(Minecraft.getInstance().font, lockStatusText, x + 15, y + 5, -1, false); + } + + @Nullable + @Override + public Tooltip getTooltip(int mouseX, int mouseY) { + var menu = gui.getMenu(); + var tooltip = + switch (menu.getCraftingLockedReason()) { + case NONE -> null; + case LOCK_UNTIL_PULSE -> InGameTooltip.CraftingLockedUntilPulse.text(); + case LOCK_WHILE_HIGH -> InGameTooltip.CraftingLockedByRedstoneSignal.text(); + case LOCK_WHILE_LOW -> InGameTooltip.CraftingLockedByLackOfRedstoneSignal.text(); + case LOCK_UNTIL_RESULT -> { + var stack = menu.getUnlockStack(); + Component stackName; + Component stackAmount; + if (stack != null) { + stackName = AEKeyRendering.getDisplayName(stack.what()); + stackAmount = + Component.literal(stack.what().formatAmount(stack.amount(), AmountFormat.FULL)); + } else { + stackName = Component.literal("ERROR"); + stackAmount = Component.literal("ERROR"); + } + yield InGameTooltip.CraftingLockedUntilResult.text(stackName, stackAmount); + } + }; + + return tooltip != null ? new Tooltip(tooltip) : null; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java index 311ed500..8725a874 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderContainer.java @@ -1,16 +1,7 @@ package net.pedroksl.advanced_ae.gui.patternencoder; -import appeng.api.crafting.IPatternDetails; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.api.inventories.InternalInventory; -import appeng.api.stacks.AEKey; -import appeng.api.stacks.GenericStack; -import appeng.crafting.pattern.AEProcessingPattern; -import appeng.menu.AEBaseMenu; -import appeng.menu.SlotSemantics; -import appeng.menu.implementations.MenuTypeBuilder; -import appeng.menu.slot.OutputSlot; -import appeng.menu.slot.RestrictedInputSlot; +import java.util.HashMap; + import net.minecraft.core.Direction; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; @@ -23,142 +14,155 @@ import net.pedroksl.advanced_ae.network.AAENetworkHandler; import net.pedroksl.advanced_ae.network.packet.AdvPatternEncoderPacket; -import java.util.HashMap; +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.inventories.InternalInventory; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.crafting.pattern.AEProcessingPattern; +import appeng.menu.AEBaseMenu; +import appeng.menu.SlotSemantics; +import appeng.menu.implementations.MenuTypeBuilder; +import appeng.menu.slot.OutputSlot; +import appeng.menu.slot.RestrictedInputSlot; public class AdvPatternEncoderContainer extends AEBaseMenu { - public static final MenuType TYPE = MenuTypeBuilder - .create(AdvPatternEncoderContainer::new, AdvPatternEncoderHost.class) - .build(AdvancedAE.id("adv_pattern_encoder")); - - private final RestrictedInputSlot inputSlot; - private final OutputSlot outputSlot; - private final AdvPatternEncoderHost host; - - public AdvPatternEncoderContainer(int id, Inventory playerInventory, AdvPatternEncoderHost host) { - super(TYPE, id, playerInventory, host); - this.createPlayerInventorySlots(playerInventory); - this.host = host; - - this.addSlot(this.inputSlot = new RestrictedInputSlot(RestrictedInputSlot.PlacableItemType.ENCODED_PATTERN, - host.getInventory(), 0), SlotSemantics.ENCODED_PATTERN); - this.addSlot(this.outputSlot = new OutputSlot(host.getInventory(), 1, null), SlotSemantics.MACHINE_OUTPUT); - - this.host.setInventoryChangedHandler(this::onChangeInventory); - if (this.inputSlot.hasItem()) { - decodeInputPattern(); - } - } - - public void onUpdateRequested() { - if (this.inputSlot.hasItem()) { - decodeInputPattern(); - } - } - - public void onChangeInventory(InternalInventory inv, int slot) { - if (inv == host.getInventory()) { - if (slot == 0) { - if (this.inputSlot.hasItem()) { - decodeInputPattern(); - } else if (!this.inputSlot.hasItem()) { - clearDecodedPattern(); - this.outputSlot.set(ItemStack.EMPTY); - } - } else if (slot == 1 && !this.outputSlot.hasItem()) { - clearDecodedPattern(); - this.inputSlot.set(ItemStack.EMPTY); - } - } - } - - private void decodeInputPattern() { - ItemStack stack = this.inputSlot.getItem(); - - IPatternDetails details = PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); - - if (details == null) return; - - HashMap dirMap = new HashMap<>(); - if (details instanceof AEProcessingPattern processingPattern) { - dirMap = decodeProcessingPattern(processingPattern); - } else if (details instanceof AdvProcessingPattern advProcessingPattern) { - dirMap = decodeAdvProcessingPattern(advProcessingPattern); - } - - if (this.getPlayer() instanceof ServerPlayer sp) { - AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(dirMap), sp); - } - } - - private HashMap decodeProcessingPattern(AEProcessingPattern pattern) { - var sparseInputs = pattern.getSparseInputs(); - - HashMap inputMap = new HashMap<>(); - for (GenericStack input : sparseInputs) { - if (input == null) { - continue; - } - - if (!inputMap.containsKey(input.what())) { - inputMap.put(input.what(), null); - } - } - - var newAdvPattern = AdvPatternDetailsEncoder.encodeProcessingPattern(pattern.getSparseInputs(), - pattern.getSparseOutputs(), inputMap); - this.outputSlot.set(newAdvPattern); - - return inputMap; - } - - private HashMap decodeAdvProcessingPattern(AdvProcessingPattern pattern) { - this.outputSlot.set(this.inputSlot.getItem().copy()); - - return pattern.getDirectionMap(); - } - - private void clearDecodedPattern() { - if (this.getPlayer() instanceof ServerPlayer sp) { - AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(), sp); - } - } - - public void update(AEKey key, Direction dir) { - if (!this.outputSlot.hasItem()) { - copyItemToOutputSlot(); - } - - AdvProcessingPattern details = - (AdvProcessingPattern) PatternDetailsHelper.decodePattern(this.outputSlot.getItem(), - this.getPlayer().level()); - if (details != null) { - var dirMap = details.getDirectionMap(); - dirMap.put(key, dir); - var newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern(details.getSparseInputs(), - details.getSparseOutputs(), dirMap); - this.outputSlot.set(newPattern); - - if (this.getPlayer() instanceof ServerPlayer sp) { - AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(dirMap), sp); - } - } - } - - public void copyItemToOutputSlot() { - ItemStack stack = this.inputSlot.getItem(); - - IPatternDetails details = PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); - - if (details == null) return; - - if (details instanceof AEProcessingPattern processingPattern) { - decodeProcessingPattern(processingPattern); - } else if (details instanceof AdvProcessingPattern advProcessingPattern) { - decodeAdvProcessingPattern(advProcessingPattern); - } - } - - public interface inventoryChangedHandler { - void handleChange(InternalInventory inv, int slot); - } + public static final MenuType TYPE = MenuTypeBuilder.create( + AdvPatternEncoderContainer::new, AdvPatternEncoderHost.class) + .build(AdvancedAE.id("adv_pattern_encoder")); + + private final RestrictedInputSlot inputSlot; + private final OutputSlot outputSlot; + private final AdvPatternEncoderHost host; + + public AdvPatternEncoderContainer(int id, Inventory playerInventory, AdvPatternEncoderHost host) { + super(TYPE, id, playerInventory, host); + this.createPlayerInventorySlots(playerInventory); + this.host = host; + + this.addSlot( + this.inputSlot = new RestrictedInputSlot( + RestrictedInputSlot.PlacableItemType.ENCODED_PATTERN, host.getInventory(), 0), + SlotSemantics.ENCODED_PATTERN); + this.addSlot(this.outputSlot = new OutputSlot(host.getInventory(), 1, null), SlotSemantics.MACHINE_OUTPUT); + + this.host.setInventoryChangedHandler(this::onChangeInventory); + if (this.inputSlot.hasItem()) { + decodeInputPattern(); + } + } + + public void onUpdateRequested() { + if (this.inputSlot.hasItem()) { + decodeInputPattern(); + } + } + + public void onChangeInventory(InternalInventory inv, int slot) { + if (inv == host.getInventory()) { + if (slot == 0) { + if (this.inputSlot.hasItem()) { + decodeInputPattern(); + } else if (!this.inputSlot.hasItem()) { + clearDecodedPattern(); + this.outputSlot.set(ItemStack.EMPTY); + } + } else if (slot == 1 && !this.outputSlot.hasItem()) { + clearDecodedPattern(); + this.inputSlot.set(ItemStack.EMPTY); + } + } + } + + private void decodeInputPattern() { + ItemStack stack = this.inputSlot.getItem(); + + IPatternDetails details = + PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); + + if (details == null) return; + + HashMap dirMap = new HashMap<>(); + if (details instanceof AEProcessingPattern processingPattern) { + dirMap = decodeProcessingPattern(processingPattern); + } else if (details instanceof AdvProcessingPattern advProcessingPattern) { + dirMap = decodeAdvProcessingPattern(advProcessingPattern); + } + + if (this.getPlayer() instanceof ServerPlayer sp) { + AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(dirMap), sp); + } + } + + private HashMap decodeProcessingPattern(AEProcessingPattern pattern) { + var sparseInputs = pattern.getSparseInputs(); + + HashMap inputMap = new HashMap<>(); + for (GenericStack input : sparseInputs) { + if (input == null) { + continue; + } + + if (!inputMap.containsKey(input.what())) { + inputMap.put(input.what(), null); + } + } + + var newAdvPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( + pattern.getSparseInputs(), pattern.getSparseOutputs(), inputMap); + this.outputSlot.set(newAdvPattern); + + return inputMap; + } + + private HashMap decodeAdvProcessingPattern(AdvProcessingPattern pattern) { + this.outputSlot.set(this.inputSlot.getItem().copy()); + + return pattern.getDirectionMap(); + } + + private void clearDecodedPattern() { + if (this.getPlayer() instanceof ServerPlayer sp) { + AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(), sp); + } + } + + public void update(AEKey key, Direction dir) { + if (!this.outputSlot.hasItem()) { + copyItemToOutputSlot(); + } + + AdvProcessingPattern details = (AdvProcessingPattern) PatternDetailsHelper.decodePattern( + this.outputSlot.getItem(), this.getPlayer().level()); + if (details != null) { + var dirMap = details.getDirectionMap(); + dirMap.put(key, dir); + var newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( + details.getSparseInputs(), details.getSparseOutputs(), dirMap); + this.outputSlot.set(newPattern); + + if (this.getPlayer() instanceof ServerPlayer sp) { + AAENetworkHandler.INSTANCE.sendTo(new AdvPatternEncoderPacket(dirMap), sp); + } + } + } + + public void copyItemToOutputSlot() { + ItemStack stack = this.inputSlot.getItem(); + + IPatternDetails details = + PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); + + if (details == null) return; + + if (details instanceof AEProcessingPattern processingPattern) { + decodeProcessingPattern(processingPattern); + } else if (details instanceof AdvProcessingPattern advProcessingPattern) { + decodeAdvProcessingPattern(advProcessingPattern); + } + } + + public interface inventoryChangedHandler { + void handleChange(InternalInventory inv, int slot); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderGui.java b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderGui.java index 93999976..1d3faf25 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderGui.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/AdvPatternEncoderGui.java @@ -1,14 +1,11 @@ package net.pedroksl.advanced_ae.gui.patternencoder; -import appeng.api.stacks.AEKey; -import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.Scrollbar; -import appeng.client.guidebook.document.LytRect; -import appeng.client.guidebook.render.SimpleRenderContext; -import appeng.core.AppEng; -import appeng.menu.slot.FakeSlot; +import java.util.ArrayList; +import java.util.HashMap; +import javax.annotation.Nullable; + import com.mojang.datafixers.util.Pair; + import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.Tooltip; @@ -22,193 +19,218 @@ import net.pedroksl.advanced_ae.network.packet.AdvPatternEncoderChangeDirectionPacket; import net.pedroksl.advanced_ae.network.packet.AdvPatternEncoderUpdateRequestPacket; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; +import appeng.api.stacks.AEKey; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.Scrollbar; +import appeng.client.guidebook.document.LytRect; +import appeng.client.guidebook.render.SimpleRenderContext; +import appeng.core.AppEng; +import appeng.menu.slot.FakeSlot; public class AdvPatternEncoderGui extends AEBaseScreen { - private static final int ROW_HEIGHT = 18; - private static final int SLOT_SIZE = ROW_HEIGHT; - private static final int ROW_SPACING = 2; - private static final int VISIBLE_ROWS = 3; - - private static final int LIST_ANCHOR_X = 18; - private static final int LIST_ANCHOR_Y = 22; - private static final int DIRECTION_BUTTONS_OFFSET_X = 1; - private static final int DIRECTION_BUTTONS_WIDTH = 12; - private static final int DIRECTION_BUTTONS_HEIGHT = 14; - - private static final Rect2i SLOT_BBOX = new Rect2i(146, 16, SLOT_SIZE, SLOT_SIZE); - - private final ResourceLocation DEFAULT_TEXTURE = AppEng.makeId("textures/guis/adv_pattern_encoder.png"); - - private final Scrollbar scrollbar; - private HashMap inputList = new HashMap<>(); - private final HashMap directionButtons = new HashMap<>(); - private final ArrayList rows = new ArrayList<>(); - - public AdvPatternEncoderGui(AdvPatternEncoderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { - super(menu, playerInventory, title, style); - this.scrollbar = widgets.addScrollBar("scrollbar", Scrollbar.SMALL); - - AAENetworkHandler.INSTANCE.sendToServer(new AdvPatternEncoderUpdateRequestPacket()); - } - - @Override - public void drawFG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, int mouseY) { - this.menu.slots.removeIf(slot -> slot instanceof FakeSlot); - this.directionButtons.forEach((key, value) -> { - for (int x = 0; x < 7; x++) { - value[x].visible = false; - } - }); - - final int scrollLevel = scrollbar.getCurrentScroll(); - int visibleRows = Math.min(VISIBLE_ROWS, this.inputList.size()); - int i = 0; - for (; i < visibleRows; ++i) { - int currentRow = scrollLevel + i; - if (currentRow >= this.inputList.size()) { - break; - } - - InputRow row = this.rows.get(currentRow); - var renderContext = new SimpleRenderContext(LytRect.empty(), guiGraphics); - renderContext.renderItem( - row.key().wrapForDisplayOrFilter(), - LIST_ANCHOR_X + 1, LIST_ANCHOR_Y + 1 + i * (ROW_HEIGHT + ROW_SPACING), - 16, 16 - ); - - var buttons = this.directionButtons.get(row.key); - var highlight = getSelectedDirButton(row.dir); - for (var col = 0; col < 7; col++) { - var button = buttons[col]; - button.setPosition( - this.leftPos + LIST_ANCHOR_X + 2 + SLOT_SIZE + - (col + 1) * DIRECTION_BUTTONS_OFFSET_X + - col * DIRECTION_BUTTONS_WIDTH, - this.topPos + LIST_ANCHOR_Y + 1 + i * (ROW_HEIGHT + ROW_SPACING) - ); - button.setHighlighted(col == highlight); - button.visible = true; - } - } - } - - @Override - public void drawBG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, - int mouseY, float partialTicks) { - super.drawBG(guiGraphics, offsetX, offsetY, mouseX, mouseY, partialTicks); - - int currentX = offsetX + LIST_ANCHOR_X; - int currentY = offsetY + LIST_ANCHOR_Y; - - int visibleRows = Math.min(VISIBLE_ROWS, this.inputList.size()); - for (int i = 0; i < visibleRows; ++i) { - guiGraphics.blit(DEFAULT_TEXTURE, currentX, currentY, SLOT_BBOX.getX(), SLOT_BBOX.getY(), SLOT_BBOX.getWidth(), - SLOT_BBOX.getHeight()); - currentY += ROW_HEIGHT + ROW_SPACING; - } - } - - @Override - public void init() { - super.init(); - this.refreshList(); - } - - public void update(HashMap inputList) { - this.inputList.clear(); - this.directionButtons.forEach((k, v) -> { - for (var btn : v) { - this.removeWidget(btn); - } - }); - this.directionButtons.clear(); - this.rows.clear(); - - this.inputList = inputList; - this.refreshList(); - } - - private void refreshList() { - for (var key : this.inputList.keySet()) { - this.rows.add(new InputRow(key, this.inputList.get(key))); - - DirectionInputButton[] buttons = new DirectionInputButton[7]; - for (var x = 0; x < 7; x++) { - var button = new DirectionInputButton(0, 0, DIRECTION_BUTTONS_WIDTH, DIRECTION_BUTTONS_HEIGHT, - getDirButtonTextures(x), this::directionButtonPressed); - button.setTooltip(Tooltip.create(getDirButtonText(x))); - button.setKey(key); - button.setIndex(x); - button.visible = false; - buttons[x] = this.addRenderableWidget(button); - } - - directionButtons.put(key, buttons); - } - - this.resetScrollbar(); - } - - private void directionButtonPressed(Button b) { - DirectionInputButton button = ((DirectionInputButton) b); - AAENetworkHandler.INSTANCE.sendToServer(new AdvPatternEncoderChangeDirectionPacket(button.getKey(), button.getDirection())); - } - - private int getSelectedDirButton(@Nullable Direction dir) { - if (dir == null) return 0; - - return switch (dir) { - case NORTH -> 1; - case EAST -> 2; - case SOUTH -> 3; - case WEST -> 4; - case UP -> 5; - case DOWN -> 6; - }; - } - - private Pair getDirButtonTextures(int index) { - return switch (index) { - case 1 -> new Pair<>(AdvancedAE.id("textures/guis/north_button.png"), - AdvancedAE.id("textures/guis/north_button_selected.png")); - case 2 -> new Pair<>(AdvancedAE.id("textures/guis/east_button.png"), - AdvancedAE.id("textures/guis/east_button_selected.png")); - case 3 -> new Pair<>(AdvancedAE.id("textures/guis/south_button.png"), - AdvancedAE.id("textures/guis/south_button_selected.png")); - case 4 -> new Pair<>(AdvancedAE.id("textures/guis/west_button.png"), - AdvancedAE.id("textures/guis/west_button_selected.png")); - case 5 -> new Pair<>(AdvancedAE.id("textures/guis/up_button.png"), - AdvancedAE.id("textures/guis/up_button_selected.png")); - case 6 -> new Pair<>(AdvancedAE.id("textures/guis/down_button.png"), - AdvancedAE.id("textures/guis/down_button_selected.png")); - default -> new Pair<>(AdvancedAE.id("textures/guis/any_button.png"), - AdvancedAE.id("textures/guis/any_button_selected.png")); - }; - } - - private Component getDirButtonText(int index) { - return switch (index) { - case 1 -> Component.translatable("gui.advanced_ae.north_button_tooltip"); - case 2 -> Component.translatable("gui.advanced_ae.east_button_tooltip"); - case 3 -> Component.translatable("gui.advanced_ae.south_button_tooltip"); - case 4 -> Component.translatable("gui.advanced_ae.west_button_tooltip"); - case 5 -> Component.translatable("gui.advanced_ae.up_button_tooltip"); - case 6 -> Component.translatable("gui.advanced_ae.down_button_tooltip"); - default -> Component.translatable("gui.advanced_ae.any_button_tooltip"); - }; - } - - private void resetScrollbar() { - scrollbar.setHeight(VISIBLE_ROWS * ROW_HEIGHT + (VISIBLE_ROWS - 1) * ROW_SPACING - 2); - scrollbar.setRange(0, this.inputList.size() - VISIBLE_ROWS, 2); - } - - public record InputRow(AEKey key, @Nullable Direction dir) { - - } + private static final int ROW_HEIGHT = 18; + private static final int SLOT_SIZE = ROW_HEIGHT; + private static final int ROW_SPACING = 2; + private static final int VISIBLE_ROWS = 3; + + private static final int LIST_ANCHOR_X = 18; + private static final int LIST_ANCHOR_Y = 22; + private static final int DIRECTION_BUTTONS_OFFSET_X = 1; + private static final int DIRECTION_BUTTONS_WIDTH = 12; + private static final int DIRECTION_BUTTONS_HEIGHT = 14; + + private static final Rect2i SLOT_BBOX = new Rect2i(146, 16, SLOT_SIZE, SLOT_SIZE); + + private final ResourceLocation DEFAULT_TEXTURE = AppEng.makeId("textures/guis/adv_pattern_encoder.png"); + + private final Scrollbar scrollbar; + private HashMap inputList = new HashMap<>(); + private final HashMap directionButtons = new HashMap<>(); + private final ArrayList rows = new ArrayList<>(); + + public AdvPatternEncoderGui( + AdvPatternEncoderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + this.scrollbar = widgets.addScrollBar("scrollbar", Scrollbar.SMALL); + + AAENetworkHandler.INSTANCE.sendToServer(new AdvPatternEncoderUpdateRequestPacket()); + } + + @Override + public void drawFG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, int mouseY) { + this.menu.slots.removeIf(slot -> slot instanceof FakeSlot); + this.directionButtons.forEach((key, value) -> { + for (int x = 0; x < 7; x++) { + value[x].visible = false; + } + }); + + final int scrollLevel = scrollbar.getCurrentScroll(); + int visibleRows = Math.min(VISIBLE_ROWS, this.inputList.size()); + int i = 0; + for (; i < visibleRows; ++i) { + int currentRow = scrollLevel + i; + if (currentRow >= this.inputList.size()) { + break; + } + + InputRow row = this.rows.get(currentRow); + var renderContext = new SimpleRenderContext(LytRect.empty(), guiGraphics); + renderContext.renderItem( + row.key().wrapForDisplayOrFilter(), + LIST_ANCHOR_X + 1, + LIST_ANCHOR_Y + 1 + i * (ROW_HEIGHT + ROW_SPACING), + 16, + 16); + + var buttons = this.directionButtons.get(row.key); + var highlight = getSelectedDirButton(row.dir); + for (var col = 0; col < 7; col++) { + var button = buttons[col]; + button.setPosition( + this.leftPos + + LIST_ANCHOR_X + + 2 + + SLOT_SIZE + + (col + 1) * DIRECTION_BUTTONS_OFFSET_X + + col * DIRECTION_BUTTONS_WIDTH, + this.topPos + LIST_ANCHOR_Y + 1 + i * (ROW_HEIGHT + ROW_SPACING)); + button.setHighlighted(col == highlight); + button.visible = true; + } + } + } + + @Override + public void drawBG(GuiGraphics guiGraphics, int offsetX, int offsetY, int mouseX, int mouseY, float partialTicks) { + super.drawBG(guiGraphics, offsetX, offsetY, mouseX, mouseY, partialTicks); + + int currentX = offsetX + LIST_ANCHOR_X; + int currentY = offsetY + LIST_ANCHOR_Y; + + int visibleRows = Math.min(VISIBLE_ROWS, this.inputList.size()); + for (int i = 0; i < visibleRows; ++i) { + guiGraphics.blit( + DEFAULT_TEXTURE, + currentX, + currentY, + SLOT_BBOX.getX(), + SLOT_BBOX.getY(), + SLOT_BBOX.getWidth(), + SLOT_BBOX.getHeight()); + currentY += ROW_HEIGHT + ROW_SPACING; + } + } + + @Override + public void init() { + super.init(); + this.refreshList(); + } + + public void update(HashMap inputList) { + this.inputList.clear(); + this.directionButtons.forEach((k, v) -> { + for (var btn : v) { + this.removeWidget(btn); + } + }); + this.directionButtons.clear(); + this.rows.clear(); + + this.inputList = inputList; + this.refreshList(); + } + + private void refreshList() { + for (var key : this.inputList.keySet()) { + this.rows.add(new InputRow(key, this.inputList.get(key))); + + DirectionInputButton[] buttons = new DirectionInputButton[7]; + for (var x = 0; x < 7; x++) { + var button = new DirectionInputButton( + 0, + 0, + DIRECTION_BUTTONS_WIDTH, + DIRECTION_BUTTONS_HEIGHT, + getDirButtonTextures(x), + this::directionButtonPressed); + button.setTooltip(Tooltip.create(getDirButtonText(x))); + button.setKey(key); + button.setIndex(x); + button.visible = false; + buttons[x] = this.addRenderableWidget(button); + } + + directionButtons.put(key, buttons); + } + + this.resetScrollbar(); + } + + private void directionButtonPressed(Button b) { + DirectionInputButton button = ((DirectionInputButton) b); + AAENetworkHandler.INSTANCE.sendToServer( + new AdvPatternEncoderChangeDirectionPacket(button.getKey(), button.getDirection())); + } + + private int getSelectedDirButton(@Nullable Direction dir) { + if (dir == null) return 0; + + return switch (dir) { + case NORTH -> 1; + case EAST -> 2; + case SOUTH -> 3; + case WEST -> 4; + case UP -> 5; + case DOWN -> 6; + }; + } + + private Pair getDirButtonTextures(int index) { + return switch (index) { + case 1 -> new Pair<>( + AdvancedAE.id("textures/guis/north_button.png"), + AdvancedAE.id("textures/guis/north_button_selected.png")); + case 2 -> new Pair<>( + AdvancedAE.id("textures/guis/east_button.png"), + AdvancedAE.id("textures/guis/east_button_selected.png")); + case 3 -> new Pair<>( + AdvancedAE.id("textures/guis/south_button.png"), + AdvancedAE.id("textures/guis/south_button_selected.png")); + case 4 -> new Pair<>( + AdvancedAE.id("textures/guis/west_button.png"), + AdvancedAE.id("textures/guis/west_button_selected.png")); + case 5 -> new Pair<>( + AdvancedAE.id("textures/guis/up_button.png"), + AdvancedAE.id("textures/guis/up_button_selected.png")); + case 6 -> new Pair<>( + AdvancedAE.id("textures/guis/down_button.png"), + AdvancedAE.id("textures/guis/down_button_selected.png")); + default -> new Pair<>( + AdvancedAE.id("textures/guis/any_button.png"), + AdvancedAE.id("textures/guis/any_button_selected.png")); + }; + } + + private Component getDirButtonText(int index) { + return switch (index) { + case 1 -> Component.translatable("gui.advanced_ae.north_button_tooltip"); + case 2 -> Component.translatable("gui.advanced_ae.east_button_tooltip"); + case 3 -> Component.translatable("gui.advanced_ae.south_button_tooltip"); + case 4 -> Component.translatable("gui.advanced_ae.west_button_tooltip"); + case 5 -> Component.translatable("gui.advanced_ae.up_button_tooltip"); + case 6 -> Component.translatable("gui.advanced_ae.down_button_tooltip"); + default -> Component.translatable("gui.advanced_ae.any_button_tooltip"); + }; + } + + private void resetScrollbar() { + scrollbar.setHeight(VISIBLE_ROWS * ROW_HEIGHT + (VISIBLE_ROWS - 1) * ROW_SPACING - 2); + scrollbar.setRange(0, this.inputList.size() - VISIBLE_ROWS, 2); + } + + public record InputRow(AEKey key, @Nullable Direction dir) {} } diff --git a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/DirectionInputButton.java b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/DirectionInputButton.java index 361c3032..e47df5df 100644 --- a/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/DirectionInputButton.java +++ b/src/main/java/net/pedroksl/advanced_ae/gui/patternencoder/DirectionInputButton.java @@ -1,78 +1,81 @@ package net.pedroksl.advanced_ae.gui.patternencoder; -import appeng.api.stacks.AEKey; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.datafixers.util.Pair; + +import org.jetbrains.annotations.NotNull; + import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; + +import appeng.api.stacks.AEKey; public class DirectionInputButton extends Button { - Pair textures; - private AEKey key; - private int index; - private boolean highlighted; - - public DirectionInputButton(int x, int y, int width, int height, - Pair textures, OnPress onPress) { - super(x, y, width, height, Component.empty(), onPress, Button.DEFAULT_NARRATION); - - this.textures = textures; - } - - public void setHighlighted(boolean isHighlighted) { - this.highlighted = isHighlighted; - } - - public void setKey(AEKey key) { - this.key = key; - } - - public AEKey getKey() { - return this.key; - } - - public void setIndex(int index) { - this.index = index; - } - - public Direction getDirection() { - return switch (index) { - case 1 -> Direction.NORTH; - case 2 -> Direction.EAST; - case 3 -> Direction.SOUTH; - case 4 -> Direction.WEST; - case 5 -> Direction.UP; - case 6 -> Direction.DOWN; - default -> null; - }; - } - - @Override - protected void renderWidget(@NotNull GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { - RenderSystem.setShader(GameRenderer::getPositionShader); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); - if (highlighted) { - RenderSystem.setShaderTexture(0, textures.getSecond()); - pGuiGraphics.blit(textures.getSecond(), this.getX(), this.getY(), 0, 0, width, height, 16, 16); - } else { - RenderSystem.setShaderTexture(0, textures.getFirst()); - pGuiGraphics.blit(textures.getFirst(), this.getX(), this.getY(), 0, 0, width, height, 16, 16); - } - } - - @Override - public void onClick(double p_onClick_1_, double p_onClick_3_) { - super.onClick(p_onClick_1_, p_onClick_3_); - } - - @Override - public boolean mouseClicked(double x, double y, int button) { - return super.mouseClicked(x, y, button); - } + Pair textures; + private AEKey key; + private int index; + private boolean highlighted; + + public DirectionInputButton( + int x, int y, int width, int height, Pair textures, OnPress onPress) { + super(x, y, width, height, Component.empty(), onPress, Button.DEFAULT_NARRATION); + + this.textures = textures; + } + + public void setHighlighted(boolean isHighlighted) { + this.highlighted = isHighlighted; + } + + public void setKey(AEKey key) { + this.key = key; + } + + public AEKey getKey() { + return this.key; + } + + public void setIndex(int index) { + this.index = index; + } + + public Direction getDirection() { + return switch (index) { + case 1 -> Direction.NORTH; + case 2 -> Direction.EAST; + case 3 -> Direction.SOUTH; + case 4 -> Direction.WEST; + case 5 -> Direction.UP; + case 6 -> Direction.DOWN; + default -> null; + }; + } + + @Override + protected void renderWidget(@NotNull GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) { + RenderSystem.setShader(GameRenderer::getPositionShader); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + if (highlighted) { + RenderSystem.setShaderTexture(0, textures.getSecond()); + pGuiGraphics.blit(textures.getSecond(), this.getX(), this.getY(), 0, 0, width, height, 16, 16); + } else { + RenderSystem.setShaderTexture(0, textures.getFirst()); + pGuiGraphics.blit(textures.getFirst(), this.getX(), this.getY(), 0, 0, width, height, 16, 16); + } + } + + @Override + public void onClick(double p_onClick_1_, double p_onClick_3_) { + super.onClick(p_onClick_1_, p_onClick_3_); + } + + @Override + public boolean mouseClicked(double x, double y, int button) { + return super.mouseClicked(x, y, button); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/AAEMixinPlugin.java b/src/main/java/net/pedroksl/advanced_ae/mixins/AAEMixinPlugin.java index 71979eb6..3da56ae8 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/AAEMixinPlugin.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/AAEMixinPlugin.java @@ -1,72 +1,68 @@ package net.pedroksl.advanced_ae.mixins; -import net.neoforged.fml.ModList; +import java.util.List; +import java.util.Set; + import org.objectweb.asm.tree.ClassNode; -import it.unimi.dsi.fastutil.objects.Object2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + +import net.neoforged.fml.ModList; import net.neoforged.fml.loading.LoadingModList; import net.neoforged.fml.loading.moddiscovery.ModInfo; -import java.util.List; -import java.util.Set; - public class AAEMixinPlugin implements IMixinConfigPlugin { - private static final Object2ObjectMap MOD_MIXINS = new Object2ObjectOpenHashMap<>( - new String[]{"net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderMenu", - "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderGui", - "net.pedroksl.advanced_ae.mixins.appflux.MixinSmallAdvPatternProviderGui", - "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderLogic", - "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderLogicHost"}, - new String[]{"appflux", "appflux", "appflux", "appflux", "appflux"}, - Object2ObjectOpenHashMap.DEFAULT_LOAD_FACTOR - ); - - @Override - public void onLoad(String s) { - String[] str; - - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return !MOD_MIXINS.containsKey(mixinClassName) || isModLoaded(MOD_MIXINS.get(mixinClassName)); - } - - @Override - public void acceptTargets(Set set, Set set1) { - - } - - @Override - public List getMixins() { - return null; - } - - @Override - public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } - - @Override - public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } - - private static boolean isModLoaded(String modId) { - if (ModList.get() == null) { - return LoadingModList.get().getMods() - .stream().map(ModInfo::getModId) - .anyMatch(modId::equals); - } else { - return ModList.get().isLoaded(modId); - } - } + private static final Object2ObjectMap MOD_MIXINS = new Object2ObjectOpenHashMap<>( + new String[] { + "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderMenu", + "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderGui", + "net.pedroksl.advanced_ae.mixins.appflux.MixinSmallAdvPatternProviderGui", + "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderLogic", + "net.pedroksl.advanced_ae.mixins.appflux.MixinAdvPatternProviderLogicHost" + }, + new String[] {"appflux", "appflux", "appflux", "appflux", "appflux"}, + Object2ObjectOpenHashMap.DEFAULT_LOAD_FACTOR); + + @Override + public void onLoad(String s) { + String[] str; + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + return !MOD_MIXINS.containsKey(mixinClassName) || isModLoaded(MOD_MIXINS.get(mixinClassName)); + } + + @Override + public void acceptTargets(Set set, Set set1) {} + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {} + + @Override + public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {} + + private static boolean isModLoaded(String modId) { + if (ModList.get() == null) { + return LoadingModList.get().getMods().stream() + .map(ModInfo::getModId) + .anyMatch(modId::equals); + } else { + return ModList.get().isLoaded(modId); + } + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinContainerPatternModifier.java b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinContainerPatternModifier.java index 33cd473b..864e2095 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinContainerPatternModifier.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinContainerPatternModifier.java @@ -1,5 +1,23 @@ package net.pedroksl.advanced_ae.mixins; +import java.util.Arrays; +import java.util.HashMap; + +import com.glodblock.github.extendedae.container.ContainerPatternModifier; +import com.glodblock.github.extendedae.util.Ae2Reflect; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetailsEncoder; +import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; + import appeng.api.crafting.PatternDetailsHelper; import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; @@ -10,181 +28,158 @@ import appeng.menu.AEBaseMenu; import appeng.menu.SlotSemantics; import appeng.menu.slot.AppEngSlot; -import com.glodblock.github.extendedae.container.ContainerPatternModifier; -import com.glodblock.github.extendedae.util.Ae2Reflect; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetailsEncoder; -import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Arrays; -import java.util.HashMap; @Mixin(ContainerPatternModifier.class) public class MixinContainerPatternModifier extends AEBaseMenu { - public MixinContainerPatternModifier(MenuType menuType, int id, Inventory playerInventory, Object host) { - super(menuType, id, playerInventory, host); - } - - @Final - @Shadow(remap = false) - public AppEngSlot replaceTarget; - - @Final - @Shadow(remap = false) - public AppEngSlot replaceWith; - - @Shadow(remap = false) - private void replace(GenericStack[] stacks, GenericStack[] des, AEKey replace, AEKey with) { - } - - @Shadow(remap = false) - private ItemStack[] itemize(GenericStack[] stacks) { - return null; - } - - @Shadow(remap = false) - private ItemStack itemize(GenericStack stack) { - return null; - } - - @Shadow(remap = false) - private boolean checkModify(GenericStack[] stacks, int scale, boolean div) { - return false; - } - - @Shadow(remap = false) - private void modifyStacks(GenericStack[] stacks, GenericStack[] des, int scale, boolean div) { - } - - /** - * @author pedroksl - * @reason Enabled replace method to keep adv patterns custom tags - */ - @Overwrite(remap = false) - public void replace() { - var replace = this.replaceTarget.getItem(); - var with = this.replaceWith.getItem(); - if (replace.isEmpty() || with.isEmpty()) { - return; - } - for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) { - var stack = slot.getItem(); - if (stack.getItem() instanceof EncodedPatternItem) { - var detail = PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); - if (detail instanceof AdvProcessingPattern processingPattern) { - var input = processingPattern.getSparseInputs().toArray(new GenericStack[0]); - var output = processingPattern.getOutputs().toArray(new GenericStack[0]); - var replaceInput = new GenericStack[input.length]; - var replaceOutput = new GenericStack[output.length]; - this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); - this.replace(output, replaceOutput, AEItemKey.of(replace), AEItemKey.of(with)); - - var dirMap = processingPattern.getDirectionMap(); - var newDirMap = new HashMap(); - for (var entry : dirMap.entrySet()) { - if (AEItemKey.matches(entry.getKey(), replace)) { - newDirMap.put(AEItemKey.of(with), entry.getValue()); - } else { - newDirMap.put(entry.getKey(), entry.getValue()); - } - } - ItemStack newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( - Arrays.asList(replaceInput), - Arrays.asList(replaceOutput), - newDirMap); - slot.set(newPattern); - } else if (detail instanceof AEProcessingPattern process) { - var input = process.getSparseInputs().toArray(new GenericStack[0]); - var output = process.getOutputs().toArray(new GenericStack[0]); - var replaceInput = new GenericStack[input.length]; - var replaceOutput = new GenericStack[output.length]; - this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); - this.replace(output, replaceOutput, AEItemKey.of(replace), AEItemKey.of(with)); - var newPattern = PatternDetailsHelper.encodeProcessingPattern( - Arrays.asList(replaceInput), - Arrays.asList(replaceOutput) - ); - slot.set(newPattern); - } else if (detail instanceof AECraftingPattern craft) { - var input = craft.getSparseInputs().toArray(new GenericStack[0]); - var output = craft.getPrimaryOutput(); - var replaceInput = new GenericStack[input.length]; - this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); - try { - var newPattern = PatternDetailsHelper.encodeCraftingPattern( - Ae2Reflect.getCraftRecipe(craft), - itemize(replaceInput), - itemize(output), - craft.canSubstitute, - craft.canSubstituteFluids - ); - //noinspection DataFlowIssue - var check = new AECraftingPattern(AEItemKey.of(newPattern), this.getPlayer().level()); - //noinspection ConstantValue - if (check != null) { - slot.set(newPattern); - } - } catch (Exception e) { - // It is an invalid change - return; - } - } - } - } - } - - /** - * @author pedroksl - * @reason Enabled modify method to keep adv patterns custom tags - */ - @Overwrite(remap = false) - public void modify(int scale, boolean div) { - if (scale <= 0) { - return; - } - for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) { - var stack = slot.getItem(); - if (stack.getItem() instanceof EncodedPatternItem) { - var detail = PatternDetailsHelper.decodePattern(stack, this.getPlayer().level()); - if (detail instanceof AdvProcessingPattern processingPattern) { - var input = processingPattern.getSparseInputs().toArray(new GenericStack[0]); - var output = processingPattern.getOutputs().toArray(new GenericStack[0]); - if (checkModify(input, scale, div) && checkModify(output, scale, div)) { - var mulInput = new GenericStack[input.length]; - var mulOutput = new GenericStack[output.length]; - modifyStacks(input, mulInput, scale, div); - modifyStacks(output, mulOutput, scale, div); - var dirMap = processingPattern.getDirectionMap(); - ItemStack newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( - Arrays.asList(mulInput), - Arrays.asList(mulOutput), - dirMap); - slot.set(newPattern); - } - } else if (detail instanceof AEProcessingPattern process) { - var input = process.getSparseInputs().toArray(new GenericStack[0]); - var output = process.getOutputs().toArray(new GenericStack[0]); - if (checkModify(input, scale, div) && checkModify(output, scale, div)) { - var mulInput = new GenericStack[input.length]; - var mulOutput = new GenericStack[output.length]; - modifyStacks(input, mulInput, scale, div); - modifyStacks(output, mulOutput, scale, div); - var newPattern = PatternDetailsHelper.encodeProcessingPattern( - Arrays.asList(mulInput), - Arrays.asList(mulOutput) - ); - slot.set(newPattern); - } - } - } - } - } + public MixinContainerPatternModifier(MenuType menuType, int id, Inventory playerInventory, Object host) { + super(menuType, id, playerInventory, host); + } + + @Final + @Shadow(remap = false) + public AppEngSlot replaceTarget; + + @Final + @Shadow(remap = false) + public AppEngSlot replaceWith; + + @Shadow(remap = false) + private void replace(GenericStack[] stacks, GenericStack[] des, AEKey replace, AEKey with) {} + + @Shadow(remap = false) + private ItemStack[] itemize(GenericStack[] stacks) { + return null; + } + + @Shadow(remap = false) + private ItemStack itemize(GenericStack stack) { + return null; + } + + @Shadow(remap = false) + private boolean checkModify(GenericStack[] stacks, int scale, boolean div) { + return false; + } + + @Shadow(remap = false) + private void modifyStacks(GenericStack[] stacks, GenericStack[] des, int scale, boolean div) {} + + /** + * @author pedroksl + * @reason Enabled replace method to keep adv patterns custom tags + */ + @Overwrite(remap = false) + public void replace() { + var replace = this.replaceTarget.getItem(); + var with = this.replaceWith.getItem(); + if (replace.isEmpty() || with.isEmpty()) { + return; + } + for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) { + var stack = slot.getItem(); + if (stack.getItem() instanceof EncodedPatternItem) { + var detail = PatternDetailsHelper.decodePattern( + stack, this.getPlayer().level()); + if (detail instanceof AdvProcessingPattern processingPattern) { + var input = processingPattern.getSparseInputs().toArray(new GenericStack[0]); + var output = processingPattern.getOutputs().toArray(new GenericStack[0]); + var replaceInput = new GenericStack[input.length]; + var replaceOutput = new GenericStack[output.length]; + this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); + this.replace(output, replaceOutput, AEItemKey.of(replace), AEItemKey.of(with)); + + var dirMap = processingPattern.getDirectionMap(); + var newDirMap = new HashMap(); + for (var entry : dirMap.entrySet()) { + if (AEItemKey.matches(entry.getKey(), replace)) { + newDirMap.put(AEItemKey.of(with), entry.getValue()); + } else { + newDirMap.put(entry.getKey(), entry.getValue()); + } + } + ItemStack newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( + Arrays.asList(replaceInput), Arrays.asList(replaceOutput), newDirMap); + slot.set(newPattern); + } else if (detail instanceof AEProcessingPattern process) { + var input = process.getSparseInputs().toArray(new GenericStack[0]); + var output = process.getOutputs().toArray(new GenericStack[0]); + var replaceInput = new GenericStack[input.length]; + var replaceOutput = new GenericStack[output.length]; + this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); + this.replace(output, replaceOutput, AEItemKey.of(replace), AEItemKey.of(with)); + var newPattern = PatternDetailsHelper.encodeProcessingPattern( + Arrays.asList(replaceInput), Arrays.asList(replaceOutput)); + slot.set(newPattern); + } else if (detail instanceof AECraftingPattern craft) { + var input = craft.getSparseInputs().toArray(new GenericStack[0]); + var output = craft.getPrimaryOutput(); + var replaceInput = new GenericStack[input.length]; + this.replace(input, replaceInput, AEItemKey.of(replace), AEItemKey.of(with)); + try { + var newPattern = PatternDetailsHelper.encodeCraftingPattern( + Ae2Reflect.getCraftRecipe(craft), + itemize(replaceInput), + itemize(output), + craft.canSubstitute, + craft.canSubstituteFluids); + //noinspection DataFlowIssue + var check = new AECraftingPattern( + AEItemKey.of(newPattern), this.getPlayer().level()); + //noinspection ConstantValue + if (check != null) { + slot.set(newPattern); + } + } catch (Exception e) { + // It is an invalid change + return; + } + } + } + } + } + + /** + * @author pedroksl + * @reason Enabled modify method to keep adv patterns custom tags + */ + @Overwrite(remap = false) + public void modify(int scale, boolean div) { + if (scale <= 0) { + return; + } + for (var slot : this.getSlots(SlotSemantics.ENCODED_PATTERN)) { + var stack = slot.getItem(); + if (stack.getItem() instanceof EncodedPatternItem) { + var detail = PatternDetailsHelper.decodePattern( + stack, this.getPlayer().level()); + if (detail instanceof AdvProcessingPattern processingPattern) { + var input = processingPattern.getSparseInputs().toArray(new GenericStack[0]); + var output = processingPattern.getOutputs().toArray(new GenericStack[0]); + if (checkModify(input, scale, div) && checkModify(output, scale, div)) { + var mulInput = new GenericStack[input.length]; + var mulOutput = new GenericStack[output.length]; + modifyStacks(input, mulInput, scale, div); + modifyStacks(output, mulOutput, scale, div); + var dirMap = processingPattern.getDirectionMap(); + ItemStack newPattern = AdvPatternDetailsEncoder.encodeProcessingPattern( + Arrays.asList(mulInput), Arrays.asList(mulOutput), dirMap); + slot.set(newPattern); + } + } else if (detail instanceof AEProcessingPattern process) { + var input = process.getSparseInputs().toArray(new GenericStack[0]); + var output = process.getOutputs().toArray(new GenericStack[0]); + if (checkModify(input, scale, div) && checkModify(output, scale, div)) { + var mulInput = new GenericStack[input.length]; + var mulOutput = new GenericStack[output.length]; + modifyStacks(input, mulInput, scale, div); + modifyStacks(output, mulOutput, scale, div); + var newPattern = PatternDetailsHelper.encodeProcessingPattern( + Arrays.asList(mulInput), Arrays.asList(mulOutput)); + slot.set(newPattern); + } + } + } + } + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinEncodedPatternItem.java b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinEncodedPatternItem.java index 86809b8f..76f7a8bc 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinEncodedPatternItem.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinEncodedPatternItem.java @@ -1,17 +1,8 @@ package net.pedroksl.advanced_ae.mixins; -import appeng.api.crafting.*; -import appeng.api.stacks.AEItemKey; -import appeng.api.stacks.GenericStack; -import appeng.core.AppEng; -import appeng.core.localization.GuiText; -import appeng.crafting.pattern.EncodedPatternItem; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; +import java.util.List; +import java.util.Objects; + import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -20,94 +11,111 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; -import java.util.Objects; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; + +import appeng.api.crafting.*; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.GenericStack; +import appeng.core.AppEng; +import appeng.core.localization.GuiText; +import appeng.crafting.pattern.EncodedPatternItem; @Mixin(value = EncodedPatternItem.class, remap = false) public class MixinEncodedPatternItem { - @Final - @Shadow - private EncodedPatternDecoder decoder; - - @Final - @Nullable - private InvalidPatternTooltipStrategy invalidPatternTooltip; - - @Shadow - protected static Component getTooltipEntryLine(GenericStack stack) { - return Component.empty(); - } - - @Inject( - method = "appendHoverText", - at = @At("HEAD"), - cancellable = true - ) - public void onHoverText(ItemStack stack, Item.TooltipContext context, List lines, - TooltipFlag flags, CallbackInfo ci) { - var what = AEItemKey.of(stack); - if (what == null) { - // This can be called very early to index tooltips for search. In those cases, - // there is no encoded pattern present. - ci.cancel(); - } - - var clientLevel = AppEng.instance().getClientLevel(); - if (clientLevel == null) { - ci.cancel(); // Showing pattern details will only work reliably client-side - } - - PatternDetailsTooltip tooltip; - try { - var details = Objects.requireNonNull(decoder.decode(what, clientLevel), "decoder returned null"); - - if (!(details instanceof AdvProcessingPattern)) { - return; - } - - tooltip = details.getTooltip(clientLevel, flags); - } catch (Exception e) { - lines.add(GuiText.InvalidPattern.text().copy().withStyle(ChatFormatting.RED)); - if (invalidPatternTooltip != null) { - tooltip = invalidPatternTooltip.getTooltip(stack, clientLevel, e, flags); - } else { - tooltip = null; - } - } - - if (tooltip != null) { - var label = Component.empty().append(tooltip.getOutputMethod()) - .append(": ").withStyle(ChatFormatting.GRAY); - var and = Component.literal(" ").append(GuiText.And.text()) - .append(" ").withStyle(ChatFormatting.GRAY); - var with = GuiText.With.text().copy().append(": ").withStyle(ChatFormatting.GRAY); - - boolean first = true; - for (var output : tooltip.getOutputs()) { - lines.add(Component.empty().append(first ? label : and).append(getTooltipEntryLine(output))); - first = false; - } - - first = true; - for (var input : tooltip.getInputs()) { - var details = ((AdvProcessingPattern) decoder.decode(what, clientLevel)); - var inputDirection = details.getDirectionSideForInputKey(input.what()); - var dirText = inputDirection == null ? "" : " (" + inputDirection.toString().toUpperCase().charAt(0) + ")"; - lines.add(Component.empty().append(first ? with : and).append(getTooltipEntryLine(input)).append(dirText)); - first = false; - } - - for (var property : tooltip.getProperties()) { - if (property.value() != null) { - lines.add(Component.empty().append(property.name()) - .append(Component.literal(": ").withStyle(ChatFormatting.GRAY)) - .append(property.value())); - } else { - lines.add(Component.empty().withStyle(ChatFormatting.GRAY).append(property.name())); - } - } - } - ci.cancel(); - } + @Final + @Shadow + private EncodedPatternDecoder decoder; + + @Final + @Nullable + private InvalidPatternTooltipStrategy invalidPatternTooltip; + + @Shadow + protected static Component getTooltipEntryLine(GenericStack stack) { + return Component.empty(); + } + + @Inject(method = "appendHoverText", at = @At("HEAD"), cancellable = true) + public void onHoverText( + ItemStack stack, Item.TooltipContext context, List lines, TooltipFlag flags, CallbackInfo ci) { + var what = AEItemKey.of(stack); + if (what == null) { + // This can be called very early to index tooltips for search. In those cases, + // there is no encoded pattern present. + ci.cancel(); + } + + var clientLevel = AppEng.instance().getClientLevel(); + if (clientLevel == null) { + ci.cancel(); // Showing pattern details will only work reliably client-side + } + + PatternDetailsTooltip tooltip; + try { + var details = Objects.requireNonNull(decoder.decode(what, clientLevel), "decoder returned null"); + + if (!(details instanceof AdvProcessingPattern)) { + return; + } + + tooltip = details.getTooltip(clientLevel, flags); + } catch (Exception e) { + lines.add(GuiText.InvalidPattern.text().copy().withStyle(ChatFormatting.RED)); + if (invalidPatternTooltip != null) { + tooltip = invalidPatternTooltip.getTooltip(stack, clientLevel, e, flags); + } else { + tooltip = null; + } + } + + if (tooltip != null) { + var label = Component.empty() + .append(tooltip.getOutputMethod()) + .append(": ") + .withStyle(ChatFormatting.GRAY); + var and = Component.literal(" ") + .append(GuiText.And.text()) + .append(" ") + .withStyle(ChatFormatting.GRAY); + var with = GuiText.With.text().copy().append(": ").withStyle(ChatFormatting.GRAY); + + boolean first = true; + for (var output : tooltip.getOutputs()) { + lines.add(Component.empty().append(first ? label : and).append(getTooltipEntryLine(output))); + first = false; + } + + first = true; + for (var input : tooltip.getInputs()) { + var details = ((AdvProcessingPattern) decoder.decode(what, clientLevel)); + var inputDirection = details.getDirectionSideForInputKey(input.what()); + var dirText = inputDirection == null + ? "" + : " (" + inputDirection.toString().toUpperCase().charAt(0) + ")"; + lines.add(Component.empty() + .append(first ? with : and) + .append(getTooltipEntryLine(input)) + .append(dirText)); + first = false; + } + + for (var property : tooltip.getProperties()) { + if (property.value() != null) { + lines.add(Component.empty() + .append(property.name()) + .append(Component.literal(": ").withStyle(ChatFormatting.GRAY)) + .append(property.value())); + } else { + lines.add(Component.empty().withStyle(ChatFormatting.GRAY).append(property.name())); + } + } + } + ci.cancel(); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingLogic.java b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingLogic.java index 4ec0f64e..aaf1c9a9 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingLogic.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingLogic.java @@ -1,12 +1,5 @@ package net.pedroksl.advanced_ae.mixins; -import appeng.api.crafting.IPatternDetails; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.crafting.pattern.AEProcessingPattern; -import appeng.helpers.IPatternTerminalLogicHost; -import appeng.parts.encoding.PatternEncodingLogic; -import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,30 +7,33 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(value = PatternEncodingLogic.class, remap = false) -public class MixinPatternEncodingLogic { +import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; - @Final - @Shadow - private IPatternTerminalLogicHost host; +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.PatternDetailsHelper; +import appeng.crafting.pattern.AEProcessingPattern; +import appeng.helpers.IPatternTerminalLogicHost; +import appeng.parts.encoding.PatternEncodingLogic; - @Shadow - private void loadProcessingPattern(AEProcessingPattern pattern) { +@Mixin(value = PatternEncodingLogic.class, remap = false) +public class MixinPatternEncodingLogic { - } + @Final + @Shadow + private IPatternTerminalLogicHost host; - @Inject( - method = "loadEncodedPattern", - at = @At(value = "INVOKE", ordinal = 7) - ) - protected void onLoadEncodedPattern(ItemStack pattern, CallbackInfo ci) { - IPatternDetails details = PatternDetailsHelper.decodePattern(pattern, this.host.getLevel()); - if (details instanceof AdvProcessingPattern advPattern) { - var aePattern = advPattern.getAEProcessingPattern(this.host.getLevel()); - if (aePattern != null) { - loadProcessingPattern(aePattern); - } - } - } + @Shadow + private void loadProcessingPattern(AEProcessingPattern pattern) {} + @Inject(method = "loadEncodedPattern", at = @At(value = "INVOKE", ordinal = 7)) + protected void onLoadEncodedPattern(ItemStack pattern, CallbackInfo ci) { + IPatternDetails details = PatternDetailsHelper.decodePattern(pattern, this.host.getLevel()); + if (details instanceof AdvProcessingPattern advPattern) { + var aePattern = advPattern.getAEProcessingPattern(this.host.getLevel()); + if (aePattern != null) { + loadProcessingPattern(aePattern); + } + } + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingTermMenu.java b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingTermMenu.java index 7eeaf6fb..4d6b71f6 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingTermMenu.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternEncodingTermMenu.java @@ -1,18 +1,8 @@ package net.pedroksl.advanced_ae.mixins; -import appeng.api.crafting.PatternDetailsHelper; -import appeng.api.stacks.AEKey; -import appeng.api.stacks.GenericStack; -import appeng.api.storage.ITerminalHost; -import appeng.menu.me.common.MEStorageMenu; -import appeng.menu.me.items.PatternEncodingTermMenu; -import appeng.menu.slot.RestrictedInputSlot; -import net.minecraft.core.Direction; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetailsEncoder; -import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; +import java.util.Arrays; +import java.util.HashMap; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,56 +11,66 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.Arrays; -import java.util.HashMap; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetailsEncoder; +import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern; + +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.ITerminalHost; +import appeng.menu.me.common.MEStorageMenu; +import appeng.menu.me.items.PatternEncodingTermMenu; +import appeng.menu.slot.RestrictedInputSlot; @Mixin(PatternEncodingTermMenu.class) public class MixinPatternEncodingTermMenu extends MEStorageMenu { - @Final - @Shadow(remap = false) - private RestrictedInputSlot encodedPatternSlot; + @Final + @Shadow(remap = false) + private RestrictedInputSlot encodedPatternSlot; - @Inject( - method = "encodeProcessingPattern", - at = @At(value = "RETURN", ordinal = 2), - cancellable = true, - locals = LocalCapture.CAPTURE_FAILHARD, - remap = false - ) - private void onEncodeProcessingPattern(CallbackInfoReturnable cir, GenericStack[] in, boolean v, GenericStack[] out) { - if (this.encodedPatternSlot.hasItem()) { - var encodedPattern = this.encodedPatternSlot.getItem(); + @Inject( + method = "encodeProcessingPattern", + at = @At(value = "RETURN", ordinal = 2), + cancellable = true, + locals = LocalCapture.CAPTURE_FAILHARD, + remap = false) + private void onEncodeProcessingPattern( + CallbackInfoReturnable cir, GenericStack[] in, boolean v, GenericStack[] out) { + if (this.encodedPatternSlot.hasItem()) { + var encodedPattern = this.encodedPatternSlot.getItem(); - var details = PatternDetailsHelper.decodePattern(encodedPattern, this.getPlayerInventory().player.level()); - if (details == null) { - return; - } + var details = PatternDetailsHelper.decodePattern( + encodedPattern, this.getPlayerInventory().player.level()); + if (details == null) { + return; + } - if (details instanceof AdvProcessingPattern pattern) { - var dirMap = pattern.getDirectionMap(); - HashMap newDirMap = new HashMap<>(); - for (var input : in) { - if (input == null) { - continue; - } + if (details instanceof AdvProcessingPattern pattern) { + var dirMap = pattern.getDirectionMap(); + HashMap newDirMap = new HashMap<>(); + for (var input : in) { + if (input == null) { + continue; + } - if (dirMap.containsKey(input.what())) { - newDirMap.put(input.what(), dirMap.get(input.what())); - } - } - if (!newDirMap.isEmpty()) { - cir.setReturnValue(AdvPatternDetailsEncoder.encodeProcessingPattern( - Arrays.asList(in), - Arrays.asList(out), - newDirMap - )); - } - } - } - } + if (dirMap.containsKey(input.what())) { + newDirMap.put(input.what(), dirMap.get(input.what())); + } + } + if (!newDirMap.isEmpty()) { + cir.setReturnValue(AdvPatternDetailsEncoder.encodeProcessingPattern( + Arrays.asList(in), Arrays.asList(out), newDirMap)); + } + } + } + } - public MixinPatternEncodingTermMenu(MenuType menuType, int id, Inventory ip, ITerminalHost host) { - super(menuType, id, ip, host); - } + public MixinPatternEncodingTermMenu(MenuType menuType, int id, Inventory ip, ITerminalHost host) { + super(menuType, id, ip, host); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternProviderLogic.java b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternProviderLogic.java index 8eb58b4a..9ef54454 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternProviderLogic.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/MixinPatternProviderLogic.java @@ -1,9 +1,7 @@ package net.pedroksl.advanced_ae.mixins; -import appeng.api.networking.IManagedGridNode; -import appeng.helpers.patternprovider.PatternProviderLogic; -import net.minecraft.core.Direction; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import java.util.EnumSet; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -11,32 +9,31 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import java.util.EnumSet; +import net.minecraft.core.Direction; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; + +import appeng.api.networking.IManagedGridNode; +import appeng.helpers.patternprovider.PatternProviderLogic; @Mixin(value = PatternProviderLogic.class, remap = false) public class MixinPatternProviderLogic { - @Shadow - IManagedGridNode mainNode; - - @Inject( - method = "getActiveSides", - at = @At("TAIL"), - locals = LocalCapture.CAPTURE_FAILHARD, - cancellable = true - ) - private void onGetActiveSides(CallbackInfoReturnable> cir, EnumSet sides) { - // Additionally skip sides with grid connections to advanced pattern providers - var node = mainNode.getNode(); - if (node != null) { - for (var entry : node.getInWorldConnections().entrySet()) { - var otherNode = entry.getValue().getOtherSide(node); - if (otherNode.getOwner() instanceof AdvPatternProviderLogicHost) { - sides.remove(entry.getKey()); - } - } - } - - cir.setReturnValue(sides); - } + @Shadow + IManagedGridNode mainNode; + + @Inject(method = "getActiveSides", at = @At("TAIL"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) + private void onGetActiveSides(CallbackInfoReturnable> cir, EnumSet sides) { + // Additionally skip sides with grid connections to advanced pattern providers + var node = mainNode.getNode(); + if (node != null) { + for (var entry : node.getInWorldConnections().entrySet()) { + var otherNode = entry.getValue().getOtherSide(node); + if (otherNode.getOwner() instanceof AdvPatternProviderLogicHost) { + sides.remove(entry.getKey()); + } + } + } + + cir.setReturnValue(sides); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderGui.java b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderGui.java index 80b5e50f..a13c5808 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderGui.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderGui.java @@ -1,47 +1,53 @@ package net.pedroksl.advanced_ae.mixins.appflux; -import appeng.api.upgrades.Upgrades; -import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.UpgradesPanel; -import appeng.core.localization.GuiText; -import appeng.menu.SlotSemantics; +import java.util.ArrayList; +import java.util.List; + import com.glodblock.github.appflux.util.helpers.IUpgradableMenu; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderContainer; -import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderGui; + 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 java.util.ArrayList; -import java.util.List; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderContainer; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderGui; + +import appeng.api.upgrades.Upgrades; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.UpgradesPanel; +import appeng.core.localization.GuiText; +import appeng.menu.SlotSemantics; @Mixin(AdvPatternProviderGui.class) public abstract class MixinAdvPatternProviderGui extends AEBaseScreen { - @Inject( - method = "", - at = @At("TAIL"), - remap = false - ) - private void initUpgrade(AdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { - this.widgets.add("upgrades", new UpgradesPanel(menu.getSlots(SlotSemantics.UPGRADE), this::af_$getCompatibleUpgrades)); - } - - @Unique - private List af_$getCompatibleUpgrades() { - var list = new ArrayList(); - list.add(GuiText.CompatibleUpgrades.text()); - list.addAll(Upgrades.getTooltipLinesForMachine(((IUpgradableMenu) menu).getUpgrades().getUpgradableItem())); - return list; - } - - public MixinAdvPatternProviderGui(AdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { - super(menu, playerInventory, title, style); - } + @Inject(method = "", at = @At("TAIL"), remap = false) + private void initUpgrade( + AdvPatternProviderContainer menu, + Inventory playerInventory, + Component title, + ScreenStyle style, + CallbackInfo ci) { + this.widgets.add( + "upgrades", new UpgradesPanel(menu.getSlots(SlotSemantics.UPGRADE), this::af_$getCompatibleUpgrades)); + } + + @Unique + private List af_$getCompatibleUpgrades() { + var list = new ArrayList(); + list.add(GuiText.CompatibleUpgrades.text()); + list.addAll(Upgrades.getTooltipLinesForMachine( + ((IUpgradableMenu) menu).getUpgrades().getUpgradableItem())); + return list; + } + public MixinAdvPatternProviderGui( + AdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogic.java b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogic.java index 5d1ec437..3311e079 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogic.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogic.java @@ -1,18 +1,11 @@ package net.pedroksl.advanced_ae.mixins.appflux; -import appeng.api.networking.IManagedGridNode; -import appeng.api.networking.security.IActionSource; -import appeng.api.upgrades.IUpgradeInventory; -import appeng.api.upgrades.IUpgradeableObject; -import appeng.api.upgrades.UpgradeInventories; +import java.util.List; + import com.glodblock.github.appflux.common.AFSingletons; import com.glodblock.github.appflux.common.me.energy.EnergyTicker; import com.glodblock.github.appflux.common.me.service.IEnergyDistributor; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,85 +14,89 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; + +import appeng.api.networking.IManagedGridNode; +import appeng.api.networking.security.IActionSource; +import appeng.api.upgrades.IUpgradeInventory; +import appeng.api.upgrades.IUpgradeableObject; +import appeng.api.upgrades.UpgradeInventories; @Mixin(value = AdvPatternProviderLogic.class, remap = false) public abstract class MixinAdvPatternProviderLogic implements IUpgradeableObject { - @Final - @Shadow - private AdvPatternProviderLogicHost host; - - @Final - @Shadow - private IManagedGridNode mainNode; - - @Final - @Shadow - private IActionSource actionSource; - - @Unique - private IUpgradeInventory af_upgrades = UpgradeInventories.empty(); - - @Unique - private EnergyTicker af_ticker; - - @Unique - private void af_onUpgradesChanged() { - this.host.saveChanges(); - this.host.getBlockEntity().invalidateCapabilities(); - this.af_ticker.updateSleep(); - } - - @Override - public IUpgradeInventory getUpgrades() { - return this.af_upgrades; - } - - @Inject( - method = "(Lappeng/api/networking/IManagedGridNode;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;I)V", - at = @At("TAIL") - ) - private void initUpgrade(IManagedGridNode mainNode, AdvPatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { - this.af_upgrades = UpgradeInventories.forMachine(host.getTerminalIcon().getItem(), 1, this::af_onUpgradesChanged); - this.af_ticker = new EnergyTicker(this.host::getBlockEntity, this.host, () -> this.af_upgrades.isInstalled(AFSingletons.INDUCTION_CARD), this.mainNode, this.actionSource); - this.mainNode.addService(IEnergyDistributor.class, this.af_ticker); - } - - @Inject( - method = "writeToNBT", - at = @At("TAIL") - ) - private void saveUpgrade(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - this.af_upgrades.writeToNBT(tag, "upgrades", registries); - } - - @Inject( - method = "readFromNBT", - at = @At("TAIL") - ) - private void loadUpgrade(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { - this.af_upgrades.readFromNBT(tag, "upgrades", registries); - } - - @Inject( - method = "addDrops", - at = @At("TAIL") - ) - private void dropUpgrade(List drops, CallbackInfo ci) { - for (var is : this.af_upgrades) { - if (!is.isEmpty()) { - drops.add(is); - } - } - } - - @Inject( - method = "clearContent", - at = @At("TAIL") - ) - private void clearUpgrade(CallbackInfo ci) { - this.af_upgrades.clear(); - } - + @Final + @Shadow + private AdvPatternProviderLogicHost host; + + @Final + @Shadow + private IManagedGridNode mainNode; + + @Final + @Shadow + private IActionSource actionSource; + + @Unique + private IUpgradeInventory af_upgrades = UpgradeInventories.empty(); + + @Unique + private EnergyTicker af_ticker; + + @Unique + private void af_onUpgradesChanged() { + this.host.saveChanges(); + this.host.getBlockEntity().invalidateCapabilities(); + this.af_ticker.updateSleep(); + } + + @Override + public IUpgradeInventory getUpgrades() { + return this.af_upgrades; + } + + @Inject( + method = + "(Lappeng/api/networking/IManagedGridNode;Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;I)V", + at = @At("TAIL")) + private void initUpgrade( + IManagedGridNode mainNode, AdvPatternProviderLogicHost host, int patternInventorySize, CallbackInfo ci) { + this.af_upgrades = + UpgradeInventories.forMachine(host.getTerminalIcon().getItem(), 1, this::af_onUpgradesChanged); + this.af_ticker = new EnergyTicker( + this.host::getBlockEntity, + this.host, + () -> this.af_upgrades.isInstalled(AFSingletons.INDUCTION_CARD), + this.mainNode, + this.actionSource); + this.mainNode.addService(IEnergyDistributor.class, this.af_ticker); + } + + @Inject(method = "writeToNBT", at = @At("TAIL")) + private void saveUpgrade(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { + this.af_upgrades.writeToNBT(tag, "upgrades", registries); + } + + @Inject(method = "readFromNBT", at = @At("TAIL")) + private void loadUpgrade(CompoundTag tag, HolderLookup.Provider registries, CallbackInfo ci) { + this.af_upgrades.readFromNBT(tag, "upgrades", registries); + } + + @Inject(method = "addDrops", at = @At("TAIL")) + private void dropUpgrade(List drops, CallbackInfo ci) { + for (var is : this.af_upgrades) { + if (!is.isEmpty()) { + drops.add(is); + } + } + } + + @Inject(method = "clearContent", at = @At("TAIL")) + private void clearUpgrade(CallbackInfo ci) { + this.af_upgrades.clear(); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogicHost.java b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogicHost.java index 3ab52fbb..ea3825e0 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogicHost.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderLogicHost.java @@ -1,21 +1,22 @@ package net.pedroksl.advanced_ae.mixins.appflux; -import appeng.api.upgrades.IUpgradeInventory; -import appeng.api.upgrades.IUpgradeableObject; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; + +import appeng.api.upgrades.IUpgradeInventory; +import appeng.api.upgrades.IUpgradeableObject; + @Mixin(value = AdvPatternProviderLogicHost.class, remap = false) public interface MixinAdvPatternProviderLogicHost extends IUpgradeableObject { - @Shadow - AdvPatternProviderLogic getLogic(); - - @Override - default IUpgradeInventory getUpgrades() { - return ((IUpgradeableObject) this.getLogic()).getUpgrades(); - } + @Shadow + AdvPatternProviderLogic getLogic(); -} \ No newline at end of file + @Override + default IUpgradeInventory getUpgrades() { + return ((IUpgradeableObject) this.getLogic()).getUpgrades(); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderMenu.java b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderMenu.java index 267b1d1a..d988cc48 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderMenu.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinAdvPatternProviderMenu.java @@ -1,15 +1,7 @@ package net.pedroksl.advanced_ae.mixins.appflux; -import appeng.api.upgrades.IUpgradeInventory; -import appeng.api.upgrades.IUpgradeableObject; -import appeng.menu.AEBaseMenu; import com.glodblock.github.appflux.util.helpers.IUpgradableMenu; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.level.ItemLike; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; -import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; -import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,39 +9,51 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.level.ItemLike; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogicHost; +import net.pedroksl.advanced_ae.gui.advpatternprovider.AdvPatternProviderMenu; + +import appeng.api.upgrades.IUpgradeInventory; +import appeng.api.upgrades.IUpgradeableObject; +import appeng.menu.AEBaseMenu; + @Mixin(AdvPatternProviderMenu.class) public abstract class MixinAdvPatternProviderMenu extends AEBaseMenu implements IUpgradableMenu { - @Final - @Shadow(remap = false) - protected AdvPatternProviderLogic logic; - - @Inject( - method = "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;" + - "Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", - at = @At(value = "INVOKE", target = "Lnet/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu;" + - "createPlayerInventorySlots(Lnet/minecraft/world/entity/player/Inventory;)V"), - remap = false - ) - private void initToolbox(MenuType menuType, int id, Inventory playerInventory, AdvPatternProviderLogicHost host, - CallbackInfo ci) { - this.setupUpgrades(((IUpgradeableObject) host).getUpgrades()); - } - - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public IUpgradeInventory getUpgrades() { - return ((IUpgradeableObject) this.logic).getUpgrades(); - } - - @SuppressWarnings("AddedMixinMembersNamePattern") - @Override - public boolean hasUpgrade(ItemLike upgradeCard) { - return getUpgrades().isInstalled(upgradeCard); - } - - public MixinAdvPatternProviderMenu(MenuType menuType, int id, Inventory playerInventory, Object host) { - super(menuType, id, playerInventory, host); - } - -} \ No newline at end of file + @Final + @Shadow(remap = false) + protected AdvPatternProviderLogic logic; + + @Inject( + method = "(Lnet/minecraft/world/inventory/MenuType;ILnet/minecraft/world/entity/player/Inventory;" + + "Lnet/pedroksl/advanced_ae/common/logic/AdvPatternProviderLogicHost;)V", + at = + @At( + value = "INVOKE", + target = "Lnet/pedroksl/advanced_ae/gui/advpatternprovider/AdvPatternProviderMenu;" + + "createPlayerInventorySlots(Lnet/minecraft/world/entity/player/Inventory;)V"), + remap = false) + private void initToolbox( + MenuType menuType, int id, Inventory playerInventory, AdvPatternProviderLogicHost host, CallbackInfo ci) { + this.setupUpgrades(((IUpgradeableObject) host).getUpgrades()); + } + + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public IUpgradeInventory getUpgrades() { + return ((IUpgradeableObject) this.logic).getUpgrades(); + } + + @SuppressWarnings("AddedMixinMembersNamePattern") + @Override + public boolean hasUpgrade(ItemLike upgradeCard) { + return getUpgrades().isInstalled(upgradeCard); + } + + public MixinAdvPatternProviderMenu(MenuType menuType, int id, Inventory playerInventory, Object host) { + super(menuType, id, playerInventory, host); + } +} diff --git a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinSmallAdvPatternProviderGui.java b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinSmallAdvPatternProviderGui.java index 4730f8f3..08ff937f 100644 --- a/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinSmallAdvPatternProviderGui.java +++ b/src/main/java/net/pedroksl/advanced_ae/mixins/appflux/MixinSmallAdvPatternProviderGui.java @@ -1,47 +1,53 @@ package net.pedroksl.advanced_ae.mixins.appflux; -import appeng.api.upgrades.Upgrades; -import appeng.client.gui.AEBaseScreen; -import appeng.client.gui.style.ScreenStyle; -import appeng.client.gui.widgets.UpgradesPanel; -import appeng.core.localization.GuiText; -import appeng.menu.SlotSemantics; +import java.util.ArrayList; +import java.util.List; + import com.glodblock.github.appflux.util.helpers.IUpgradableMenu; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Inventory; -import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; -import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderGui; + 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 java.util.ArrayList; -import java.util.List; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Inventory; +import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderContainer; +import net.pedroksl.advanced_ae.gui.advpatternprovider.SmallAdvPatternProviderGui; + +import appeng.api.upgrades.Upgrades; +import appeng.client.gui.AEBaseScreen; +import appeng.client.gui.style.ScreenStyle; +import appeng.client.gui.widgets.UpgradesPanel; +import appeng.core.localization.GuiText; +import appeng.menu.SlotSemantics; @Mixin(SmallAdvPatternProviderGui.class) public abstract class MixinSmallAdvPatternProviderGui extends AEBaseScreen { - @Inject( - method = "", - at = @At("TAIL"), - remap = false - ) - private void initUpgrade(SmallAdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style, CallbackInfo ci) { - this.widgets.add("upgrades", new UpgradesPanel(menu.getSlots(SlotSemantics.UPGRADE), this::af_$getCompatibleUpgrades)); - } - - @Unique - private List af_$getCompatibleUpgrades() { - var list = new ArrayList(); - list.add(GuiText.CompatibleUpgrades.text()); - list.addAll(Upgrades.getTooltipLinesForMachine(((IUpgradableMenu) menu).getUpgrades().getUpgradableItem())); - return list; - } - - public MixinSmallAdvPatternProviderGui(SmallAdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { - super(menu, playerInventory, title, style); - } + @Inject(method = "", at = @At("TAIL"), remap = false) + private void initUpgrade( + SmallAdvPatternProviderContainer menu, + Inventory playerInventory, + Component title, + ScreenStyle style, + CallbackInfo ci) { + this.widgets.add( + "upgrades", new UpgradesPanel(menu.getSlots(SlotSemantics.UPGRADE), this::af_$getCompatibleUpgrades)); + } + + @Unique + private List af_$getCompatibleUpgrades() { + var list = new ArrayList(); + list.add(GuiText.CompatibleUpgrades.text()); + list.addAll(Upgrades.getTooltipLinesForMachine( + ((IUpgradableMenu) menu).getUpgrades().getUpgradableItem())); + return list; + } + public MixinSmallAdvPatternProviderGui( + SmallAdvPatternProviderContainer menu, Inventory playerInventory, Component title, ScreenStyle style) { + super(menu, playerInventory, title, style); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/network/AAENetworkHandler.java b/src/main/java/net/pedroksl/advanced_ae/network/AAENetworkHandler.java index fe22f75b..e6926089 100644 --- a/src/main/java/net/pedroksl/advanced_ae/network/AAENetworkHandler.java +++ b/src/main/java/net/pedroksl/advanced_ae/network/AAENetworkHandler.java @@ -1,6 +1,7 @@ package net.pedroksl.advanced_ae.network; import com.glodblock.github.glodium.network.NetworkHandler; + import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.network.packet.AdvPatternEncoderChangeDirectionPacket; import net.pedroksl.advanced_ae.network.packet.AdvPatternEncoderPacket; @@ -8,12 +9,12 @@ public class AAENetworkHandler extends NetworkHandler { - public static final AAENetworkHandler INSTANCE = new AAENetworkHandler(); + public static final AAENetworkHandler INSTANCE = new AAENetworkHandler(); - public AAENetworkHandler() { - super(AdvancedAE.MOD_ID); - registerPacket(AdvPatternEncoderUpdateRequestPacket::new); - registerPacket(AdvPatternEncoderPacket::new); - registerPacket(AdvPatternEncoderChangeDirectionPacket::new); - } + public AAENetworkHandler() { + super(AdvancedAE.MOD_ID); + registerPacket(AdvPatternEncoderUpdateRequestPacket::new); + registerPacket(AdvPatternEncoderPacket::new); + registerPacket(AdvPatternEncoderChangeDirectionPacket::new); + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderChangeDirectionPacket.java b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderChangeDirectionPacket.java index a04ca341..b9886582 100644 --- a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderChangeDirectionPacket.java +++ b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderChangeDirectionPacket.java @@ -1,7 +1,11 @@ package net.pedroksl.advanced_ae.network.packet; -import appeng.api.stacks.AEKey; +import static appeng.api.stacks.AEKey.writeKey; + +import javax.annotation.Nullable; + import com.glodblock.github.glodium.network.packet.IMessage; + import net.minecraft.core.Direction; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; @@ -9,54 +13,51 @@ import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderContainer; -import javax.annotation.Nullable; - -import static appeng.api.stacks.AEKey.writeKey; +import appeng.api.stacks.AEKey; public class AdvPatternEncoderChangeDirectionPacket implements IMessage { - private AEKey key; - private Direction dir; - - public AdvPatternEncoderChangeDirectionPacket() { - } - - public AdvPatternEncoderChangeDirectionPacket(AEKey key, @Nullable Direction dir) { - this.key = key; - this.dir = dir; - } - - @Override - public void toBytes(RegistryFriendlyByteBuf buf) { - writeKey(buf, this.key); - if (this.dir == null) { - buf.writeBoolean(false); - } else { - buf.writeBoolean(true); - buf.writeEnum(this.dir); - } - } - - @Override - public void fromBytes(RegistryFriendlyByteBuf buf) { - this.key = AEKey.readKey(buf); - this.dir = buf.readBoolean() ? buf.readEnum(Direction.class) : null; - } - - @Override - public void onMessage(Player player) { - if (player.containerMenu instanceof AdvPatternEncoderContainer encoderContainer) { - encoderContainer.update(this.key, this.dir); - } - } - - @Override - public ResourceLocation id() { - return AdvancedAE.id("encoder_change_direction_update"); - } - - @Override - public boolean isClient() { - return false; - } + private AEKey key; + private Direction dir; + + public AdvPatternEncoderChangeDirectionPacket() {} + + public AdvPatternEncoderChangeDirectionPacket(AEKey key, @Nullable Direction dir) { + this.key = key; + this.dir = dir; + } + + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + writeKey(buf, this.key); + if (this.dir == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + buf.writeEnum(this.dir); + } + } + + @Override + public void fromBytes(RegistryFriendlyByteBuf buf) { + this.key = AEKey.readKey(buf); + this.dir = buf.readBoolean() ? buf.readEnum(Direction.class) : null; + } + + @Override + public void onMessage(Player player) { + if (player.containerMenu instanceof AdvPatternEncoderContainer encoderContainer) { + encoderContainer.update(this.key, this.dir); + } + } + + @Override + public ResourceLocation id() { + return AdvancedAE.id("encoder_change_direction_update"); + } + + @Override + public boolean isClient() { + return false; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderPacket.java b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderPacket.java index 9a39a2c1..a6be98b9 100644 --- a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderPacket.java +++ b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderPacket.java @@ -1,7 +1,11 @@ package net.pedroksl.advanced_ae.network.packet; -import appeng.api.stacks.AEKey; +import static appeng.api.stacks.AEKey.writeKey; + +import java.util.HashMap; + import com.glodblock.github.glodium.network.packet.IMessage; + import net.minecraft.client.Minecraft; import net.minecraft.core.Direction; import net.minecraft.network.RegistryFriendlyByteBuf; @@ -10,63 +14,61 @@ import net.pedroksl.advanced_ae.AdvancedAE; import net.pedroksl.advanced_ae.gui.patternencoder.AdvPatternEncoderGui; -import java.util.HashMap; - -import static appeng.api.stacks.AEKey.writeKey; +import appeng.api.stacks.AEKey; public class AdvPatternEncoderPacket implements IMessage { - private HashMap dirMap; + private HashMap dirMap; - public AdvPatternEncoderPacket() { - this.dirMap = new HashMap<>(); - } + public AdvPatternEncoderPacket() { + this.dirMap = new HashMap<>(); + } - public AdvPatternEncoderPacket(HashMap dirMap) { - this.dirMap = dirMap; - } + public AdvPatternEncoderPacket(HashMap dirMap) { + this.dirMap = dirMap; + } - @Override - public void toBytes(RegistryFriendlyByteBuf buf) { - buf.writeInt(dirMap.size()); - for (var entry : dirMap.entrySet()) { - writeKey(buf, entry.getKey()); - Direction dir = entry.getValue(); - if (dir == null) { - buf.writeBoolean(false); - } else { - buf.writeBoolean(true); - buf.writeEnum(entry.getValue()); - } - } - } + @Override + public void toBytes(RegistryFriendlyByteBuf buf) { + buf.writeInt(dirMap.size()); + for (var entry : dirMap.entrySet()) { + writeKey(buf, entry.getKey()); + Direction dir = entry.getValue(); + if (dir == null) { + buf.writeBoolean(false); + } else { + buf.writeBoolean(true); + buf.writeEnum(entry.getValue()); + } + } + } - @Override - public void fromBytes(RegistryFriendlyByteBuf buf) { - dirMap = new HashMap<>(); + @Override + public void fromBytes(RegistryFriendlyByteBuf buf) { + dirMap = new HashMap<>(); - int size = buf.readInt(); - for (var x = 0; x < size; x++) { - AEKey key = AEKey.readKey(buf); - Direction dir = buf.readBoolean() ? buf.readEnum(Direction.class) : null; - dirMap.put(key, dir); - } - } + int size = buf.readInt(); + for (var x = 0; x < size; x++) { + AEKey key = AEKey.readKey(buf); + Direction dir = buf.readBoolean() ? buf.readEnum(Direction.class) : null; + dirMap.put(key, dir); + } + } - @Override - public void onMessage(Player player) { - if (Minecraft.getInstance().screen instanceof AdvPatternEncoderGui encoderGui) { - encoderGui.update(this.dirMap); - } - } + @Override + public void onMessage(Player player) { + if (Minecraft.getInstance().screen instanceof AdvPatternEncoderGui encoderGui) { + encoderGui.update(this.dirMap); + } + } - @Override - public ResourceLocation id() { - return AdvancedAE.id("pattern_encoder_update"); - } + @Override + public ResourceLocation id() { + return AdvancedAE.id("pattern_encoder_update"); + } - @Override - public boolean isClient() { - return true; - } + @Override + public boolean isClient() { + return true; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderUpdateRequestPacket.java b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderUpdateRequestPacket.java index 280a4b72..550755ef 100644 --- a/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderUpdateRequestPacket.java +++ b/src/main/java/net/pedroksl/advanced_ae/network/packet/AdvPatternEncoderUpdateRequestPacket.java @@ -1,6 +1,7 @@ package net.pedroksl.advanced_ae.network.packet; import com.glodblock.github.glodium.network.packet.IMessage; + import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; @@ -9,31 +10,28 @@ public class AdvPatternEncoderUpdateRequestPacket implements IMessage { - public AdvPatternEncoderUpdateRequestPacket() { - } - - @Override - public void toBytes(RegistryFriendlyByteBuf buf) { - } - - @Override - public void fromBytes(RegistryFriendlyByteBuf buf) { - } - - @Override - public void onMessage(Player player) { - if (player.containerMenu instanceof AdvPatternEncoderContainer encoderContainer) { - encoderContainer.onUpdateRequested(); - } - } - - @Override - public ResourceLocation id() { - return AdvancedAE.id("pattern_encoder_update_request"); - } - - @Override - public boolean isClient() { - return false; - } + public AdvPatternEncoderUpdateRequestPacket() {} + + @Override + public void toBytes(RegistryFriendlyByteBuf buf) {} + + @Override + public void fromBytes(RegistryFriendlyByteBuf buf) {} + + @Override + public void onMessage(Player player) { + if (player.containerMenu instanceof AdvPatternEncoderContainer encoderContainer) { + encoderContainer.onUpdateRequested(); + } + } + + @Override + public ResourceLocation id() { + return AdvancedAE.id("pattern_encoder_update_request"); + } + + @Override + public boolean isClient() { + return false; + } } diff --git a/src/main/java/net/pedroksl/advanced_ae/xmod/appflux/AFCommonLoad.java b/src/main/java/net/pedroksl/advanced_ae/xmod/appflux/AFCommonLoad.java index 498ceac8..1e4a505a 100644 --- a/src/main/java/net/pedroksl/advanced_ae/xmod/appflux/AFCommonLoad.java +++ b/src/main/java/net/pedroksl/advanced_ae/xmod/appflux/AFCommonLoad.java @@ -1,20 +1,27 @@ package net.pedroksl.advanced_ae.xmod.appflux; -import appeng.api.upgrades.Upgrades; import com.glodblock.github.appflux.common.AFSingletons; + import net.pedroksl.advanced_ae.common.AAESingletons; -public class AFCommonLoad { +import appeng.api.upgrades.Upgrades; - public static void init() { - try { - Upgrades.add(AFSingletons.INDUCTION_CARD, AAESingletons.ADV_PATTERN_PROVIDER, 1, "gui" + - ".advanced_ae.adv_pattern_provider"); - Upgrades.add(AFSingletons.INDUCTION_CARD, AAESingletons.ADV_PATTERN_PROVIDER_PART, 1, "gui" + - ".advanced_ae.adv_pattern_provider"); - } catch (Throwable ignored) { - // NO-OP - } - } +public class AFCommonLoad { + public static void init() { + try { + Upgrades.add( + AFSingletons.INDUCTION_CARD, + AAESingletons.ADV_PATTERN_PROVIDER, + 1, + "gui" + ".advanced_ae.adv_pattern_provider"); + Upgrades.add( + AFSingletons.INDUCTION_CARD, + AAESingletons.ADV_PATTERN_PROVIDER_PART, + 1, + "gui" + ".advanced_ae.adv_pattern_provider"); + } catch (Throwable ignored) { + // NO-OP + } + } } diff --git a/src/main/resources/assets/advanced_ae/textures/block/adv_co_processing_unit.png b/src/main/resources/assets/advanced_ae/textures/block/adv_co_processing_unit.png new file mode 100644 index 0000000000000000000000000000000000000000..440607ec9fca0420211cd1625be42ad385b27cad GIT binary patch literal 370 zcmV-&0ge8NP)Px$EJ;K`R5*=|Q?Y8pKn#5`HyF*PbSj=q?V*3*p=9W9bm`!!`IK&6`y-`8{vd-L zJY@_elL_JmLp!7rr}nP&!C{?@o^*QBYM$p$B*5%Jl!MtDKT)o>1AzOhM|Bjg#A!L8 zaAlPAv>eoa|9HI+$mM5dv18dKsblt>E$XfT^I3b50hh)wd&6GcU7I5q`@yJ?5#`B_PrDM zGG=e2`41$9D2I~@!m`3=q#zX-6~fM^O0T;HM2p^y3S&Q@?i#e~Hko