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

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;
    }
//дальше пакеты
Тогда смысл этого кода, если можно взять форджевский? Да и я заметил, что нбт то сохраняется. Просто не могу никак получить ид и количество жидкости.
[merge_posts_bbcode]Добавлено: 05.10.2015 17:54:00[/merge_posts_bbcode]

Даже с помощью ведрового метода измерения жидкости, была найдена емкость моей канистры и она совпала с той, которая прописана в тайле!
 
Код:
fuelCapacity.getFluid().getLocalizedName();
получаем:
Код:
java.lang.NullPointerException: Unexpected error
Незнаю, возможно я что то делаю не так
 
CoomingSoon написал(а):
Код:
getFluid

Он-то нулл?
Да это я тупанул. Вывожу в лог fuelCapacity.getFluidAmount(); получаю 0
[merge_posts_bbcode]Добавлено: 07.10.2015 16:21:58[/merge_posts_bbcode]

Так до меня доперло! С клиентской стороны 0, с серверной все правильно! Вывод: СИНХОНИЗАЦИЯ!

[merge_posts_bbcode]Добавлено: 07.10.2015 16:33:08[/merge_posts_bbcode]

Осталось понять, как получить информацию с клиентской стороны...
 
Код:
@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 void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {

    this.readFromNBT(pkt.func_148857_g());
    this.worldObj.func_147479_m(xCoord, yCoord, zCoord);
    }

    @Override
    public Packet getDescriptionPacket() {

    NBTTagCompound nbt = new NBTTagCompound();
    this.writeToNBT(nbt);
    return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt);
    }
Хоть те пакеты я использую?
 
Надо помечать блок на обновление (markForUpdate вроде). В мире ищи
 
CoomingSoon написал(а):
Надо помечать блок на обновление (markForUpdate вроде). В мире ищи
@Override
public void updateEntity()
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
        markDirty();
super.updateEntity();
  //          worldObj.func_147479_m(xCoord, yCoord, zCoord);
   
}
 
Help Me! Потому, что я не знаю как все это заставить работать.
 
Каким образом с клиентской стороны получить переменную, которая лежит на серверной?
 
Отправкой пакета с сервера по просьбе клиента.
[merge_posts_bbcode]Добавлено: 08.10.2015 21:21:37[/merge_posts_bbcode]

Вот что у меня получилось, конечно без Gui, но всё-же:
Код:
public class BlockTest extends Block implements ITileEntityProvider {

    public BlockTest(String tag) {
        super(Material.wood);
        setCreativeTab(CreativeTabs.tabBlock);
    }

    public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {

    }

    @Override
    public TileEntity createNewTileEntity(World world, int meta) {
        return new TileEntityTest();
    }

    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        if (player.isSneaking()) return false;
        TileEntityTest tile = (TileEntityTest)world.getTileEntity(x, y, z);
        if (tile != null) {
            ItemStack is = player.getCurrentEquippedItem();
            if (is != null) {
                if (is.getItem() == Items.water_bucket) {
                    if (tile.tank.getFluid() != null && tile.tank.getFluid().getFluid().equals(FluidRegistry.WATER)) 
                        tile.tank.setFluid(new FluidStack(FluidRegistry.WATER, tile.tank.getFluid().amount + 1000));
                    else if (tile.tank.getFluid() == null)
                        tile.tank.setFluid(new FluidStack(FluidRegistry.WATER, 1000));
                }
                if (is.getItem() == Items.lava_bucket) {
                    if (tile.tank.getFluid() != null && tile.tank.getFluid().getFluid().equals(FluidRegistry.LAVA)) 
                        tile.tank.setFluid(new FluidStack(FluidRegistry.LAVA, tile.tank.getFluid().amount + 1000));
                    else if (tile.tank.getFluid() == null)
                        tile.tank.setFluid(new FluidStack(FluidRegistry.LAVA, 1000));
                }
            } else {
                if (tile.tank.getInfo() != null && tile.tank.getInfo().fluid != null)
                    if (world.isRemote) player.addChatMessage(new ChatComponentText("Fluid: " + tile.tank.getInfo().fluid.getLocalizedName() + ", Capacity:" + tile.tank.getInfo().fluid.amount + ""));
            }
            return true;
        }
        return onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ);
    }

}
Код:
public class TileEntityTest extends TileEntity {

    public FluidTank tank;
    private int capacity;

    public TileEntityTest() {
        capacity = 5000;
        tank = new FluidTank(capacity);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        super.readFromNBT(nbt);
        tank.readFromNBT(nbt);
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        super.writeToNBT(nbt);
        tank.writeToNBT(nbt);
    }

    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    }

}
Проверил и пере-заходил в мир, работает в одиночной игре как надо.

Да, я знаю что я в onBlockActivated написал не так как надо, ну я просто набросок делал.
 
timaxa007 написал(а):
Отправкой пакета с сервера по просьбе клиента.
[merge_posts_bbcode]Добавлено: 08.10.2015 21:21:37[/merge_posts_bbcode]

Вот что у меня получилось, конечно без Gui, но всё-же:
Код:
public class BlockTest extends Block implements ITileEntityProvider {

    public BlockTest(String tag) {
        super(Material.wood);
        setCreativeTab(CreativeTabs.tabBlock);
    }

    public void onBlockHarvested(World world, int x, int y, int z, int meta, EntityPlayer player) {

    }

    @Override
    public TileEntity createNewTileEntity(World world, int meta) {
        return new TileEntityTest();
    }

    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        if (player.isSneaking()) return false;
        TileEntityTest tile = (TileEntityTest)world.getTileEntity(x, y, z);
        if (tile != null) {
            ItemStack is = player.getCurrentEquippedItem();
            if (is != null) {
                if (is.getItem() == Items.water_bucket) {
                    if (tile.tank.getFluid() != null && tile.tank.getFluid().getFluid().equals(FluidRegistry.WATER)) 
                        tile.tank.setFluid(new FluidStack(FluidRegistry.WATER, tile.tank.getFluid().amount + 1000));
                    else if (tile.tank.getFluid() == null)
                        tile.tank.setFluid(new FluidStack(FluidRegistry.WATER, 1000));
                }
                if (is.getItem() == Items.lava_bucket) {
                    if (tile.tank.getFluid() != null && tile.tank.getFluid().getFluid().equals(FluidRegistry.LAVA)) 
                        tile.tank.setFluid(new FluidStack(FluidRegistry.LAVA, tile.tank.getFluid().amount + 1000));
                    else if (tile.tank.getFluid() == null)
                        tile.tank.setFluid(new FluidStack(FluidRegistry.LAVA, 1000));
                }
            } else {
                if (tile.tank.getInfo() != null && tile.tank.getInfo().fluid != null)
                    if (world.isRemote) player.addChatMessage(new ChatComponentText("Fluid: " + tile.tank.getInfo().fluid.getLocalizedName() + ", Capacity:" + tile.tank.getInfo().fluid.amount + ""));
            }
            return true;
        }
        return onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ);
    }

}
Код:
public class TileEntityTest extends TileEntity {

    public FluidTank tank;
    private int capacity;

    public TileEntityTest() {
        capacity = 5000;
        tank = new FluidTank(capacity);
    }

    @Override
    public void readFromNBT(NBTTagCompound nbt) {
        super.readFromNBT(nbt);
        tank.readFromNBT(nbt);
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        super.writeToNBT(nbt);
        tank.writeToNBT(nbt);
    }

    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    }

}
Проверил и пере-заходил в мир, работает в одиночной игре как надо.

Да, я знаю что я в onBlockActivated написал  не так как надо, ну я просто набросок делал.
Спасибо. Как сделаю мультиблочную структуру, так и займусь всеми тайлами.
 
Так! А способ попроще есть? Ну или менее громоздкий? Это проверка мультиблока.
Код:
private static boolean checkNorth(World world, int x, int y, int z){
        Block a = Blocks.air;
        Block b = Blocks.stone;
        if(world.getBlock(x+0, y+0, z+-1) == a){
            if(world.getBlock(x+0, y+0, z+-2) == a){
                if(world.getBlock(x+0, y+1, z+0) == a){
                    if(world.getBlock(x+0, y+1, z+-1) == a){
                        if(world.getBlock(x+0, y+1, z+-2) == a){
                            if(world.getBlock(x+0, y+2, z+0) == a){
                                if(world.getBlock(x+0, y+2, z+-1) == a){
                                    if(world.getBlock(x+0, y+2, z+-2) == a){
                                        if(world.getBlock(x+1, y+0, z+0) == a){
                                            if(world.getBlock(x+1, y+0, z+-1) == b){
                                                if(world.getBlock(x+1, y+0, z+-2) == a){
                                                    if(world.getBlock(x+1, y+1, z+0) == a){
                                                        if(world.getBlock(x+1, y+1, z+-1) == a){
                                                            if(world.getBlock(x+1, y+1, z+-2) == a){
                                                                if(world.getBlock(x+1, y+2, z+0) == a){
                                                                    if(world.getBlock(x+1, y+2, z+-1) == a){
                                                                        if(world.getBlock(x+1, y+2, z+-2) == a){
                                                                            if(world.getBlock(x+2, y+0, z+0) == a){
                                                                                if(world.getBlock(x+2, y+0, z+-1) == a){
                                                                                    if(world.getBlock(x+2, y+0, z+-2) == a){
                                                                                        if(world.getBlock(x+2, y+1, z+0) == a){
                                                                                            if(world.getBlock(x+2, y+1, z+-1) == a){
                                                                                                if(world.getBlock(x+2, y+1, z+-2) == a){
                                                                                                    if(world.getBlock(x+2, y+2, z+0) == a){
                                                                                                        if(world.getBlock(x+2, y+2, z+-1) == a){
                                                                                                            if(world.getBlock(x+2, y+2, z+-2) == a){
                                                                                                                return true;
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        return false;
        }
 
Извини, не читал весь пост целиком, наткнулся только на последнее сообщение, поэтому могу высказаться не по теме...
Не проще ли циклом решить проверку мультиблока?
От и до... Если каждый из перечисленных равен а, то ...
И так далее.
Спасибо за внимание.
 
Asd1995sse, а так проще?
Код:
    private static boolean checkNorth(World world, int x, int y, int z){
        Block a = Blocks.air;
        Block b = Blocks.stone;
        int count = 0;
        for (int x2 = x - 2; x < x + 2; ++x2) {
            for (int y2 = y - 2; y < y + 2; ++y2) {
                for (int z2 = z - 2; z < z + 2; ++z2) {
                    if (x2 == 1 && y2 == 0 && z2 == -1 && world.getBlock(x2, y2, z2) == b) {
                        ++count;
                    } else if (world.getBlock(x2, y2, z2) == a) {
                        ++count;
                    }
                }
            }
        }
        return count == (5 * 5 * 5);
    }
 
есть прога для генерации кода для мультиблоков.Я делал тему но ее удалили
 
XuPuPG написал(а):
есть прога для генерации кода для мультиблоков.Я делал тему но ее удалили
Minecraft modding development ? Если да, то код от неё я и представил...
 
Ковыряй Rail Craft
 
А что ему нужно?
Там есть мультиблоки.
При ломание жидкость сохраняется
 
Назад
Сверху