Создание TileEntity c хранилищем жидкости.

Доброго времени суток! В общем у меня возникла необходимость сделать блок со своим баком(для воды, но это не важно). Ну в принципе работает, но что то явно пошло не так.
Код:
public FluidTank FuelCapacity;
public int MaxFuelLevel = FluidContainerRegistry.BUCKET_VOLUME * 10;
public int fuelLevel;
public TileEntityTest(){
        super();
this.FuelCapacity = new FluidTank(FluidRegistry.WATER,fuelLevel,MaxFuelLevel);
}

Код:
@Override
    public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
         int fill = super.fill(from, resource, doFill);
        /***
        if (canFill(from, resource.getFluid())) {
              return FuelCapacity.fill(resource, doFill);
            }
            return 0;
            ***/
         

                worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
                markDirty();
            

            return fill;
    }
    
    @Override
    public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
        
        if ((resource == null) || (!resource.isFluidEqual(FuelCapacity.getFluid()))) {
              return null;
            }
            if (!canDrain(from, resource.getFluid())) {
              return null;
            }
            return FuelCapacity.drain(resource.amount, doDrain);
    }
    @Override
    public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
        //if(maxDrain != 0){
            
        return FuelCapacity.drain(maxDrain, doDrain);
        
        
    }
    
    @Override
    public boolean canFill(ForgeDirection from, Fluid fluid) {        
        if (FluidRegistry.WATER.getID() == fluid.getID()){
        return true;
        }
        return false;
    }
    
    @Override
    public boolean canDrain(ForgeDirection from, Fluid fluid) {
        
        return FluidRegistry.WATER.getID() == fluid.getID();
    }
    @Override
    public FluidTankInfo[] getTankInfo(ForgeDirection from) {
        
        
        return new FluidTankInfo[] { FuelCapacity.getInfo() };
        
    }
В итоге жидкость заполняет хранилище, но FuelCapacity.getFluid() дает результат 0, получение id жидкости null. Что делаю не так?
 
Яснопонятно, пойду дальше билдкрафт, форестри и индастриал ковырять(
 
---
FanKar написал(а):
Asd1995sse написал(а):
там танки после уничтожения не сохраняют жидкости.
И что? Ему нужен пример как работать с Forge'вским методом для хранения жидкостей.
---
FanKar написал(а):
Там нету контейнеров.
Есть. По крайней мере, вроде было в "experimental" версии.
---
FanKar написал(а):
Там, тоже используют TileEntity с хранением Forge'вских жидкостей.
---
 
FanKar написал(а):
Asd1995sse написал(а):
там танки после уничтожения не сохраняют жидкости.
Там нету контейнеров.
А ТАМ ТО ЧТО?
Сохранение жидкости, после разрушения мне не нужно т.к. у меня мультиблочная структура! Индастриал рудопромывочный механизм. Ферсетри Центрифуги и т.д. И да я еще забыл упомянуть Railcraft и MFR
 
FanKar Старайся не цитировать весь пост. Правила 2.5.
И я тоже имел виду про танки.
 
timaxa007 написал(а):
FanKar Старайся не цитировать весь пост. Правила 2.5.
И я тоже имел виду про танки.
Насчёт этого правила я знаю. Просто лень выделять главное. Вот не понимаю как ты делаешь это:
БЫСТРО?
Ну вообще-то машинки из ик не танки. Там просто есть контейнеры.
 
Ну грубо говоря, мне и нужно сделать жидкостный контейнер для моей машинки
 
Asd1995sse написал(а):
Ну грубо говоря, мне и нужно сделать жидкостный контейнер для моей машинки
Но как я вижу, по названию классов у тебя "Жидксотный танк"
 
FanKar написал(а):
Asd1995sse написал(а):
Ну грубо говоря, мне и нужно сделать жидкостный контейнер для моей машинки
Но как я вижу, по названию классов у тебя "Жидксотный танк"
Изначально делал как в индастриале, но не заработало. Вернее я не допер как прогресс бар сделать. Решил сделать как в билдкрафте, ибо нужен полноценный танк.
 
Как из танка вытащить id жидкости, её количество?
 
Жидкость можно залить, слить(по трубам). Но после перезахода все обнуляется(в нбт запись есть и пакеты тоже присутствуют). Получить ни ид жидкости ни её количество нельзя (возвращает null или 0)
[merge_posts_bbcode]Добавлено: 03.10.2015 21:56:58[/merge_posts_bbcode]

Фух. В нбт все сохраняется, но получить кол-во и ид все равно невозможно(
 
Ща создам новый тайл и буду пробовать сделать кастомный танк. Все выложу на всеобщее обозрение ибо у меня не хватает логики, чтобы это все осмыслить!
 
Код:
package asdintergatermod.game.blocks.lenr.tileentity;

import asdintergatermod.minilib.util.gui.GuiLenrARC;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;

public class TestTileEntity extends TileEntity implements ISidedInventory, IFluidHandler{
    public int MaxFuelLevel = FluidContainerRegistry.BUCKET_VOLUME * 10;
    public FluidTank fuelCapacity;
    public int renderOffset;
    
    public TestTileEntity(){
        super();
        fuelCapacity = new FluidTank(MaxFuelLevel);
    }
    //Для гуи
    public FluidStack getTankAmount() {
        
        return fuelCapacity.getFluid();
    }
//Копипаст начало
    @Override
    public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
        int amount = fuelCapacity.fill(resource, doFill);
        if (amount > 0 && doFill)
        {
            renderOffset += resource.amount;
            worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
            worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType());
        }

        return amount;
    }

    @Override
    public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
         if (fuelCapacity.getFluidAmount() == 0)
                return null;
            if (fuelCapacity.getFluid().getFluid() != resource.getFluid())
                return null;
           
            return this.drain(from, resource.amount, doDrain);
    }

    @Override
    public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
        FluidStack amount = fuelCapacity.drain(maxDrain, doDrain);
        if (amount != null && doDrain)
        {
            renderOffset = -maxDrain;
            worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
            worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, this.getBlockType());
        }
        return amount;
    }

    @Override
    public boolean canFill(ForgeDirection from, Fluid fluid) {
        return fuelCapacity.getFluidAmount() == 0 || (fuelCapacity.getFluid().getFluid() == fluid && fuelCapacity.getFluidAmount() < fuelCapacity.getCapacity());
    }

    @Override
    public boolean canDrain(ForgeDirection from, Fluid fluid) {
        return fuelCapacity.getFluidAmount() > 0;
    }

    @Override
    public FluidTankInfo[] getTankInfo(ForgeDirection from) {
         FluidStack fluid = null;
            if (fuelCapacity.getFluid() != null)
                fluid = fuelCapacity.getFluid().copy();
            return new FluidTankInfo[] { new FluidTankInfo(fluid, fuelCapacity.getCapacity()) };
    }
//копипаст конец
    @Override
    public void readFromNBT(NBTTagCompound tag)
    {
    super.readFromNBT(tag);
    fuelCapacity.readFromNBT(tag);

    }

    @Override
    public void writeToNBT(NBTTagCompound tag)
    {
    super.writeToNBT(tag);
    fuelCapacity.writeToNBT(tag);
    writeCustomNBT(tag);
    }

    private void writeCustomNBT(NBTTagCompound tag) {
    NBTTagCompound comp = new NBTTagCompound();


    }
    @Override
    public Packet getDescriptionPacket()
    {
    NBTTagCompound tag = new NBTTagCompound();
    writeToNBT(tag);
    return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
    }
    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
    {
    NBTTagCompound tag = pkt.func_148857_g();
    readFromNBT(tag);
    }
    

    //То, что пока мне не нужно!
    @Override
    public int getSizeInventory() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public ItemStack getStackInSlot(int p_70301_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public String getInventoryName() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean hasCustomInventoryName() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int getInventoryStackLimit() {
        // TODO Auto-generated method stub
        return 0;
    }
    public GuiScreen getGUI(EntityPlayer entityplayer)
    {
      return new GuiLenrARC(this, entityplayer.inventory);
    }
    @Override
    public boolean isUseableByPlayer(EntityPlayer player) {
        return (this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) == this)
                && (player.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) < 64.0D);
    }

    @Override
    public void openInventory() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void closeInventory() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
        // TODO Auto-generated method stub
        return false;
    }

    

}
Как получить ид жидкости(Для создения гуи) и её количество?
[merge_posts_bbcode]Добавлено: 04.10.2015 20:30:01[/merge_posts_bbcode]

Код:
getTankAmount()

Возвращает null! Вот так и живем! Такое чувство, что java работает только благодаря null!

[merge_posts_bbcode]Добавлено: 04.10.2015 20:30:05[/merge_posts_bbcode]

Код:
getTankAmount()

Возвращает null! Вот так и живем! Такое чувство, что java работает только благодаря null!
 
Код:
public class Tank extends FluidTank {

    private final String name;

    private FluidStack lastBeforeUpdate = null;

    public Tank(String name, int capacity, TileEntity tile)
    {
        super(capacity);
        this.name = name;
        this.tile = tile;
    }

    public boolean isEmpty()
    {
        return getFluid() == null || getFluid().amount <= 0;
    }

    public boolean isFull()
    {
        return getFluid() != null && getFluid().amount >= getCapacity();
    }

    public Fluid getFluidType()
    {
        return getFluid() != null ? getFluid().getFluid() : null;
    }

    @Override
    public final NBTTagCompound writeToNBT(NBTTagCompound nbt)
    {
        NBTTagCompound tankData = new NBTTagCompound();
        super.writeToNBT(tankData);
        nbt.setTag(name, tankData);
        return nbt;
    }

    @Override
    public final FluidTank readFromNBT(NBTTagCompound nbt)
    {
        if (nbt.hasKey(name))
        {
            
            setFluid(null);

            NBTTagCompound tankData = nbt.getCompoundTag(name);
            super.readFromNBT(tankData);
        }
        return this;
    }
//дальше пакеты
 
XuPuPG написал(а):
Код:
public class Tank extends FluidTank {

    private final String name;

    private FluidStack lastBeforeUpdate = null;

    public Tank(String name, int capacity, TileEntity tile)
    {
        super(capacity);
        this.name = name;
        this.tile = tile;
    }

    public boolean isEmpty()
    {
        return getFluid() == null || getFluid().amount <= 0;
    }

    public boolean isFull()
    {
        return getFluid() != null && getFluid().amount >= getCapacity();
    }

    public Fluid getFluidType()
    {
        return getFluid() != null ? getFluid().getFluid() : null;
    }

    @Override
    public final NBTTagCompound writeToNBT(NBTTagCompound nbt)
    {
        NBTTagCompound tankData = new NBTTagCompound();
        super.writeToNBT(tankData);
        nbt.setTag(name, tankData);
        return nbt;
    }

    @Override
    public final FluidTank readFromNBT(NBTTagCompound nbt)
    {
        if (nbt.hasKey(name))
        {
            
            setFluid(null);

            NBTTagCompound tankData = nbt.getCompoundTag(name);
            super.readFromNBT(tankData);
        }
        return this;
    }
//дальше пакеты
Создать танк и прикрутить его к  Tile?
[merge_posts_bbcode]Добавлено: 04.10.2015 20:43:09[/merge_posts_bbcode]

Я про использование его вместо форждовского [font=monospace, sans-serif]FluidTank[/font]
 
А регистрировать танк нужно где либо?
 
А чем тебе форджевский не угодил?Если танк как тайл то как и обычный TileEntity
 
Назад
Сверху