提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「{{前提MOD|reqmod="Fabric API 0.3.2 build 230~"}} {{チュートリアル難易度|difficulty=0|clear=none}} == レシピの追加(動的) == ここではレシピ…」)
 
1行目: 1行目:
 
{{前提MOD|reqmod="Fabric API 0.3.2 build 230~"}}
 
{{前提MOD|reqmod="Fabric API 0.3.2 build 230~"}}
{{チュートリアル難易度|difficulty=0|clear=none}}
+
{{チュートリアル難易度|difficulty=1|clear=none}}
 
+
<br />
 
 
 
== レシピの追加(動的) ==
 
== レシピの追加(動的) ==
 
ここではレシピを動的に追加する方法について解説する。
 
ここではレシピを動的に追加する方法について解説する。
11行目: 10行目:
 
// 未確認→動作確認済みのバージョン:1.14~1.16.3
 
// 未確認→動作確認済みのバージョン:1.14~1.16.3
  
===ソースコード===
+
=== ソースコード ===
 
*Main.java
 
*Main.java
 
<source lang = "java">
 
<source lang = "java">

2021年7月15日 (木) 18:09時点における版

この記事は"Fabric API 0.3.2 build 230~"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。


レシピの追加(動的)

ここではレシピを動的に追加する方法について解説する。 https://fabricmc.net/wiki/tutorial:dynamic_recipe_generationを元にこのページを書いています。 ここでの解説は(DataPackによるレシピ追加)を利用するのではなく、プログラム内で定義して追加する。 例えば、特定のMODがインストールされている場合に特定のMODのアイテムを使ったレシピを追加したりするために使うことができる。

// 未確認→動作確認済みのバージョン:1.14~1.16.3

ソースコード

  • Main.java
package com.example.addrecipe;

import java.util.ArrayList;

import com.google.common.collect.Lists;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

import net.fabricmc.api.ModInitializer;
import net.minecraft.util.Identifier;

public class Main implements ModInitializer {
	public static JsonObject sampleRecipe;

	@Override
	public void onInitialize() {
		sampleRecipe = createShapedRecipeJson(
			// レシピのパターンに使う文字を定義
			Lists.newArrayList(
				'#',
				'X'
			),
			// 上記の順に処理されます。
			Lists.newArrayList(
				new Identifier("minecraft:sticks"), 
				new Identifier("minecraft:emerald")
			),
			// 基本的にはタグを使いますが、:がない場合はitemにしましょう。
			Lists.newArrayList("tag", "tag"),
			// レシピの定義
			Lists.newArrayList(
				"XXX",
				" # ",
				" # "
			),
			// レシピの結果
			new Identifier("emerald_mod:emerald_pickaxe")
		);
	}

	public static JsonObject createShapedRecipeJson(ArrayList<Character> keys, ArrayList<Identifier> items,
		ArrayList<String> type, ArrayList<String> pattern, Identifier output) {
		JsonObject json = new JsonObject();
		
		// ここでレシピのタイプを決める。crafting_shaped(定形レシピ)
		json.addProperty("type", "minecraft:crafting_shaped");
		// "type": "minecraft:crafting_shaped"

		JsonArray jsonArray = new JsonArray();
		jsonArray.add(pattern.get(0));
		jsonArray.add(pattern.get(1));
		jsonArray.add(pattern.get(2));
		// JsonArrayにレシピを一行ずつ入れてからパターンを作成
		json.add("pattern", jsonArray);
		// "pattern": [
		// "###",
		// " | ",
		// " | "
		// ]

		JsonObject individualKey;
		JsonObject keyList = new JsonObject();

		for (int i = 0; i < keys.size(); ++i) {
			individualKey = new JsonObject();
			individualKey.addProperty(type.get(i), items.get(i).toString());
			keyList.add(keys.get(i) + "", individualKey);
			// "#": { "tag": "c:copper_ingots" }
			// "|": { "item": "minecraft:sticks" }
		}

		json.add("key", keyList);
		// "key": {
		// "#": {
		// "tag": "c:copper_ingots"
		// },
		// "|": {
		// "item": "minecraft:stick"
		// }
		// },

		JsonObject result = new JsonObject();
		result.addProperty("item", output.toString());
		result.addProperty("count", 1);
		json.add("result", result);
		// "result": {
		// "item": "modid:copper_pickaxe",
		// "count": 1
		// }

		return json;
	}
}