2014-12-13 9 views
2

Minecraft 1.7.10에 대해 ID 목록을 배치하고 게임에서 자신의 요리법을 제거하는 소형 유틸리티 모듈을 만들고자합니다. 나는 설정 파일을 가지고 있는데 레시피를 지울 수없는 것 같습니다.Minecraft Forge 1.7.10 - ID에서 요리법 제거

조리법을 제거하기위한 나의 방법은 다른 곳에서 몇 개의 포럼 스레드에서 보았고 내 구성 파일에서 작동하도록 약간 수정되었습니다 (또는 제 경우에는 작동하지 않음). 여기

은 방법 :

private void removeRecipes(String toDelete) 
{ 

    ArrayList<?> recipes = (ArrayList<?>) CraftingManager.getInstance().getRecipeList(); 

    ItemStack recipeResult = null; 

    ItemStack resultItem = new ItemStack((Item)Item.itemRegistry.getObject(toDelete)); 
    resultItem.stackSize = 1; 
    resultItem.setItemDamage(0); 

    for (int scan = 0; scan < recipes.size(); scan++) 
    { 
     IRecipe tmpRecipe = (IRecipe) recipes.get(scan); 
     if (tmpRecipe instanceof ShapedRecipes) 
     { 
      ShapedRecipes recipe = (ShapedRecipes)tmpRecipe; 
      recipeResult = recipe.getRecipeOutput(); 

      recipeResult.stackSize = 1; 
      recipeResult.setItemDamage(0); 
     } 
     if (tmpRecipe instanceof ShapelessRecipes) 
     { 
      ShapelessRecipes recipe = (ShapelessRecipes)tmpRecipe; 
      recipeResult = recipe.getRecipeOutput(); 

      recipeResult.stackSize = 1; 
      recipeResult.setItemDamage(0); 
     } 
     if (ItemStack.areItemStacksEqual(resultItem, recipeResult)) 
     { 
      System.out.println("[RecipeRemover] Removed Recipe: " + recipes.get(scan) + " -> " + recipeResult); 
      recipes.remove(scan); 
     } 
    } 
} 
+0

I 더 이상 mc의 소스를 가지고 있지는 않지만'CraftingManager.getInstance(). getRecipeList()'는 실제 목록이 아닌 arraylist의 복제본을 반환한다고 가정합니다. 당신이하고있는 것을 성취하기 위해 리플렉션을 사용해야한다고 생각하는 Im : P – engineercoding

답변

3

뭔가 조금 내 코드를 분명히 알아,하지만이 작품 (보편적으로 작동합니다) 훨씬 더 효율적인 방법입니다 :

@SuppressWarnings("unchecked") 
private void removeRecipes(String toDelete) 
{  
    ItemStack resultItem = new ItemStack((Item)Item.itemRegistry.getObject(toDelete)); 
    resultItem.stackSize = 1; 
    resultItem.setItemDamage(0); 

    List<IRecipe> recipes = CraftingManager.getInstance().getRecipeList(); 

    for (int i = 0; i < recipes.size(); i++) 
    { 
     IRecipe tmpRecipe = recipes.get(i); 

     ItemStack recipeResult = tmpRecipe.getRecipeOutput(); 
     if(recipeResult != null) 
     { 
      recipeResult.stackSize = 1; 
      recipeResult.setItemDamage(0); 
     } 

     if (ItemStack.areItemStacksEqual(resultItem, recipeResult)) 
     { 
      recipes.remove(i--); 
     } 
    } 
} 
+0

나는 본질적으로 동일한 접근법을 취하고 있으며 충분히 잘 작동합니다. –