配置/初始化模组
在Template mod generator | Fabric (fabricmc.net)中
填写mod名称和id
勾选Kotlin Programming Language选项。

下载模板文件。

解压下载的文件
使用IDE打开解压后的文件,并等待构建完成。
如果在构建过程中出现下载失败的情况,请使用科学上网工具并重试。
修改src/resources/fabric.mod.json文件中的mod相关信息。
在右侧的Gradle面板中选择Tasks -> fabric -> runClient来运行客户端

成功进入客户端后,你会注意到顶部多出了一些内容
在\src\main\kotlin\com.examplemod\ExampleMod.kt中ModInitializer下添加
const val MOD_ID = "examplemod"注意这个examplemod必须小写

添加物品/方块
注册物品
在\src\main\kotlin\com.xxx\中创建一个Package(软件包)名为Item
在Item下新建一个名为ModItem的kotlin类/文件并选择对象

在新建的ModItem.kt中添加
fun registerModItems(){
}在主类(默认为在com.examplemod下的ExampleMod.kt中onInitialize下添加
ModItem.registerModItems()以在游戏中添加你的物品

回到ModItem.kt
添加如下代码
private fun registerItem(name: String, item: Item): Item {
return Registry.register(Registries.ITEM, Identifier(ExampleMod.MOD_ID,name),item)
}然后就可以以以下格式添加物品了
val EXAMPLE_ITEM: Item = registerItem("exampleitem", Item(FabricItemSettings()))注意这个exampleitem必须小写
此时物品无法在创造物品栏找到且没有图标名称
注册方块
在\src\main\kotlin\com.examplemod\中创建一个名为block的Package(软件包)
在block中创建一个名为ModBlock的Kotlin对象
添加以下代码
private fun registerBlock(name: String,block: Block): Block {
registerModBlocksItem(name, block)
return Registry.register(Registries.BLOCK, Identifier(Example.MOD_ID, name), block)
}
private fun registerModBlocksItem(name: String,block: Block): Item?{
return Registry.register(
Registries.ITEM,Identifier(ExampleMod.MOD_ID, name),
BlockItem(block,FabricItemSettings())
)
}
fun registerModBlocks(){
}
然后可以以以下代码为模板注册方块
val EXAMPLE_BLOCK: Block = registerBlock(
" example_block",
Block(FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).sounds(BlockSoundGroup.AMETHYST_BLOCK))
)添加物品/方块到创造物品栏
在ModItem.kt中添加以下代码
private fun addItemsToIngredientItemGroup(entries: FabricItemGroupEntries){
entries.add(EXAMPLE_ITEM)
}添加到已有类别
在registerModItems方法中添加以下代码
fun registerModItems(){
ItemGroupEvents.modifyEntriesEvent(ItemGroups.TOOLS)
.register(ModItem::addItemsToIngredientItemGroup)
}TOOLS是指添加到工具类别,按住ctrl点击ItemGroups可以找到其他类别
添加到新建类别
在Item下新建一个kotlin对象名为ModItemsGroup
添加以下代码
fun registerItemGroups(){
}添加以下代码以注册一个类别并添加物品
val EXAMPLE_GROUP:ItemGroup = Registry.register(Registries.ITEM_GROUP,
Identifier(ExampleMod.MOD_ID,"example_group"),
FabricItemGroup.builder().displayName(Text.translatable("itemgroup.examplegroup"))
.icon(fun(): ItemStack{return ItemStack(ModItem.EXAMPLE_ITEM)})
.entries(fun(displayContext: ItemGroup.DisplayContext,entries){
entries.add(ModItem.EXAMPLE_ITEM)
}).build())添加纹理/本地化
在\src\main\kotlin\com.examplemod\创建一个Package名为datagen
在datagen中新建各创建一个名为ModLanguageProvider和ModModelProvider的kotlin类
ModLanguageProvider.kt:
class ModLanguageProvider(dataOutput: FabricDataOutput?) : FabricLanguageProvider(dataOutput) {
override fun generateTranslations(translationBuilder: TranslationBuilder?) {
translationBuilder?.add(ModItem.EXAMPLE_ITEM,"example")
translationBuilder?.add(ModBlock.EXAMPLE_BLOCK,"example block")
}
}ModModelProvider.kt:
class ModModelProvider(output: FabricDataOutput?) : FabricModelProvider(output) {
override fun generateBlockStateModels(blockStateModelGenerator: BlockStateModelGenerator?) {
blockStateModelGenerator?.registerCubeAllModelTexturePool(ModBlock.EXAMPLE_BLOCK)
}
override fun generateItemModels(itemModelGenerator: ItemModelGenerator?) {
itemModelGenerator?.register(ModItem.EXAMPLE_ITEM,Models.GENERATED);
}
}然后修改\src\main\kotlin\com.examplemodl\ExampleModDataGenerator.kt:
object ExampleModDataGenerator : DataGeneratorEntrypoint {
override fun onInitializeDataGenerator(fabricDataGenerator: FabricDataGenerator) {
val pack = fabricDataGenerator.createPack()
pack.addProvider { output: FabricDataOutput? ->
ModModelProvider(
output
)
}
pack.addProvider { output: FabricDataOutput? ->
ModLanguageProvider(
output
)
}
}
}运行Data Generation

可以看到已经帮你生成了assets

在\src\main\generated\assets\examplemod\中
新建目录textures和textures\block和textures\item

然后就可以在item和block中放纹理
纹理必须是.png格式
因为物品组生成本地化的命令比较复杂
所以直接在lang文件里自己添加比较方便
添加配方
在resources/data/<你的模组id>/recipes/下创建一个名为<你的物品id>.json的文件
添加以下代码
{
"type": "minecraft:crafting_shaped",
"pattern": [
"WWW",
"WR ",
"WWW"
],
"key": {
"W": {
"tag": "minecraft:logs"
},
"R": {
"item": "minecraft:redstone"
}
},
"result": {
"item": "examplemod:example_item",
"count": 4
}
}type:这是个有序合成配方。
result:这是合成4个 tutorial:custom_item 的配方。count 字段是可选的,如果不指定 count,则默认为 1。
pattern:代表合成配方的图案。每个字母代表一个物品。空格表示该槽位没有物品。每个字母代表的物品在 key 中定义。
key:每个字母代表的物品。W 代表带有 minecraft:logs 标签的物品(即所有原木)。R 代表红石。
category:这个配方在解锁后在配方书中显示的分类。
添加物品自定义行为
想要为物品添加自定义行为,需要先创建一个类并继承item类或你想添加的物品类,名随便
添加代码如下
class ExampleItem(settings: Settings) : Item(settings) {
}然后在ModItem中
将注册物品中的Item改为新建类名
val EXAMPLE_ITEM: Item = registerItem("example_item", Pokeball(FabricItemSettings()))定义各种属性
在新建类文件中修改
class ExampleItem(settings: Settings) : Item(Item.Settings()) {
}可修改的属性参考物品 [Fabric Wiki] (fabricmc.net)
例如修改物品最大堆叠数量与食物属性
class Pokeball(settings: Settings) : Item(Item.Settings()
.maxCount(16)
.food(FoodComponent.Builder()
.hunger(4)
.saturationModifier(1.2f)
.build()))
{这段代码设置了该物品最大堆叠数量为16回复饱食度4点,饱和度1.2f
注意物品的耐久度和大于1的最大堆叠数量冲突
添加物品提示
注:不同版本添加物品提示的方式有所不同,本文以1.20.1为例
override fun appendTooltip(
stack: ItemStack?,
world: World?,
tooltip: MutableList<Text>?,
context: TooltipContext?
) {
tooltip.add(Text.translatable("item.example_item.tooltip").formatted(Formatting.GOLD))
super.appendTooltip(stack, world, tooltip, context)
}当玩家将鼠标悬停在example_item上时,会显示黄色的提示
在lang文件中
为item.example_item.tooltip本地化即可
构建模组
执行右侧的Gradle-->Tasks-->build--build
完成后在\build\libs\可以找到构建后的模组