1.7.10 レシピ削除について

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.296795)

1.7.10 レシピ削除について

投稿記事by kuregumo » 2017年2月26日(日) 13:39

minecraft 1.7.10 のレシピ削除のコードは{ RecipeRemove.removeRecipe(new ItemStack(Items.****),であってますか?
もしこれじゃなかったら教えてください。いかんせん、1.6xの解説ばかりで検索しても見つからないのです。お願いします。
最後に編集したユーザー kuregumo [ 2017年2月26日(日) 17:40 ], 累計 2 回
Mekanism使用者を増やしたい。Mekanismをもっと有名にしたい。そうすれば他modとのコラボが増えるかも?
アバター
kuregumo
ID:c536bf32
木を殴ってる
 
記事: 21
登録日時: 2016年6月19日(日) 11:59
お住まい: japan

  • (PostNo.296804)

Re: 1.7.10 レシピ削除について

投稿記事by kuregumo » 2017年2月26日(日) 14:37

少し追記:これじゃできないんですよね。どこが間違っているのでしょうか。
package com.example.examplemod;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.item.crafting.ShapelessRecipes;

@Mod(modid = "difficult_craft")
public class DifficultCraft{
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event){
}

@Mod.EventHandler
public void init(FMLInitializationEvent event){

GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe),
"ZXZ",
" Y ",
" Y ",
'X',Blocks.diamond_block,
'Y',Items.stick,
'Z',Items.diamond
);
GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks),
new ItemStack(Blocks.log)
);
GameRegistry.removeRecipe(new ItemStack(Items.diamond_pickaxe),
"XXX",
" Y ",
" Y ",
'X',Items.diamond,
'Y',Items.stick
);
}

@Mod.EventHandler
public void postInit(FMLPostInitializationEvent event){
}
}
Mekanism使用者を増やしたい。Mekanismをもっと有名にしたい。そうすれば他modとのコラボが増えるかも?
アバター
kuregumo
ID:c536bf32
木を殴ってる
 
記事: 21
登録日時: 2016年6月19日(日) 11:59
お住まい: japan

  • (PostNo.296826)

Re: 1.7.10 レシピ削除について

投稿記事by kuregumo » 2017年2月26日(日) 17:44

すみません。まったく解決できてませんでした。
コード: 全て選択
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;

@Mod(modid = "DifficultCraft")
public class DifficultCraft {





   @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event){
    }
   
    @Mod.EventHandler
    public void init(FMLInitializationEvent event){
       
       RecipeDeleter.DeleteRecipe(new ItemStack(Blocks.planks,4),
             new ItemStack(Blocks.log,1)
            );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,2),
             new ItemStack(Blocks.log,1)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4),
             new ItemStack(Blocks.log,1),
             new ItemStack(Blocks.log,1)
             );
       RecipeDeleter.DeleteRecipe(new ItemStack(Items.diamond_pickaxe),
             "XXX",
             " Y ",
             " Y ",
             'X',Items.diamond,
             'Y',Items.stick
             );
       GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe),
             "XYX",
             " Z ",
             " Z ",
             'X',Items.diamond,
             'Y',Blocks.diamond_block,
             'Z',Items.stick
             );
             
      
    }
       

   @Mod.EventHandler
    public void postInit(FMLPostInitializationEvent event){
    }
}




コード: 全て選択
package DifficultCraft;
//RecipeDeleter.java"

import java.util.Iterator;
import java.util.List;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;

public class RecipeDeleter
{
public static void DeleteRecipe(ItemStack par1ItemStack)
{
List recipes = CraftingManager.getInstance().getRecipeList();

for(Iterator i = recipes.listIterator(); i.hasNext();)
{
IRecipe recipe = (IRecipe)i.next();
ItemStack is = recipe.getRecipeOutput();

if(is != null)
{
if(is == par1ItemStack)
{
i.remove();}}
}
}




}


こんなかんじでもだめでした。どこがいけないのでしょうか?
Mekanism使用者を増やしたい。Mekanismをもっと有名にしたい。そうすれば他modとのコラボが増えるかも?
アバター
kuregumo
ID:c536bf32
木を殴ってる
 
記事: 21
登録日時: 2016年6月19日(日) 11:59
お住まい: japan

  • (PostNo.296912)

Re: 1.7.10 レシピ削除について

投稿記事by defeatedcrow » 2017年2月27日(月) 19:47

GameRegistryは文字通りの登録用クラスですから、基本的にはRegistry関係のメソッドが含まれています
GameRegistryクラスにremoveRecipe()なるメソッドは存在しません
そのクラスに存在しないものを"クラス名.メソッド名"のような形式で呼び出しても出てこないです
レシピ削除はForgeによって簡易メソッドがあるとか、サポートされている要素ではないので、(クラッシュ防止や他Mod共存も考えた)安定した仕組みを作ろうとすると相応に難易度は高いです

で、RecipeDeleter.classのほうですが
こちらでやろうとしている、CraftingManager.getInstance().getRecipeList()でリストを取って、これを回してレシピを索敵する流れは正攻法だと思いますが、致命的な問題が2点ほど

・まず
コード: 全て選択
for(Iterator i = recipes.listIterator(); i.hasNext();){
}

でIteretorを回している最中に、回しているIteretorの中身は改変できません
クラッシュしますので
ついでに言うと上記のコード、文法的に狂っているいるように見えますので、IDE等を利用して文法的な初歩ミスくらいは自力で除去できると良いと思います
あなたのやりたいことは恐らくこういうことでしょう
コード: 全て選択
for(IRecipe recipe : recipes){
}


・もう一つはItemStackを==で判定しようとしている部分で
同じものを確かめたいからと安易に「==」を使用しても比較はできません

例え話として
インベントリに、「丸石1個」のアイテムスタックが2箇所に入っているとします
これは”同じアイテムを含んでいる別個体”です、同一ではありません、入っているスロットが違いますし
Entityなどもそうなのですが、==で比較できるものは同一個体に限られますので、含まれているアイテムや個数が同じであるという判定はできません

”内容が一致するか”は、NBTタグ完全一致まで確認するならItemStack.areItemStacksEqualメソッド、
アイテム種別とメタデータのみ(スタック数問わず)ならareItemsEqualメソッドを使って判定できますし、自力でItemやstackSize、metadata等をチェックしても良いと思います
そのような方法でoutputを一致判定し、削除するレシピを決めればよいのですが
(ちなみにinputの一致判定は至難なので、基本的な文法がわからない段階の人にお勧めはできません)
先に書いたようにIteretorをぶん回している間に中身の削除はできませんので、
一旦削除用のリスト(List<IRecipe>)等を作って一時保存しておき、forループを抜けたあとでListに入っているレシピをRemoveするような流れが安全かと思います



追記:
もうちょっと追加、これは動かすだけなら必須ではなく、余力があればの話なのですが、
あなたの作ったメソッドの場合、削除レシピ1個につきレシピリストをforループでぶん回すため、環境によっては恐ろしく起動が遅くなる可能性があります
公開を視野に入れているならば、CraftingManager.getInstance().getRecipeList()のレシピリストを回す回数は抑えめにしたほうが良いかもしれません

あと、この処理はInitでは他Modのレシピ追加より先に実行されてしまい、対Mod追加レシピで消したいものがある場合は削除漏れが出てくる可能性があるので、InitよりPostInitで行ったほうが良いかも
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.296926)

Re: 1.7.10 レシピ削除について

投稿記事by kuregumo » 2017年2月27日(月) 21:00

コード: 全て選択
package DifficultCraft;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;

@Mod(modid = "DifficultCraft")
public class DifficultCraft
{
   @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event){
    }
   
    @Mod.EventHandler
    public void PostInit(FMLInitializationEvent event){    
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,2,1),
             new ItemStack(Blocks.log,1,1)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,2,2),
             new ItemStack(Blocks.log,1,2)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,0),
             new ItemStack(Blocks.log,1,0),
             new ItemStack(Blocks.log,1,0)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,1),
             new ItemStack(Blocks.log,1,1),
             new ItemStack(Blocks.log,1,1)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,2),
             new ItemStack(Blocks.log,1,2),
             new ItemStack(Blocks.log,1,2)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,3),
             new ItemStack(Blocks.log,1,3),
             new ItemStack(Blocks.log,1,3)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,4),
             new ItemStack(Blocks.log,1,4),
             new ItemStack(Blocks.log,1,4)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.planks,4,5),
             new ItemStack(Blocks.log,1,5),
             new ItemStack(Blocks.log,1,5)
             );
       GameRegistry.addRecipe(new ItemStack(Items.diamond_pickaxe),
             "XYX",
             " Z ",
             " Z ",
             'X',Items.diamond,
             'Y',Blocks.diamond_block,
             'Z',Items.stick
             );
       GameRegistry.addRecipe(new ItemStack(Items.diamond_sword),
             " X ",
             " Y ",
             " Z ",
             'X',Items.diamond,
             'Y',Blocks.diamond_block,
             'Z',Items.stick
             );
       GameRegistry.addRecipe(new ItemStack(Items.diamond),
             "XXX",
             "X X",
             "XXX",
             'X',Blocks.coal_block
             );
       GameRegistry.addRecipe(new ItemStack(Items.apple),
             "XXX",
             "XXX",
             "XXX",
             'X',new ItemStack(Blocks.leaves)
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Blocks.sand,4),
             new ItemStack(Blocks.sandstone)
             );
       GameRegistry.addRecipe(new ItemStack(Items.bucket),
             "   ",
             "I I",
             " O ",
             'I',Items.iron_ingot,
             'O',Items.cauldron
             );
       GameRegistry.addShapelessRecipe(new ItemStack(Items.blaze_powder),
             new ItemStack(Items.blaze_rod),
             new ItemStack(Items.blaze_rod)
             );            
    }   
   @Mod.EventHandler
    public void postInit(FMLPostInitializationEvent event){
   
      
   }
}




と、
コード: 全て選択
package DifficultCraft;
//RecipeDeleter.java"

import java.util.Iterator;
import java.util.List;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;

public class RecipeDeleter
{
public static void DeleteRecipe(ItemStack areItemsEqual)
{
List recipes = CraftingManager.getInstance().getRecipeList();

for(IRecipe recipe : recipes){
}
IRecipe recipe = (IRecipe)i.next();
ItemStack is = recipe.getRecipeOutput();

if(is != null)
{
if(is == areItemsEqual)
{
i.remove();}}
}
}

と、
コード: 全て選択
package DifficultCraft;

import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;

public class List<IRecipe> {
   {
RecipeDeleter.DeleteRecipe(new ItemStack(Blocks.planks,4,OreDictionary.WILDCARD_VALUE),
      new ItemStack(Blocks.log,1,OreDictionary.WILDCARD_VALUE)
      );    
RecipeDeleter.DeleteRecipe(new ItemStack(Items.diamond_pickaxe),
      "XXX",
      " Y ",
      " Y ",
      'X',Items.diamond,
      'Y',Items.stick
      );
RecipeDeleter.DeleteRecipe(new ItemStack(Items.diamond_sword),
      " X ",
      " X ",
      " Y ",
      'X',Items.diamond,
      'Y',Items.stick
      );
RecipeDeleter.DeleteShapelessRecipe(new ItemStack(Items.blaze_powder,2),
      new ItemStack(Items.blaze_rod)
      );
}}

とりあえずここまでできましたが、ここからができません。
せっかく回答してもらったのですが、エラーになってしまいます。やはり僕には早すぎましたかね。(苦笑)
Mekanism使用者を増やしたい。Mekanismをもっと有名にしたい。そうすれば他modとのコラボが増えるかも?
アバター
kuregumo
ID:c536bf32
木を殴ってる
 
記事: 21
登録日時: 2016年6月19日(日) 11:59
お住まい: japan

  • (PostNo.296938)

Re: 1.7.10 レシピ削除について

投稿記事by elise_blacklab » 2017年2月27日(月) 21:46

kuregumo さんが書きました:とりあえずここまでできましたが、ここからができません。
せっかく回答してもらったのですが、エラーになってしまいます。やはり僕には早すぎましたかね。(苦笑)

まずJavaのお勉強せな
ここもぢんぐ初心者が質問する場であってプログラミング初心者が質問する場じゃあないのよね…
メイドつくってたりします.http://el-blacklab.net/
アバター
elise_blacklab
ID:16b3e9b7
掘り廃人
 
記事: 2324
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.296939)

Re: 1.7.10 レシピ削除について

投稿記事by defeatedcrow » 2017年2月27日(月) 21:51

エラーになるなら、問題箇所はエラー文に書いてあると思いますが…
全体的に、Java文法とかエラーの読み方がわからないとか、IDEなどの使い方がわからないという問題は、Modding質問の範疇ではないので割愛します。そのへんは2、3の回答で挽回できる問題ではないですし、本人が時間をかけて習得するしかないようなものですので…
(先の回答は、そのへんを考慮して書いています。書いてある事の意味が分かるかどうかが一種の目安というか、意味が分からなければこの処理の自作は難しいだろうなということ。
ModdingWikiでいう、中~上級以上のものを作ろうとしていますから。)


なぜ、リストを作る→リストの”クラスを”作ることにしたのかはちょっとよく理解できませんが、
ただ単にRemove処理をforから出せば良いだけです。

Remove周りのソースをぼくが書くとしたら、こんな感じでしょうかね
実際には、削除ターゲットのItemStackはリストで用意するでしょうけど。
コード: 全て選択
public static void DeleteRecipe(ItemStack target) {
      List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList();
      // 空の削除予定リストを作る
      List<IRecipe> removeList = new ArrayList<IRecipe>();

      for (IRecipe recipe : recipes) {
         // nullチェックは十分に
         // これを怠ると、レシピ大量自動追加系によってnullクラッシュを喰らうことがあるので
         if(recipe != null && recipe.getRecipeOutput() != null && recipe.getRecipeOutput().getItem() != null){
            // 一致判定
            if(ItemStack.areItemsEqual(target, recipe.getRecipeOutput())){
               // このループ内では削除はせず、いったん削除予定リストに入れる
               removeList.add(recipe);
            }
         }
      }
      
      // 削除する
      for(IRecipe remove : removeList){
         // removeListに保存したレシピをrecipesから除去している
         recipes.remove(remove);
      }
      
   }
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0070553b
ダイヤモンド掘り
 
記事: 878
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.297011)

Re: 1.7.10 レシピ削除について

投稿記事by kuregumo » 2017年2月28日(火) 22:18

せっかくアドバイスをいただきましたが、まずはmoddingの基礎知識や、javaについてもきちっと最後まで調べて行きたいと思いましたので、一旦mod作りを中断したいと思います。しっかり勉強した後にまたお世話になるかもしれませんが、その時はお願いします。とは言ってもmodplayerとして質問させていただくときもあるかと思いますので、その時もお願いします。頑張って勉強したら戻ります。(moddingに)
Mekanism使用者を増やしたい。Mekanismをもっと有名にしたい。そうすれば他modとのコラボが増えるかも?
アバター
kuregumo
ID:c536bf32
木を殴ってる
 
記事: 21
登録日時: 2016年6月19日(日) 11:59
お住まい: japan


Return to 質問:開発・制作関連

x