Вопрос Как прогружать чанки вечно

Версия Minecraft
1.16.X

ProGiple

Пользователь
Сообщения
103
Решения
3
Привет, форумчане! У меня есть цель сделать плагин на прогрузку некоторых чанков на постоянной основне, написал такой код:
Java:
public class UnloadChunkHandler implements Listener {
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onChunkUnload(ChunkUnloadEvent e) {
        final Chunk currentChunk = e.getChunk();
        World world = currentChunk.getWorld();

        int x = currentChunk.getX();
        int z = currentChunk.getZ();

        System.out.println("cX: " + x);
        System.out.println("cZ: " + z);
        if (ChunkLoaderManager.getChunkLoaders().stream().anyMatch(cl ->
                cl.getLoadableChunks().stream().anyMatch(c -> {
                    System.out.println("x " + c.getX());
                    System.out.println("z " + c.getZ());
                    return c.getX() == x && c.getZ() == z;
                }))) {
            System.out.println(currentChunk);

            world.loadChunk(x, z);
            world.loadChunk(x, z, true);
        }
    }
}

Я вывожу в консоль некоторые переменные, прогружаю и выгружаю чанки, бегая по миру, но в консоле выводятся только координаты тех чанков, которые не находятся в списке прогруженных, хотя и культуры на них и не растут когда игрока нет рядом. Буду благодарен вашей помощи!
 
Привет, форумчане! У меня есть цель сделать плагин на прогрузку некоторых чанков на постоянной основне, написал такой код:
Java:
public class UnloadChunkHandler implements Listener {
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onChunkUnload(ChunkUnloadEvent e) {
        final Chunk currentChunk = e.getChunk();
        World world = currentChunk.getWorld();

        int x = currentChunk.getX();
        int z = currentChunk.getZ();

        System.out.println("cX: " + x);
        System.out.println("cZ: " + z);
        if (ChunkLoaderManager.getChunkLoaders().stream().anyMatch(cl ->
                cl.getLoadableChunks().stream().anyMatch(c -> {
                    System.out.println("x " + c.getX());
                    System.out.println("z " + c.getZ());
                    return c.getX() == x && c.getZ() == z;
                }))) {
            System.out.println(currentChunk);

            world.loadChunk(x, z);
            world.loadChunk(x, z, true);
        }
    }
}

Я вывожу в консоль некоторые переменные, прогружаю и выгружаю чанки, бегая по миру, но в консоле выводятся только координаты тех чанков, которые не находятся в списке прогруженных, хотя и культуры на них и не растут когда игрока нет рядом. Буду благодарен вашей помощи!
Насколько знаю, Spigot не имеет API для загрузчиков чанков вообще. Максимум, что ты можешь сделать - держать его в оперативке, но "не тикать"
Используй Forge/Fabric, там это есть

Или патчи ядро и добавляй необходимое API
 
Максимум, что ты можешь сделать - держать его в оперативке
Paper удерживает чанк на уровне  ENTITY_TICKING, если используется addPluginChunkTicket

подробнее можно тут почитать:
 
Paper удерживает чанк на уровне  ENTITY_TICKING, если используется addPluginChunkTicket
Тикет именно это и делает, заставляет чанк тикать и не даёт его отгружать
Сущности и блоки тикают по разным, ничем не связанным алгоритмам.

подробнее можно тут почитать:
Тут нет ни единого упоминания про блоки

Повторяю еще раз.
Максимум, что ты можешь сделать - держать его в оперативке, но "не тикать"
Сущности, к-е находятся в чанке никак не связаны с тем, должен ли сам чанк и находящиеся в нем блоки "тикать"

У Forge так же есть аналогичная система "тикетов"
Различие лишь в том, что чанки в тикетах, гарантированно будут "тикнуты" вне зависимости от расстояния до игрока
 
Последнее редактирование:
Сущности и блоки тикают по разным, ничем не связанным алгоритмам.
Да, но их включение определяется одним параметром LoadLevel


Сущности, к-е находятся в чанке никак не связаны с тем, должен ли сам чанк и находящиеся в нем блоки "тикать"
Описание ENTITY_TICKING в Javadoc: "All game logic is processed." - значит должны тикать и блоки, и сущности
 
Описание ENTITY_TICKING в Javadoc: "All game logic is processed." - значит должны тикать и блоки, и сущности
Кхх ладно, однако я на 99.5% уверен, что не включает отключенных рандом-тиков "самой ванилой"

Так или иначе - написать код и проверить как это работает на самом деле - дело 30 минут

Если это действительно решает задачу, то все Окей и можно помечать решение
Иначе - я уже указал альтернативное решение и так же можно помечать решение
 
Кхх ладно, однако я на 99.5% уверен, что не включает отключенных рандом-тиков "самой ванилой"

Так или иначе - написать код и проверить как это работает на самом деле - дело 30 минут

Если это действительно решает задачу, то все Окей и можно помечать решение
Иначе - я уже указал альтернативное решение и так же можно помечать решение
Да, именно так, после подключения данного метода - ничего не поменялось
 
Да, именно так, после подключения данного метода - ничего не поменялось
Только патчить ядро
Если лень - можешь накостылить тупо откомпилив нужный класс и заменив принудительно

Ты быстро найдешь то место где тикаются чанки
просто ища использования randomTickSpeed

Модифицируй коллекцию, по которой будет идти итерация чанков, к-ые надо тикнуть и все

Могу собственно и сам выпустить патч, но мои услуги на это начинаются от 5к
 
Назад
Сверху Снизу