MC Forge 1.20.1 mod开发学习笔记(战利品、标签、配方)

战利品列表loot_tables

看了源码之后,发现这些都只是数据配置的内容,不需要额外写java代码,只需要配置一下data里面的json文件就可以了。

archaeology:考古学的掉落物

blocks:方块(挖掘、破坏)掉落物

chests:战利品箱

entities:实体(击杀)掉落物

gameplay:其他的游戏交互方式的掉落物以及效果

(真好啊,不用去开发这些底层逻辑了)

其实这里面的逻辑都是一样的,类似在卡池里面抽卡

以击杀牛的掉落物为例:

pools就是抽取的池子有哪些

然后每个池子在entries中抽取rolls+bonus_rolls次,bonus_rolls是额外的抽取次数,在json文件没有写明的情况下会受到幸运值、抢夺、时运影响(不确定)

然后每个entries一般都有几个属性:name、type、functions、weight、(似乎可能有quality)

name就是物品的标签、type就是物品的类型、functions就是作用在抽取过程的函数、weight就是抽取的权重(默认为1)(计算方式就是当前weight除以所有weight之和,得到抽出该物品的概率)

以牛的掉落物为例:

首先用函数set_count设置基础的掉落数目,count可以设为数值或者函数分布

然后是在该实体属性满足is_on_fire的情况下,对掉落物进行furnace_smelt函数(也就是用熔炉煮熟牛肉)

最后是抢夺附魔,每等级额外增加0~1个。

对于方块挖掘掉落物:(以测试模组中的candy_ore为例)

首先我们模仿官方的data格式建立文件夹,战利品列表放在test_mod文件夹下

然后开始编写我们的candy_ore.json

其中type: minecraft:alternatives,表示在children中选择第一个满足条件的物品

children下面的内容结构和entries是一样的

复制代码
{
  "type": "minecraft:block",
  "pools": [
    {
      "bonus_rolls": 0.0,
      "entries": [
        {
          "type": "minecraft:alternatives",
          "children": [
            {
              "type": "minecraft:item",
              "conditions": [
                {
                  "condition": "minecraft:match_tool",
                  "predicate": {
                    "enchantments": [
                      {
                        "enchantment": "minecraft:silk_touch",
                        "levels": {
                          "min": 1
                        }
                      }
                    ]
                  }
                }
              ],
              "name": "test_mod:candy_ore"
            },
            {
              "type": "minecraft:item",
              "functions": [
                {
                  "add": false,
                  "count": {
                    "type": "minecraft:uniform",
                    "max": 5.0,
                    "min": 2.0
                  },
                  "function": "minecraft:set_count"
                },
                {
                  "enchantment": "minecraft:fortune",
                  "formula": "minecraft:ore_drops",
                  "function": "minecraft:apply_bonus"
                },
                {
                  "function": "minecraft:explosion_decay"
                }
              ],
              "name": "minecraft:sugar"
            }
          ]
        }
      ],
      "rolls": 1.0
    }
  ]
}

其他:

对于战利品箱子,内容是在打开箱子的时候生成的

如果在entries中填写了quality字段,会根据幸运值与quality动态调整该物品的抽取权重

weight = floor(base_weight + quality * luck)

标签tags

当你在注册blocks的时候,可以添加一个.requiresCorrectToolForDrops()方法,这样会要求开采该方块的工具类型,这里的判定要求需要在tags中配置

在mineable文件夹下规定能使用不同工具进行开采的方块,例如使用镐子开采的就是pickaxe.json,在blocks文件夹下,添加needs_stone_tool.json可以添加对工具级别的要求。

目前我mod中pickaxe.json和needs_stone_tool.json内容是一样的。

复制代码
{
  "replace": false,
  "values": [
    "test_mod:candy_ore"
  ]
}

这里的replace字段表示是否替换已有的minecraft工具标签文件(当然不能替换)

对于tags中其他的内容,其实就是给物品打标签,然后代码会根据物品的标签进行一些条件判定。

配方recipes

其实这个看几个示例就明白了

type:配方类别

category:合成表分类(building、redstone、equipment、misc)(点开合成表绿色书时最左边的选项卡)

group:合成表组(绿书中左侧的配方选择框,把多类配方相似的物品放在一个组)

key:字符到物品的映射表(有序合成中使用)(只在该json中生效)(在key里面也可以使用tag,表示这一类物品都可以使用该字符表示)

pattern:合成表(有序合成中使用)(用key中的字符代表物品)(每行字符数要一样,没有物品的地方用空格代替)

result:合成台的产出,可以设定数量

show_notification:解锁配方后的右上角提示

木棍配方:

复制代码
{
  "type": "minecraft:crafting_shaped",
  "category": "misc",
  "group": "sticks",
  "key": {
    "#": {
      "tag": "minecraft:planks"
    }
  },
  "pattern": [
    "#",
    "#"
  ],
  "result": {
    "count": 4,
    "item": "minecraft:stick"
  },
  "show_notification": true
}

信标配方:(有序合成)

复制代码
{
  "type": "minecraft:crafting_shaped",
  "category": "misc",
  "key": {
    "G": {
      "item": "minecraft:glass"
    },
    "O": {
      "item": "minecraft:obsidian"
    },
    "S": {
      "item": "minecraft:nether_star"
    }
  },
  "pattern": [
    "GGG",
    "GSG",
    "OOO"
  ],
  "result": {
    "item": "minecraft:beacon"
  },
  "show_notification": true
}

下届合金锭:(无序合成,只用写ingredient)

复制代码
{
  "type": "minecraft:crafting_shapeless",
  "category": "misc",
  "group": "netherite_ingot",
  "ingredients": [
    {
      "item": "minecraft:netherite_scrap"
    },
    {
      "item": "minecraft:netherite_scrap"
    },
    {
      "item": "minecraft:netherite_scrap"
    },
    {
      "item": "minecraft:netherite_scrap"
    },
    {
      "item": "minecraft:gold_ingot"
    },
    {
      "item": "minecraft:gold_ingot"
    },
    {
      "item": "minecraft:gold_ingot"
    },
    {
      "item": "minecraft:gold_ingot"
    }
  ],
  "result": {
    "item": "minecraft:netherite_ingot"
  }
}

熔炉类型的配方:(以烧石头为例,如果type是blasting的话就是高炉,smoking烟熏炉,campfire_cooking篝火)

复制代码
{
  "type": "minecraft:smelting",
  "category": "blocks",
  "cookingtime": 200,
  "experience": 0.1,
  "ingredient": {
    "item": "minecraft:cobblestone"
  },
  "result": "minecraft:stone"
}

熔炉配方在java版MC中没法设置result的数量,这个问题好像还没修复。

锻造模板类型的配方:(以下界合金鞋子为例)

复制代码
{
  "type": "minecraft:smithing_transform",
  "addition": {
    "item": "minecraft:netherite_ingot"
  },
  "base": {
    "item": "minecraft:diamond_boots"
  },
  "result": {
    "item": "minecraft:netherite_boots"
  },
  "template": {
    "item": "minecraft:netherite_upgrade_smithing_template"
  }
}

base是要锻造的物品,addition是添加进来的物品,template是锻造模板

铁砧和附魔台似乎不是用配方这种方式进行工作的

添加模组配方的位置在resources/test_mod/recipes里面

大概写一下

测试结果:

相关推荐
程序员夏末3 分钟前
【LeetCode | 第四篇】算法笔记
笔记·算法·leetcode
Mr.朱鹏5 分钟前
分布式-redis集群架构
java·redis·分布式·后端·spring·缓存·架构
予枫的编程笔记6 分钟前
【面试专栏|Java并发编程】Java并发锁对比:synchronized与Lock,底层原理+适用场景详解
java·synchronized·java面试·java并发编程·并发锁·面试干货·lock接口
醇氧7 分钟前
PowerPoint 批量转换为 PDF
java·spring boot·spring·pdf·powerpoint
java1234_小锋8 分钟前
Java高频面试题:RabbitMQ如何实现消息的持久化?
java·开发语言
WJSKad123510 分钟前
Ghost瓶颈轻量化改进YOLOv26双路径特征生成与残差学习协同突破
学习·yolo
张永清-老清13 分钟前
每周读书与学习->Jmeter中如何使用Bean Shell脚本(二)Bean Shell的基础语法之变量与数据类型
学习·测试工具·jmeter·压力测试·性能调优·jmeter性能测试·性能分析
食指Shaye14 分钟前
docker的学习日记
学习·docker·eureka
爱打代码的小林16 分钟前
用 LangChain 解析大模型输出
java·python·langchain·大模型
_日拱一卒18 分钟前
LeetCode(力扣):只出现一次的数字
java·数据结构·算法