php小编柚子带来的java问答专题将为您详细解答Minecraft中关于结构覆盖现有块的问题。在游戏中,如何有效地操作和利用这一功能,将直接影响到游戏体验和玩法乐趣。通过本文的解读和指导,希望能帮助您更好地掌握这一技巧,从而在游戏中取得更好的成绩和体验。
我一直在尝试在线寻找一种方法来修改 Minecraft Fabric 中的现有块及其属性,但我所能找到的只是如何创建新块。 我找到的任何版本都低于 1.20。
我实际上根本找不到覆盖现有块属性的方法。覆盖也不起作用
您本质上想要做的是重新注册 minecraft 已经注册的 block
实例。但没有人记录如何做到这一点是有原因的:你不应该。
在 minecraft 中重新注册区块可能会导致奇怪的问题,尤其是当您的模组将在大型模组包中使用时。这与与其他模组甚至《我的世界》本身的兼容性有关。您最好希望避免这种情况。还有十几种其他解决方案可以改变特定块的行为,而不会引起太多问题。它们包括但不限于:
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中文网其他相关文章!