1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как сделать Хаб для сервера?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Copter533, 14 апр 2024.

  1. Автор темы
    Copter533

    Copter533 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Copter533
    Как сделать плагин для сервера хаба так, чтобы на него была минимальная возможная нагрузка (отключить все прощёты мира, оставить только обработку игроков).

    То что я пока успел придумать (не судите строго, я последний раз за плагины брался полгода назад):

    Код:
    public final class Hub extends JavaPlugin implements Listener {
    
       public static Hub instance;
    
       @Override
       public void onEnable() {
           System.out.println("Hub working!");
           getServer().getPluginManager().registerEvents(this, this);
    
           System.out.println(Bukkit.getWorld("source"));
    
           for (World world : getServer().getWorlds()) {
               if (world.getName() == "world" || world.getName() == "source") { // "source" - мир в котором будет карта хаба, все остальные миры - просто отдельные под лобби
                   System.out.printf("Skipping world \"%s\"\n", world.getName()); continue;
               }
               System.out.printf("Optimizing world \"%s\" ... ", world.getName());
               world.setKeepSpawnInMemory(false);
               world.setGameRule(GameRule.RANDOM_TICK_SPEED,0);
               world.setGameRule(GameRule.DO_DAYLIGHT_CYCLE,false);
               world.setGameRule(GameRule.DO_WEATHER_CYCLE,false);
    
               world.setGameRule(GameRule.DO_MOB_SPAWNING,false);
               world.setGameRule(GameRule.DO_MOB_LOOT,false);
               world.setGameRule(GameRule.MOB_GRIEFING,false);
    
               for (Chunk chunk : world.getLoadedChunks()) {
                   chunk.unload(false);
               }
               // world.chunk Тут надо как-то генератор поставить
    
               world.setNoTickViewDistance(2);
               world.setViewDistance(2);
    
    
               System.out.println("DONE");
           }
    
           instance = this;
       }
    
       @EventHandler
       public void onPlayerMessage(AsyncChatEvent event) {
           event.setCancelled(true);
           Player player = event.getPlayer();
           Bukkit.broadcast(
               Component.text("[ХАБ] ").color(TextColor.color(0xFF3E)).append(
               Component.text(player.getName()).color(TextColor.color(0xFFCF10)).append(
               Component.text(" » ").color(TextColor.color(0x333333)).append(
               event.message().color(TextColor.color(0xffffff))
           ))).hoverEvent(HoverEvent.showText(
               Component.text("Лобби номер ").color(TextColor.color(0xffffff)).append(
               Component.text("#???").color(TextColor.color(0xFF3E))
           ))));
       }
    }
    
    Код:
    Код:
    public class CustomChunkGenerator extends ChunkGenerator {
       private final ChunkData emptyChunk;
    
       public CustomChunkGenerator(String source) {
           World world = Hub.instance.getServer().createWorld(new WorldCreator(source));
           assert world != null;
    
           emptyChunk = super.createChunkData(world);
           emptyChunk.setRegion(0, 0, 0, 16, world.getMaxHeight(), 16, Material.AIR);
       }
    
       @Override
       public @NotNull ChunkData createVanillaChunkData(@NotNull World world, int x, int z) {
           if (x == 0 && z == 0) {
               return super.createVanillaChunkData(world, x, z);
               // Для теста взят нулевой чанк мира и генерация ванилы,
               // в будущем здесь будет браться чанк из источника (мира "source") на соответствующих коордах
           } else {
               return emptyChunk;
           }
       }
    }
    

    Версия игры - 1.16.5
     
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если задача иметь максимально оптимизированный хаб, то это тебе нужно Minestom использовать.

    Если всё-таки хочешь под Paper делать, то несколько замечаний по коду:
    Так это работать не будет. В джаве сравнение строк через equals

    Вот это делать смысла нет. Если чанки не используются - ядро само выгрузит их. А если используются, то ты их и не выгрузишь через апи.

    Уже загруженному в память миру ты никак не изменишь генератор.
    Можно пойти двумя путями:
    1) Загружать мир в оперативку самостоятельно методом Bukkit#createWorld()
    2) Заставить администраторов серверов указывать ссылку на твой плагин в параметрах генератора в конфиг загрузчиков мира (MultiVerse/MultiWorld и других). Так сделано, например, в EmptyWorldGenerator

    Но, честно говоря, не знаю, для чего ты пишешь собственный плагин на генерацию пустых чанков, если это уже чуть ли не из коробки делается параметрами генератора. А если не делается, то существуют как раз EmptyWorldGenerator, VoidGen и прочие
     
  3. Автор темы
    Copter533

    Copter533 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Copter533
    Я хочу написать не генератор пустых чанков: чанки, в которых есть куски карты (из мира source) будут с кусками карты, а остальные пустыми.

    Меня больше интересует вопрос, нужно ли создовать несколько миров или можно сделать всё в одном?

    И ещё: есть ли способ остановить просчёт мира? Чтобы песок не падал, вода не растекалась и т.д.
     
  4. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Зависит от задачи.

    Просчёт отменить нельзя, но можно отменять событие обновления физики BlockPhysicsEvent
     
  5. Автор темы
    Copter533

    Copter533 Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Copter533
    Спасибо
     

Поделиться этой страницей