Помогите Как хранить и юзать кастомные блоки

Energy warrior

Активный участник
Пользователь
Баллы
76
У меня есть класс с кастомным блоком и когда я на него нажимаю что-то должно происходить. Так как я не знаю толком баккита то мне пришлось отличать его от обычного с помощью проверок. Я захотел дабы не создавать ненужные файлы, хранить данные о блоке в самом блоке. То есть у меня есть предмет с НБТ и я проверяю есть ли он там. Если есть то на поставленный блок добавляю метадату и по не проверяю, но чёт плохо робит да и выглядит не очень. Я бы всё таки хотел просто имплементировать интерфейс и просто инстансофить его. Можно ли такое сделать? Если да то как? Если нет то что мне делать?
 
Сори за ап! Я покопался но не могу понять. Как мне сохранить базу данных в файл, где базу хранить, какую выбрать?
 
Сори за ап! Я покопался но не могу понять. Как мне сохранить базу данных в файл, где базу хранить, какую выбрать?
Много блоков - MySQL/H2 [Async]

Нету MySQL/H2 - SQLite

Не хочешь юзать БД/Мало блоков - JSON
 
Терпеть не могу качать лишние файлы на сервер, можно ли как-нибудь загрузить файлы итилиты в проект?
Вот забирай https://github.com/alexandrage/ChunkConfig/tree/master/src/ru/minecraft
Это майнкравтовский jnbt, ток отремапленый форжем и перепакован в другой пакет.
 
Спустя некоторое время я разобрался как эта штука работает, даже сделал свой дабларэй таг. Но есть она проблема! Когда я ломаю блок, у меня файл не удаляется методом delete(). Потоки пробовал закрывать - не робит! Вручную запускал сборщик мусора - тоже не робит. Что мне делать!
Код:
public void read(String folder, String name){
        NBTTagCompound nbt = new NBTTagCompound();
        File file = new File(folder, name + ".dat");
        if (file.exists()) {
            try(FileInputStream fis = new FileInputStream(file)) {
                nbt = CompressedStreamTools.readCompressed(fis);
                System.gc();
            } catch (FileNotFoundException | NullPointerException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        for (String n : nbt.func_150296_c()) {
            locs.put(n, nbt.getTag(n));
        }
    }
Код:
public void write(String folder, String name) {
        NBTTagCompound nbt = new NBTTagCompound();
        for (Entry<String, NBTBase> loc : locs.entrySet()) {
            nbt.setTag(loc.getKey(),loc.getValue());
        }
        File file = new File(folder, name + ".dat");
        try (FileOutputStream fos = new FileOutputStream(file)){
            CompressedStreamTools.writeCompressed(nbt, fos);
            System.gc();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Код:
public void delete(Location loc){
        synchronized (this){
            int x = loc.getBlockX();
            int z = loc.getBlockZ();
            int y = loc.getBlockY();
            String s = x + "." + y + "."+z;
            File file = new File(plugin.getDataFolder().getAbsolutePath(), s);
            file.deleteOnExit();
        }
    }
 
Сломал мою чанковую бд в пользу монофайла. И что будешь делать, когда оно станет весить овергиг? Не задумывался почему файлы регионов разбиты по кускам?
 
Сломал мою чанковую бд в пользу монофайла. И что будешь делать, когда оно станет весить овергиг? Не задумывался почему файлы регионов разбиты по кускам?
Не волнуйся, я обратно в чанки запихну, но модифицирую для хранения даты о блоках. Так что по поводу удаления файлов!
UPD: Я немного поэкспериментировал и выяснил, что оказывается он не может найти файл! Хотя я ищу его таким же способом, как и метод getChunk! Что я сделал не так?

Код:
public boolean deleteIfEmpty(Location location){
        synchronized (this) {
            BlockTag bt = getChunk(location);
            int ChunkX = location.getBlockX() >> 4;
            int ChunkZ = location.getBlockZ() >> 4;
            String s = ChunkX + "." + ChunkZ;
            send("work");
            System.out.println(save.get(s).toString());
            if (bt.isEmpty()) {
                send("empty");
                File file = new File(plugin.getDataFolder().getAbsolutePath(), s);
                if (file.exists()) {
                    send("exists");
                    if (file.delete()) {
                        send("File has been deleted");
                        return true;
                    } else {
                        send("File hasn't been deleted 'cause something gone wrong!");
                        return false;
                    }
                } else {
                    send("not exists");
                }
            }
        }
        return false;
    }
Код:
    private BlockTag getChunk(Location loc) {
        int ChunkX = loc.getBlockX() >> 4;
        int ChunkZ = loc.getBlockZ() >> 4;
        String s = ChunkX + "." + ChunkZ;
        if (save.containsKey(s)) {
            return save.get(s);
        } else {
            BlockTag data = new BlockTag();
            data.read(this.plugin.getDataFolder().getAbsolutePath(), s);
            save.put(s, data);
            return save.get(s);
        }
    }
UPD2: Файл он не мог найти из-за того что я не указал расширение.
 
Последнее редактирование:
Я не могу понять зачем ты тут сделал так?
Код:
                int ChunkX = loc.getBlockX() >> 4;
        int ChunkZ = loc.getBlockZ() >> 4;
        String s = ChunkX + "." + ChunkZ;
Код:
private String convert(Location loc) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        int tmpx = x >> 4;
        int tmpx2 = tmpx << 4;
        int tmpz = z >> 4;
        int tmpz2 = tmpz << 4;
        return (x - tmpx2) + "." + y + "." + (z - tmpz2);
    }
Если первое более-менее понятно, то вот второе не очень! Чем тебе обычная обычная локация не угодила?
 
Я не могу понять зачем ты тут сделал так?
Код:
                int ChunkX = loc.getBlockX() >> 4;
        int ChunkZ = loc.getBlockZ() >> 4;
        String s = ChunkX + "." + ChunkZ;
Код:
private String convert(Location loc) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        int tmpx = x >> 4;
        int tmpx2 = tmpx << 4;
        int tmpz = z >> 4;
        int tmpz2 = tmpz << 4;
        return (x - tmpx2) + "." + y + "." + (z - tmpz2);
    }
Если первое более-менее понятно, то вот второе не очень! Чем тебе обычная обычная локация не угодила?
Обычная упаковка координат в чанк, чего тут понимать то.
 
Последнее редактирование:
Сказало же упаковываю размер, потом обратно.
А чем обычные корды не угодили, зачем ты упаковываешь? Извини, конечно, за тупые вопросы, но я не улавливаю твою логику!
 
А чем обычные корды не угодили, зачем ты упаковываешь? Извини, конечно, за тупые вопросы, но я не улавливаю твою логику!
Чтоб файл меньше весил. Упаковку я улучшил до 3х символов и удаление файла дописал, когда пусто. https://github.com/alexandrage/ChunkConfig/blob/master/src/cfg/BlockTag.java
 
Назад
Верх