package thaumicenergistics.init; import net.minecraft.core.BlockPos; import net.minecraft.world.MenuProvider; import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MapColor; import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredRegister; import thaumicenergistics.ThaumicEnergistics; import thaumicenergistics.common.blocks.OrientableEntityBlock; import thaumicenergistics.common.blocks.ThEBaseEntityBlock; import thaumicenergistics.common.tiles.*; import net.minecraft.network.chat.Component; public final class ModBlocks { private ModBlocks() {} public static final DeferredRegister.Blocks REGISTRY = DeferredRegister.createBlocks(ThaumicEnergistics.MODID); private static final BlockBehaviour.Properties P = BlockBehaviour.Properties.of().mapColor(MapColor.STONE).strength(2f).sound(SoundType.STONE); /** 装配器专用:noOcclusion——玻璃方块不被视为不透明,相邻方块(如冰/半透明)接触面不被剔除,透明玻璃后可正常看到后方方块。 */ private static final BlockBehaviour.Properties PA = P.noOcclusion(); public static final DeferredBlock ESSENTIA_PROVIDER = REGISTRY.register("essentia_provider", () -> new ThEBaseEntityBlock(P) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileEssentiaProvider(pos, st); } }); public static final DeferredBlock INFUSION_PROVIDER = REGISTRY.register("infusion_provider", () -> new ThEBaseEntityBlock(P) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileInfusionProvider(pos, st); } }); public static final DeferredBlock ARCANE_ASSEMBLER = REGISTRY.register("arcane_assembler", () -> new ThEBaseEntityBlock(PA) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileArcaneAssembler(pos, st); } @Override protected net.minecraft.world.ItemInteractionResult useItemOn(net.minecraft.world.item.ItemStack stack, BlockState state, net.minecraft.world.level.Level level, BlockPos pos, net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand, net.minecraft.world.phys.BlockHitResult hit) { // 手持 AE2 内存卡:交给装配器处理(读 P2P 频率设 vis 源 / 清空),不打开 GUI。 // 1.21 方块 useItemOn 先于物品 useOn,返回 sidedSuccess 消费交互(也阻止内存卡自身 shift 清空)。 if (stack.getItem() instanceof appeng.api.implementations.items.IMemoryCard memoryCard && level.getBlockEntity(pos) instanceof TileArcaneAssembler tile) { if (!level.isClientSide) { tile.onMemoryCardActivate(player, memoryCard, stack); } return net.minecraft.world.ItemInteractionResult.sidedSuccess(level.isClientSide()); } if (!level.isClientSide) { ((net.neoforged.neoforge.common.extensions.IPlayerExtension) player) .openMenu(state.getMenuProvider(level, pos), pos); } return net.minecraft.world.ItemInteractionResult.SUCCESS; } @Override protected MenuProvider getMenuProvider(BlockState state, net.minecraft.world.level.Level level, BlockPos pos) { TileArcaneAssembler tile = (TileArcaneAssembler) level.getBlockEntity(pos); return new SimpleMenuProvider( (id, inv, p) -> new thaumicenergistics.common.container.ContainerArcaneAssembler(id, inv, tile), Component.translatable("block.thaumicenergistics.arcane_assembler")); } }); public static final DeferredBlock ESSENTIA_VIBRATION_CHAMBER = REGISTRY.register("essentia_vibration_chamber", () -> new OrientableEntityBlock(P) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileEssentiaVibrationChamber(pos, st); } }); public static final DeferredBlock KNOWLEDGE_INSCRIBER = REGISTRY.register("knowledge_inscriber", () -> new ThEBaseEntityBlock(P) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileKnowledgeInscriber(pos, st); } @Override protected void createBlockStateDefinition(net.minecraft.world.level.block.state.StateDefinition.Builder builder) { builder.add(OrientableEntityBlock.FACING); } @Override public BlockState getStateForPlacement(net.minecraft.world.item.context.BlockPlaceContext context) { return this.defaultBlockState().setValue(OrientableEntityBlock.FACING, context.getHorizontalDirection().getOpposite()); } @Override protected net.minecraft.world.ItemInteractionResult useItemOn(net.minecraft.world.item.ItemStack stack, BlockState state, net.minecraft.world.level.Level level, BlockPos pos, net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand, net.minecraft.world.phys.BlockHitResult hit) { if (!level.isClientSide) player.openMenu(state.getMenuProvider(level, pos)); return net.minecraft.world.ItemInteractionResult.SUCCESS; } @Override protected MenuProvider getMenuProvider(BlockState state, net.minecraft.world.level.Level level, BlockPos pos) { TileKnowledgeInscriber tile = (TileKnowledgeInscriber) level.getBlockEntity(pos); return new SimpleMenuProvider( (id, inv, p) -> new thaumicenergistics.common.container.ContainerKnowledgeInscriber(id, inv, tile), Component.translatable("block.thaumicenergistics.knowledge_inscriber")); } }); public static final DeferredBlock DISTILLATION_ENCODER = REGISTRY.register("distillation_encoder", () -> new ThEBaseEntityBlock(P) { public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState st) { return new TileDistillationPatternEncoder(pos, st); } @Override protected void createBlockStateDefinition(net.minecraft.world.level.block.state.StateDefinition.Builder builder) { builder.add(OrientableEntityBlock.FACING); } @Override public BlockState getStateForPlacement(net.minecraft.world.item.context.BlockPlaceContext context) { return this.defaultBlockState().setValue(OrientableEntityBlock.FACING, context.getHorizontalDirection().getOpposite()); } @Override protected net.minecraft.world.ItemInteractionResult useItemOn(net.minecraft.world.item.ItemStack stack, BlockState state, net.minecraft.world.level.Level level, BlockPos pos, net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand, net.minecraft.world.phys.BlockHitResult hit) { if (!level.isClientSide) player.openMenu(state.getMenuProvider(level, pos)); return net.minecraft.world.ItemInteractionResult.SUCCESS; } @Override protected MenuProvider getMenuProvider(BlockState state, net.minecraft.world.level.Level level, BlockPos pos) { TileDistillationPatternEncoder tile = (TileDistillationPatternEncoder) level.getBlockEntity(pos); return new SimpleMenuProvider( (id, inv, p) -> new thaumicenergistics.common.container.ContainerDistillationPatternEncoder(id, inv, tile), Component.translatable("block.thaumicenergistics.distillation_encoder")); } }); public static final DeferredBlock ESSENTIA_CELL_WORKBENCH = REGISTRY.register("essentia_cell_workbench", () -> new ThEBaseEntityBlock(P) { @Override public net.minecraft.world.level.block.entity.BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new TileEssentiaCellWorkbench(pos, state); } @Override protected net.minecraft.world.ItemInteractionResult useItemOn(net.minecraft.world.item.ItemStack stack, BlockState state, net.minecraft.world.level.Level level, BlockPos pos, net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand, net.minecraft.world.phys.BlockHitResult hit) { if (!level.isClientSide) player.openMenu(state.getMenuProvider(level, pos)); return net.minecraft.world.ItemInteractionResult.SUCCESS; } @Override protected MenuProvider getMenuProvider(BlockState state, net.minecraft.world.level.Level level, BlockPos pos) { net.minecraft.world.level.block.entity.BlockEntity be = level.getBlockEntity(pos); if (be instanceof TileEssentiaCellWorkbench workbench) { return new SimpleMenuProvider((id, inv, p) -> new thaumicenergistics.common.container.ContainerEssentiaCellWorkbench(id, inv, workbench), Component.translatable("block.thaumicenergistics.essentia_cell_workbench")); } return null; } }); }