Ic2 API

svk

1,185
3
С имплементировал IElectricItem.Вот что вышло:
Код:
    @Override
    public boolean canProvideEnergy(ItemStack itemStack) 
    {
        return true;
    }

    @Override
    public Item getChargedItem(ItemStack itemStack) 
    {
        return this;
    }

    @Override
    public Item getEmptyItem(ItemStack itemStack) 
    {
        return this;
    }

    @Override
    public double getMaxCharge(ItemStack itemStack) {

        return 1000;
    }

    @Override
    public int getTier(ItemStack itemStack) 
    {
        return 0;
    }

    @Override
    public double getTransferLimit(ItemStack itemStack) 
    {
        return 256;
    }
Всё работает, это-то да, а как достать, сколько энергии в итеме? И наоборот - установить.
[merge_posts_bbcode]Добавлено: 31.03.2015 23:06:16[/merge_posts_bbcode]

Завтра на minecraftforge напишу, если ответов не будет :)
 
Я бы на их месте поместил это в Damage, проверял?
а ещё вот что нарыл
Код:
IElectricItem powerSource = (IElectricItem)(stack.getItem());

      int emptyItemID = powerSource.getEmptyItemId(stack);
      int chargedItemID = powerSource.getChargedItemId(stack);

      if (stack.itemID == chargedItemID)
      {
        if (powerSource.getTier(stack) <= powerTier && powerSource.canProvideEnergy(stack))
        {
          int itemTransferLimit = powerSource.getTransferLimit(stack);
          int energyNeeded = adjustedStorage - currentEnergy;

          // Test if the amount of energy we have room for is greater than what the item can transfer per tick.
          if (energyNeeded > itemTransferLimit)
          {
 
Salamandr написал(а):
Я бы на их месте поместил это в Damage, проверял?
а ещё вот что нарыл
Код:
IElectricItem powerSource = (IElectricItem)(stack.getItem());

      int emptyItemID = powerSource.getEmptyItemId(stack);
      int chargedItemID = powerSource.getChargedItemId(stack);

      if (stack.itemID == chargedItemID)
      {
        if (powerSource.getTier(stack) <= powerTier && powerSource.canProvideEnergy(stack))
        {
          int itemTransferLimit = powerSource.getTransferLimit(stack);
          int energyNeeded = adjustedStorage - currentEnergy;

          // Test if the amount of energy we have room for is greater than what the item can transfer per tick.
          if (energyNeeded > itemTransferLimit)
          {
Хм, гляну, может там переменная или нбт энергии есть.
[merge_posts_bbcode]Добавлено: 01.04.2015 12:12:07[/merge_posts_bbcode]

А currentEnergy, можете скинуть чему равна эта переменная? Там НБТ или как?
 
сам погляди, http://www.massapi.com/class/ic2/api/reactor/IReactor-6.html
там ещё есть такая фигня как
Код:
ElectricItem.charge(stack, amount, baseTier, true, true);
ElectricItem.discharge(stack, amount, powerTier, false, false);
Надо просто сравнить разряженный предмет и заряженный, в режиме debug
 
Salamandr написал(а):
сам погляди, http://www.massapi.com/class/ic2/api/reactor/IReactor-6.html
там ещё есть такая фигня как
Код:
ElectricItem.charge(stack, amount, baseTier, true, true);
ElectricItem.discharge(stack, amount, powerTier, false, false);
Надо просто сравнить разряженный предмет и заряженный, в режиме debug
Всё равно там не написанно, как получить, сколько энергии в итеме.
А заряжать, походу, так
Код:
ElectricItem.charge(stackCopy, item.getMaxCharge(stackCopy), baseTier, true, true);
Только я не понял, что такое baseTier(

А есть что декомпелировать, что-бы глянуть как другие моды достают, сколько энергии в итеме? (Энергию в итеме, не в блоке или тайле)
 
да, конечно. Скачай http://jenkins.ic2.player.to/job/IC2_experimental/
dev версию, и загляни в core.item.ItemBattery, хотя там ничего такого особенного нет. Но есть в core.item.block.ItemElectricBlock

Код:
ItemStack itemStack = new ItemStack(Ic2Items.batBox.getItem(), 1);
    itemStack.setItemDamage(0);
    NBTTagCompound nbttagcompound = StackUtil.getOrCreateNbtData(itemStack);
    nbttagcompound.setDouble("energy", 40000.0D);
 
Salamandr написал(а):
да, конечно. Скачай http://jenkins.ic2.player.to/job/IC2_experimental/
dev версию, и загляни в core.item.ItemBattery, хотя там ничего такого особенного нет. Но есть в core.item.block.ItemElectricBlock

Код:
ItemStack itemStack = new ItemStack(Ic2Items.batBox.getItem(), 1);
    itemStack.setItemDamage(0);
    NBTTagCompound nbttagcompound = StackUtil.getOrCreateNbtData(itemStack);
    nbttagcompound.setDouble("energy", 40000.0D);
Я декомпелировать не умею(
nbttagcompound.setDouble("energy", 40000.0D); - это оно, только, не думаю что этот таг хранится в корне. Можете скинуть StackUtil?
 
Не вводи людей в заблуждение. Таг Energy используется только для свинченных энергохранителей. Для предметов используется дамаг.
 
Dragon2488 написал(а):
Не вводи людей в заблуждение. Таг Energy используется только для свинченных энергохранителей. Для предметов используется дамаг.
Оу, вы мне? Извините, я лишь сделал предположение.
 
Код:
ItemStack is = new ItemStack(...);
is.getItemDamage();


вот и прекрасно ) разобрались таки...

скачай JD-GUI http://jd.benow.ca/
в нём можно посмотреть код ЛЮБОГО мода (ну или любой Java игры)))
 
Dragon2488 написал(а):
Не сработало(
Код:
package com.svk.industrialGuns.guns;

import ic2.api.info.IEnergyValueProvider;
import ic2.api.item.ElectricItem;
import ic2.api.item.IElectricItem;
import ic2.api.item.IElectricItemManager;

import java.util.List;

import com.svk.industrialGuns.base.CommonProxy;

import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class EnergyCell extends Item implements IElectricItem
{
    private String name;
    public EnergyCell(String name) 
    {
        super();
        this.setCreativeTab(CommonProxy.TabGun);
        this.setUnlocalizedName(name);
        this.name = name;
    }

    @SideOnly(Side.CLIENT)
    public void registerIcons(IIconRegister ir) 
    {
       super.itemIcon = ir.registerIcon("industrialGuns:" + name);
    }
    
    public void onUpdate(ItemStack item, World world, Entity entity, int par4, boolean par5) 
    {    
        System.out.println(item.getItemDamage());
    }

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

    @Override
    public Item getChargedItem(ItemStack itemStack) 
    {
        return this;
    }

    @Override
    public Item getEmptyItem(ItemStack itemStack) 
    {
        return this;
    }

    @Override
    public double getMaxCharge(ItemStack itemStack) 
    {
        return 1000;
    }

    @Override
    public int getTier(ItemStack itemStack) 
    {
        return 0;
    }

    @Override
    public double getTransferLimit(ItemStack itemStack) 
    {
        return 1;
    }
}

Демаг всегда 0, однако я зарядил предмет в 1 заряжалке, и разрядил во 2.
 
Походу нашел решение, щас выложу...
P.S. "Спасибо за помощь RedEnergy"

Фикс метод:
Код:
    public int getCurrentEnergy(ItemStack item)
    {
        String energyStrFull = ElectricItem.manager.getToolTip(item);
        String energyStr[] = energyStrFull.split(" ");
        if(energyStr[1].contains("k"))
        {
            if(energyStr[1].contains("M"))
            {
                return Integer.parseInt(energyStr[0])*1000000;
            }
            return Integer.parseInt(energyStr[0])*1000;
        }
        else
        {
            return Integer.parseInt(energyStr[0]);
        }
    }
[merge_posts_bbcode]Добавлено: 01.04.2015 15:44:22[/merge_posts_bbcode]

Упс, я лол, вот решение:
Код:
        ElectricItem.manager.getCharge(item);
 
Назад
Сверху