JMCCC

Gitter Build Status
A powerful open-source library for launching and downloading Minecraft.

License

JMCCC is licensed under the MIT license.

Features

Quick Start

Dependencies

Dependency Description
org.to2mbn:jmccc Minecraft launching feature.
org.to2mbn:jmccc-yggdrasil-authenticator Yggdrasil authentication feature.
org.to2mbn:jmccc-mcdownloader Minecraft downloading feature.
org.to2mbn:jmccc-mojang-api Mojang API client.

The snapshot repository:

<repository>
    <id>ossrh</id>
    <url>https://oss.sonatype.org/content/groups/public/</url>
    <snapshots>
        <enabled>true</enabled>
    </snapshots>
</repository>

Launching Minecraft

MinecraftDirectory dir = new MinecraftDirectory("/home/user/.minecraft");
Launcher launcher = LauncherBuilder.buildDefault();
launcher.launch(new LaunchOption("1.10", YggdrasilAuthenticator.password("<email>", "<password>"), dir));

You can replace YggdrasilAuthenticator.password("<email>", "<password>") with new OfflineAuthenticator("<username>") if you want to use offline authentication.

Downloading Minecraft

MinecraftDirectory dir = new MinecraftDirectory("/home/user/.minecraft");
MinecraftDownloader downloader = MinecraftDownloaderBuilder.buildDefault();
downloader.downloadIncrementally(dir, "1.10", new CallbackAdapter<Version>() {

    @Override
    public void failed(Throwable e) {
        // when the task fails
    }

    @Override
    public void done(Version result) {
        // when the task finishes
    }

    @Override
    public void cancelled() {
        // when the task cancels
    }

    @Override
    public <R> DownloadCallback<R> taskStart(DownloadTask<R> task) {
        // when a new sub download task starts
        // return a DownloadCallback to listen the status of the task
        return new CallbackAdapter<R>() {

            @Override
            public void done(R result) {
                // when the sub download task finishes
            }

            @Override
            public void failed(Throwable e) {
                // when the sub download task fails
            }

            @Override
            public void cancelled() {
                // when the sub download task cancels
            }

            @Override
            public void updateProgress(long done, long total) {
                // when the progress of the sub download task has updated
            }

            @Override
            public void retry(Throwable e, int current, int max) {
                // when the sub download task fails, and the downloader decides to retry the task
                // in this case, failed() won't be called
            }
        };
    }
});

You can pass a null callback if you don't want to monitor the whole task. You can also return null in taskStart() if you don't want to monitor sub tasks.

Don't forget to shutdown the downloader when you are no longer going to use it.

downloader.shutdown();

Downloading Forge/Liteloader

MinecraftDirectory dir = new MinecraftDirectory("/home/user/.minecraft");
ForgeDownloadProvider forgeProvider = new ForgeDownloadProvider();
LiteloaderDownloadProvider liteloaderProvider = new LiteloaderDownloadProvider();
MinecraftDownloader downloader = MinecraftDownloaderBuilder.create()
    .providerChain(DownloadProviderChain.create()
        .addProvider(forgeProvider)
        .addProvider(liteloaderProvider))
    .build();

downloader.downloadIncrementally(dir, "1.8-forge1.8-11.14.3.1514", new CallbackAdapter<Version>() {...});
downloader.downloadIncrementally(dir, "1.7.10-LiteLoader1.7.10", new CallbackAdapter<Version>() {...});
downloader.download(forgeProvider.forgeVersionList(), new CallbackAdapter<ForgeVersionList>() {...});
downloader.download(liteloaderProvider.liteloaderVersionList(), new CallbackAdapter<LiteloaderVersionList>() {...});

FML options

JMCCC won't add fml options (such as -Dfml.ignoreInvalidMinecraftCertificates=true and -Dfml.ignorePatchDiscrepancies=true) to the command line automatically. If you have problems launching forge, you may need to add these arguments manually. These arguments are already defined in class ExtraArgumentsTemplates.

option.extraJvmArguments().add(ExtraArgumentsTemplates.FML_IGNORE_INVALID_MINECRAFT_CERTIFICATES);
option.extraJvmArguments().add(ExtraArgumentsTemplates.FML_IGNORE_PATCH_DISCREPANCISE);