提供: Minecraft Modding Wiki
ModderKina (トーク | 投稿記録) 細 (ミス) |
細 (→ソースコード) |
||
(2人の利用者による、間の3版が非表示) | |||
1行目: | 1行目: | ||
{{前提MOD|reqmod="Minecraft Forge Universal 11.14.0~"}} | {{前提MOD|reqmod="Minecraft Forge Universal 11.14.0~"}} | ||
− | {{前提Mapping|reqmap=" | + | {{前提Mapping|reqmap="stable_16"}}<br> |
− | {{チュートリアル難易度|difficulty=1|clear=none}} | + | {{チュートリアル難易度|difficulty=1|clear=none}}<br> |
+ | <br> | ||
==IRecipe利用によるレシピ追加== | ==IRecipe利用によるレシピ追加== | ||
<p>IRecipeを利用した少し複雑なレシピ追加方法。<br> | <p>IRecipeを利用した少し複雑なレシピ追加方法。<br> | ||
10行目: | 11行目: | ||
package等省略 | package等省略 | ||
− | @Mod(modid = "irecipesample") | + | @Mod(modid = "irecipesample", |
+ | acceptedMinecraftVersions = "[1.8,1.8.9]") | ||
public class SampleRecipeCore{ | public class SampleRecipeCore{ | ||
@EventHandler | @EventHandler | ||
85行目: | 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"であることを前提としています。 |
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で結果を返すというのが基本的な流れ。
ここではクラフティングテーブル内が全て土であることを確認し、土の量によって結果であるダイアモンドの量を増減させて返している。