топливо с прочностью

35
0
Доброго времени суток! Создал свою печку и сколько не копался увы не смог это воплотить в жизнь. Создал предмет с прочностью. Но когда применяю его как топливо происходит следующее:
начинается переплавка и -1 к прочности. 
следующая переплавка не отнимает прочность, а применяет его как бесконечное топливо :с
Уж не знаю что делать, 2й день мучаюсь :(
з.ы. 1.7.10
 
Вот кусок из моего мода:
Код:
items[1].getItem().setDamage(items[1], items[1].getItem().getDamage(items[1]) + 100);
Я так понимаю у вас примерно так:
Код:
items[1].getItem().setDamage(items[1],100);
?
 
у меня в печке прописанно топливо вот так :С
Код:
public static int getItemBurnTime(ItemStack itemstack){
        if(itemstack == null){
            return 0;
        }else{
            Item item = itemstack.getItem();
            
            if(item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air){
                Block block = Block.getBlockFromItem(item);    
            }
            
            if(item == Items.nether_star) return 20;
            if(item == ModItems.hammer)return 20; //топливо с прочностью
            //if(item instanceof ItemTool && ((ItemTool) item).getToolMaterialName().equals("EMERALD")) return 300;
            return GameRegistry.getFuelValue(itemstack);
        }
    }
и при попытке хот как то указать прочность, ругается :(
 
Код:
items[1].getItem().setDamage(items[1], items[1].getItem().getDamage(items[1]) + 100);
Говнокод
items[1].damageItem(null, 100);
 
wilah написал(а):
Код:
items[1].getItem().setDamage(items[1], items[1].getItem().getDamage(items[1]) + 100);
Говнокод
items[1].damageItem(null, 100);
И что сильно такое на производительность действует ?
 
а если не трудно, можете подсказать все таки, как быть с моим вариантом кода? :С
 
ладно, я сдаюсь, не нашел способ решения, баг сделал фичей, в плавке применяется бесконечный итем для работы, топливо ненужно :,D можно закрыть и выкинуть в корзину :О
 
Я не очень хороший моддер но надеюсь поможет.
Код:
           public static int i = 100;//Время не в сикундах (подбераетса методом фтика)
    @Override
    public void updateEntity() 
    {
        if(!this.worldObj.isRemote)
        {
            if(items[0] != null && items[1] != null)
            {
                //System.out.print("\n"+ items[1].getItem().getDamage(items[1]));
                if(items[0].getItem() == Items.diamond/*Это то что должно быть в слоте 0*/ && items[0].stackSize >= 5 /*Это сколько должно придметов печка скушает за 1 раз*/&& items[1].getItem() == ExampleMod.power_item/*Это слот 1 сюда нужно клать топливо*/ && items[1].getItem().getDamage(items[1]) < 1700/*Это здорове  топлива. В моем случае если дамаг больше  1700 то топливо изпользовано*/)
                {
                    if(items[2] == null)
                    {
                            if(i <= 1)
                            {
                                System.out.print("Null");
                                items[0].stackSize -= 5;
                                if (items[0].stackSize <= 0) items[0] = null;
                                //items[1].stackSize -= 1;
                                //if (items[1].stackSize <= 0) items[1] = null;
                                items[1].getItem().setDamage(items[1], items[1].getItem().getDamage(items[1]) + 100);//100 это дамаг которий будет нанесен при 1 использование.
                                items[2] = new ItemStack(Items.glass_bottle, 10);//Это то что мы получим после плавки(или что у вас там).
                                i = 100;// Установка времени в начало.
                            }
                            else
                            {
                                i--;
                            }
                    }
                    else if(items[2].getItem() == Items.glass_bottle)
                    {
                        if(items[2].stackSize < 64)
                        {
                            if(i <= 1)
                            {
                                System.out.print("else");
                                items[0].stackSize -= 5;
                                if (items[0].stackSize <= 0) items[0] = null;
                                //items[1].stackSize -= 1;
                                //if (items[1].stackSize <= 0) items[1] = null;
                                items[1].getItem().setDamage(items[1], items[1].getItem().getDamage(items[1]) + 100);
                                for(int i = items[2].stackSize, b = 0; i <= 64 && b <= 10; i++, b++)
                                {
                                    items[2].stackSize = i;
                                }
                                i = 100;
                            }
                            else
                            {
                                i--;
                            }
                        }
                        else
                        {
                            System.out.print("Elyer");
                        }
                    }
                }
            }
        }
Это из TileEntity.
Я почти уверен что так лудше не делать но у меня все работает.
 
блин, никак не пойму куда это можно всунуть и что заменить :С Может мне легче другой тайлентити замутить?
Код:
package CoreApril.blocksEntity;

import CoreApril.blocks.Anvil;
import CoreApril.items.ModItems;
import CoreApril.recipes.AnvilRecipes;

import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;

public class TileEntityAnvil extends TileEntity implements ISidedInventory {

    private static final int[] slotsTop = new int[] { 0 };
    private static final int[] slotsBottom = new int[] { 2, 1 };
    private static final int[] slotsSides = new int[] { 1 };

    private ItemStack[] furnaceItemStacks = new ItemStack[3];

    public int furnaceBurnTime;
    public int currentBurnTime;
    public int furnaceCookTime;

    private String furnaceName;

    public void furnaceName(String string){
        this.furnaceName = string;
    }
    
    @Override
    public int getSizeInventory() {
        return this.furnaceItemStacks.length;
    }

    @Override
    public ItemStack getStackInSlot(int slot) {
        return this.furnaceItemStacks[slot];
    }

    @Override
    public ItemStack decrStackSize(int par1, int par2) {
        if (this.furnaceItemStacks[par1] != null) {
            ItemStack itemstack;
            if (this.furnaceItemStacks[par1].stackSize <= par2) {
                itemstack = this.furnaceItemStacks[par1];
                this.furnaceItemStacks[par1] = null;
                return itemstack;
            } else {
                itemstack = this.furnaceItemStacks[par1].splitStack(par2);

                if (this.furnaceItemStacks[par1].stackSize == 0) {
                    this.furnaceItemStacks[par1] = null;
                }
                return itemstack;
            }
        } else {
            return null;
        }
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int slot) {
        if (this.furnaceItemStacks[slot] != null) {
            ItemStack itemstack = this.furnaceItemStacks[slot];
            this.furnaceItemStacks[slot] = null;
            return itemstack;
        } else {
            return null;
        }
    }

    @Override
    public void setInventorySlotContents(int slot, ItemStack itemstack) {
        this.furnaceItemStacks[slot] = itemstack;

        if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
            itemstack.stackSize = this.getInventoryStackLimit();
        }

    }

    @Override
    public String getInventoryName() {
        return this.hasCustomInventoryName() ? this.furnaceName : "Наковальня 9000";
    }

    @Override
    public boolean hasCustomInventoryName() {
        return this.furnaceName != null && this.furnaceName.length() > 0;
    }

    @Override
    public int getInventoryStackLimit() {
        return 1;
    }

    public void readFromNBT(NBTTagCompound tagCompound) {
        super.readFromNBT(tagCompound);
        NBTTagList tagList = tagCompound.getTagList("Items", 10);
        this.furnaceItemStacks = new ItemStack[this.getSizeInventory()];

        for (int i = 0; i < tagList.tagCount(); ++i) {
            NBTTagCompound tabCompound1 = tagList.getCompoundTagAt(i);
            byte byte0 = tabCompound1.getByte("Slot");

            if (byte0 >= 0 && byte0 < this.furnaceItemStacks.length) {
                this.furnaceItemStacks[byte0] = ItemStack.loadItemStackFromNBT(tabCompound1);
            }
        }

        this.furnaceBurnTime = tagCompound.getShort("BurnTime");
        this.furnaceCookTime = tagCompound.getShort("CookTime");
        this.currentBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);

        if (tagCompound.hasKey("CustomName", 8)) {
            this.furnaceName = tagCompound.getString("CustomName");
        }
    }

    public void writeToNBT(NBTTagCompound tagCompound) {
        super.writeToNBT(tagCompound);
        tagCompound.setShort("BurnTime", (short) this.furnaceBurnTime);
        tagCompound.setShort("CookTime", (short) this.furnaceBurnTime);
        NBTTagList tagList = new NBTTagList();

        for (int i = 0; i < this.furnaceItemStacks.length; ++i) {
            if (this.furnaceItemStacks[i] != null) {
                NBTTagCompound tagCompound1 = new NBTTagCompound();
                tagCompound1.setByte("Slot", (byte) i);
                this.furnaceItemStacks[i].writeToNBT(tagCompound1);
                tagList.appendTag(tagCompound1);
            }
        }

        tagCompound.setTag("Items", tagList);

        if (this.hasCustomInventoryName()) {
            tagCompound.setString("CustomName", this.furnaceName);
        }
    }

    @SideOnly(Side.CLIENT)
    public int getCookProgressScaled(int par1) {
        return this.furnaceCookTime * par1 / 200;
    }

    @SideOnly(Side.CLIENT)
    public int getBurnTimeRemainingScaled(int par1) {
        if (this.currentBurnTime == 0) {
            this.currentBurnTime = 200;
        }

        return this.furnaceBurnTime * par1 / this.currentBurnTime;
    }

    public boolean isBurning() {
        return this.furnaceBurnTime > 0;
    }

    public void updateEntity() {
        boolean flag = this.furnaceBurnTime > 0;
        boolean flag1 = false;

        if (this.furnaceBurnTime > 0) {
            --this.furnaceBurnTime;
        }

        if (!this.worldObj.isRemote) {
            if (this.furnaceBurnTime == 0 && this.canSmelt()) {
                this.currentBurnTime = this.furnaceBurnTime = getItemBurnTime(this.furnaceItemStacks[1]);

                if (this.furnaceBurnTime > 0) {
                    flag1 = true;
                    if (this.furnaceItemStacks[1] != null) {
                        --this.furnaceItemStacks[1].stackSize;

                        if (this.furnaceItemStacks[1].stackSize == 0) {
                            this.furnaceItemStacks[1] = furnaceItemStacks[1].getItem().getContainerItem(this.furnaceItemStacks[1]);
                        }
                    }
                }
            }

            if (this.isBurning() && this.canSmelt()) {
                ++this.furnaceCookTime;
                if (this.furnaceCookTime == 20) {
                    this.furnaceCookTime = 0;
                    this.smeltItem();
                    flag1 = true;
                }
            } else {
                this.furnaceCookTime = 0;
            }
        }

        if (flag != this.furnaceBurnTime > 0) {
            flag1 = true;
            Anvil.updateBlockState(this.furnaceBurnTime > 0, this.worldObj, this.xCoord, this.yCoord, this.zCoord);
        }

        if (flag1) {
            this.markDirty();
        }
    }

    private boolean canSmelt() {
        if (this.furnaceItemStacks[0] == null) {
            return false;
        } else {
            ItemStack itemstack = AnvilRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);
            if (itemstack == null) return false;
            if (this.furnaceItemStacks[2] == null) return true;
            if (!this.furnaceItemStacks[2].isItemEqual(itemstack)) return false;
            int result = furnaceItemStacks[2].stackSize + itemstack.stackSize;
            return result <= getInventoryStackLimit() && result <= this.furnaceItemStacks[2].getMaxStackSize();
        }
    }

    public void smeltItem() {
        if (this.canSmelt()) {
            ItemStack itemstack = AnvilRecipes.smelting().getSmeltingResult(this.furnaceItemStacks[0]);

            if (this.furnaceItemStacks[2] == null) {
                this.furnaceItemStacks[2] = itemstack.copy();
            } else if (this.furnaceItemStacks[2].getItem() == itemstack.getItem()) {
                this.furnaceItemStacks[2].stackSize += itemstack.stackSize;
            }
            
            --this.furnaceItemStacks[0].stackSize;
            
            if(this.furnaceItemStacks[0].stackSize >= 0){
                this.furnaceItemStacks[0] = null;
            }
        }
    }
    
    public static int getItemBurnTime(ItemStack itemstack){
        if(itemstack == null){
            return 0;
        }else{
            Item item = itemstack.getItem();
            
            if(item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air){
                Block block = Block.getBlockFromItem(item);    
            }
            
            if(item == Items.nether_star) return 20;
            if(item == ModItems.AnvilPlate)return 20;
            if(item instanceof ItemTool && ((ItemTool) item).getToolMaterialName().equals("EMERALD")) return 300;
            return GameRegistry.getFuelValue(itemstack);
        }
    }

    public static boolean isItemFuel(ItemStack itemstack){
        return getItemBurnTime(itemstack) > 0;
    }
    
    @Override
    public boolean isUseableByPlayer(EntityPlayer player) {
        return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : player.getDistanceSq((double) this.xCoord + 0.5D, (double) this.yCoord + 0.5D, (double) this.zCoord + 0.5D) <= 64.0D;
    }

    @Override
    public void openInventory() {

    }

    @Override
    public void closeInventory() {

    }

    @Override
    public boolean isItemValidForSlot(int par1, ItemStack itemstack) {
        return par1 == 2 ? false : (par1 == 1 ? isItemFuel(itemstack) : true);
    }

    @Override
    public int[] getAccessibleSlotsFromSide(int par1) {
        return par1 == 0 ? slotsBottom : (par1 == 1 ? slotsTop : slotsSides);
    }

    @Override
    public boolean canInsertItem(int par1, ItemStack itemstack, int par3) {
        return this.isItemValidForSlot(par1, itemstack);
    }

    @Override
    public boolean canExtractItem(int par1, ItemStack itemstack, int par3) {
        return par3 != 0 || par1 != 1 || itemstack.getItem() == Items.bucket;
    }

}
 
Назад
Сверху