提供: Minecraft Modding Wiki
移動先: 案内検索
(レシピを作る)
(Jsonによる手法: 古いForgeでJsonレシピを使う場合の注意)
 
(2人の利用者による、間の4版が非表示)
1行目: 1行目:
 
{{前提MOD|reqmod="Minecraft Forge Universal 14.21.0.xxx~"}}
 
{{前提MOD|reqmod="Minecraft Forge Universal 14.21.0.xxx~"}}
 
{{チュートリアル難易度|difficulty=0}}
 
{{チュートリアル難易度|difficulty=0}}
このチュートリアルでは、バニラの基本的なレシピの追加方法について解説します。
+
このチュートリアルでは、基本的なレシピの追加方法について解説する。<br>
<br />
+
1.12からは以前の手法に加えて、Jsonによってレシピを記述できるようになった。<br>
==ソース==
+
また、その影響によって従来の方法にも少し変更が加えられている。<br>
===RecipeSample.java===
+
バニラのクラスや書式を使う利点はないのでOreRecipeを用いる。
 +
== Jsonによる手法 ==
 +
1.12ではバニラのレシピカスタマイズ機能が不完全なため、Modのエントリクラス(@Modアノテーションがついたクラス)は不可欠。<br>
 +
ここではエントリクラスが存在するという前提で、Jsonのみについて解説する。<br>
 +
 
 +
なお、古いバージョン(1.12~1.12.2初期頃)のForgeではJsonレシピの一部機能が未実装であり未修正のバグも存在したため、それらのバージョンでJsonレシピを扱う際は注意が必要。<br>
 +
 
 +
=== サンプル ===
 +
* dirt_to_diamond_vertical.json
 +
<source lang="javascript">
 +
{
 +
  "type": "forge:ore_shaped",
 +
  "group": "recipe_sample:dirt_to_diamond",
 +
  "pattern": [
 +
    " # ",
 +
    " # ",
 +
    " # "
 +
  ],
 +
  "key": {
 +
    "#": {
 +
      "item": "minecraft:dirt",
 +
      "data": 0
 +
    }
 +
  },
 +
  "result": {
 +
    "item": "minecraft:diamond"
 +
  }
 +
}
 +
</source>
 +
* dirt_to_diamond_horizontal.json
 +
<source lang="javascript">
 +
{
 +
  "type": "forge:ore_shaped",
 +
  "group": "recipe_sample:dirt_to_diamond",
 +
  "pattern": [
 +
    "###"
 +
  ],
 +
  "key": {
 +
    "#": {
 +
      "item": "minecraft:dirt",
 +
      "data": 0
 +
    }
 +
  },
 +
  "result": {
 +
    "item": "minecraft:diamond"
 +
  }
 +
}
 +
</source>
 +
* fluffy_diamond.json
 +
<source lang="javascript">
 +
{
 +
  "type": "forge:ore_shapeless",
 +
  "ingredients": [
 +
    {
 +
      "item": "minecraft:wool",
 +
      "data": 3
 +
    },
 +
    {
 +
      "item": "minecraft:feather"
 +
    },
 +
    {
 +
      "item": "minecraft:web"
 +
    }
 +
  ],
 +
  "result": {
 +
    "item": "minecraft:diamond"
 +
  }
 +
}
 +
</source>
 +
=== 解説 ===
 +
レシピのJsonは"assets/<modid>/recipes/"ディレクトリ下に配置すること。<br>
 +
Jsonのファイル名はそのままレシピの内部名に用いられる。<br>
 +
内部名はアドバンスメントによるレシピ解放などに用いる。<br>
 +
group項目に同一文字列を入れるとレシピ本において同じ括りで表示されるようになる。<br>
 +
 
 +
data項目で材料のメタ値(ダメージ値)を指定することが可能。<br>
 +
メタ値(ダメージ値)が0の場合はdata項目を省略することができる。<br>
 +
ただしメタ値を利用して同一IDに複数種類が登録されているアイテムやブロックを材料にする場合は0でもdata項目を省略することができない。(上の例では<code>minecraft:dirt</code>や<code>minecraft:wool</code>が該当する)<br>
 +
data項目に<code>32767</code>を指定するとWildcardとなりメタ値(ダメージ値)に関わらず材料として使用できるようになる。(ただしビルド2542より前ではWildcardメタが正常に動作しないので注意)
 +
 
 +
ちなみに、レシピの材料指定には[[鉱石辞書の利用]]も可能である。<br>
 +
その場合はitem項目に代わってtype項目で<code>"forge:ore_dict"</code>を指定し、ore項目に材料の鉱石辞書名を指定する。
 +
 
 +
<source lang="javascript">
 +
  "key": {
 +
    "#": {
 +
      "type": "forge:ore_dict",
 +
      "ore": "dirt"
 +
    }
 +
  }
 +
</source>
 +
 
 +
== 従来の手法 ==
 +
Forgeにより以前から提供されていたレシピ登録機能も引き続き利用できる。将来廃止されるかどうかは不透明である。<br>
 +
ちなみに、Forge側は「1.13ではServer-Client同期が実装されることが予期されるから、Jsonに移行すべきだ」としている。
 +
=== サンプル ===
 
<source lang="java">
 
<source lang="java">
package com.test.testmod;
+
import net.minecraft.init.Blocks;
 
 
 
import net.minecraft.init.Items;
 
import net.minecraft.init.Items;
 
import net.minecraft.item.ItemStack;
 
import net.minecraft.item.ItemStack;
 +
import net.minecraft.item.crafting.IRecipe;
 
import net.minecraft.util.ResourceLocation;
 
import net.minecraft.util.ResourceLocation;
 +
import net.minecraftforge.event.RegistryEvent;
 
import net.minecraftforge.fml.common.Mod;
 
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
+
import net.minecraftforge.oredict.ShapedOreRecipe;
 +
import net.minecraftforge.oredict.ShapelessOreRecipe;
  
 +
@Mod.EventBusSubscriber
 
@Mod(modid = RecipeSample.MOD_ID, version = RecipeSample.MOD_VERSION)
 
@Mod(modid = RecipeSample.MOD_ID, version = RecipeSample.MOD_VERSION)
 
public class RecipeSample{
 
public class RecipeSample{
public static final String MOD_ID = "recipesample";
+
    public static final String MOD_ID = "recipe_sample";
public static final String MOD_VERSION = "1.0";
+
    public static final String MOD_VERSION = "1.0";
@Mod.EventHandler
+
 
public void init(FMLInitializationEvent event) {
+
    @SubscribeEvent
GameRegistry.addShapedRecipe(new ResourceLocation("addDiamond"), new ResourceLocation("addDefaultItemRecipe"), new ItemStack(Items.DIAMOND), new Object[] {
+
    public static void registerRecipes(RegistryEvent.Register<IRecipe> event){
"###",
+
        event.getRegistry().registerAll(
"# #",
+
                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
                                "###",
+
                        " # ",
'#', Items.DIAMOND});
+
                        " # ",
}
+
                        " # ",
 +
                        '#', new ItemStack(Blocks.DIRT)
 +
                ).setRegistryName(MOD_ID, "dirt_to_diamond_vertical"),
 +
 
 +
                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
 +
                        "###",
 +
                        '#', new ItemStack(Blocks.DIRT)
 +
                ).setRegistryName(MOD_ID, "dirt_to_diamond_horizontal"),
 +
 
 +
                new ShapelessOreRecipe(null, Items.DIAMOND,
 +
                        new ItemStack(Blocks.WOOL, 1, 3),
 +
                        Items.FEATHER,
 +
                        Blocks.WEB
 +
                ).setRegistryName(MOD_ID, "fluffy_diamond")
 +
        );
 +
    }
 
}
 
}
 
</source>
 
</source>
 
+
=== 解説 ===
==解説==
+
第一引数のnameと第二引数のgroupが新たに追加された。<br>
===レシピを作る===
+
<del>現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。</del><br>
レシピの登録はinitで行います
+
<ins>ビルド2542で修正されWildcardメタが正常に動作するようになり、ItemStackでラップしてあげる必要はなくなった。</ins>
以前のバージョンとの違いは、addShapedRecipeメソッドの引数です
 
第一引数に名前、第二引数にグループを追加します
 
第三引数は、完成物
 
第四引数以降は、レシピの情報になっています
 
</br>
 
完成物の個数を変えるには、第3引数で
 
<source lang=java>
 
new ItemStack(Items.DIAMOND, 16)
 
</source>
 
このようにすれば、完成物の個数が変わります
 
 
 
===不定形レシピを作る===
 
[[category:その他]]
 

2018年8月29日 (水) 21:07時点における最新版

この記事は"Minecraft Forge Universal 14.21.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。

このチュートリアルでは、基本的なレシピの追加方法について解説する。
1.12からは以前の手法に加えて、Jsonによってレシピを記述できるようになった。
また、その影響によって従来の方法にも少し変更が加えられている。
バニラのクラスや書式を使う利点はないのでOreRecipeを用いる。

Jsonによる手法[編集]

1.12ではバニラのレシピカスタマイズ機能が不完全なため、Modのエントリクラス(@Modアノテーションがついたクラス)は不可欠。
ここではエントリクラスが存在するという前提で、Jsonのみについて解説する。

なお、古いバージョン(1.12~1.12.2初期頃)のForgeではJsonレシピの一部機能が未実装であり未修正のバグも存在したため、それらのバージョンでJsonレシピを扱う際は注意が必要。

サンプル[編集]

  • dirt_to_diamond_vertical.json
{
  "type": "forge:ore_shaped",
  "group": "recipe_sample:dirt_to_diamond",
  "pattern": [
    " # ",
    " # ",
    " # "
  ],
  "key": {
    "#": {
      "item": "minecraft:dirt",
      "data": 0
    }
  },
  "result": {
    "item": "minecraft:diamond"
  }
}
  • dirt_to_diamond_horizontal.json
{
  "type": "forge:ore_shaped",
  "group": "recipe_sample:dirt_to_diamond",
  "pattern": [
    "###"
  ],
  "key": {
    "#": {
      "item": "minecraft:dirt",
      "data": 0
    }
  },
  "result": {
    "item": "minecraft:diamond"
  }
}
  • fluffy_diamond.json
{
  "type": "forge:ore_shapeless",
  "ingredients": [
    {
      "item": "minecraft:wool",
      "data": 3
    },
    {
      "item": "minecraft:feather"
    },
    {
      "item": "minecraft:web"
    }
  ],
  "result": {
    "item": "minecraft:diamond"
  }
}

解説[編集]

レシピのJsonは"assets/<modid>/recipes/"ディレクトリ下に配置すること。
Jsonのファイル名はそのままレシピの内部名に用いられる。
内部名はアドバンスメントによるレシピ解放などに用いる。
group項目に同一文字列を入れるとレシピ本において同じ括りで表示されるようになる。

data項目で材料のメタ値(ダメージ値)を指定することが可能。
メタ値(ダメージ値)が0の場合はdata項目を省略することができる。
ただしメタ値を利用して同一IDに複数種類が登録されているアイテムやブロックを材料にする場合は0でもdata項目を省略することができない。(上の例ではminecraft:dirtminecraft:woolが該当する)
data項目に32767を指定するとWildcardとなりメタ値(ダメージ値)に関わらず材料として使用できるようになる。(ただしビルド2542より前ではWildcardメタが正常に動作しないので注意)

ちなみに、レシピの材料指定には鉱石辞書の利用も可能である。
その場合はitem項目に代わってtype項目で"forge:ore_dict"を指定し、ore項目に材料の鉱石辞書名を指定する。

"key": {
    "#": {
      "type": "forge:ore_dict",
      "ore": "dirt"
    }
  }

従来の手法[編集]

Forgeにより以前から提供されていたレシピ登録機能も引き続き利用できる。将来廃止されるかどうかは不透明である。
ちなみに、Forge側は「1.13ではServer-Client同期が実装されることが予期されるから、Jsonに移行すべきだ」としている。

サンプル[編集]

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.oredict.ShapedOreRecipe;
import net.minecraftforge.oredict.ShapelessOreRecipe;

@Mod.EventBusSubscriber
@Mod(modid = RecipeSample.MOD_ID, version = RecipeSample.MOD_VERSION)
public class RecipeSample{
    public static final String MOD_ID = "recipe_sample";
    public static final String MOD_VERSION = "1.0";

    @SubscribeEvent
    public static void registerRecipes(RegistryEvent.Register<IRecipe> event){
        event.getRegistry().registerAll(
                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
                        " # ",
                        " # ",
                        " # ",
                        '#', new ItemStack(Blocks.DIRT)
                ).setRegistryName(MOD_ID, "dirt_to_diamond_vertical"),

                new ShapedOreRecipe(new ResourceLocation(MOD_ID, "dirt_to_diamond"), Items.DIAMOND,
                        "###",
                        '#', new ItemStack(Blocks.DIRT)
                ).setRegistryName(MOD_ID, "dirt_to_diamond_horizontal"),

                new ShapelessOreRecipe(null, Items.DIAMOND,
                        new ItemStack(Blocks.WOOL, 1, 3),
                        Items.FEATHER,
                        Blocks.WEB
                ).setRegistryName(MOD_ID, "fluffy_diamond")
        );
    }
}

解説[編集]

第一引数のnameと第二引数のgroupが新たに追加された。
現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。
ビルド2542で修正されWildcardメタが正常に動作するようになり、ItemStackでラップしてあげる必要はなくなった。