Рецепты для своей печки

68
0
Подскажите пожалуйста, как можно переделать систему рецептов этой ( dual intput) под регистрацию рецептов не с помощью ифов а как в обычной печке ? Заранее спасибо.
 
У нас даже хэши айтемстаков не работают, а ты тут просишь.
 
Не стал читать про печь, но если я правильно понял, как она работает:

static HashMap<ItemStack[], ItemStack[]>, которая будет в качестве ключа прочить массив ItemStack'ов(ингредиенты), а значением будет тот или иной результат(предметы/блоки).

Дальше додумать не сложно:
Код:
static addR(ItemStack[] in, ItemStack[] out) {
 recipes.put(in, out);
}

Ну и чтобы печь начала плавить, нужно, чтобы ингредиенты совпали, т.е.:
Код:
onTick() {
 if(recipes.contains(getArrayOfItems())) {
  Додумать
 }
}
 
Сделать враппер для итемстака, который будет генерировать хеш из ID + метадаты, опционально количества.
 
Oldestkon написал(а):
Сделать враппер для итемстака, который будет генерировать хеш из ID + метадаты, опционально количества.
Где-то уже был такой метод. По моему в самом ItemStack'е.
[merge_posts_bbcode]Добавлено: 09.01.2015 19:20:49[/merge_posts_bbcode]

Вотс.
Код:
public static boolean areItemStacksEqual(ItemStack stackA, ItemStack stackB) {

   return stackA == null &&
   stackB == null ? true : (
   stackA != null &&
   stackB != null ? stackA.isItemStackEqual(stackB) : false);
}

private boolean isItemStackEqual(ItemStack other) {
   return this.stackSize != other.stackSize 
   ? false : (this.item != other.item ? false : (
     this.itemDamage != other.itemDamage ? false : (
     this.stackTagCompound == null && other.stackTagCompound != null ? false : 
     this.stackTagCompound == null || this.stackTagCompound.equals(other.stackTagCompound))));
    }
 
Код:
public class ItemStackHash{

    private ItemStack iStack;

    private boolean doCheckNBT = false;
    private boolean doCheckStackSize = false;
    private boolean doCheckDamage = false;

    public ItemStackHash(Block block){
        this(block, 1);
    }

    public ItemStackHash(Block block, int count){
        this(block, count, 0);
    }

    public ItemStackHash(Block block, int count, int damage){
        this(Item.getItemFromBlock(block), count, damage);
    }

    public ItemStackHash(Item item){
        this(item, 1);
    }

    public ItemStackHash(Item item, int count){
        this(item, count, 0);
    }

    public ItemStackHash(Item item, int count, int damage){
        iStack = new ItemStack(Preconditions.checkNotNull(item, "Item is null!"), count, damage);
    }

    public ItemStackHash(ItemStack itemStack){
        iStack = Preconditions.checkNotNull(itemStack, "ItemStack is null!");
    }

    private ItemStackHash(){
        throw new UnsupportedOperationException("Unsupported empty constructor!");
    }

    public ItemStackHash setDoCheckDamage(){
        doCheckDamage = true;
        return this;
    }

    public ItemStackHash setDoCheckStackSize(){
        doCheckStackSize = true;
        return this;
    }

    public ItemStackHash setDoCheckNBT(){
        doCheckNBT = true;
        return this;
    }

    public ItemStackHash setChecks(ItemStackHash parent){
        doCheckNBT = parent.doCheckNBT;
        doCheckDamage = parent.doCheckDamage;
        doCheckStackSize = parent.doCheckStackSize;
        return this;
    }

    public ItemStack getItemStack(){
        return iStack;
    }

    public int hashCode(){
        final int prime = 31;
        int result = 1;
        result = prime * result + Item.getIdFromItem(iStack.getItem());
        result = prime * result + (doCheckDamage ? iStack.getItemDamage() : 0);
        result = prime * result + (doCheckStackSize ? iStack.stackSize : 0);
        result = prime * result + (doCheckNBT && iStack.hasTagCompound() ? iStack.stackTagCompound.hashCode() : 0);
        return result;
    }

    public boolean equals(Object obj) {
        if(!(obj instanceof ItemStackHash)){
            return false;
        }

        ItemStackHash hashStack = (ItemStackHash)obj;

        if(Item.getIdFromItem(iStack.getItem()) != Item.getIdFromItem(hashStack.iStack.getItem())){
            return false;
        }

        if(doCheckDamage && iStack.getItemDamage() != hashStack.iStack.getItemDamage()){
            return false;
        }

        if(doCheckNBT && iStack.stackTagCompound != hashStack.iStack.stackTagCompound){
            return false;
        }

        if(doCheckStackSize && iStack.stackSize != hashStack.iStack.stackSize){
            return false;
        }

        return true;
    }

    public String toString(){
        return iStack.toString();
    }
}
 
Не метод.
Фёрстик выше правильно написал.
Дело в том, что надо создать класс-враппер, который перезапишет equals и hashcode, иначе ты не сможешь использовать итемстак как ключ в хешкарте.
Всё логично, вроде.
 
Oldestkon написал(а):
Фёрстик выше правильно написал.
Дело в том, что надо создать класс-враппер, который перезапишет equals и hashcode, иначе ты не сможешь использовать итемстак как ключ в хешкарте.
Точно, как раз думал об этом. Будем знать.
 
Назад
Сверху