Вращения блока к лицу игрока

Версия Minecraft
1.8+
У меня есть блок с моделью
1538511618795-png.3757
Как повернуть блок при установке к игроку?
 
2,932
44
598
Смотри в исходном коде печки/сундука/верстака/ступенек/тыквы/факела/головы/таблички/картинки/кровати/рамки/рычага/кнопки/крюка/люка/поршня/раздатчика/выбрасывателя/воронки/двери/повторителя/компаратора/рельсы.
 
1,159
38
544
Я как-то изучал как майн реализует поворот блока и вот что я нашел:
1) Если блок без TileEntity:
Тут блок наследуется от BlockDirectional, а направление задается метадатой блока. Именно так это сделано с кроватью, тыквой и т.д.

2) Если блок с TileEntity
По сути, все так же - задает направление метадатой блока:
Код:
    ...

    @Override
    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack p_149689_6_) {
        //This gets the direction the player is facing as an int from 0 to 3
        int dir = MathHelper.floor_double((player.rotationYaw * 4F) / 360F + 0.5D) & 3;
        //You can use the block metadata to save the direction
        world.setBlockMetadataWithNotify(x, y, z, dir, 3);
        //Or you can save it in a tile entity if you are using one
        //createNewTileEntity(world, world.getBlockMetadata(x, y, z));
        super.onBlockPlacedBy(world, x, y, z, player, p_149689_6_);
    }

Но в TileEntity нужно определить следующие методы:
Код:
    ...  

    // TODO: Сохранять направление в NBT - нерационально. Нужно юзать метадату - http://www.minecraftforge.net/forum/topic/25239-solved1710-saving-block-direction-state/
    @Override
    public void writeToNBT(NBTTagCompound compound) {
        super.writeToNBT(compound);
        upgradeStationInventory.writeToNBT(compound);
        compound.setInteger("dir", this.blockMetadata);
    }

    @Override
    public void readFromNBT(NBTTagCompound compound) {
        super.readFromNBT(compound);
        upgradeStationInventory.readFromNBT(compound);
        this.blockMetadata = compound.getInteger("dir");

    }

    // TODO: Отказаться от хранения поворота в NBT. Это следует делать в метадате блока как в печке!
    // Синхронизирует переменные блока с блоком на клиенте
    @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound tag = new NBTTagCompound();
        writeToNBT(tag);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, tag);
    }

    // Нужно для метода выше
    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
        readFromNBT(pkt.func_148857_g());
    }

    // http://cazzar.net/tutorials/minecraft/Tile-Entity-Updates-The-Quick-and-Dirty-Method/
    public void markForUpdate() {
        worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
    }

Вотъ тебе пример. Там и рендер obj (как блока, так и итема в руке), TileEntity, сам блок... Надеюсь, это поможет.

PS: И пусть тебя не смущают мои тудухи. Сохранять метадату в TileEntity - это норм (я думаю)
 
Последнее редактирование:
1,159
38
544
Метадата и так синхронится с клиентом, нахрена ее еще хранить в тайле?
Я вот тоже сам сомневаюсь, нужно ли хранить ее в тайле. Но если этого не делать - мой блок не запоминает направление после рестарта мира.
 
Сверху