From 1b487fb1af1298bc72e955decb40cd0bc47e20a8 Mon Sep 17 00:00:00 2001 From: GaLi Date: Wed, 3 Dec 2025 17:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=A3=85=E9=85=8D=E7=9F=A9?= =?UTF-8?q?=E9=98=B5=E6=A0=B7=E6=9D=BF=E6=A0=B8=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/extendedae_plus/ExtendedAEPlus.java | 8 + .../content/matrix/PatternCorePlusBlock.java | 17 ++ .../matrix/PatternCorePlusBlockEntity.java | 181 ++++++++++++++++++ .../init/ModBlockEntities.java | 7 + .../com/extendedae_plus/init/ModBlocks.java | 12 +- .../extendedae_plus/init/ModCreativeTabs.java | 3 +- .../com/extendedae_plus/init/ModItems.java | 4 + .../tags/block/mineable/pickaxe.json | 3 +- .../tags/block/needs_stone_tool.json | 3 +- 9 files changed, 234 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlock.java create mode 100644 src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlockEntity.java diff --git a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java index d13a415..f792a43 100644 --- a/src/main/java/com/extendedae_plus/ExtendedAEPlus.java +++ b/src/main/java/com/extendedae_plus/ExtendedAEPlus.java @@ -10,6 +10,7 @@ import com.extendedae_plus.api.ids.EAPComponents; import com.extendedae_plus.api.storage.InfinityBigIntegerCellHandler; import com.extendedae_plus.config.ModConfigs; import com.extendedae_plus.content.matrix.CrafterCorePlusBlockEntity; +import com.extendedae_plus.content.matrix.PatternCorePlusBlockEntity; import com.extendedae_plus.content.matrix.SpeedCorePlusBlockEntity; import com.extendedae_plus.init.*; import com.extendedae_plus.util.storage.InfinityStorageManager; @@ -167,6 +168,13 @@ public class ExtendedAEPlus { null ); + ModBlocks.ASSEMBLER_MATRIX_PATTERN_PLUS.get().setBlockEntity( + PatternCorePlusBlockEntity.class, + ModBlockEntities.ASSEMBLER_MATRIX_PATTERN_PLUS_BE.get(), + null, + null + ); + LOGGER.info("Bound UploadCoreBlockEntity to assembler matrix upload core block."); } catch (Throwable t) { LOGGER.warn("Failed to bind block entities: {}", t.toString()); diff --git a/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlock.java b/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlock.java new file mode 100644 index 0000000..12465d5 --- /dev/null +++ b/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlock.java @@ -0,0 +1,17 @@ +package com.extendedae_plus.content.matrix; + +import com.extendedae_plus.init.ModItems; +import com.glodblock.github.extendedae.common.blocks.matrix.BlockAssemblerMatrixBase; +import net.minecraft.world.item.Item; + +public class PatternCorePlusBlock extends BlockAssemblerMatrixBase { + + public PatternCorePlusBlock(Properties props) { + super(props); + } + + @Override + public Item getPresentItem() { + return ModItems.ASSEMBLER_MATRIX_PATTERN_PLUS.get(); + } +} diff --git a/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlockEntity.java b/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlockEntity.java new file mode 100644 index 0000000..e71749d --- /dev/null +++ b/src/main/java/com/extendedae_plus/content/matrix/PatternCorePlusBlockEntity.java @@ -0,0 +1,181 @@ +package com.extendedae_plus.content.matrix; + +import appeng.api.config.Settings; +import appeng.api.config.YesNo; +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.PatternDetailsHelper; +import appeng.api.implementations.blockentities.PatternContainerGroup; +import appeng.api.inventories.InternalInventory; +import appeng.api.networking.IGrid; +import appeng.api.networking.crafting.ICraftingProvider; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.KeyCounter; +import appeng.blockentity.crafting.IMolecularAssemblerSupportedPattern; +import appeng.crafting.pattern.EncodedPatternItem; +import appeng.helpers.patternprovider.PatternContainer; +import appeng.util.inv.AppEngInternalInventory; +import appeng.util.inv.FilteredInternalInventory; +import appeng.util.inv.InternalInventoryHost; +import appeng.util.inv.filter.AEItemFilters; +import appeng.util.inv.filter.IAEItemFilter; +import com.extendedae_plus.init.ModBlockEntities; +import com.extendedae_plus.init.ModItems; +import com.glodblock.github.extendedae.common.me.matrix.ClusterAssemblerMatrix; +import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class PatternCorePlusBlockEntity extends TileAssemblerMatrixPattern { + + public static final int INV_SIZE = 72; + + private final AppEngInternalInventory patternInventory; + private final List patterns = new ArrayList<>(); + + public PatternCorePlusBlockEntity(BlockPos pos, BlockState blockState) { + super(pos, blockState); + this.patternInventory = new AppEngInternalInventory(this, INV_SIZE, 1); + this.patternInventory.setFilter(new Filter(this::getLevel)); + this.getMainNode().addService(ICraftingProvider.class, this); + } + + @Override + public void saveAdditional(CompoundTag data, HolderLookup.Provider registries) { + super.saveAdditional(data, registries); + this.patternInventory.writeToNBT(data, "pattern", registries); + } + + @Override + public void loadTag(CompoundTag data, HolderLookup.Provider registries) { + super.loadTag(data, registries); + this.patternInventory.readFromNBT(data, "pattern", registries); + } + + public AppEngInternalInventory getPatternInventory() { + return this.patternInventory; + } + + public long getLocateID() { + return this.worldPosition.asLong(); + } + + public void updatePatterns() { + this.patterns.clear(); + for (var stack : this.patternInventory) { + var details = PatternDetailsHelper.decodePattern(stack, this.getLevel()); + if (details != null) { + this.patterns.add(details); + } + } + ICraftingProvider.requestUpdate(this.getMainNode()); + } + + @Override + public void addAdditionalDrops(Level level, BlockPos pos, List drops) { + super.addAdditionalDrops(level, pos, drops); + for (var pattern : this.patternInventory) { + drops.add(pattern); + } + } + + @Override + public void clearContent() { + super.clearContent(); + this.patternInventory.clear(); + } + + @Override + public void add(ClusterAssemblerMatrix cluster) { + cluster.addPattern(this); + } + + @Override + public void saveChangedInventory(AppEngInternalInventory inv) { + this.saveChanges(); + this.updatePatterns(); + } + + @Override + public void onReady() { + super.onReady(); + this.updatePatterns(); + } + + @Override + public void onChangeInventory(AppEngInternalInventory inv, int slot) { + this.saveChanges(); + this.updatePatterns(); + } + + @Override + public List getAvailablePatterns() { + return this.patterns; + } + + @Override + public boolean pushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder) { + if (!isFormed() || !this.getMainNode().isActive() || !this.patterns.contains(patternDetails)) { + return false; + } + return this.cluster.pushCraftingJob(patternDetails, inputHolder); + } + + @Override + public boolean isBusy() { + return this.cluster == null || this.cluster.isBusy(); + } + + @Override + public @Nullable IGrid getGrid() { + return this.getMainNode().getGrid(); + } + + @Override + public InternalInventory getTerminalPatternInventory() { + return this.patternInventory; + } + + @Override + public boolean isVisibleInTerminal() { + return this.manager.getSetting(Settings.PATTERN_ACCESS_TERMINAL) == YesNo.YES; + } + + @Override + public PatternContainerGroup getTerminalGroup() { + var icon = AEItemKey.of(ModItems.ASSEMBLER_MATRIX_PATTERN_PLUS.get()); + return new PatternContainerGroup(icon, icon.getDisplayName(), List.of(Component.translatable("gui.expatternprovider.assembler_matrix.pattern"))); + } + + @Override + public long getTerminalSortOrder() { + return this.getLocateID(); + } + + @Override + public @NotNull BlockEntityType getType() { + return ModBlockEntities.ASSEMBLER_MATRIX_PATTERN_PLUS_BE.get(); + } + + public record Filter(Supplier world) implements IAEItemFilter { + + @Override + public boolean allowInsert(InternalInventory inv, int slot, ItemStack stack) { + if (stack.getItem() instanceof EncodedPatternItem) { + return PatternDetailsHelper.decodePattern(stack, world.get()) instanceof IMolecularAssemblerSupportedPattern; + } + return false; + } + } +} diff --git a/src/main/java/com/extendedae_plus/init/ModBlockEntities.java b/src/main/java/com/extendedae_plus/init/ModBlockEntities.java index 4717226..8215833 100644 --- a/src/main/java/com/extendedae_plus/init/ModBlockEntities.java +++ b/src/main/java/com/extendedae_plus/init/ModBlockEntities.java @@ -2,6 +2,7 @@ package com.extendedae_plus.init; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.content.matrix.CrafterCorePlusBlockEntity; +import com.extendedae_plus.content.matrix.PatternCorePlusBlockEntity; import com.extendedae_plus.content.matrix.SpeedCorePlusBlockEntity; import com.extendedae_plus.content.wireless.WirelessTransceiverBlockEntity; import com.extendedae_plus.content.controller.NetworkPatternControllerBlockEntity; @@ -64,4 +65,10 @@ public final class ModBlockEntities { BLOCK_ENTITY_TYPES.register("assembler_matrix_crafter_plus", ()-> BlockEntityType.Builder.of(CrafterCorePlusBlockEntity::new, ModBlocks.ASSEMBLER_MATRIX_CRAFTER_PLUS.get()).build(null)); + + //超级装配矩阵样板核心 + public static final DeferredHolder,BlockEntityType> ASSEMBLER_MATRIX_PATTERN_PLUS_BE= + BLOCK_ENTITY_TYPES.register("assembler_matrix_pattern_plus", + ()-> BlockEntityType.Builder.of(PatternCorePlusBlockEntity::new, + ModBlocks.ASSEMBLER_MATRIX_PATTERN_PLUS.get()).build(null)); } diff --git a/src/main/java/com/extendedae_plus/init/ModBlocks.java b/src/main/java/com/extendedae_plus/init/ModBlocks.java index 7367840..4f97723 100644 --- a/src/main/java/com/extendedae_plus/init/ModBlocks.java +++ b/src/main/java/com/extendedae_plus/init/ModBlocks.java @@ -3,10 +3,11 @@ package com.extendedae_plus.init; import com.extendedae_plus.ExtendedAEPlus; import com.extendedae_plus.content.controller.NetworkPatternControllerBlock; import com.extendedae_plus.content.matrix.CrafterCorePlusBlock; +import com.extendedae_plus.content.matrix.PatternCorePlusBlock; import com.extendedae_plus.content.matrix.SpeedCorePlusBlock; +import com.extendedae_plus.content.matrix.UploadCoreBlock; import com.extendedae_plus.content.wireless.WirelessTransceiverBlock; import com.extendedae_plus.content.crafting.EPlusCraftingUnitType; -import com.extendedae_plus.content.matrix.UploadCoreBlock; import appeng.block.crafting.CraftingUnitBlock; import appeng.blockentity.crafting.CraftingBlockEntity; import appeng.core.definitions.AEBlockEntities; @@ -104,4 +105,13 @@ public final class ModBlocks { .requiresCorrectToolForDrops() ) ); + + public static final DeferredBlock ASSEMBLER_MATRIX_PATTERN_PLUS = BLOCKS.register( + "assembler_matrix_pattern_plus", + () -> new PatternCorePlusBlock( + BlockBehaviour.Properties.of() + .strength(1.5F, 6.0F) + .requiresCorrectToolForDrops() + ) + ); } diff --git a/src/main/java/com/extendedae_plus/init/ModCreativeTabs.java b/src/main/java/com/extendedae_plus/init/ModCreativeTabs.java index 2a44d2f..08056d2 100644 --- a/src/main/java/com/extendedae_plus/init/ModCreativeTabs.java +++ b/src/main/java/com/extendedae_plus/init/ModCreativeTabs.java @@ -32,7 +32,8 @@ public final class ModCreativeTabs { ModItems.ENTITY_TICKER_PART_ITEM.get().getDefaultInstance(), ModItems.INFINITY_BIGINTEGER_CELL_ITEM.get().getDefaultInstance(), ModItems.ASSEMBLER_MATRIX_SPEED_PLUS.get().getDefaultInstance(), - ModItems.ASSEMBLER_MATRIX_CRAFTER_PLUS.get().getDefaultInstance() + ModItems.ASSEMBLER_MATRIX_CRAFTER_PLUS.get().getDefaultInstance(), + ModItems.ASSEMBLER_MATRIX_PATTERN_PLUS.get().getDefaultInstance() ).forEach(output::accept); // 放入四个预设的 stacks(x2,x4,x8,x16),使用 ModItems 工厂创建 diff --git a/src/main/java/com/extendedae_plus/init/ModItems.java b/src/main/java/com/extendedae_plus/init/ModItems.java index 6fa95b2..f757230 100644 --- a/src/main/java/com/extendedae_plus/init/ModItems.java +++ b/src/main/java/com/extendedae_plus/init/ModItems.java @@ -72,6 +72,10 @@ public final class ModItems { "assembler_matrix_crafter_plus", ()->new BlockItem(ModBlocks.ASSEMBLER_MATRIX_CRAFTER_PLUS.get(), new Item.Properties()) ); + public static final DeferredItem ASSEMBLER_MATRIX_PATTERN_PLUS = ITEMS.register( + "assembler_matrix_pattern_plus", + () -> new BlockItem(ModBlocks.ASSEMBLER_MATRIX_PATTERN_PLUS.get(), new Item.Properties()) + ); static final DeferredItem NETWORK_PATTERN_CONTROLLER = ITEMS.register( "network_pattern_controller", () -> new BlockItem(ModBlocks.NETWORK_PATTERN_CONTROLLER.get(), new Item.Properties()) diff --git a/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json index b3ef6e1..c517254 100644 --- a/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/src/main/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -10,6 +10,7 @@ "extendedae_plus:256x_crafting_accelerator", "extendedae_plus:1024x_crafting_accelerator", "extendedae_plus:assembler_matrix_speed_plus", - "extendedae_plus:assembler_matrix_crafter_plus" + "extendedae_plus:assembler_matrix_crafter_plus", + "extendedae_plus:assembler_matrix_pattern_plus" ] } diff --git a/src/main/resources/data/minecraft/tags/block/needs_stone_tool.json b/src/main/resources/data/minecraft/tags/block/needs_stone_tool.json index 2ee0dc3..c52be35 100644 --- a/src/main/resources/data/minecraft/tags/block/needs_stone_tool.json +++ b/src/main/resources/data/minecraft/tags/block/needs_stone_tool.json @@ -10,6 +10,7 @@ "extendedae_plus:256x_crafting_accelerator", "extendedae_plus:1024x_crafting_accelerator", "extendedae_plus:assembler_matrix_speed_plus", - "extendedae_plus:assembler_matrix_crafter_plus" + "extendedae_plus:assembler_matrix_crafter_plus", + "extendedae_plus:assembler_matrix_pattern_plus" ] }