Хранение данных в блоке

Версия Minecraft
1.7.10
API
Forge

dxAugust

Живёт в подвале
135
2
8
Возник вопрос о хранении данных в блоке, например ник последнего игрока который по нему ударил
 
Решение
Данные хранят не в Block, а в TileEntity, конкретно в NBT, если понимаешь что это. Ну и вот пример того, что ты написал:
Block:
    @Override // Необходимо расширить интерфейс ITileEntityProvider
    public TileEntity createNewTileEntity(World world, int meta) {
        return new TileExample(); // Возвращаем наш тайл, чтобы игра понимала, какой необходимо создать
    }

    @Override // Действие при клике на блок
    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
        TileEntity tile = world.getTileEntity(x, y, z); // Получаем TileEntity по заданным координатам
        if (tile == null) // Проверяем, что не было возвращено null
            return;

        TileExample example = (TileExample) tile; //...
Данные хранят не в Block, а в TileEntity, конкретно в NBT, если понимаешь что это. Ну и вот пример того, что ты написал:
Block:
    @Override // Необходимо расширить интерфейс ITileEntityProvider
    public TileEntity createNewTileEntity(World world, int meta) {
        return new TileExample(); // Возвращаем наш тайл, чтобы игра понимала, какой необходимо создать
    }

    @Override // Действие при клике на блок
    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
        TileEntity tile = world.getTileEntity(x, y, z); // Получаем TileEntity по заданным координатам
        if (tile == null) // Проверяем, что не было возвращено null
            return;

        TileExample example = (TileExample) tile; // Делаем каст от TileEntity к нашему TileEntityExample
        example.nickname = player.getCommandSenderName(); // Устанавливаем значение переменной nickname на никнейм игрока
    }

TileEntity:
public class TileExample extends TileEntity {
    public String nickname = ""; // Кешируем значение Nickname

    @Override // Записываем данные в NBT. Делаем это только на сервере
    public void writeToNBT(NBTTagCompound nbt) {
        if (getWorldObj().isRemote)
            return;

        nbt.setString("LastClickNickname", nickname);
    }

    @Override // Считываем данные с NBT
    public void readFromNBT(NBTTagCompound nbt) {
        nickname = nbt.getString("LastClickNickname");
    }

    @Override // Записываем NBT в пакет, который следом полетит на клиент
    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        this.writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    @Override // Делаем так, чтобы наш тайл не тикал, убираем линию нагрузку
    public boolean canUpdate() {
        return false;
    }

    @Override // Считываем данные с пакета, которые записали в методе getDescriptionPacket
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
        this.readFromNBT(pkt.func_148857_g());
    }
}

PS Блок должен расширять интерфейс ITileEntityProvider
 
Последнее редактирование:
Назад
Сверху