Minecraft Fabric模组开发教程#10 添加矿物

首发于Enaium的个人博客


注册矿物

我们都知道,在矿物被挖掘之后,会掉落经验,所以我们需要使用ExperienceDroppingBlock来创建方块对象,之后需要创建两种矿物,一种是普通的矿物,一种是深层矿物。

ExperienceDroppingBlock的构造函数需要两个参数,第一个是掉落的经验数量,这里也就是创建了一个随机为 10-17 的经验掉落,第二个参数是方块的设置,这里设置了方块的颜色,敲击音效,硬度抗性,必须使用工具,以及挖掘音效。

java 复制代码
public static final Block END_HEART_ORE = new ExperienceDroppingBlock(UniformIntProvider.create(10, 17), AbstractBlock.Settings.create().mapColor(MapColor.STONE_GRAY).instrument(Instrument.BASEDRUM).requiresTool().strength(3.0f, 3.0f).sounds(BlockSoundGroup.NETHER_ORE));

深层矿物的设置和普通矿物差不多,只不过需要调用copy方法。

java 复制代码
public static final Block DEEPSLATE_END_HEART_ORE = new ExperienceDroppingBlock(UniformIntProvider.create(10, 17), AbstractBlock.Settings.copy(END_HEART_ORE).mapColor(MapColor.DEEPSLATE_GRAY).instrument(Instrument.BASEDRUM).requiresTool().strength(4.5f, 3.0f).sounds(BlockSoundGroup.DEEPSLATE));

最后,我们需要注册这两个矿物。

java 复制代码
Registry.register(Registries.BLOCK, new Identifier("awesome", "end_heart_ore"), END_HEART_ORE);
Registry.register(Registries.BLOCK, new Identifier("awesome", "deepslate_end_heart_ore"), DEEPSLATE_END_HEART_ORE);

注册矿物物品

使用之前学习的方法,我们可以很容易的注册矿物物品。

矿物纹理

使用之前学习的方法,我们可以很容易的注册矿物纹理。

多语言文件

json 复制代码
{
    "item.awesome.end_heart_ore": "End Heart Ore",
    "item.awesome.deepslate_end_heart_ore": "Deepslate End Heart Ore",
    "block.awesome.end_heart_ore": "End Heart Ore",
    "block.awesome.deepslate_end_heart_ore": "Deepslate End Heart Ore"
}

掉落物

这里会比较复杂,需要考虑精准采集和时运的影响,但我们可以使用原版中已经存在的配置。

我们进入到原版游戏中的data/minecraft/loot_tables/blocks/diamond_ore.json和data/minecraft/loot_tables/blocks/deepslate_diamond_ore.json将钻石矿的掉落配置加以修改。

diff 复制代码
@@ -24,7 +24,7 @@
                   }
                 }
               ],
-              "name": "minecraft:diamond_ore"
+              "name": "awesome:end_heart_ore"
             },
             {
               "type": "minecraft:item",
@@ -38,7 +38,7 @@
                   "function": "minecraft:explosion_decay"
                 }
               ],
-              "name": "minecraft:diamond"
+              "name": "awesome:end_heart"
             }
           ]
         }
@@ -46,5 +46,5 @@
       "rolls": 1.0
     }
   ],
-  "random_sequence": "minecraft:blocks/diamond_ore"
+  "random_sequence": "awesome:blocks/end_heart_ore"
 }
diff 复制代码
@@ -24,7 +24,7 @@
                   }
                 }
               ],
-              "name": "minecraft:deepslate_diamond_ore"
+              "name": "awesome:deepslate_end_heart_ore"
             },
             {
               "type": "minecraft:item",
@@ -38,7 +38,7 @@
                   "function": "minecraft:explosion_decay"
                 }
               ],
-              "name": "minecraft:diamond"
+              "name": "awesome:end_heart"
             }
           ]
         }
@@ -46,5 +46,5 @@
       "rolls": 1.0
     }
   ],
-  "random_sequence": "minecraft:blocks/deepslate_diamond_ore"
+  "random_sequence": "awesome:blocks/deepslate_end_heart_ore"
 }

可挖掘方块

我们需要在data/minecraft/tags/blocks/mineable/pickaxe.json中添加我们的矿物。

json 复制代码
{
  "replace": false,
  "values": [
    "awesome:end_heart_ore",
    "awesome:deepslate_end_heart_ore"
  ]
}

矿物配方

首先添加熔炉的配方,还是在recipes下创建,格式就是物品ID_from_smelting_矿物ID.json,高炉的配方就是物品ID_from_blasting_矿物ID.json。

熔炉

json 复制代码
{
  "type": "minecraft:smelting",
  "category": "misc",
  "cookingtime": 200,
  "experience": 1.0,
  "group": "end_heart",
  "ingredient": {
    "item": "awesome:end_heart_ore"
  },
  "result": "awesome:end_heart"
}
json 复制代码
{
  "type": "minecraft:smelting",
  "category": "misc",
  "cookingtime": 200,
  "experience": 1.0,
  "group": "end_heart",
  "ingredient": {
    "item": "awesome:deepslate_end_heart_ore"
  },
  "result": "awesome:end_heart"
}

高炉

json 复制代码
{
  "type": "minecraft:blasting",
  "category": "misc",
  "cookingtime": 100,
  "experience": 1.0,
  "group": "end_heart",
  "ingredient": {
    "item": "awesome:end_heart_ore"
  },
  "result": "awesome:end_heart"
}
json 复制代码
{
  "type": "minecraft:blasting",
  "category": "misc",
  "cookingtime": 100,
  "experience": 1.0,
  "group": "end_heart",
  "ingredient": {
    "item": "awesome:deepslate_end_heart_ore"
  },
  "result": "awesome:end_heart"
}

矿物生成

首先创建矿物的configured_feature,在data\awesome\worldgen\configured_feature中,创建配置end_heart_ore.json。

其中discard_chance_on_air_exposure就是矿物在空气中曝露的概率,size就是矿物的大小,targets就是矿物生成的目标方块,predicate_type的意思就是判断tag中的方块是否符合要求,不过要注意的是state中的Name必须首字母大写。

json 复制代码
{
  "type": "minecraft:ore",
  "config": {
    "discard_chance_on_air_exposure": 0.0,
    "size": 12,
    "targets": [
      {
        "state": {
          "Name": "awesome:end_heart_ore"
        },
        "target": {
          "predicate_type": "minecraft:tag_match",
          "tag": "minecraft:stone_ore_replaceables"
        }
      },
      {
        "state": {
          "Name": "awesome:deepslate_end_heart_ore"
        },
        "target": {
          "predicate_type": "minecraft:tag_match",
          "tag": "minecraft:deepslate_ore_replaceables"
        }
      }
    ]
  }
}

然后创建placed_feature,在data\awesome\worldgen\placed_feature中,创建配置end_heart_ore.json。

在placement中有四个参数,第一个是minecraft:count,就是矿物的数量,第二个是minecraft:in_square,就是矿物的生成范围,第三个是minecraft:height_range,就是矿物的生成高度,第四个是minecraft:biome,表示会在群系中生成。

json 复制代码
{
  "feature": "awesome:end_heart_ore",
  "placement": [
    {
      "type": "minecraft:count",
      "count": 20
    },
    {
      "type": "minecraft:in_square"
    },
    {
      "type": "minecraft:height_range",
      "height": {
        "type": "minecraft:trapezoid",
        "max_inclusive": {
          "absolute": 70
        },
        "min_inclusive": {
          "absolute": -24
        }
      }
    },
    {
      "type": "minecraft:biome"
    }
  ]
}

最后注册PlacedFeature。

java 复制代码
public static final RegistryKey<PlacedFeature> END_HEART_ORE_PLACED_FEATURE = RegistryKey.of(RegistryKeys.PLACED_FEATURE, new Identifier("awesome","end_heart_ore"));

并且在BiomeModifications中注册END_HEART_ORE_PLACED_FEATURE。

java 复制代码
BiomeModifications.addFeature(BiomeSelectors.foundInOverworld(), GenerationStep.Feature.UNDERGROUND_ORES, END_HEART_ORE_PLACED_FEATURE);

相关推荐
鬼手点金20 分钟前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
paopaokaka_luck1 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
Wang's Blog2 小时前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog2 小时前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
蜗牛互联网2 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff3 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
Shaoshing3 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
dd聊技术3 小时前
Prompt 从代码常量搬进数据库:改一句话,不用再发一次版
java·后端
ly76893 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
TAKETODAY3 小时前
Netty 是怎么把 HTTP 请求交给 MVC 的?一个请求的完整链路
java·netty