我一直在尝试在线寻找一种方法来修改 Minecraft Fabric 中的现有块及其属性,但我所能找到的只是如何创建新块。 我确实找到了 1.20 以下版本的任何版本。
我实际上根本找不到覆盖现有块属性的方法。覆盖也不起作用
您本质上想要做的是重新注册 Minecraft 已经注册的
Block
实例。但没有人记录如何做到这一点是有原因的:你不应该。
在 Minecraft 中重新注册区块可能会导致奇怪的问题,尤其是当您的模组将在大型模组包中使用时。这与与其他模组甚至《我的世界》本身的兼容性有关。您最好希望避免这种情况。还有十几种其他解决方案可以改变特定块的行为,而不会引起太多问题。它们包括但不限于:
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
。
我希望这有帮助。快乐编码!