提供: Minecraft Modding Wiki
移動先: 案内検索
(作った。不親切。)
 
(ソースコード)
 
(2人の利用者による、間の4版が非表示)
1行目: 1行目:
 
{{前提MOD|reqmod="Minecraft Forge Universal 11.14.0~"}}
 
{{前提MOD|reqmod="Minecraft Forge Universal 11.14.0~"}}
{{前提MOD|reqmap="snapshot_nodoc_20150404"}}
+
{{前提Mapping|reqmap="stable_16"}}<br>
{{チュートリアル難易度|difficulty=1|clear=none}}
+
{{チュートリアル難易度|difficulty=1|clear=none}}<br>
<p>ワールド上に設置できる簡単なブロックの追加方法</p>
+
<br>
==ブロックの追加==
+
==IRecipe利用によるレシピ追加==
 +
<p>IRecipeを利用した少し複雑なレシピ追加方法。<br>
 +
(単純なレシピは[[1.7のレシピ追加|1.7と同様の方法]]で実現できる)</p>
 
===ソースコード===
 
===ソースコード===
 
*SampleRecipeCore.java
 
*SampleRecipeCore.java
9行目: 11行目:
 
package等省略
 
package等省略
  
@Mod(modid = "irecipesample")
+
@Mod(modid = "irecipesample",
 +
    acceptedMinecraftVersions = "[1.8,1.8.9]")
 
public class SampleRecipeCore{
 
public class SampleRecipeCore{
 
     @EventHandler
 
     @EventHandler
84行目: 87行目:
 
RecipeSorterにIRecipe実装クラスを登録した後GameRegistry#addRecipeでレシピを登録。<br>
 
RecipeSorterにIRecipe実装クラスを登録した後GameRegistry#addRecipeでレシピを登録。<br>
 
RecipeSorter#registerの第一引数は他と登録名が被らないようにModID等一意なものを含める。<br>
 
RecipeSorter#registerの第一引数は他と登録名が被らないようにModID等一意なものを含める。<br>
また、第四引数は"after"であればあれほど優先度が低い。
+
また、第四引数は"after"であればあるほど優先度が低い。
 
詳しくはRecipeSorterのコンストラクタを見ると良い。
 
詳しくはRecipeSorterのコンストラクタを見ると良い。
 
  
 
===SampleRecipe.java===
 
===SampleRecipe.java===
 
matchesで対象であるかを判定し、getCraftingResultで結果を返すというのが基本的な流れ。<br>
 
matchesで対象であるかを判定し、getCraftingResultで結果を返すというのが基本的な流れ。<br>
 
ここではクラフティングテーブル内が全て土であることを確認し、土の量によって結果であるダイアモンドの量を増減させて返している。
 
ここではクラフティングテーブル内が全て土であることを確認し、土の量によって結果であるダイアモンドの量を増減させて返している。

2015年12月30日 (水) 23:50時点における最新版

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

この記事はMCPのMappingが"stable_16"であることを前提としています。


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



IRecipe利用によるレシピ追加[編集]

IRecipeを利用した少し複雑なレシピ追加方法。
(単純なレシピは1.7と同様の方法で実現できる)

ソースコード[編集]

  • SampleRecipeCore.java
package等省略

@Mod(modid = "irecipesample",
     acceptedMinecraftVersions = "[1.8,1.8.9]")
public class SampleRecipeCore{
    @EventHandler
    public void init(FMLInitializationEvent event){
        RecipeSorter.register("irecipesample:sample",SampleRecipe.class, RecipeSorter.Category.SHAPELESS,"after:minecraft:shapeless");
        GameRegistry.addRecipe(new SampleRecipe());
    }
}
  • SampleRecipe.java
package等省略;

public class SampleRecipe implements IRecipe{
    private ItemStack recipeItem = new ItemStack(Blocks.dirt);
    private ItemStack outItem = new ItemStack(Items.diamond);

    public boolean matches(InventoryCrafting inv, World worldIn){
        boolean allEmpty=true;
        for(int h = 0; h < inv.getHeight(); h++){
            for(int w = 0; w < inv.getWidth(); w++){
                ItemStack current = inv.getStackInRowAndColumn(h,w);
                if(current==null){
                    allEmpty &= true;
                    continue;
                }else allEmpty &= false;
                if (!(current.getItem() == recipeItem.getItem() && (recipeItem.getMetadata() == 32767 || current.getMetadata() == recipeItem.getMetadata()))){
                    return false;
                }
            }
        }
        return !allEmpty;
    }

    public ItemStack getCraftingResult(InventoryCrafting inv){
        ItemStack out = getRecipeOutput().copy();
        for(int h = 0; h < inv.getHeight(); h++){
            for(int w = 0; w < inv.getWidth(); w++){
                if(inv.getStackInRowAndColumn(h,w)!=null)out.stackSize++;
            }
        }
        out.stackSize--;
        return out;
    }

    public int getRecipeSize(){
        return 10;
    }

    public ItemStack getRecipeOutput(){
        return outItem;
    }

    public ItemStack[] getRemainingItems(InventoryCrafting inv){
        ItemStack[] aitemstack = new ItemStack[inv.getSizeInventory()];

        for (int i = 0; i < aitemstack.length; ++i)
        {
            ItemStack itemstack = inv.getStackInSlot(i);
            aitemstack[i] = net.minecraftforge.common.ForgeHooks.getContainerItem(itemstack);
        }

        return aitemstack;
    }
}

解説[編集]

SampleRecipeCore.java[編集]

RecipeSorter.register("irecipesample:sample", SampleRecipe.class, RecipeSorter.Category.SHAPELESS,"after:minecraft:shapeless");
GameRegistry.addRecipe(new SampleRecipe());

RecipeSorterにIRecipe実装クラスを登録した後GameRegistry#addRecipeでレシピを登録。
RecipeSorter#registerの第一引数は他と登録名が被らないようにModID等一意なものを含める。
また、第四引数は"after"であればあるほど優先度が低い。 詳しくはRecipeSorterのコンストラクタを見ると良い。

SampleRecipe.java[編集]

matchesで対象であるかを判定し、getCraftingResultで結果を返すというのが基本的な流れ。
ここではクラフティングテーブル内が全て土であることを確認し、土の量によって結果であるダイアモンドの量を増減させて返している。