如何用Fabric loader的格式使用mixin实现重新注册Minecraft原版的方块?给出一个代码实现?
时间: 2023-09-22 09:06:16 浏览: 218
### 回答1:
Fabric Loader 是 Minecraft 的一个模组加载器,可以方便地加载各种模组,Mixin 则是一个轻量级的Java字节码注入框架,用于在运行时修改类的行为。
要重新注册 Minecraft 原版的方块,可以使用 Mixin 来注入新的方块,具体步骤如下:
1. 在 build.gradle 文件中添加 Fabric API 和 Mixin 的依赖:
```
dependencies {
// ...其他依赖
modCompile "net.fabricmc:fabric-loader:0.7.+"
modCompile "net.fabricmc.fabric-api:fabric-api:0.30.0+1.17"
modCompile "org.spongepowered:mixin:0.9.+"
}
```
2. 创建一个新的类,实现 Mixin 接口,并在其中定义一个静态方法,用于重新注册方块。在这个方法中,可以调用 Fabric API 提供的注册方法,来注册新的方块。
```
import net.fabricmc.fabric.api.block.FabricBlockSettings;
import net.fabricmc.fabric.api.event.registry.RegistryEntryAddedCallback;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
@Mixin(Registry.class)
public class MyBlockMixin {
@Overwrite
public static <T, R extends T> R register(Registry<T> registry, Identifier identifier, R entry) {
if (entry instanceof Block) {
// 创建新的方块
Block newBlock = new Block(FabricBlockSettings.of(Material.STONE).hardness(1.0f));
// 注册新的方块
Registry.register(Registry.BLOCK, new Identifier("my_mod", "my_block"), newBlock);
// 返回新的方块
return (R) newBlock;
} else {
// 对于其他类型的注册,调用原始的注册方法
return Registry.register(registry, identifier, entry);
}
}
}
```
在这个例子中,我们覆盖了 `Registry.register()` 方法,当注册的是一个方块时,我们创建了一个新的方块,并注册到游戏中,然后返回这个新的方块。
3. 在 `META-INF` 文件夹下创建一个新的文件 `mixins.modid.json`,用于指定 Mixin 的目标类和注入的 Mixin 类。在这个文件中,我们指定了 `Registry.class` 作为目标类,并将我们创建的 Mixin 类 `MyBlockMixin` 注入到其中。
```
{
"target": "net.minecraft.util.registry.Registry",
"mixins": [
"com.example.MyBlockMixin"
]
}
```
4. 将编译后的模组文件放入 Minecraft 游戏的 `mods` 文件夹中,启动游戏即可看到新的方块。
需要注意的是,这个例子只是演示了如何使用 Mixin 来重新注册 Minecraft 原版的方块,实际上还需要更多的代码来定义方块的行为、纹理、物品等。
### 回答2:
使用Fabric Loader和Mixin库重新注册Minecraft原版方块的方法如下:
首先,确保你已经安装了Fabric Loader和Mixin库。
1. 创建一个新的Mod项目,包括一个modid和modname。
2. 在项目的build.gradle文件中添加以下依赖项:
```
repositories {
mavenCentral()
}
dependencies {
modImplementation "net.fabricmc:fabric-loader:${project.fabric_version}"
include "net.fabricmc:fabric-mixin:${project.fabric_version}"
include "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
// 添加其他依赖项
}
```
3. 创建一个类来实现Mixin的注入,该类应该以"Mixin"开头,例如"MixinReRegisterBlocks"。
4. 在代码中使用`@Mixin`注解来扩展或修改Minecraft的原版类,例如:
```java
@Mixin(Block.class)
public abstract class MixinReRegisterBlocks {
@Inject(at = @At("RETURN"), method = "getTranslationKey", cancellable = true)
public void getCustomTranslationKey(CallbackInfoReturnable callback) {
if (this instanceof CustomBlock) { // CustomBlock是自定义的方块类
callback.setReturnValue(CustomBlockRegistry.getCustomTranslationKey((Block)(Object) this));
}
}
}
```
上述代码使用`@Inject`注解来注入`getTranslationKey`方法,并在方法返回前检查方块是否是自定义方块,如果是,则使用自定义的翻译键。
5. 在项目的resources文件夹中创建一个新的mixins文件夹,并在其中创建一个名为"block.mixins.json"的文件,内容如下:
```json
{
"mixins": [
"your.package.name.mixin.MixinReRegisterBlocks"
]
}
```
这将告诉Mixin库要在编译期间织入"MixinReRegisterBlocks"类。
6. 编译和运行你的Mod项目,确保Mixin正确注入。
注意:上述代码仅为示例,实际使用中需要根据需求修改和扩展Mixin类的方法。
同时,为了省略一些细节,如项目结构、导入包等,请根据具体情况进行调整。
阅读全文