Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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
 
Если задача иметь максимально оптимизированный хаб, то это тебе нужно Minestom использовать.

Если всё-таки хочешь под Paper делать, то несколько замечаний по коду:
Код:
if (world.getName() == "world" || world.getName() == "source")
Так это работать не будет. В джаве сравнение строк через equals

Код:
          for (Chunk chunk : world.getLoadedChunks()) {
              chunk.unload(false);
          }
Вот это делать смысла нет. Если чанки не используются - ядро само выгрузит их. А если используются, то ты их и не выгрузишь через апи.

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

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

Если всё-таки хочешь под Paper делать, то несколько замечаний по коду:

Так это работать не будет. В джаве сравнение строк через equals


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


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

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

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

И ещё: есть ли способ остановить просчёт мира? Чтобы песок не падал, вода не растекалась и т.д.
 
Меня больше интересует вопрос, нужно ли создовать несколько миров или можно сделать всё в одном?
Зависит от задачи.

есть ли способ остановить просчёт мира? Чтобы песок не падал, вода не растекалась и т.д.
Просчёт отменить нельзя, но можно отменять событие обновления физики BlockPhysicsEvent
 

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

Назад
Верх