提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「==1.7.10の独自レシピシステムの追加== ここでは、比較的規模の大きいmodでよく見られる、バニラのクラフトや製錬、醸造以外...」)
 
(1.7.10の独自レシピシステムの追加)
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
 
==1.7.10の独自レシピシステムの追加==
 
==1.7.10の独自レシピシステムの追加==
  
ここでは、比較的規模の大きいmodでよく見られる、バニラのクラフトや製錬、醸造以外の方法でアイテムを作成するための、独自レシピシステムの作成について解説します。<br />
+
ここでは、比較的規模の大きいmodでよく見られる、製錬のように少ない種類のアイテムからアイテムを作成する(例.IC2抽出機)ための、独自レシピシステムの実装の一例について解説します。<br />
 
ここでは、実装したレシピシステムを使用して実際にアイテムを得る方法や、レシピをNEIで見れるようにする方法については解説しません。<br />
 
ここでは、実装したレシピシステムを使用して実際にアイテムを得る方法や、レシピをNEIで見れるようにする方法については解説しません。<br />
  
80行目: 80行目:
  
 
     //レシピを登録するメソッド。staticなのでインスタンスを生成せずとも外部から呼び出せる
 
     //レシピを登録するメソッド。staticなのでインスタンスを生成せずとも外部から呼び出せる
     public static void RegisterRecipe(ItemStack input, ItemStack output){
+
     public static void registerRecipe(ItemStack input, ItemStack output){
 
         instance.recipes.add(new RecipeItemStack(input, output));
 
         instance.recipes.add(new RecipeItemStack(input, output));
 
     }
 
     }
  
 
     //こちらは素材アイテムを鉱石辞書の鉱石名で指定するためのメソッド
 
     //こちらは素材アイテムを鉱石辞書の鉱石名で指定するためのメソッド
     public static void RegisterRecipe(String input, ItemStack output){
+
     public static void registerRecipe(String input, ItemStack output){
 
         instance.recipes.add(new RecipeItemStack(input, output));
 
         instance.recipes.add(new RecipeItemStack(input, output));
 
     }
 
     }
  
 
     //stackを素材とするレシピを探すメソッド
 
     //stackを素材とするレシピを探すメソッド
     public static RecipeItemStack FindRecipe(ItemStack stack){
+
     public static RecipeItemStack findRecipe(ItemStack stack){
 
         for(RecipeItemStack it : instance.recipes){
 
         for(RecipeItemStack it : instance.recipes){
 
             if(it.isMatch(stack)) return it;
 
             if(it.isMatch(stack)) return it;
97行目: 97行目:
 
}
 
}
 
</source>
 
</source>
 +
 
==解説==
 
==解説==
 
===RecipeItemStack.java===
 
===RecipeItemStack.java===

2015年9月22日 (火) 18:54時点における最新版

1.7.10の独自レシピシステムの追加[編集]

ここでは、比較的規模の大きいmodでよく見られる、製錬のように少ない種類のアイテムからアイテムを作成する(例.IC2抽出機)ための、独自レシピシステムの実装の一例について解説します。
ここでは、実装したレシピシステムを使用して実際にアイテムを得る方法や、レシピを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を用いている。
外部からのレシピ追加・照合は、このクラスのメソッドを呼び出して行う。