浏览代码

修改为右键交互

husj 3 天之前
父节点
当前提交
67c435456e

+ 1 - 1
gradle.properties

@@ -9,7 +9,7 @@ org.gradle.configuration-cache=false
 # check these on https://fabricmc.net/develop
 minecraft_version=1.21.9
 yarn_mappings=1.21.9+build.1
-loader_version=0.18.1
+loader_version=0.17.3
 loom_version=1.14-SNAPSHOT
 
 # Mod Properties

+ 4 - 2
src/client/java/com/husj/client/screen/DisassemblerScreen.java

@@ -3,8 +3,8 @@ package com.husj.client.screen;
 import com.husj.screen.DisassemblerScreenHandler;
 import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.screen.ingame.HandledScreen;
-import com.mojang.blaze3d.pipeline.RenderPipeline;
-import net.minecraft.client.render.*;
+
+import net.minecraft.client.gl.RenderPipelines;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.text.Text;
 import net.minecraft.util.Identifier;
@@ -26,6 +26,8 @@ public class DisassemblerScreen extends HandledScreen<DisassemblerScreenHandler>
     protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
         int x = (width - backgroundWidth) / 2;
         int y = (height - backgroundHeight) / 2;
+        context.drawTexture(RenderPipelines.GUI_TEXTURED, TEXTURE, x, y, 0.0f, 0.0f, backgroundWidth, backgroundHeight,
+                256, 256);
     }
 
     @Override

+ 2 - 1
src/main/java/com/husj/Husj.java

@@ -18,9 +18,10 @@ public class Husj implements ModInitializer {
 	public void onInitialize() {
 		// 注册方块和方块实体
 		ModBlocks.registerModBlocks();
-		
+
 		// 注册屏幕处理器
 		com.husj.screen.ModScreenHandlers.registerScreenHandlers();
+		ModItemGroups.registerItemGroups();
 
 		LOGGER.info("Husj模组已加载!拆解台功能已启用。");
 	}

+ 4 - 4
src/main/java/com/husj/ModBlocks.java

@@ -17,15 +17,15 @@ import net.minecraft.util.Identifier;
 
 public class ModBlocks {
     public static final Block DISASSEMBLER_BLOCK = registerBlock("disassembler",
-        DisassemblerBlock::new, AbstractBlock.Settings.create().nonOpaque());
+            DisassemblerBlock::new, AbstractBlock.Settings.copy(Blocks.IRON_BLOCK).nonOpaque());
 
-    public static final BlockEntityType<DisassemblerBlockEntity> DISASSEMBLER_BLOCK_ENTITY =
-        Registry.register(Registries.BLOCK_ENTITY_TYPE,
+    public static final BlockEntityType<DisassemblerBlockEntity> DISASSEMBLER_BLOCK_ENTITY = Registry.register(
+            Registries.BLOCK_ENTITY_TYPE,
             Identifier.of("husj", "disassembler_block_entity"),
             FabricBlockEntityTypeBuilder.create(DisassemblerBlockEntity::new, DISASSEMBLER_BLOCK).build());
 
     private static Block registerBlock(String name, java.util.function.Function<AbstractBlock.Settings, Block> factory,
-                                       AbstractBlock.Settings settings) {
+            AbstractBlock.Settings settings) {
         RegistryKey<Block> blockKey = RegistryKey.of(RegistryKeys.BLOCK, Identifier.of("husj", name));
         settings.registryKey(blockKey);
         Block block = factory.apply(settings);

+ 31 - 36
src/main/java/com/husj/block/DisassemblerBlock.java

@@ -4,21 +4,13 @@ import com.husj.block.entity.DisassemblerBlockEntity;
 import com.mojang.serialization.MapCodec;
 import net.minecraft.block.*;
 import net.minecraft.block.entity.BlockEntity;
-import net.minecraft.block.entity.BlockEntityTicker;
-import net.minecraft.block.entity.BlockEntityType;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.screen.NamedScreenHandlerFactory;
-import net.minecraft.screen.ScreenHandlerContext;
-import net.minecraft.screen.SimpleNamedScreenHandlerFactory;
-import net.minecraft.text.Text;
 import net.minecraft.util.ActionResult;
 import net.minecraft.util.hit.BlockHitResult;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
-import org.jetbrains.annotations.Nullable;
 
 public class DisassemblerBlock extends BlockWithEntity {
-    private static final Text TITLE = Text.translatable("container.husj.disassembler");
 
     public DisassemblerBlock(Settings settings) {
         super(settings);
@@ -42,37 +34,40 @@ public class DisassemblerBlock extends BlockWithEntity {
     @Override
     public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
         if (!world.isClient()) {
-            NamedScreenHandlerFactory screenHandlerFactory = state.createScreenHandlerFactory(world, pos);
-            if (screenHandlerFactory != null) {
-                player.openHandledScreen(screenHandlerFactory);
-            }
-        }
-        return ActionResult.SUCCESS;
-    }
+            // 获取玩家主手的物品
+            net.minecraft.item.ItemStack heldItem = player.getMainHandStack();
 
-    @Override
-    @Nullable
-    public NamedScreenHandlerFactory createScreenHandlerFactory(BlockState state, World world, BlockPos pos) {
-        BlockEntity blockEntity = world.getBlockEntity(pos);
-        if (blockEntity instanceof DisassemblerBlockEntity) {
-            return new SimpleNamedScreenHandlerFactory((syncId, inventory, player) -> 
-                new com.husj.screen.DisassemblerScreenHandler(syncId, inventory, ScreenHandlerContext.create(world, pos)), TITLE);
-        }
-        return null;
-    }
+            // 检查是否可以拆解
+            if (!heldItem.isEmpty() && com.husj.recipe.DisassemblerRecipes.hasRecipe(heldItem)) {
+                // 获取拆解结果
+                net.minecraft.item.ItemStack result = com.husj.recipe.DisassemblerRecipes.getRecipeResult(heldItem);
 
-    @Nullable
-    @Override
-    public <T extends BlockEntity> BlockEntityTicker<T> getTicker(World world, BlockState state, BlockEntityType<T> type) {
-        if (world.isClient()) {
-            return null;
+                if (!result.isEmpty()) {
+                    // 在方块上方生成掉落物
+                    net.minecraft.entity.ItemEntity itemEntity = new net.minecraft.entity.ItemEntity(
+                            world,
+                            pos.getX() + 0.5,
+                            pos.getY() + 1.0,
+                            pos.getZ() + 0.5,
+                            result.copy());
+                    itemEntity.setToDefaultPickupDelay();
+                    world.spawnEntity(itemEntity);
+
+                    // 消耗玩家手中的物品
+                    if (!player.isCreative()) {
+                        heldItem.decrement(1);
+                    }
+
+                    // 播放音效
+                    world.playSound(null, pos, net.minecraft.sound.SoundEvents.BLOCK_ANVIL_USE,
+                            net.minecraft.sound.SoundCategory.BLOCKS, 1.0F, 1.0F);
+
+                    return ActionResult.SUCCESS;
+                }
+            }
         }
-        return validateTicker(type, com.husj.ModBlocks.DISASSEMBLER_BLOCK_ENTITY, DisassemblerBlockEntity::tick);
-    }
 
-    @Nullable
-    protected static <E extends BlockEntity, A extends BlockEntity> BlockEntityTicker<A> validateTicker(
-            BlockEntityType<A> givenType, BlockEntityType<E> expectedType, BlockEntityTicker<? super E> ticker) {
-        return expectedType == givenType ? (BlockEntityTicker<A>) ticker : null;
+        return ActionResult.CONSUME;
     }
+
 }

+ 6 - 5
src/main/java/com/husj/screen/DisassemblerScreenHandler.java

@@ -21,7 +21,8 @@ public class DisassemblerScreenHandler extends ScreenHandler {
         this(syncId, playerInventory, new SimpleInventory(2), new ArrayPropertyDelegate(2));
     }
 
-    public DisassemblerScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, PropertyDelegate propertyDelegate) {
+    public DisassemblerScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory,
+            PropertyDelegate propertyDelegate) {
         super(ModScreenHandlers.DISASSEMBLER_SCREEN_HANDLER, syncId);
         checkSize(inventory, 2);
         this.inventory = inventory;
@@ -30,16 +31,16 @@ public class DisassemblerScreenHandler extends ScreenHandler {
 
         addProperties(propertyDelegate);
 
-        // 输入槽 (0)
-        this.addSlot(new Slot(inventory, 0, 56, 35) {
+        // 输入槽 (0) - 在3x3网格的中心位置
+        this.addSlot(new Slot(inventory, 0, 80, 35) {
             @Override
             public boolean canInsert(ItemStack stack) {
                 return com.husj.recipe.DisassemblerRecipes.hasRecipe(stack);
             }
         });
 
-        // 输出槽 (1)
-        this.addSlot(new Slot(inventory, 1, 116, 35) {
+        // 输出槽 (1) - 在箭头右侧
+        this.addSlot(new Slot(inventory, 1, 143, 35) {
             @Override
             public boolean canInsert(ItemStack stack) {
                 return false;

二进制
src/main/resources/assets/husj/textures/gui/container/disassembler.png


+ 2 - 2
src/main/resources/fabric.mod.json

@@ -30,7 +30,7 @@
 		}
 	],
 	"depends": {
-		"fabricloader": ">=0.18.1",
+		"fabricloader": ">=0.17.3",
 		"minecraft": "~1.21.9",
 		"java": ">=21",
 		"fabric-api": "*"
@@ -38,4 +38,4 @@
 	"suggests": {
 		"another-mod": "*"
 	}
-}
+}