Мод для Minecraft с использованием Eclipse выдает ошибку при запуске - PullRequest
0 голосов
/ 21 января 2012

Я сделал инструмент из блока, я не сделал ошибок в коде.Когда я пытаюсь нажать кнопку сборки, появляется сообщение об ошибке терминала: как я могу это исправить?Пожалуйста.Вот код для RecipesTools.addRecipes

package net.minecraft.src;

public class RecipesTools
{
    private String recipePatterns[][] =
    {
        {
            "XXX", " # ", " # "
        }, {
            "X", "#", "#"
        }, {
            "XX", "X#", " #"
        }, {
            "XX", " #", " #"
        }
    };
    private Object recipeItems[][];

    public RecipesTools()
    {
        recipeItems = (new Object[][]
                {
                    new Object[] {
                        Block.planks, Block.cobblestone, Item.ingotIron, Item.diamond, Item.ingotGold,  Block.RadiatedStone
                    }, new Object[] {
                        Item.pickaxeWood, Item.pickaxeStone, Item.pickaxeSteel, Item.pickaxeDiamond, Item.pickaxeGold, Item.pickaxeRadiated
                    }, new Object[] {
                        Item.shovelWood, Item.shovelStone, Item.shovelSteel, Item.shovelDiamond, Item.shovelGold
                    }, new Object[] {
                        Item.axeWood, Item.axeStone, Item.axeSteel, Item.axeDiamond, Item.axeGold
                    }, new Object[] {
                        Item.hoeWood, Item.hoeStone, Item.hoeSteel, Item.hoeDiamond, Item.hoeGold
                    }
                });
    }

    public void addRecipes(CraftingManager craftingmanager)
    {
        for (int i = 0; i < recipeItems[0].length; i++)
        {
            Object obj = recipeItems[0][i];
            for (int j = 0; j < recipeItems.length - 1; j++)
            {
                Item item = (Item)recipeItems[j + 1][i];
                craftingmanager.addRecipe(new ItemStack(item), new Object[]
                        {
                            recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
                        });
            }
        }

        craftingmanager.addRecipe(new ItemStack(Item.shears), new Object[]
                {
                    " #", "# ", Character.valueOf('#'), Item.ingotIron
                });
    }
}

EDIT Я также дал Eclipe 1024 МБ ОЗУ и удалил папку .Minecraft.

Ответы [ 3 ]

1 голос
/ 21 января 2012

recipeItems[0].length равно 6. Но recipeItems[2] и следующие имеют только пять элементов.Поэтому ваш цикл верхнего уровня в addRecipes неверен.

Вероятно, вы должны использовать типы коллекций (vector, list, Array, ...) и итераторы для этого, что сделает код более безопасным и более читабельным.(ИМО).

0 голосов
/ 22 февраля 2015

Прежде всего, вы, вероятно, должны проверить, какого типа Object s в массиве, перед тем как вы их приведете, так что часть, которая в данный момент имеет значение

Item item = (Item)recipeItems[j + 1][i];

в цикле, следует заменить на что-то вроде этого:

Object itemObj = recipeItems[j + 1][i];
if(itemObj instanceof Item)
{
    // The current element is an Item
    Item item = (Item)recipeItems[j + 1][i];
    craftingmanager.addRecipe(new ItemStack(item), new Object[]
    {
        recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
    });
}
else if(itemObj instanceof Block)
{
    // The current element is a Block
    Block block = (Block)recipeItems[j + 1][i];
    craftingmanager.addRecipe(new ItemStack(block), new Object[]
    {
        recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
    });
}
else
{
    // The current element is none of the types above
    // TODO Throw an exception, print a message or quit the game
}

потому что, я почти уверен, что вы не можете разыграть Item до Block. Это не решит эту проблему, это был просто совет, потому что код, который вы использовали там раньше, может вызвать ошибки в будущем.

Решение вашей текущей проблемы - это то, что Mat и nicholas.hauschild уже ответили. Первые два элемента массива recipeItems (recipeItems[0] и recipeItems[1]) имеют 6 элементов, но остальные элементы имеют только 5 элементов. В вашем цикле вы берете длину только первого элемента и используете его для циклического прохождения остальных элементов, но они меньше первого.
Что произойдет, если вы попытаетесь получить доступ к элементу 6 в массиве из 5 элементов?

Вы можете заменить цикл на что-то вроде этого:

for(int i = 0; i < recipeItems.length - 1; i++)
{
    for(int j = 0; j < recipeItems[i].length; j++)
    {
        Object obj = recipeItems[0][j];
        Object itemObj = recipeItems[i + 1][j];
        if(itemObj instanceof Item)
        {
            // The current element is an Item
            Item item = (Item)recipeItems[j + 1][i];
            craftingmanager.addRecipe(new ItemStack(item), new Object[]
            {
                recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
            });
        }
        else if(itemObj instanceof Block)
        {
            // The current element is a Block
            Block block = (Block)recipeItems[j + 1][i];
            craftingmanager.addRecipe(new ItemStack(block), new Object[]
            {
                recipePatterns[j], Character.valueOf('#'), Item.stick, Character.valueOf('X'), obj
            });
        }
        else
        {
            // The current element is none of the types above
            // TODO Throw an exception, print a message or quit the game
        }
    }
}

Надеюсь, это поможет!

0 голосов
/ 21 января 2012

Ваш внешний цикл в addRecipies выполняет итерацию по массиву [0], равному recipeItems.В первом дочернем массиве есть 6 элементов, означающих, что recipeItems[0][5] будет допустимым элементом.Но есть неверное предположение, что это верно для всех recipeItems массивов.По крайней мере один из более поздних массивов содержит менее 6 элементов.

Вы должны выполнять итерации по размеру дочерних массивов, а не по размеру первого массива.

...