Как сделать динамическое создание миров Forge 1.18.2

Версия Minecraft
1.18.2
API
Forge
Я хочу создать мод, который будет позволять через команду создавать отдельный мир, а затем подключаться к нему с помощью другой команды. Как это реализовать? Я изучил много решений, но ни одно из них не подошло для этой версии.

Я смог найти как создать только один мир
 
Краш-лог
нету
Краш-лог:
нету
Проще всего посмотреть именно Исходники AdAstra

а затем подключаться к нему с помощью другой команды
!Код с 1.20+!

ну или

Java:
  private void disconnect() { // отключение игрока от текущего мира
       this.minecraft.level.disconnect();
  }


Java:
   public void joinWorld(LevelSummary summary) { // подключение к другому(может не работать / быть не стабильным, лучше чекнуть как загружается мир через WordlSelectionScreen)
        Minecraft minecraft = Minecraft.getInstance();
        if (!summary.isDisabled()) {
            minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F));
            if (minecraft.getLevelSource().levelExists(summary.getLevelId())) {
                minecraft.forceSetScreen(new GenericDirtMessageScreen(Component.translatable("selectWorld.data_read"))); // загрузочный экран
                minecraft.createWorldOpenFlows().loadLevel(new TitleScreen() /*последний экран*/, summary.getLevelId());
            }
        }
    }
 
Последнее редактирование:
На коленке делалось.

Java:
private static final Map<String, ServerLevel> worlds = new HashMap<>();


@SubscribeEvent
public static void onServerStarting(ServerStartingEvent event) {
    CommandDispatcher<CommandSourceStack> dispatcher = event.getServer().getCommands().getDispatcher();
    dispatcher.register(Commands.literal("createworld").then(Commands.argument("worldName", StringArgumentType.string()).executes(context -> createWorld(context.getSource(), StringArgumentType.getString(context, "worldName")))));
    dispatcher.register(Commands.literal("joinworld").then(Commands.argument("worldName", StringArgumentType.string()).executes(context -> joinWorld(context.getSource(), StringArgumentType.getString(context, "worldName")))));
}

private static int createWorld(CommandSourceStack source, String worldName) {
    MinecraftServer server = source.getServer();
    ServerLevel existingWorld = worlds.get(worldName);

    if (existingWorld != null) {
        source.sendSuccess(() -> new net.minecraft.network.chat.Component("Мир " + worldName + " уже существует"), false);
        return 0;
    }

    ServerLevel newWorld = server.createLevel(worldName, Level.OVERWORLD, server.getWorldData().getGenerator(), server.getWorldData().isHardcore());
    if (newWorld != null) {
        worlds.put(worldName, newWorld);
        source.sendSuccess(() -> new net.minecraft.network.chat.Component("Мир " + worldName + " создан!"), false);
        return 1;
    }
    source.sendSuccess(() -> new net.minecraft.network.chat.Component("Ошибка при создание мира " + worldName), false);
    return 0;
}

private static int joinWorld(CommandSourceStack source, String worldName) {
    ServerLevel world = worlds.get(worldName);
    if (world != null) {
        source.getPlayerOrException().changeDimension(world);
        source.sendSuccess(() -> new net.minecraft.network.chat.Component("Вход в мир " + worldName + "!"), false);
        return 1;
    }
    source.sendSuccess(() -> new net.minecraft.network.chat.Component("Мир " + worldName + " не существует"), false);
    return 0;
}
Понял, а в чем прикол менять название классов каждую версию? Или менять логику работы
Меняется api.
Это уже вопрос к моджанг)
 
Назад
Сверху