[1.6.4] Использование предмета при крафте

Статус
В этой теме нельзя размещать новые ответы.
675
2
Доброго врмени суток.

Нужно сделать, дабы у предмета при крафте отбиралась по одной прочности, а сам предмет оставался(в моем случае IElectricItem, ic api).
Можно ли организовать такую фичу без своего крафтера?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Или вернее переписать getContainerItemStack
 
675
2
Спасибо, попробую. Появилась другая проблема, предмет не расходуется при ПКМ'е по блоку/воздуху.

Код:
package flymod.baseclasses;

import ic2.api.item.ElectricItem;
import ic2.api.item.IElectricItem;

import java.util.List;

import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;


public class ICToolMain extends MainItem implements IElectricItem {

    private int storage;
    private int tier;
    private int transferLimit;
    private int energyPerUse;

    public boolean onBlockClick(ItemStack item, World world, EntityPlayer player, int x, int y, int z, int side) {
        return false;
    }

    public boolean onRightClick(ItemStack item, World world, EntityPlayer player) {
        return false;
    }

    public ICToolMain(int id, String unlocalizedName, int tier, int storage, int transferLimit, int energyPerUse) {
        super(id, unlocalizedName);
        this.setMaxDamage(10);
        this.setNoRepair();
        this.setMaxStackSize(1);
        this.storage = storage;
        this.tier = tier;
        this.transferLimit = transferLimit;
        this.energyPerUse = energyPerUse;
    }

    int i = 0;
    
    public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
        if (!world.isRemote)
            if (ElectricItem.manager.canUse(itemStack, energyPerUse))
                if (onRightClick(itemStack, world, player))
                    ElectricItem.manager.use(itemStack, energyPerUse, player);
        player.addChatMessage("Использовано " + energyPerUse + "ЕУ" + "(" +  i++ + ")" + "; Сейчас в устройстве: " + storage);
        return itemStack;
    }
    
    public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float par8, float par9, float par10) {
        if (!world.isRemote)
            if (ElectricItem.manager.canUse(itemStack, energyPerUse))
                if (onBlockClick(itemStack, world, player, x, y, z, side)) {
                    ElectricItem.manager.use(itemStack, energyPerUse, player);
                    player.addChatMessage("Использовано " + energyPerUse + "ЕУ" + "(" +  i++ + ")" + "; Сейчас в устройстве: " + storage);
                    return true;
                }
        return false;
    }

    @Override
    public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) {
        ItemStack var4 = new ItemStack(this, 1);
        ElectricItem.manager.charge(var4, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
        par3List.add(var4);
        par3List.add(new ItemStack(this, 1, this.getMaxDamage()));

    }

    @Override
    public boolean canProvideEnergy(ItemStack itemStack) {
        return false;
    }

    @Override
    public int getChargedItemId(ItemStack itemStack) {
        return this.itemID;
    }

    @Override
    public int getEmptyItemId(ItemStack itemStack) {
        return this.itemID;
    }

    @Override
    public int getMaxCharge(ItemStack itemStack) {
        return this.storage;
    }

    @Override
    public int getTier(ItemStack itemStack) {
        return this.tier;
    }

    @Override
    public int getTransferLimit(ItemStack itemStack) {
        return this.transferLimit;
    }
}

Что не так делаю?
 
675
2
Агась, так заработало:
Код:
package flymod.baseclasses;

import ic2.api.item.ElectricItem;
import ic2.api.item.IElectricItem;

import java.util.List;

import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;


public class ICToolMain extends MainItem implements IElectricItem {

    private int storage;
    private int tier;
    private int transferLimit;
    private int energyPerUse;

    public ICToolMain(int id, String unlocalizedName, int tier, int storage, int transferLimit, int energyPerUse) {
        super(id, unlocalizedName);
        this.setMaxDamage(10);
        this.setNoRepair();
        this.setMaxStackSize(1);
        this.storage = storage;
        this.tier = tier;
        this.transferLimit = transferLimit;
        this.energyPerUse = energyPerUse;
    }
    
    @Override
    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player){
         if (!world.isRemote) {
             if (ElectricItem.manager.canUse(itemstack, this.energyPerUse)) {
                    ElectricItem.manager.use(itemstack, this.energyPerUse, player);
             } else {
                 player.addChatMessage("Нету энергии");
             }
         }
         return itemstack;
    }

    @Override
    public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) {
        ItemStack var4 = new ItemStack(this, 1);
        ElectricItem.manager.charge(var4, Integer.MAX_VALUE, Integer.MAX_VALUE, true, false);
        par3List.add(var4);
        par3List.add(new ItemStack(this, 1, this.getMaxDamage()));

    }

    @Override
    public boolean canProvideEnergy(ItemStack itemStack) {
        return true;
    }

    @Override
    public int getChargedItemId(ItemStack itemStack) {
        return this.itemID;
    }

    @Override
    public int getEmptyItemId(ItemStack itemStack) {
        return this.itemID;
    }

    @Override
    public int getMaxCharge(ItemStack itemStack) {
        return this.storage;
    }

    @Override
    public int getTier(ItemStack itemStack) {
        return this.tier;
    }

    @Override
    public int getTransferLimit(ItemStack itemStack) {
        return this.transferLimit;
    }
}
 
675
2
Как-то так...

Код:
    @Override
       public final ItemStack getContainerItemStack(ItemStack aStack) {
              if(aStack.getItemDamage() >= aStack.getMaxDamage()-1) {
                  aStack.setItemDamage(0);
              } else {
                  aStack.setItemDamage(aStack.getItemDamage() + 1);
              }

              return aStack;
           }

Ещё вопрос. Через что можно организовать крафт предмета, если его прочность больше 10 например? Т.е. если она меньше 10, то крафт не проходит.
 
Проверять через if(){}.
Код:
int damage = aStack.getItemDamage;

if(damage > 10){
//крафт, или еще что нибудь
}
else{
//оставить пустым
}
 
675
2
Vova_master написал(а):
Проверять через if(){}.
Код:
int damage = aStack.getItemDamage;

if(damage > 10){
//крафт, или еще что нибудь
}
else{
//оставить пустым
}
Если я не ошибаюсь, крафт происходит в крафтере, а getContainerItemStack просто возвращает предмет.



Можно ли обойтись без переписывания крафтера?
 
Try4W написал(а):
Vova_master написал(а):
Проверять через if(){}.
Код:
int damage = aStack.getItemDamage;

if(damage > 10){
//крафт, или еще что нибудь
}
else{
//оставить пустым
}
Если я не ошибаюсь, крафт происходит в крафтере, а getContainerItemStack просто возвращает предмет.



Можно ли обойтись без переписывания крафтера?
Ты хочешь править исходники? Ну-ну. Только потом не жалуйся, что майн не робит. Да, и где ты увидел getContainerItemStack? Тут только getItemDamage
[merge_posts_bbcode]Добавлено: 21.04.2014 23:07:56[/merge_posts_bbcode]

Код:
    /**
     * gets the damage of an itemstack
     */
    public int getItemDamage()
    {
        if (getItem() != null)
        {
            return getItem().getDamage(this);
        }
        return this.itemDamage;
    }
Кусок из ItemStack.java который лежит в net.minecraft.item
 
675
2
Vova_master написал(а):
Ты хочешь править исходники? Ну-ну. Только потом не жалуйся, что майн не робит. Да, и где ты увидел getContainerItemStack? Тут только getItemDamage
Переписать, в смысле дописать. (Наследовать/оверрайдить)
Смотри выше, метод getContainerItemStack. Повторюсь, что предмет удалить я могу. Нужно именно, дабы только предмет с прочностью 1+ работал в крафте.
 
Оу. Насчет get... тупанул.... Ну, для этого наверняка есть метод, на крайняк его можно зашаманить с нуля. Ща попробую. Только без теста
[merge_posts_bbcode]Добавлено: 21.04.2014 23:28:43[/merge_posts_bbcode]

Код:
    /**
     * Return the itemDamage represented by this ItemStack. Defaults to the itemDamage field on ItemStack, but can be overridden here for other sources such as NBT.
     *
     * @param stack The itemstack that is damaged
     * @return the damage value
     */
    public int getDamage(ItemStack stack)
    {
        return stack.itemDamage;
    }
В Item.java нашел. Подойдет?
 
675
2
Vova_master написал(а):
Оу. Насчет get... тупанул.... Ну, для этого наверняка есть метод, на крайняк его можно зашаманить с нуля. Ща попробую. Только без теста
[merge_posts_bbcode]Добавлено: 21.04.2014 23:28:43[/merge_posts_bbcode]

Код:
    /**
     * Return the itemDamage represented by this ItemStack. Defaults to the itemDamage field on ItemStack, but can be overridden here for other sources such as NBT.
     *
     * @param stack The itemstack that is damaged
     * @return the damage value
     */
    public int getDamage(ItemStack stack)
    {
        return stack.itemDamage;
    }
В Item.java нашел. Подойдет?
Это уже реализовано. Нужно отменить возможность крафта в зависимости от прочности предмета.
 
Try4W написал(а):
Vova_master написал(а):
Оу. Насчет get... тупанул.... Ну, для этого наверняка есть метод, на крайняк его можно зашаманить с нуля. Ща попробую. Только без теста
[merge_posts_bbcode]Добавлено: 21.04.2014 23:28:43[/merge_posts_bbcode]

Код:
    /**
     * Return the itemDamage represented by this ItemStack. Defaults to the itemDamage field on ItemStack, but can be overridden here for other sources such as NBT.
     *
     * @param stack The itemstack that is damaged
     * @return the damage value
     */
    public int getDamage(ItemStack stack)
    {
        return stack.itemDamage;
    }
В Item.java нашел. Подойдет?
Это уже реализовано. Нужно отменить возможность крафта в зависимости от прочности предмета.
Ну через эту проверять прочность, и если она ниже определенной планки(2, например), то крафтить нельзя. А если нет, то можно. Может, так как то:
Код:
public void damagedCraft(ItemStack stack){
int damage = stack.itemDamage;

if(damage > 2//или другого числа){
//что-то, для запрета крафта, придется, походу, самим шаманить, за что нас(меня) Анти(или кто-нибудь еще) обязательно пришибет
}
else{}
}
Сам только что сам на ходу зашаманил.
 
675
2
Я знаю синтаксис if'ов :)
Именно метод мне и нужен, мб отменить событие. Подожду ещё ответов.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Vova_master написал(а):
Try4W написал(а):
Vova_master написал(а):
Оу. Насчет get... тупанул.... Ну, для этого наверняка есть метод, на крайняк его можно зашаманить с нуля. Ща попробую. Только без теста
[merge_posts_bbcode]Добавлено: 21.04.2014 23:28:43[/merge_posts_bbcode]

Код:
    /**
     * Return the itemDamage represented by this ItemStack. Defaults to the itemDamage field on ItemStack, but can be overridden here for other sources such as NBT.
     *
     * @param stack The itemstack that is damaged
     * @return the damage value
     */
    public int getDamage(ItemStack stack)
    {
        return stack.itemDamage;
    }
В Item.java нашел. Подойдет?
Это уже реализовано. Нужно отменить возможность крафта в зависимости от прочности предмета.
Ну через эту проверять прочность, и если она ниже определенной планки(2, например), то крафтить нельзя. А если нет, то можно. Может, так как то:
Код:
public void damagedCraft(ItemStack stack){
int damage = stack.itemDamage;

if(damage > 2//или другого числа){
//что-то, для запрета крафта, придется, походу, самим шаманить, за что нас(меня) Анти(или кто-нибудь еще) обязательно пришибет
}
else{}
}
Сам только что сам на ходу зашаманил.
Поздравляю. ты потихоньку добираешься до уровня RaVeN-а! Тебе осталось еще немного, поспеши!
[merge_posts_bbcode]Добавлено: 21.04.2014 20:32:26[/merge_posts_bbcode]

Хотя ты не такой тупой, просто вечно лезешь не в то место и говоришь не ту вещь, что надо.
 
675
2
Не подскажите, какой класс или метод отвечает за крафт? Т.е. сравнивает лист рецептов и то, что игрок положил в крафт-поле(если я правильно понял, как это работает)
 
905
5
По идее, net.minecraft.item.crafting.CraftingManager.
 
675
2
Метод findMatchingRecipe(...);

И... я не представляю, как это организовать. Если создавать свой CraftingManager, то придется как-то регистрировать его и сверяться с ним при обновлении крафт поля(onCraftMatrixChanged). Мб есть способ попроще? :)

Повторю свой вопрос:

Как сделать, дабы крафт проходил,только если в рецепте используется предмет с прочностью больше 1.
 
905
5
Сильнолагучий метод инкаминг.
Код:
for (i=1; i<item.maxDamage; i++)
    {
    GameRegistry.addRecipe(new ItemStack(output, 1, i), new Object[] { "#11", "323", "11#", Character.valueOf('1'), item});
    }
Но это же заспамит список рецептов нахрен.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху