Minecraft 结构覆盖现有区块 1.20

问题描述 投票:0回答:1

我一直在尝试在线寻找一种方法来修改 Minecraft Fabric 中的现有块及其属性,但我所能找到的只是如何创建新块。 我确实找到了 1.20 以下版本的任何版本。

我实际上根本找不到覆盖现有块属性的方法。覆盖也不起作用

java minecraft block fabric
1个回答
0
投票

您本质上想要做的是重新注册 Minecraft 已经注册的

Block
实例。但没有人记录如何做到这一点是有原因的:你不应该

在 Minecraft 中重新注册区块可能会导致奇怪的问题,尤其是当您的模组将在大型模组包中使用时。这与与其他模组甚至《我的世界》本身的兼容性有关。您最好希望避免这种情况。还有十几种其他解决方案可以改变特定块的行为,而不会引起太多问题。它们包括但不限于:

  • 只需将您的区块添加到 Minecraft 的内置标签之一 - 您甚至不需要为此使用 Java 代码,只需要数据包中的 JSON 文件:https://minecraft.fandom.com/wiki/Tag。例如,这可以使石头可以用铲子开采。
  • 使用 Fabric API 提供的回调之一来侦听您想要处理的某些事件。例如,当玩家点击它时,这可以将草块变成泥土。
  • 创建一个所谓的“扩展块”,它可以充当块的自定义状态属性。 IE。如果您想给
    minecraft:stone
    一个
    age
    属性(出于任何可能有用的原因),请将
    minecraft:stone
    视为
    age=0
    并使用
     中的 
    modid:aged_stone
     属性创建自定义块(例如 
    age
    1
    至任何最大年龄以扩大年龄范围。

另一种更通用的方法是将 Mixin 构建到

Block
类或适当的子类中,并执行类似以下操作来针对特定块(在本例中为石头):

Block self = (Block) (Object) this;
if (BuiltInRegistries.BLOCK.getKey(self).equals(new ResourceLocation("stone"))) {
    // Do something only if this block is stone
}

但是,如果你真的真的想完全替换一个块实例,这里有一个建议:使用 Mixin 注入

Registry.register
,用自定义块实例替换特定的块实例:

@Mixin(Registry.class)
public class RegistryMixin {
    @Inject(
        // You may need to specify the correct signature after the method
        // name because there are two `register` methods.
        method="register",
        at=@At("HEAD"),
        cancelable=true
    )
    // Note that this is a generic method, in Mixin you'll have to use
    // Object to replace type parameters
    private static void onRegister(Registry reg, ResourceLocation id, Object value, CallbackInfoReturnable<Object> cir) {
        if (reg != BuiltInRegistries.BLOCK) return;
        if (!id.toString().equals("minecraft:stone")) return;

        // Now that you've filtered out the minecraft:stone block,
        // you can re-register it
        Block myCustomBlock = new Block(.......);
        ((WritableRegistry) reg).register(id, myCustomBlock);
        cir.setReturnValue(myCustomBlock);
    }
}

但是再次尝试避免这种解决方案。这里有龙。

注意,我没有测试任何代码片段,因为在撰写本文时我手头没有修改环境。它可能需要调整才能工作。 另外,我使用了 Mojang 的官方映射,如果您使用 Yarn 映射,名称可能会有所不同。例如,

ResourceLocation
在Yarn中被命名为
Identifier


我希望这有帮助。快乐编码!

© www.soinside.com 2019 - 2024. All rights reserved.