提供: Minecraft Modding Wiki
移動先: 案内検索
(レシピを作る)
(Jsonについて追記)
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>
 +
=== サンプル ===
 +
* 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>
 +
現状Wildcardメタ32767を用いるとレシピ本においては正常に扱えない。
 +
 
 +
== 従来の手法 ==
 +
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),
 +
                        new ItemStack(Items.FEATHER),
 +
                        new ItemStack(Blocks.WEB)
 +
                ).setRegistryName(MOD_ID, "fluffy_diamond")
 +
        );
 +
    }
 
}
 
}
 
</source>
 
</source>
 
+
=== 解説 ===
==解説==
+
第一引数のnameと第二引数のgroupが新たに追加された。<br>
===レシピを作る===
+
現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。
レシピの登録はinitで行います
 
以前のバージョンとの違いは、addShapedRecipeメソッドの引数です
 
第一引数に名前、第二引数にグループを追加します
 
第三引数は、完成物
 
第四引数以降は、レシピの情報になっています
 
</br>
 
完成物の個数を変えるには、第3引数で
 
<source lang=java>
 
new ItemStack(Items.DIAMOND, 16)
 
</source>
 
このようにすれば、完成物の個数が変わります
 
 
 
===不定形レシピを作る===
 
[[category:その他]]
 

2017年9月2日 (土) 23:30時点における版

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

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

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

Jsonによる手法

1.12ではバニラのレシピカスタマイズ機能が不完全なため、Modのエントリクラス(@Modアノテーションがついたクラス)は不可欠。
ここではエントリクラスが存在するという前提で、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に同一文字列を入れるとレシピ本において同じ括りで表示されるようになる。
現状Wildcardメタ32767を用いるとレシピ本においては正常に扱えない。

従来の手法

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),
                        new ItemStack(Items.FEATHER),
                        new ItemStack(Blocks.WEB)
                ).setRegistryName(MOD_ID, "fluffy_diamond")
        );
    }
}

解説

第一引数のnameと第二引数のgroupが新たに追加された。
現状Wildcardを用いるとレシピ本においては正常に扱えないうえに、従来のように材料に生のItem/Blockインスタンスを入れるとWildcardメタ扱いになるため注意。