首页  >  文章  >  Minecraft 结构覆盖现有块 1.20

Minecraft 结构覆盖现有块 1.20

PHPz
PHPz转载
2024-02-22 13:00:09750浏览

php小编柚子带来的java问答专题将为您详细解答Minecraft中关于结构覆盖现有块的问题。在游戏中,如何有效地操作和利用这一功能,将直接影响到游戏体验和玩法乐趣。通过本文的解读和指导,希望能帮助您更好地掌握这一技巧,从而在游戏中取得更好的成绩和体验。

问题内容

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

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

解决方法

您本质上想要做的是重新注册 minecraft 已经注册的 block 实例。但没有人记录如何做到这一点是有原因的:你不应该

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

  • 只需将您的方块添加到 minecraft 的内置标签之一 - 您甚至不需要 java 代码,只需要数据包中的 json 文件:https://www.php.cn/link/ff7cc29289db44861ce4b3e5e56fe234。例如,这可以使石头可以用铲子开采。
  • 使用 fabric api 提供的回调之一来侦听您想要处理的某些事件。例如,当玩家点击它时,它可以将草块变成泥土。
  • 创建一个所谓的“扩展块”,它可以充当块的自定义状态属性。 ie。如果您想给 minecraft:stone 一个 age 属性(无论出于何种原因可能有用),请将 minecraft:stone 视为 age=0 并使用 age 创建自定义块(例如 modid:ged_stone) zqb 属性从 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

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

以上是Minecraft 结构覆盖现有块 1.20的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除