提供: Minecraft Modding Wiki
2015年9月22日 (火) 17:17時点におけるFさん (トーク | 投稿記録)による版 (1.7.10の独自レシピシステムの追加1.7の独自レシピシステムの追加へ移動: 1.7.10の.10はいらないのでは?)
移動先: 案内検索

1.7.10の独自レシピシステムの追加

ここでは、比較的規模の大きいmodでよく見られる、バニラのクラフトや製錬、醸造以外の方法でアイテムを作成するための、独自レシピシステムの作成について解説します。
ここでは、実装したレシピシステムを使用して実際にアイテムを得る方法や、レシピをNEIで見れるようにする方法については解説しません。

ここでは「1個の素材アイテムからアイテムを作成する」クラフトのためのレシピシステムについてのみ解説します。
また、素材アイテムは鉱石辞書名からも指定できるようにします。

ソースコード

import関係は省略します。

  • RecipeItemStack.java
public class RecipeItemStack{
    protected boolean isOre; //このレシピが鉱石辞書の指定か否かのフラグ(true:鉱石辞書による指定)

    protected ItemStack mat; //レシピの素材アイテム
    protected int matId;     //素材アイテムの鉱石辞書内でのID

    protected ItemStack prod;//レシピで作成できるアイテム

    //コンストラクタ
    public RecipeItemStack(ItemStack mat, ItemStack prod){
        this.mat=mat;
        this.prod=prod;
        this.isOre=false;
    }
    public RecipeItemStack(String mat, ItemStack prod){
        this.matId=OreDictionary.getOreID(mat);
        this.prod=prod;
        this.isOre=true;
    }

    //このレシピの素材アイテムを返す
    public ItemStack getMaterial(){
        //鉱石辞書による指定の場合、初回のみ素材アイテムスタックを生成し、matに代入する
        //当然だが、指定した鉱石名を持つアイテムが存在しない場合、matはnullのまま返されるので注意
        if(isOre && mat==null){
            ArrayList<ItemStack> list=OreDictionary.getOres(OreDictionary.getOreName(matId));
            if(!list.isEmpty()) mat=list.get(0).copy();
        }

        return mat;
    }

    //このレシピで得られるアイテムを返す
    public ItemStack getProduct(){
        return prod;
    }

    //stackがこのレシピの素材と一致しているか判定する
    public boolean isMatch(ItemStack stack){
        //鉱石辞書による指定かどうかで処理を変える
        if(isOre){
            int[] ids=OreDictionary.getOreIDs(stack);
            for(int i=0;i<ids.length;i++){
                if(matId==ids[i]) return true;
            }
            return false;
        }
        else{
            //素材のメタ値を無視するレシピにも対応するため、OreDictionaryのメソッドで同一アイテムスタックか判定
            return OreDictionary.itemMatches(mat, stack, false);
        }
    }
}
  • Recipes.Java
public class Recipes{
    private static Recieps instance=new Recieps(); //Recipesクラスのインスタンス
    private ArrayList<RecipeItemStack> recipes=new ArrayList<RecipeItemStack>(); //登録されたレシピを保持するリスト

    //コンストラクタをprivateにして、外部からインスタンス化できないようにしておく
    private Recipes(){}

    //レシピを登録するメソッド。staticなのでインスタンスを生成せずとも外部から呼び出せる
    public static void RegisterRecipe(ItemStack input, ItemStack output){
        instance.recipes.add(new RecipeItemStack(input, output));
    }

    //こちらは素材アイテムを鉱石辞書の鉱石名で指定するためのメソッド
    public static void RegisterRecipe(String input, ItemStack output){
        instance.recipes.add(new RecipeItemStack(input, output));
    }

    //stackを素材とするレシピを探すメソッド
    public static RecipeItemStack FindRecipe(ItemStack stack){
        for(RecipeItemStack it : instance.recipes){
            if(it.isMatch(stack)) return it;
        }
    }
}

解説

RecipeItemStack.java

素材と、クラフトで得られる生成物を紐付けるクラス。
コンストラクタを二種類用意して、素材をアイテムスタックと鉱石名のどちらでも指定できるようにしている。

Recipes.Java

レシピの登録や管理を行うクラス。
ここでは、登録されたレシピを保持するために、ArrayListを用いている。
外部からのレシピ追加・照合は、このクラスのメソッドを呼び出して行う。