配置/初始化模组

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.ktModInitializer下添加

const val MOD_ID = "examplemod"

注意这个examplemod必须小写

添加物品/方块

注册物品

\src\main\kotlin\com.xxx\中创建一个Package(软件包)名为Item

Item下新建一个名为ModItemkotlin类/文件并选择对象

在新建的ModItem.kt中添加

    fun registerModItems(){
}

在主类(默认为在com.examplemod下的ExampleMod.ktonInitialize下添加

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\中创建一个名为blockPackage(软件包)

block中创建一个名为ModBlockKotlin对象

添加以下代码

    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中新建各创建一个名为ModLanguageProviderModModelProviderkotlin

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\

新建目录texturestextures\blocktextures\item

然后就可以在itemblock中放纹理

纹理必须是.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\可以找到构建后的模组

哇哇哇哇哇哇哇哇