diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 9e7553d9a3..331b5e472b 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -9,7 +9,7 @@ body: value: | 提交前请确认: * 该问题确实是 **HMCL 的错误**,而**不是 Minecraft 非正常退出**,如果你的 Minecraft 非正常退出,请前往 [QQ 群](https://docs.hmcl.net/groups.html)/[Discord 频道](https://discord.gg/jVvC7HfM6U) 中获取帮助。 - * 你的启动器版本是**最新的快照版本**,可以点击 [此处](https://github.com/burningtnt/HMCL-Snapshot-Update/raw/master/datas/HMCL-dev.jar) 下载最新快照版本。 + * 你的启动器版本是**最新的快照版本**,可以点击 [此处](https://zkitefly.github.io/HMCL-Snapshot-Update/) 下载最新快照版本。 如果你的问题并不属于上述两类,你可以选取另一种 Issue 类型,或者直接前往 [QQ 群](https://docs.hmcl.net/groups.html)/[Discord 频道](https://discord.gg/jVvC7HfM6U) 中获取帮助。 diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 960a983660..33fc9ed4ca 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -241,7 +241,7 @@ public void onStop(boolean success, TaskExecutor executor) { launchingStepsPane.fireEvent(new DialogCloseEvent()); if (!success) { Exception ex = executor.getException(); - if (!(ex instanceof CancellationException)) { + if (ex != null && !(ex instanceof CancellationException)) { String message; if (ex instanceof ModpackCompletionException) { if (ex.getCause() instanceof FileNotFoundException) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index c96b56cfa4..6223c6da8f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -54,17 +54,19 @@ import static org.jackhuang.hmcl.ui.FXUtils.onInvalidating; import static org.jackhuang.hmcl.util.Lang.immutableListOf; import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author huangyuhui */ public final class Accounts { - private Accounts() {} + private Accounts() { + } private static final AuthlibInjectorArtifactProvider AUTHLIB_INJECTOR_DOWNLOADER = createAuthlibInjectorArtifactProvider(); + private static void triggerAuthlibInjectorUpdateCheck() { if (AUTHLIB_INJECTOR_DOWNLOADER instanceof AuthlibInjectorDownloader) { Schedulers.io().execute(() -> { @@ -87,6 +89,7 @@ private static void triggerAuthlibInjectorUpdateCheck() { // ==== login type / account factory mapping ==== private static final Map> type2factory = new HashMap<>(); private static final Map, String> factory2type = new HashMap<>(); + static { type2factory.put("offline", FACTORY_OFFLINE); type2factory.put("authlibInjector", FACTORY_AUTHLIB_INJECTOR); @@ -130,7 +133,7 @@ else if (account instanceof MicrosoftAccount) private static final String GLOBAL_PREFIX = "$GLOBAL:"; private static final ObservableList> globalAccountStorages = FXCollections.observableArrayList(); - private static final ObservableList accounts = observableArrayList(account -> new Observable[] { account }); + private static final ObservableList accounts = observableArrayList(account -> new Observable[]{account}); private static final ObjectProperty selectedAccount = new SimpleObjectProperty<>(Accounts.class, "selectedAccount"); /** @@ -465,6 +468,8 @@ public static String localizeErrorMessage(Exception exception) { } else { return i18n("account.methods.microsoft.error.unknown", errorCode); } + } else if (exception instanceof MicrosoftService.XBox400Exception) { + return i18n("account.methods.microsoft.error.wrong_verify_method"); } else if (exception instanceof MicrosoftService.NoMinecraftJavaEditionProfileException) { return i18n("account.methods.microsoft.error.no_character"); } else if (exception instanceof MicrosoftService.NoXuiException) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java index a37f0cef2b..076c284611 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Theme.java @@ -148,7 +148,10 @@ public Color getForegroundColor() { public String[] getStylesheets(String overrideFontFamily) { String css = "/assets/css/blue.css"; - String fontFamily = System.getProperty("hmcl.font.override", overrideFontFamily); + String fontFamily = overrideFontFamily == null + ? System.getProperty("hmcl.font.override", System.getenv("HMCL_FONT")) + : overrideFontFamily; + String fontStyle = null; if (fontFamily == null) { Optional font = tryLoadFont(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 327d17a308..50ec8535a2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -337,7 +337,7 @@ private final class View extends VBox { TwoLineListItem version = new TwoLineListItem(); version.getStyleClass().setAll("two-line-item-second-large"); - version.setTitle(i18n("archive.game_version")); + version.setTitle(i18n("game.version")); version.setSubtitle(GameCrashWindow.this.version.getId()); TwoLineListItem total_memory = new TwoLineListItem(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index b6cf2a2de9..d622fe9c0b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -18,9 +18,10 @@ package org.jackhuang.hmcl.ui; import com.jfoenix.controls.JFXButton; -import javafx.beans.InvalidationListener; +import javafx.beans.Observable; import javafx.beans.binding.Bindings; -import javafx.beans.property.*; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.css.PseudoClass; import javafx.event.EventHandler; import javafx.geometry.Insets; @@ -55,29 +56,77 @@ public class InstallerItem extends Control { private final String id; private final VersionIconType iconType; - public final StringProperty libraryVersion = new SimpleStringProperty(); - public final StringProperty incompatibleLibraryName = new SimpleStringProperty(); - public final StringProperty dependencyName = new SimpleStringProperty(); - public final BooleanProperty incompatibleWithGame = new SimpleBooleanProperty(); - public final BooleanProperty removable = new SimpleBooleanProperty(); - public final BooleanProperty upgradable = new SimpleBooleanProperty(false); - public final BooleanProperty installable = new SimpleBooleanProperty(true); - public final ObjectProperty> removeAction = new SimpleObjectProperty<>(); - public final ObjectProperty> action = new SimpleObjectProperty<>(); - - private Style style = Style.LIST_ITEM; + private final Style style; + private final ObjectProperty versionProperty = new SimpleObjectProperty<>(this, "version", null); + private final ObjectProperty resolvedStateProperty = new SimpleObjectProperty<>(this, "resolvedState", InstallableState.INSTANCE); + + private final ObjectProperty> installActionProperty = new SimpleObjectProperty<>(this, "installAction"); + private final ObjectProperty> removeActionProperty = new SimpleObjectProperty<>(this, "removeAction"); + + public interface State { + } + + public static final class InstallableState implements State { + public static final InstallableState INSTANCE = new InstallableState(); + + private InstallableState() { + } + } + + public static final class IncompatibleState implements State { + private final String incompatibleItemName; + private final String incompatibleItemVersion; + + public IncompatibleState(String incompatibleItemName, String incompatibleItemVersion) { + this.incompatibleItemName = incompatibleItemName; + this.incompatibleItemVersion = incompatibleItemVersion; + } + + public String getIncompatibleItemName() { + return incompatibleItemName; + } + + public String getIncompatibleItemVersion() { + return incompatibleItemVersion; + } + } + + public static final class InstalledState implements State { + private final String version; + private final boolean external; + private final boolean incompatibleWithGame; + + public InstalledState(String version, boolean external, boolean incompatibleWithGame) { + this.version = version; + this.external = external; + this.incompatibleWithGame = incompatibleWithGame; + } + + public String getVersion() { + return version; + } + + public boolean isExternal() { + return external; + } + + public boolean isIncompatibleWithGame() { + return incompatibleWithGame; + } + } public enum Style { LIST_ITEM, CARD, } - public InstallerItem(LibraryAnalyzer.LibraryType id) { - this(id.getPatchId()); + public InstallerItem(LibraryAnalyzer.LibraryType id, Style style) { + this(id.getPatchId(), style); } - public InstallerItem(String id) { + public InstallerItem(String id, Style style) { this.id = id; + this.style = style; switch (id) { case "game": @@ -109,18 +158,24 @@ public InstallerItem(String id) { } } - public void setStyleMode(Style style) { - this.style = style; + public String getLibraryId() { + return id; } - public void setState(String libraryVersion, boolean incompatibleWithGame, boolean removable) { - this.libraryVersion.set(libraryVersion); - this.incompatibleWithGame.set(incompatibleWithGame); - this.removable.set(removable); + public ObjectProperty versionProperty() { + return versionProperty; } - public String getLibraryId() { - return id; + public ObjectProperty resolvedStateProperty() { + return resolvedStateProperty; + } + + public ObjectProperty> installActionProperty() { + return installActionProperty; + } + + public ObjectProperty> removeActionProperty() { + return removeActionProperty; } @Override @@ -129,35 +184,25 @@ protected Skin createDefaultSkin() { } public final static class InstallerItemGroup { - public final InstallerItem game = new InstallerItem(MINECRAFT); - public final InstallerItem fabric = new InstallerItem(FABRIC); - public final InstallerItem fabricApi = new InstallerItem(FABRIC_API); - public final InstallerItem forge = new InstallerItem(FORGE); - public final InstallerItem neoForge = new InstallerItem(NEO_FORGE); - public final InstallerItem liteLoader = new InstallerItem(LITELOADER); - public final InstallerItem optiFine = new InstallerItem(OPTIFINE); - public final InstallerItem quilt = new InstallerItem(QUILT); - public final InstallerItem quiltApi = new InstallerItem(QUILT_API); + private final InstallerItem game; private final InstallerItem[] libraries; - private final HashMap> incompatibleMap = new HashMap<>(); - - private Set getIncompatibles(InstallerItem item) { + private Set getIncompatibles(Map> incompatibleMap, InstallerItem item) { return incompatibleMap.computeIfAbsent(item, it -> new HashSet<>()); } - private void addIncompatibles(InstallerItem item, InstallerItem... others) { - Set set = getIncompatibles(item); + private void addIncompatibles(Map> incompatibleMap, InstallerItem item, InstallerItem... others) { + Set set = getIncompatibles(incompatibleMap, item); for (InstallerItem other : others) { set.add(other); - getIncompatibles(other).add(item); + getIncompatibles(incompatibleMap, other).add(item); } } - private void mutualIncompatible(InstallerItem... items) { + private void mutualIncompatible(Map> incompatibleMap, InstallerItem... items) { for (InstallerItem item : items) { - Set set = getIncompatibles(item); + Set set = getIncompatibles(incompatibleMap, item); for (InstallerItem item2 : items) { if (item2 != item) { @@ -167,43 +212,66 @@ private void mutualIncompatible(InstallerItem... items) { } } - public InstallerItemGroup(String gameVersion) { - mutualIncompatible(forge, fabric, quilt, neoForge, liteLoader); - addIncompatibles(optiFine, fabric, quilt, neoForge); - addIncompatibles(fabricApi, forge, quiltApi, neoForge, liteLoader, optiFine); - addIncompatibles(quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine); - - InvalidationListener listener = o -> { - for (Map.Entry> entry : incompatibleMap.entrySet()) { - InstallerItem item = entry.getKey(); - - String incompatibleId = null; - for (InstallerItem other : entry.getValue()) { - if (other.libraryVersion.get() != null) { - incompatibleId = other.id; - break; + public InstallerItemGroup(String gameVersion, Style style) { + game = new InstallerItem(MINECRAFT, style); + InstallerItem fabric = new InstallerItem(FABRIC, style); + InstallerItem fabricApi = new InstallerItem(FABRIC_API, style); + InstallerItem forge = new InstallerItem(FORGE, style); + InstallerItem neoForge = new InstallerItem(NEO_FORGE, style); + InstallerItem liteLoader = new InstallerItem(LITELOADER, style); + InstallerItem optiFine = new InstallerItem(OPTIFINE, style); + InstallerItem quilt = new InstallerItem(QUILT, style); + InstallerItem quiltApi = new InstallerItem(QUILT_API, style); + + Map> incompatibleMap = new HashMap<>(); + mutualIncompatible(incompatibleMap, forge, fabric, quilt, neoForge); + addIncompatibles(incompatibleMap, liteLoader, fabric, quilt, neoForge); + addIncompatibles(incompatibleMap, optiFine, fabric, quilt, neoForge); + addIncompatibles(incompatibleMap, fabricApi, forge, quiltApi, neoForge, liteLoader, optiFine); + addIncompatibles(incompatibleMap, quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine); + + for (Map.Entry> entry : incompatibleMap.entrySet()) { + InstallerItem item = entry.getKey(); + Set incompatibleItems = entry.getValue(); + + Observable[] bindings = new Observable[incompatibleItems.size() + 1]; + bindings[0] = item.versionProperty; + int i = 1; + for (InstallerItem other : incompatibleItems) { + bindings[i++] = other.versionProperty; + } + + item.resolvedStateProperty.bind(Bindings.createObjectBinding(() -> { + InstalledState itemVersion = item.versionProperty.get(); + if (itemVersion != null) { + return itemVersion; + } + + for (InstallerItem other : incompatibleItems) { + InstalledState otherVersion = other.versionProperty.get(); + if (otherVersion != null) { + return new IncompatibleState(other.id, otherVersion.version); } } - item.incompatibleLibraryName.set(incompatibleId); - } - }; - for (InstallerItem item : incompatibleMap.keySet()) { - item.libraryVersion.addListener(listener); + return InstallableState.INSTANCE; + }, bindings)); } - fabricApi.dependencyName.bind(Bindings.createStringBinding(() -> { - if (fabric.libraryVersion.get() == null) return FABRIC.getPatchId(); - else return null; - }, fabric.libraryVersion)); + if (gameVersion != null) { + game.versionProperty.set(new InstalledState(gameVersion, false, false)); + } - quiltApi.dependencyName.bind(Bindings.createStringBinding(() -> { - if (quilt.libraryVersion.get() == null) return QUILT.getPatchId(); - else return null; - }, quilt.libraryVersion)); + InstallerItem[] all = {game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi}; + + for (InstallerItem item : all) { + if (!item.resolvedStateProperty.isBound()) { + item.resolvedStateProperty.bind(item.versionProperty); + } + } if (gameVersion == null) { - this.libraries = new InstallerItem[]{game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi}; + this.libraries = all; } else if (GameVersionNumber.compare(gameVersion, "1.13") < 0) { this.libraries = new InstallerItem[]{game, forge, liteLoader, optiFine}; } else { @@ -211,15 +279,19 @@ public InstallerItemGroup(String gameVersion) { } } + public InstallerItem getGame() { + return game; + } + public InstallerItem[] getLibraries() { return libraries; } } - public static class InstallerItemSkin extends SkinBase { - + private static final class InstallerItemSkin extends SkinBase { private static final PseudoClass LIST_ITEM = PseudoClass.getPseudoClass("list-item"); private static final PseudoClass CARD = PseudoClass.getPseudoClass("card"); + private static final WeakListenerHolder holder = new WeakListenerHolder(); InstallerItemSkin(InstallerItem control) { super(control); @@ -227,6 +299,7 @@ public static class InstallerItemSkin extends SkinBase { Pane pane; if (control.style == Style.CARD) { pane = new VBox(); + holder.add(FXUtils.onWeakChange(pane.widthProperty(), v -> FXUtils.setLimitHeight(pane, v.doubleValue() * 0.7))); } else { pane = new HBox(); } @@ -262,20 +335,25 @@ public static class InstallerItemSkin extends SkinBase { pane.getChildren().add(statusLabel); HBox.setHgrow(statusLabel, Priority.ALWAYS); statusLabel.textProperty().bind(Bindings.createStringBinding(() -> { - String incompatibleWith = control.incompatibleLibraryName.get(); - String version = control.libraryVersion.get(); - if (control.incompatibleWithGame.get()) { - return i18n("install.installer.change_version", version); - } else if (incompatibleWith != null) { - return i18n("install.installer.incompatible", i18n("install.installer." + incompatibleWith)); - } else if (version == null) { + State state = control.resolvedStateProperty.get(); + + if (state instanceof InstalledState) { + InstalledState s = (InstalledState) state; + if (s.incompatibleWithGame) { + return i18n("install.installer.change_version", s.version); + } + if (s.external) { + return i18n("install.installer.external_version", s.version); + } + return i18n("install.installer.version", s.version); + } else if (state instanceof InstallableState) { return i18n("install.installer.not_installed"); - } else if (control.id.equals(MINECRAFT.getPatchId()) || control.removable.get() || control.upgradable.get()) { - return i18n("install.installer.version", version); + } else if (state instanceof IncompatibleState) { + return i18n("install.installer.incompatible", i18n("install.installer." + ((IncompatibleState) state).incompatibleItemName)); } else { - return i18n("install.installer.external_version", version); + throw new AssertionError("Unknown state type: " + state.getClass()); } - }, control.incompatibleLibraryName, control.incompatibleWithGame, control.libraryVersion, control.installable, control.removable, control.upgradable)); + }, control.resolvedStateProperty)); BorderPane.setMargin(statusLabel, new Insets(0, 0, 0, 8)); BorderPane.setAlignment(statusLabel, Pos.CENTER_LEFT); @@ -284,31 +362,48 @@ public static class InstallerItemSkin extends SkinBase { buttonsContainer.setAlignment(Pos.CENTER); pane.getChildren().add(buttonsContainer); - JFXButton closeButton = new JFXButton(); - closeButton.setGraphic(SVG.CLOSE.createIcon(Theme.blackFill(), -1, -1)); - closeButton.getStyleClass().add("toggle-icon4"); - closeButton.visibleProperty().bind(control.removable); - closeButton.managedProperty().bind(closeButton.visibleProperty()); - closeButton.onMouseClickedProperty().bind(control.removeAction); - buttonsContainer.getChildren().add(closeButton); - - JFXButton arrowButton = new JFXButton(); - arrowButton.graphicProperty().bind(Bindings.createObjectBinding(() -> control.upgradable.get() - ? SVG.UPDATE.createIcon(Theme.blackFill(), -1, -1) - : SVG.ARROW_RIGHT.createIcon(Theme.blackFill(), -1, -1), - control.upgradable)); - arrowButton.getStyleClass().add("toggle-icon4"); - arrowButton.visibleProperty().bind(Bindings.createBooleanBinding( - () -> control.installable.get() && control.libraryVersion.get() == null && control.incompatibleLibraryName.get() == null, - control.installable, control.libraryVersion, control.incompatibleLibraryName + JFXButton removeButton = new JFXButton(); + removeButton.setGraphic(SVG.CLOSE.createIcon(Theme.blackFill(), -1, -1)); + removeButton.getStyleClass().add("toggle-icon4"); + if (control.id.equals(MINECRAFT.getPatchId())) { + removeButton.setVisible(false); + } else { + removeButton.visibleProperty().bind(Bindings.createBooleanBinding(() -> control.resolvedStateProperty.get() instanceof InstalledState, control.resolvedStateProperty)); + } + removeButton.managedProperty().bind(removeButton.visibleProperty()); + removeButton.onMouseClickedProperty().bind(control.removeActionProperty); + buttonsContainer.getChildren().add(removeButton); + + JFXButton installButton = new JFXButton(); + installButton.graphicProperty().bind(Bindings.createObjectBinding(() -> + control.resolvedStateProperty.get() instanceof InstallableState ? + SVG.ARROW_RIGHT.createIcon(Theme.blackFill(), -1, -1) : + SVG.UPDATE.createIcon(Theme.blackFill(), -1, -1), + control.resolvedStateProperty )); - arrowButton.managedProperty().bind(arrowButton.visibleProperty()); - arrowButton.onMouseClickedProperty().bind(control.action); - buttonsContainer.getChildren().add(arrowButton); + installButton.getStyleClass().add("toggle-icon4"); + installButton.visibleProperty().bind(Bindings.createBooleanBinding(() -> { + if (control.installActionProperty.get() == null) { + return false; + } + + State state = control.resolvedStateProperty.get(); + if (state instanceof InstallableState) { + return true; + } + if (state instanceof InstalledState) { + return !((InstalledState) state).external; + } + + return false; + }, control.resolvedStateProperty, control.installActionProperty)); + installButton.managedProperty().bind(installButton.visibleProperty()); + installButton.onMouseClickedProperty().bind(control.installActionProperty); + buttonsContainer.getChildren().add(installButton); - FXUtils.onChangeAndOperate(arrowButton.visibleProperty(), clickable -> { + FXUtils.onChangeAndOperate(installButton.visibleProperty(), clickable -> { if (clickable) { - container.onMouseClickedProperty().bind(control.action); + container.onMouseClickedProperty().bind(control.installActionProperty); pane.setCursor(Cursor.HAND); } else { container.onMouseClickedProperty().unbind(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index 0bbb02d654..e2b14a5986 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -33,7 +33,7 @@ import java.util.Map; import java.util.Optional; -import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; +import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.MINECRAFT; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; class AdditionalInstallersPage extends InstallersPage { @@ -59,7 +59,7 @@ public AdditionalInstallersPage(String gameVersion, Version version, WizardContr for (InstallerItem library : group.getLibraries()) { String libraryId = library.getLibraryId(); if (libraryId.equals("game")) continue; - library.removeAction.set(e -> { + library.removeActionProperty().set(e -> { controller.getSettings().put(libraryId, new UpdateInstallerWizardProvider.RemoveVersionAction(libraryId)); reload(); }); @@ -99,12 +99,12 @@ protected void reload() { if (!"game".equals(libraryId) && currentGameVersion != null && !currentGameVersion.equals(game) && getVersion(libraryId) == null && alreadyInstalled) { // For third-party libraries, if game version is being changed, and the library is not being reinstalled, // warns the user that we should update the library. - library.setState(libraryVersion, /* incompatibleWithGame */ true, /* removable */ true); + library.versionProperty().set(new InstallerItem.InstalledState(libraryVersion, false, true)); compatible = false; } else if (alreadyInstalled || getVersion(libraryId) != null) { - library.setState(libraryVersion, /* incompatibleWithGame */ false, /* removable */ true); + library.versionProperty().set(new InstallerItem.InstalledState(libraryVersion, false, false)); } else { - library.setState(/* libraryVersion */ null, /* incompatibleWithGame */ false, /* removable */ false); + library.versionProperty().set(null); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java index 6ad9798334..20a0692bd1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/DownloadPage.java @@ -69,7 +69,6 @@ public class DownloadPage extends DecoratorAnimatedPage implements DecoratorPage private final TabHeader.Tab modTab = new TabHeader.Tab<>("modTab"); private final TabHeader.Tab modpackTab = new TabHeader.Tab<>("modpackTab"); private final TabHeader.Tab resourcePackTab = new TabHeader.Tab<>("resourcePackTab"); - private final TabHeader.Tab customizationTab = new TabHeader.Tab<>("customizationTab"); private final TabHeader.Tab worldTab = new TabHeader.Tab<>("worldTab"); private final TransitionPane transitionPane = new TransitionPane(); private final DownloadNavigator versionPageNavigator = new DownloadNavigator(); @@ -80,7 +79,7 @@ public DownloadPage() { newGameTab.setNodeSupplier(loadVersionFor(() -> new VersionsPage(versionPageNavigator, i18n("install.installer.choose", i18n("install.installer.game")), "", DownloadProviders.getDownloadProvider(), "game", versionPageNavigator::onGameSelected))); modpackTab.setNodeSupplier(loadVersionFor(() -> { - ModpackDownloadListPage page = new ModpackDownloadListPage(Versions::downloadModpackImpl, false); + DownloadListPage page = HMCLLocalizedDownloadListPage.ofModPack(Versions::downloadModpackImpl, false); JFXButton installLocalModpackButton = FXUtils.newRaisedButton(i18n("install.modpack")); installLocalModpackButton.setOnAction(e -> Versions.importModpack()); @@ -88,9 +87,8 @@ public DownloadPage() { page.getActions().add(installLocalModpackButton); return page; })); - modTab.setNodeSupplier(loadVersionFor(() -> new ModDownloadListPage((profile, version, file) -> download(profile, version, file, "mods"), true))); - resourcePackTab.setNodeSupplier(loadVersionFor(() -> new ResourcePackDownloadListPage((profile, version, file) -> download(profile, version, file, "resourcepacks"), true))); - customizationTab.setNodeSupplier(loadVersionFor(() -> new DownloadListPage(CurseForgeRemoteModRepository.CUSTOMIZATIONS))); + modTab.setNodeSupplier(loadVersionFor(() -> HMCLLocalizedDownloadListPage.ofMod((profile, version, file) -> download(profile, version, file, "mods"), true))); + resourcePackTab.setNodeSupplier(loadVersionFor(() -> HMCLLocalizedDownloadListPage.ofResourcePack((profile, version, file) -> download(profile, version, file, "resourcepacks"), true))); worldTab.setNodeSupplier(loadVersionFor(() -> new DownloadListPage(CurseForgeRemoteModRepository.WORLDS))); tab = new TabHeader(newGameTab, modpackTab, modTab, resourcePackTab, worldTab); @@ -129,12 +127,6 @@ public DownloadPage() { item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(resourcePackTab)); item.setOnAction(e -> tab.select(resourcePackTab)); }) -// .addNavigationDrawerItem(item -> { -// item.setTitle(i18n("download.curseforge.customization")); -// item.setLeftGraphic(wrap(SVG::script)); -// item.activeProperty().bind(tab.getSelectionModel().selectedItemProperty().isEqualTo(customizationTab)); -// item.setOnAction(e -> selectTabIfCurseForgeAvailable(customizationTab)); -// }) .addNavigationDrawerItem(item -> { item.setTitle(i18n("world")); item.setLeftGraphic(wrap(SVG.EARTH)); @@ -170,7 +162,7 @@ private static void download(Profile profile, @Nullable String version, RemoteMo Path runDirectory = profile.getRepository().hasVersion(version) ? profile.getRepository().getRunDirectory(version).toPath() : profile.getRepository().getBaseDirectory().toPath(); - Controllers.prompt(i18n("archive.name"), (result, resolve, reject) -> { + Controllers.prompt(i18n("archive.file.name"), (result, resolve, reject) -> { if (!OperatingSystem.isNameValid(result)) { reject.accept(i18n("install.new_game.malformed")); return; @@ -212,9 +204,6 @@ private void loadVersions(Profile profile) { if (resourcePackTab.isInitialized()) { resourcePackTab.getNode().loadVersion(profile, null); } - if (customizationTab.isInitialized()) { - customizationTab.getNode().loadVersion(profile, null); - } if (worldTab.isInitialized()) { worldTab.getNode().loadVersion(profile, null); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index aa6cc4fa81..b9c8e0c338 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -54,7 +54,7 @@ public class InstallersPage extends Control implements WizardPage { public InstallersPage(WizardController controller, HMCLGameRepository repository, String gameVersion, DownloadProvider downloadProvider) { this.controller = controller; - this.group = new InstallerItem.InstallerItemGroup(gameVersion); + this.group = new InstallerItem.InstallerItemGroup(gameVersion, getInstallerItemStyle()); txtName.getValidators().addAll( new RequiredValidator(), @@ -63,33 +63,31 @@ public InstallersPage(WizardController controller, HMCLGameRepository repository installable.bind(createBooleanBinding(txtName::validate, txtName.textProperty())); txtName.setText(gameVersion); - group.game.installable.setValue(false); - - for (InstallerItem item : group.getLibraries()) { - item.setStyleMode(InstallerItem.Style.CARD); - } - for (InstallerItem library : group.getLibraries()) { String libraryId = library.getLibraryId(); if (libraryId.equals(LibraryAnalyzer.LibraryType.MINECRAFT.getPatchId())) continue; - library.action.set(e -> { + library.installActionProperty().set(e -> { if (LibraryAnalyzer.LibraryType.FABRIC_API.getPatchId().equals(libraryId)) { Controllers.dialog(i18n("install.installer.fabric-api.warning"), i18n("message.warning"), MessageDialogPane.MessageType.WARNING); } - if (library.incompatibleLibraryName.get() == null) + if (!(library.resolvedStateProperty().get() instanceof InstallerItem.IncompatibleState)) controller.onNext(new VersionsPage(controller, i18n("install.installer.choose", i18n("install.installer." + libraryId)), gameVersion, downloadProvider, libraryId, () -> controller.onPrev(false))); }); - library.removeAction.set(e -> { + library.removeActionProperty().set(e -> { controller.getSettings().remove(libraryId); reload(); }); } } + protected InstallerItem.Style getInstallerItemStyle() { + return InstallerItem.Style.CARD; + } + @Override public String getTitle() { - return i18n("install.new_game"); + return group.getGame().versionProperty().get().getVersion(); } private String getVersion(String id) { @@ -100,11 +98,9 @@ protected void reload() { for (InstallerItem library : group.getLibraries()) { String libraryId = library.getLibraryId(); if (controller.getSettings().containsKey(libraryId)) { - library.libraryVersion.set(getVersion(libraryId)); - library.removable.set(true); + library.versionProperty().set(new InstallerItem.InstalledState(getVersion(libraryId), false, false)); } else { - library.libraryVersion.set(null); - library.removable.set(false); + library.versionProperty().set(null); } } } @@ -148,7 +144,7 @@ protected InstallersPageSkin(InstallersPage control) { versionNamePane.setAlignment(Pos.CENTER_LEFT); control.txtName.setMaxWidth(300); - versionNamePane.getChildren().setAll(new Label(i18n("archive.name")), control.txtName); + versionNamePane.getChildren().setAll(new Label(i18n("version.name")), control.txtName); root.setTop(versionNamePane); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java index 0f93bd0ce0..2240b5d18f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/ModpackPage.java @@ -48,7 +48,7 @@ protected ModpackPage(WizardController controller) { BorderPane archiveNamePane = new BorderPane(); { - Label label = new Label(i18n("archive.name")); + Label label = new Label(i18n("archive.file.name")); BorderPane.setAlignment(label, Pos.CENTER_LEFT); archiveNamePane.setLeft(label); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java index 46df504b17..ceb0c9ed3c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadListPage.java @@ -43,7 +43,6 @@ import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.task.Schedulers; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.task.TaskExecutor; import org.jackhuang.hmcl.ui.Controllers; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.WeakListenerHolder; @@ -52,6 +51,7 @@ import org.jackhuang.hmcl.ui.construct.TwoLineListItem; import org.jackhuang.hmcl.ui.decorator.DecoratorPage; import org.jackhuang.hmcl.util.AggregatedObservableList; +import org.jackhuang.hmcl.util.Holder; import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.i18n.I18n; @@ -64,10 +64,10 @@ import java.util.Optional; import java.util.stream.Collectors; +import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.ui.FXUtils.stringConverter; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.javafx.ExtendedProperties.selectedItemPropertyFor; -import static org.jackhuang.hmcl.ui.FXUtils.runInFX; public class DownloadListPage extends Control implements DecoratorPage, VersionPage.VersionLoadable { protected final ReadOnlyObjectWrapper state = new ReadOnlyObjectWrapper<>(); @@ -87,7 +87,7 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP protected final ListProperty downloadSources = new SimpleListProperty<>(this, "downloadSources", FXCollections.observableArrayList()); protected final StringProperty downloadSource = new SimpleStringProperty(); private final WeakListenerHolder listenerHolder = new WeakListenerHolder(); - private TaskExecutor executor; + private int searchID = 0; protected RemoteModRepository repository; private Runnable retrySearch; @@ -163,11 +163,8 @@ public void search(String userGameVersion, RemoteModRepository.Category category setLoading(true); setFailed(false); - if (executor != null && !executor.isCancelled()) { - executor.cancel(); - } - - executor = Task.supplyAsync(() -> { + int currentSearchID = searchID = searchID + 1; + Task.supplyAsync(() -> { Profile.ProfileVersion version = this.version.get(); if (StringUtils.isBlank(version.getVersion())) { return userGameVersion; @@ -176,9 +173,11 @@ public void search(String userGameVersion, RemoteModRepository.Category category ? version.getProfile().getRepository().getGameVersion(version.getVersion()).orElse("") : ""; } - }).thenApplyAsync(gameVersion -> - repository.search(gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC) - ).whenComplete(Schedulers.javafx(), (result, exception) -> { + }).thenApplyAsync(gameVersion -> repository.search(gameVersion, category, pageOffset, 50, searchFilter, sort, RemoteModRepository.SortOrder.DESC)).whenComplete(Schedulers.javafx(), (result, exception) -> { + if (searchID != currentSearchID) { + return; + } + setLoading(false); if (exception == null) { items.setAll(result.getResults().collect(Collectors.toList())); @@ -196,7 +195,7 @@ protected String getLocalizedCategory(String category) { return i18n("curse.category." + category); } - protected String getLocalizedCategoryIndent(ModDownloadListPageSkin.CategoryIndented category) { + private String getLocalizedCategoryIndent(ModDownloadListPageSkin.CategoryIndented category) { return StringUtils.repeats(' ', category.indent * 4) + (category.getCategory() == null ? i18n("curse.category.0") @@ -344,13 +343,14 @@ protected ModDownloadListPageSkin(DownloadListPage control) { sortComboBox.getSelectionModel().select(0); searchPane.addRow(rowIndex++, new Label(i18n("mods.category")), categoryStackPane, new Label(i18n("search.sort")), sortStackPane); - StringProperty previousSearchFilter = new SimpleStringProperty(this, "Previous Seach Filter", ""); + IntegerProperty filterID = new SimpleIntegerProperty(this, "Filter ID", 0); + IntegerProperty currentFilterID = new SimpleIntegerProperty(this, "Current Filter ID", -1); EventHandler searchAction = e -> { - if (!previousSearchFilter.get().equals(nameField.getText())) { + if (currentFilterID.get() != filterID.get()) { control.pageOffset.set(0); } + currentFilterID.set(filterID.get()); - previousSearchFilter.set(nameField.getText()); getSkinnable().search(gameVersionField.getSelectionModel().getSelectedItem(), Optional.ofNullable(categoryComboBox.getSelectionModel().getSelectedItem()) .map(CategoryIndented::getCategory) @@ -360,60 +360,93 @@ protected ModDownloadListPageSkin(DownloadListPage control) { sortComboBox.getSelectionModel().getSelectedItem()); }; + control.listenerHolder.add(FXUtils.observeWeak( + () -> filterID.set(filterID.get() + 1), + + control.downloadSource, + gameVersionField.getSelectionModel().selectedItemProperty(), + categoryComboBox.getSelectionModel().selectedItemProperty(), + nameField.textProperty(), + sortComboBox.getSelectionModel().selectedItemProperty() + )); + HBox actionsBox = new HBox(8); GridPane.setColumnSpan(actionsBox, 4); actionsBox.setAlignment(Pos.CENTER); { AggregatedObservableList actions = new AggregatedObservableList<>(); + Holder changeButton = new Holder<>(); + JFXButton firstPageButton = FXUtils.newBorderButton(i18n("search.first_page")); firstPageButton.setOnAction(event -> { control.pageOffset.set(0); + changeButton.value.run(); searchAction.handle(event); }); - firstPageButton.setDisable(true); - control.pageCount.addListener((observable, oldValue, newValue) -> firstPageButton.setDisable(control.pageCount.get() == -1)); JFXButton previousPageButton = FXUtils.newBorderButton(i18n("search.previous_page")); previousPageButton.setOnAction(event -> { - if (control.pageOffset.get() > 0) { - control.pageOffset.set(control.pageOffset.get() - 1); + int pageOffset = control.pageOffset.get(); + if (pageOffset > 0) { + control.pageOffset.set(pageOffset - 1); + changeButton.value.run(); searchAction.handle(event); } }); - previousPageButton.setDisable(true); - control.pageOffset.addListener((observable, oldValue, newValue) -> previousPageButton.setDisable( - control.pageCount.get() == -1 || control.pageOffset.get() == 0 - )); - - Label pageOffset = new Label(i18n("search.page_n", 0, "-")); - control.pageOffset.addListener((observable, oldValue, newValue) -> pageOffset.setText(i18n( - "search.page_n", control.pageOffset.get() + 1, control.pageCount.get() == -1 ? "-" : control.pageCount.getValue().toString() - ))); - control.pageCount.addListener((observable, oldValue, newValue) -> pageOffset.setText(i18n( - "search.page_n", control.pageOffset.get() + 1, control.pageCount.get() == -1 ? "-" : control.pageCount.getValue().toString() - ))); + + Label pageDescription = new Label(); + pageDescription.textProperty().bind(Bindings.createStringBinding(() -> { + int pageCount = control.pageCount.get(); + return i18n("search.page_n", control.pageOffset.get() + 1, pageCount == -1 ? "-" : String.valueOf(pageCount)); + }, control.pageOffset, control.pageCount)); JFXButton nextPageButton = FXUtils.newBorderButton(i18n("search.next_page")); nextPageButton.setOnAction(event -> { - control.pageOffset.set(control.pageOffset.get() + 1); - searchAction.handle(event); + int nv = control.pageOffset.get() + 1; + if (nv < control.pageCount.get()) { + control.pageOffset.set(nv); + changeButton.value.run(); + searchAction.handle(event); + } }); - nextPageButton.setDisable(true); - control.pageOffset.addListener((observable, oldValue, newValue) -> nextPageButton.setDisable( - control.pageCount.get() == -1 || control.pageOffset.get() >= control.pageCount.get() - 1 - )); - control.pageCount.addListener((observable, oldValue, newValue) -> nextPageButton.setDisable( - control.pageCount.get() == -1 || control.pageOffset.get() >= control.pageCount.get() - 1 - )); JFXButton lastPageButton = FXUtils.newBorderButton(i18n("search.last_page")); lastPageButton.setOnAction(event -> { control.pageOffset.set(control.pageCount.get() - 1); + changeButton.value.run(); searchAction.handle(event); }); + + firstPageButton.setDisable(true); + previousPageButton.setDisable(true); lastPageButton.setDisable(true); - control.pageCount.addListener((observable, oldValue, newValue) -> lastPageButton.setDisable(control.pageCount.get() == -1 || control.pageOffset.get() >= control.pageCount.get() - 1)); + nextPageButton.setDisable(true); + + changeButton.value = () -> { + int pageOffset = control.pageOffset.get(); + int pageCount = control.pageCount.get(); + + boolean disablePrevious = pageOffset == 0; + firstPageButton.setDisable(disablePrevious); + previousPageButton.setDisable(disablePrevious); + + boolean disableNext = pageOffset == pageCount - 1; + nextPageButton.setDisable(disableNext); + lastPageButton.setDisable(disableNext || pageCount == -1); + }; + + FXUtils.onChange(control.pageCount, pageCountN -> { + int pageCount = pageCountN.intValue(); + + if (pageCount != -1) { + if (control.pageOffset.get() + 1 >= pageCount) { + control.pageOffset.set(pageCount - 1); + } + } + + changeButton.value.run(); + }); Pane placeholder = new Pane(); HBox.setHgrow(placeholder, Priority.SOMETIMES); @@ -421,13 +454,14 @@ protected ModDownloadListPageSkin(DownloadListPage control) { JFXButton searchButton = FXUtils.newRaisedButton(i18n("search")); searchButton.setOnAction(searchAction); - actions.appendList(FXCollections.observableArrayList(firstPageButton, previousPageButton, pageOffset, nextPageButton, lastPageButton, placeholder, searchButton)); + actions.appendList(FXCollections.observableArrayList(firstPageButton, previousPageButton, pageDescription, nextPageButton, lastPageButton, placeholder, searchButton)); actions.appendList(control.actions); Bindings.bindContent(actionsBox.getChildren(), actions.getAggregatedList()); } searchPane.addRow(rowIndex++, actionsBox); + FXUtils.onChange(control.downloadSource, v -> searchAction.handle(null)); nameField.setOnAction(searchAction); gameVersionField.setOnAction(searchAction); categoryComboBox.setOnAction(searchAction); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java index a8244c509b..3440c928e9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java @@ -301,10 +301,18 @@ protected ModDownloadPageSkin(DownloadPage control) { for (String gameVersion : control.versions.keys().stream() .sorted(Collections.reverseOrder(GameVersionNumber::compare)) .collect(Collectors.toList())) { - ComponentList sublist = new ComponentList(() -> - control.versions.get(gameVersion).stream() - .map(version -> new ModItem(version, control)) - .collect(Collectors.toList())); + List versions = control.versions.get(gameVersion); + if (versions == null || versions.isEmpty()) { + continue; + } + + ComponentList sublist = new ComponentList(() -> { + ArrayList items = new ArrayList<>(versions.size()); + for (RemoteMod.Version v: versions) { + items.add(new ModItem(v, control)); + } + return items; + }); sublist.getStyleClass().add("no-padding"); sublist.setTitle("Minecraft " + gameVersion); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java similarity index 50% rename from HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java rename to HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java index cf430a476f..e00db972b9 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackDownloadListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/HMCLLocalizedDownloadListPage.java @@ -28,28 +28,60 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; -public class ResourcePackDownloadListPage extends DownloadListPage { - public ResourcePackDownloadListPage(DownloadPage.DownloadCallback callback, boolean versionSelection) { +public final class HMCLLocalizedDownloadListPage extends DownloadListPage { + public static DownloadListPage ofMod(DownloadPage.DownloadCallback callback, boolean versionSelection) { + return new HMCLLocalizedDownloadListPage(callback, versionSelection, RemoteModRepository.Type.MOD, CurseForgeRemoteModRepository.MODS, ModrinthRemoteModRepository.MODS); + } + + public static DownloadListPage ofCurseForgeMod(DownloadPage.DownloadCallback callback, boolean versionSelection) { + return new HMCLLocalizedDownloadListPage(callback, versionSelection, RemoteModRepository.Type.MOD, CurseForgeRemoteModRepository.MODS, null); + } + + public static DownloadListPage ofModrinthMod(DownloadPage.DownloadCallback callback, boolean versionSelection) { + return new HMCLLocalizedDownloadListPage(callback, versionSelection, RemoteModRepository.Type.MOD, null, ModrinthRemoteModRepository.MODS); + } + + public static DownloadListPage ofModPack(DownloadPage.DownloadCallback callback, boolean versionSelection) { + return new HMCLLocalizedDownloadListPage(callback, versionSelection, RemoteModRepository.Type.MODPACK, CurseForgeRemoteModRepository.MODPACKS, ModrinthRemoteModRepository.MODPACKS); + } + + public static DownloadListPage ofResourcePack(DownloadPage.DownloadCallback callback, boolean versionSelection) { + return new HMCLLocalizedDownloadListPage(callback, versionSelection, RemoteModRepository.Type.RESOURCE_PACK, CurseForgeRemoteModRepository.RESOURCE_PACKS, ModrinthRemoteModRepository.RESOURCE_PACKS); + } + + private HMCLLocalizedDownloadListPage(DownloadPage.DownloadCallback callback, boolean versionSelection, RemoteModRepository.Type type, CurseForgeRemoteModRepository curseForge, ModrinthRemoteModRepository modrinth) { super(null, callback, versionSelection); - repository = new Repository(); + repository = new Repository(type, curseForge, modrinth); supportChinese.set(true); downloadSources.get().setAll("mods.curseforge", "mods.modrinth"); - if (CurseForgeRemoteModRepository.isAvailable()) + if (curseForge != null) { downloadSource.set("mods.curseforge"); - else + } else if (modrinth != null) { downloadSource.set("mods.modrinth"); + } else { + throw new AssertionError("Should not be here."); + } } private class Repository extends LocalizedRemoteModRepository { + private final RemoteModRepository.Type type; + private final CurseForgeRemoteModRepository curseForge; + private final ModrinthRemoteModRepository modrinth; + + public Repository(Type type, CurseForgeRemoteModRepository curseForge, ModrinthRemoteModRepository modrinth) { + this.type = type; + this.curseForge = curseForge; + this.modrinth = modrinth; + } @Override protected RemoteModRepository getBackedRemoteModRepository() { if ("mods.modrinth".equals(downloadSource.get())) { - return ModrinthRemoteModRepository.RESOURCE_PACKS; + return modrinth; } else { - return CurseForgeRemoteModRepository.RESOURCE_PACKS; + return curseForge; } } @@ -64,19 +96,17 @@ protected SortType getBackedRemoteModRepositorySortOrder() { @Override public Type getType() { - return Type.MOD; + return type; } } @Override protected String getLocalizedCategory(String category) { - String key; - if ("mods.modrinth".equals(downloadSource.get())) { - key = "modrinth.category." + category; - } else { - key = "curse.category." + category; + if (category.isEmpty()) { + return ""; } + String key = ("mods.modrinth".equals(downloadSource.get()) ? "modrinth" : "curse") + ".category." + category; try { return I18n.getResourceBundle().getString(key); } catch (MissingResourceException e) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java index d65df18fc6..aea2967a7e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java @@ -38,7 +38,6 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.function.Function; import static org.jackhuang.hmcl.ui.FXUtils.runInFX; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; @@ -73,37 +72,36 @@ public void loadVersion(Profile profile, String versionId) { return LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(versionId), gameVersion); }).thenAcceptAsync(analyzer -> { - Function removeAction = libraryId -> () -> { - profile.getDependency().removeLibraryAsync(version, libraryId) - .thenComposeAsync(profile.getRepository()::saveAsync) - .withComposeAsync(profile.getRepository().refreshVersionsAsync()) - .withRunAsync(Schedulers.javafx(), () -> loadVersion(this.profile, this.versionId)) - .start(); - }; - itemsProperty().clear(); - InstallerItem.InstallerItemGroup group = new InstallerItem.InstallerItemGroup(gameVersion); + InstallerItem.InstallerItemGroup group = new InstallerItem.InstallerItemGroup(gameVersion, InstallerItem.Style.LIST_ITEM); // Conventional libraries: game, fabric, forge, neoforge, liteloader, optifine - for (InstallerItem installerItem : group.getLibraries()) { - String libraryId = installerItem.getLibraryId(); + for (InstallerItem item : group.getLibraries()) { + String libraryId = item.getLibraryId(); String libraryVersion = analyzer.getVersion(libraryId).orElse(null); - boolean libraryConfigurable = libraryVersion != null && analyzer.getLibraryStatus(libraryId) == LibraryAnalyzer.LibraryMark.LibraryStatus.CLEAR; - installerItem.libraryVersion.set(libraryVersion); - installerItem.upgradable.set(libraryConfigurable); - installerItem.installable.set(true); - installerItem.action.set(e -> { + if (libraryVersion != null) { + item.versionProperty().set(new InstallerItem.InstalledState( + libraryVersion, + analyzer.getLibraryStatus(libraryId) != LibraryAnalyzer.LibraryMark.LibraryStatus.CLEAR, + false + )); + } else { + item.versionProperty().set(null); + } + + item.installActionProperty().set(e -> { Controllers.getDecorator().startWizard(new UpdateInstallerWizardProvider(profile, gameVersion, version, libraryId, libraryVersion)); }); - boolean removable = !LibraryAnalyzer.LibraryType.MINECRAFT.getPatchId().equals(libraryId) && libraryConfigurable; - installerItem.removable.set(removable); - if (removable) { - Runnable action = removeAction.apply(libraryId); - installerItem.removeAction.set(e -> action.run()); - } - itemsProperty().add(installerItem); + + item.removeActionProperty().set(e -> profile.getDependency().removeLibraryAsync(version, libraryId) + .thenComposeAsync(profile.getRepository()::saveAsync) + .withComposeAsync(profile.getRepository().refreshVersionsAsync()) + .withRunAsync(Schedulers.javafx(), () -> loadVersion(this.profile, this.versionId)) + .start()); + + itemsProperty().add(item); } // other third-party libraries which are unable to manage. @@ -115,14 +113,13 @@ public void loadVersion(Profile profile, String versionId) { if (LibraryAnalyzer.LibraryType.fromPatchId(libraryId) != null) continue; - Runnable action = removeAction.apply(libraryId); - - InstallerItem installerItem = new InstallerItem(libraryId); - installerItem.libraryVersion.set(libraryVersion); - installerItem.installable.set(false); - installerItem.upgradable.set(false); - installerItem.removable.set(true); - installerItem.removeAction.set(e -> action.run()); + InstallerItem installerItem = new InstallerItem(libraryId, InstallerItem.Style.LIST_ITEM); + installerItem.versionProperty().set(new InstallerItem.InstalledState(libraryVersion, false, false)); + installerItem.removeActionProperty().set(e -> profile.getDependency().removeLibraryAsync(version, libraryId) + .thenComposeAsync(profile.getRepository()::saveAsync) + .withComposeAsync(profile.getRepository().refreshVersionsAsync()) + .withRunAsync(Schedulers.javafx(), () -> loadVersion(this.profile, this.versionId)) + .start()); itemsProperty().add(installerItem); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadListPage.java deleted file mode 100644 index 5deea40292..0000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModDownloadListPage.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2021 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.ui.versions; - -import org.jackhuang.hmcl.game.LocalizedRemoteModRepository; -import org.jackhuang.hmcl.mod.RemoteModRepository; -import org.jackhuang.hmcl.mod.curse.CurseForgeRemoteModRepository; -import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; - -import static org.jackhuang.hmcl.util.i18n.I18n.i18n; - -public class ModDownloadListPage extends DownloadListPage { - public ModDownloadListPage(DownloadPage.DownloadCallback callback, boolean versionSelection) { - super(null, callback, versionSelection); - - repository = new Repository(); - - supportChinese.set(true); - downloadSources.get().setAll("mods.curseforge", "mods.modrinth"); - if (CurseForgeRemoteModRepository.isAvailable()) - downloadSource.set("mods.curseforge"); - else - downloadSource.set("mods.modrinth"); - } - - private class Repository extends LocalizedRemoteModRepository { - - @Override - protected RemoteModRepository getBackedRemoteModRepository() { - if ("mods.modrinth".equals(downloadSource.get())) { - return ModrinthRemoteModRepository.MODS; - } else { - return CurseForgeRemoteModRepository.MODS; - } - } - - @Override - protected SortType getBackedRemoteModRepositorySortOrder() { - if ("mods.modrinth".equals(downloadSource.get())) { - return SortType.NAME; - } else { - return SortType.POPULARITY; - } - } - - @Override - public Type getType() { - return Type.MOD; - } - } - - @Override - protected String getLocalizedCategory(String category) { - if ("mods.modrinth".equals(downloadSource.get())) { - return i18n("modrinth.category." + category); - } else { - return i18n("curse.category." + category); - } - } - - @Override - protected String getLocalizedOfficialPage() { - if ("mods.modrinth".equals(downloadSource.get())) { - return i18n("mods.modrinth"); - } else { - return i18n("mods.curseforge"); - } - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index 497a383cca..acd647a5fd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -33,7 +33,10 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.StackPane; -import org.jackhuang.hmcl.mod.*; +import org.jackhuang.hmcl.mod.LocalModFile; +import org.jackhuang.hmcl.mod.ModLoaderType; +import org.jackhuang.hmcl.mod.RemoteMod; +import org.jackhuang.hmcl.mod.RemoteModRepository; import org.jackhuang.hmcl.mod.curse.CurseForgeRemoteModRepository; import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; import org.jackhuang.hmcl.setting.Profile; @@ -46,7 +49,10 @@ import org.jackhuang.hmcl.ui.animation.ContainerAnimations; import org.jackhuang.hmcl.ui.animation.TransitionPane; import org.jackhuang.hmcl.ui.construct.*; -import org.jackhuang.hmcl.util.*; +import org.jackhuang.hmcl.util.Holder; +import org.jackhuang.hmcl.util.Lazy; +import org.jackhuang.hmcl.util.Pair; +import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -58,6 +64,8 @@ import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.Optional; import java.util.function.Predicate; @@ -67,10 +75,10 @@ import static org.jackhuang.hmcl.ui.FXUtils.onEscPressed; import static org.jackhuang.hmcl.ui.ToolbarListPageSkin.createToolbarButton2; import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; import static org.jackhuang.hmcl.util.StringUtils.isNotBlank; import static org.jackhuang.hmcl.util.i18n.I18n.i18n; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; class ModListPageSkin extends SkinBase { @@ -252,7 +260,7 @@ static class ModInfoObject extends RecursiveTreeObject implements StringBuilder message = new StringBuilder(localModFile.getFileName()); if (isNotBlank(localModFile.getGameVersion())) - message.append(", ").append(i18n("archive.game_version")).append(": ").append(localModFile.getGameVersion()); + message.append(", ").append(i18n("game.version")).append(": ").append(localModFile.getGameVersion()); if (isNotBlank(localModFile.getAuthors())) message.append(", ").append(i18n("archive.author")).append(": ").append(localModFile.getAuthors()); this.message = message.toString(); @@ -323,18 +331,16 @@ class ModInfoDialog extends JFXDialogLayout { setBody(description); if (StringUtils.isNotBlank(modInfo.getModInfo().getId())) { - Lang.>immutableListOf( + for (Pair item : Arrays.asList( pair("mods.curseforge", CurseForgeRemoteModRepository.MODS), pair("mods.modrinth", ModrinthRemoteModRepository.MODS) - ).forEach(item -> { - String text = item.getKey(); - RemoteModRepository remoteModRepository = item.getValue(); - - JFXHyperlink button = new JFXHyperlink(i18n(text)); + )) { + RemoteModRepository repository = item.getValue(); + JFXHyperlink button = new JFXHyperlink(i18n(item.getKey())); Task.runAsync(() -> { - Optional versionOptional = remoteModRepository.getRemoteVersionByLocalFile(modInfo.getModInfo(), modInfo.getModInfo().getFile()); + Optional versionOptional = repository.getRemoteVersionByLocalFile(modInfo.getModInfo(), modInfo.getModInfo().getFile()); if (versionOptional.isPresent()) { - RemoteMod remoteMod = remoteModRepository.getModById(versionOptional.get().getModid()); + RemoteMod remoteMod = repository.getModById(versionOptional.get().getModid()); FXUtils.runInFX(() -> { for (ModLoaderType modLoaderType : versionOptional.get().getLoaders()) { String loaderName; @@ -357,15 +363,16 @@ class ModInfoDialog extends JFXDialogLayout { default: continue; } - if (!title.getTags().contains(loaderName)) { - title.getTags().add(loaderName); + List tags = title.getTags(); + if (!tags.contains(loaderName)) { + tags.add(loaderName); } } button.setOnAction(e -> { fireEvent(new DialogCloseEvent()); Controllers.navigate(new DownloadPage( - new DownloadListPage(remoteModRepository), + repository instanceof CurseForgeRemoteModRepository ? HMCLLocalizedDownloadListPage.ofCurseForgeMod(null, false) : HMCLLocalizedDownloadListPage.ofModrinthMod(null, false), remoteMod, new Profile.ProfileVersion(ModListPageSkin.this.getSkinnable().getProfile(), ModListPageSkin.this.getSkinnable().getVersionId()), null @@ -377,7 +384,7 @@ class ModInfoDialog extends JFXDialogLayout { }).start(); button.setDisable(true); getActions().add(button); - }); + } } if (StringUtils.isNotBlank(modInfo.getModInfo().getUrl())) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModpackDownloadListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModpackDownloadListPage.java deleted file mode 100644 index 91ee40d05c..0000000000 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModpackDownloadListPage.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2022 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.ui.versions; - -import org.jackhuang.hmcl.game.LocalizedRemoteModRepository; -import org.jackhuang.hmcl.mod.RemoteModRepository; -import org.jackhuang.hmcl.mod.curse.CurseForgeRemoteModRepository; -import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; - -import static org.jackhuang.hmcl.util.i18n.I18n.i18n; - -public class ModpackDownloadListPage extends DownloadListPage { - public ModpackDownloadListPage(DownloadPage.DownloadCallback callback, boolean versionSelection) { - super(null, callback, versionSelection); - - repository = new Repository(); - - supportChinese.set(true); - downloadSources.get().setAll("mods.curseforge", "mods.modrinth"); - if (CurseForgeRemoteModRepository.isAvailable()) - downloadSource.set("mods.curseforge"); - else - downloadSource.set("mods.modrinth"); - } - - private class Repository extends LocalizedRemoteModRepository { - - @Override - protected RemoteModRepository getBackedRemoteModRepository() { - if ("mods.modrinth".equals(downloadSource.get())) { - return ModrinthRemoteModRepository.MODPACKS; - } else { - return CurseForgeRemoteModRepository.MODPACKS; - } - } - - @Override - protected SortType getBackedRemoteModRepositorySortOrder() { - if ("mods.modrinth".equals(downloadSource.get())) { - return SortType.NAME; - } else { - return SortType.POPULARITY; - } - } - - @Override - public Type getType() { - return Type.MODPACK; - } - } - - @Override - protected String getLocalizedCategory(String category) { - if ("mods.modrinth".equals(downloadSource.get())) { - return i18n("modrinth.category." + category); - } else { - return i18n("curse.category." + category); - } - } - - @Override - protected String getLocalizedOfficialPage() { - if ("mods.modrinth".equals(downloadSource.get())) { - return i18n("mods.modrinth"); - } else { - return i18n("mods.curseforge"); - } - } -} diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java index 58a1fd9aad..ea8914d8c8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/NativePatcher.java @@ -1,3 +1,20 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2024 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.jackhuang.hmcl.util; import com.google.gson.reflect.TypeToken; @@ -19,6 +36,9 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; +/** + * @author Glavo + */ public final class NativePatcher { private NativePatcher() { } @@ -114,9 +134,10 @@ public static Version patchNative(Version version, String gameVersion, JavaVersi if (library.isNative()) { Library replacement = replacements.getOrDefault(library.getName() + ":natives", NONEXISTENT_LIBRARY); if (replacement == NONEXISTENT_LIBRARY) { - LOG.warning("No alternative native library " + library.getName() + " provided for platform " + javaVersion.getPlatform()); + LOG.warning("No alternative native library " + library.getName() + ":natives provided for platform " + javaVersion.getPlatform()); newLibraries.add(library); } else if (replacement != null) { + LOG.info("Replace " + library.getName() + ":natives with " + replacement.getName()); newLibraries.add(replacement); } } else { @@ -124,6 +145,7 @@ public static Version patchNative(Version version, String gameVersion, JavaVersi if (replacement == NONEXISTENT_LIBRARY) { newLibraries.add(library); } else if (replacement != null) { + LOG.info("Replace " + library.getName() + " with " + replacement.getName()); newLibraries.add(replacement); } } diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 77ed7f4190..dc1bdd651e 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -107,6 +107,7 @@ account.methods.microsoft.error.country_unavailable=Xbox Live is not available i account.methods.microsoft.error.missing_xbox_account=Your Microsoft account does not have a linked Xbox account yet. Please create one before continuing. account.methods.microsoft.error.no_character=Your account does not own the Minecraft Java Edition.\nThe game profile may not have been created,\nplease click the link above to create it. account.methods.microsoft.error.unknown=Failed to log in, error: %d. +account.methods.microsoft.error.wrong_verify_method=Please log in using your account & password on the Microsoft account login page. Please do not use a verification code to log in. account.methods.microsoft.logging_in=Logging in... account.methods.microsoft.hint=Please click on the "login" button, and copy the code shown here later to finish the login process in the opened browser window.\n\ \n\ @@ -158,8 +159,7 @@ account.username=Username archive.author=Author(s) archive.date=Publish Date -archive.game_version=Game Version -archive.name=Filename +archive.file.name=File Name archive.version=Version assets.download=Downloading Assets @@ -319,7 +319,6 @@ download=Download download.hint=Install games and modpacks or download mods, resource packs and worlds download.code.404=File not found on the remote server: %s download.content=Addons -download.curseforge.customization=Shaders, and game customization download.curseforge.unavailable=HMCL nightly build does not support access to CurseForge, please use release version or beta version to download. download.existing=The file cannot be saved because it already exists. You can use 'Save As' to save the file elsewhere. download.external_link=Open Download Website @@ -615,7 +614,7 @@ install.failed.malformed=The downloaded files are corrupted. You can try fixing install.failed.optifine_conflict=Cannot install both Fabric, OptiFine, and Forge on Minecraft 1.13 or above. install.failed.optifine_forge_1.17=For Minecraft version 1.17.1 or lower, Forge only supports OptiFine H1 Pre2 or newer. You can install them under the snapshot versions tab. install.failed.version_mismatch=This library requires the game version %s, but the installed one is %s. -install.installer.change_version=Version %s is not compatible with the current game version. Click here to replace it with another version or delete it. +install.installer.change_version=%s Incompatible install.installer.choose=Choose Your %s Version install.installer.depend=Requires %s install.installer.fabric=Fabric @@ -1224,6 +1223,7 @@ update.no_browser=Cannot open in the system browser. But, we copied the link to update.tooltip=Update version=Games +version.name=Instance Name version.cannot_read=Unable to parse the game version, automatic installation cannot continue. version.empty=No Instances version.empty.add=Add an Instance diff --git a/HMCL/src/main/resources/assets/lang/I18N_es.properties b/HMCL/src/main/resources/assets/lang/I18N_es.properties index 036af612c4..0172d1c54f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_es.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_es.properties @@ -138,8 +138,7 @@ account.username=Nombre de usuario archive.author=Autor(es) archive.date=Fecha de publicación -archive.game_version=Versión del juego -archive.name=Nombre de archivo +archive.file.name=Nombre de archivo archive.version=Versión assets.download=Descargando assets @@ -295,7 +294,6 @@ download=Descargar download.hint=Instalar juegos y modpacks o descargar mods, paquetes de recursos y mapas download.code.404=Archivo no encontrado en el servidor remoto: %s download.content=Complementos -download.curseforge.customization=Luz y sombras, y personalización del juego download.existing=El archivo no se puede guardar porque ya existe. Puedes usar 'Guardar como' para guardar el archivo en otro lugar. download.external_link=Abrir sitio web download.failed=Falló la descarga de %1$s, código de respuesta: %2$d @@ -480,13 +478,6 @@ game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Forge puede haber game.crash.reason.java_version_is_too_high=El juego actual se bloqueó porque la versión de Java es demasiado alta y no puede seguir ejecutándose.\nCambie a una versión anterior de Java en la pestaña Java Path de Configuración global del juego o Configuración específica del juego antes de iniciar el juego.\nSi no es así, puede descargarlo desde java.com (Java8) o BellSoft Liberica Full JRE (Java17) y otras plataformas para descargar e instalar una (reinicie el iniciador después de la instalación). game.crash.reason.mod_name=El juego actual no puede continuar ejecutándose debido a un problema con el nombre del archivo mod. El nombre del archivo de\nMod solo debe usar mayúsculas y minúsculas (Aa ~ Zz), números (0 ~ 9), líneas horizontales (-), subrayado (_) y puntos (.) en toda la mitad del inglés.\n Por favor, vaya a la carpeta mod para agregar un carácter de Cumplimiento anterior a todos los nombres de archivo mod que no cumplan. game.crash.reason.incomplete_forge_installation=O jogo atual não pode continuar devido a uma instalação incompleta do Forge / NeoForge.\nDesinstale e reinstale o Forge / NeoForge em Configurações de versão - Instalação automática. -game.crash.reason.forge_error=Forge puede haber proporcionado un mensaje de error. \nPuede ver el registro y realizar las acciones correspondientes de acuerdo con la información de registro en el informe de errores. \nSi no ve un mensaje de error, puede consultar el informe de errores para saber cómo ocurrió el error.\n%1$s -game.crash.reason.mod_solution0=El juego actual no puede seguir ejecutándose debido a algunos problemas de modificación. \nPuede consultar el registro para ver si hay un mod incorrecto. -game.crash.reason.mod_profile_causes_game_crash=El juego actual no puede seguir ejecutándose debido a un problema con el perfil de mod. \nPuede consultar el registro del mod defectuoso y su archivo de configuración. -game.crash.reason.fabric_reports_an_error_and_gives_a_solution=Forge puede haber dado un mensaje de error. \nPuede ver el registro y realizar las acciones correspondientes de acuerdo con la información de registro en el informe de errores. \nSi no ve un mensaje de error, puede consultar el informe de errores para saber cómo ocurrió el error. -game.crash.reason.java_version_is_too_high=El juego actual se bloqueó porque la versión de Java es demasiado alta y no puede seguir ejecutándose. \nCambie a una versión anterior de Java en la pestaña Java Path de Configuración global del juego o Configuración específica del juego antes de iniciar el juego. \nSi no es así, puede descargarlo desde java.com (Java8) o BellSoft Liberica Full JRE (Java17) y otras plataformas para descargar e instalar una (reinicie el iniciador después de la instalación). -game.crash.reason.mod_name=El juego actual no puede continuar ejecutándose debido a un problema con el nombre del archivo mod. El nombre del archivo de \nMod solo debe usar mayúsculas y minúsculas (Aa ~ Zz), números (0 ~ 9), líneas horizontales (-), subrayado (_) y puntos (.) en toda la mitad del inglés. \n Por favor, vaya a la carpeta mod para agregar un carácter de Cumplimiento anterior a todos los nombres de archivo mod que no cumplan. -game.crash.reason.incomplete_forge_installation=O jogo atual não pode continuar devido a uma instalação incompleta do Forge. \nDesinstale e reinstale o Forge em Configurações de versão - Instalação automática. game.crash.reason.modlauncher_8=El juego se ha bloqueado porque tu versión actual de Forge no es compatible con tu instalación de Java. Por favor, intente actualizar Forge, o intente utilizar Java 8u312/11.0.13/17.0.1 o versiones anteriores.\n\ \n\ 8u312 y anteriores\:\n\ diff --git a/HMCL/src/main/resources/assets/lang/I18N_ja.properties b/HMCL/src/main/resources/assets/lang/I18N_ja.properties index eed35a3f51..057ddc5e98 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ja.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ja.properties @@ -125,8 +125,7 @@ account.username=ユーザー名 archive.author=作成者 archive.date=公開日 -archive.game_version=ゲームバージョン -archive.name=名前 +archive.file.name=名前 archive.version=バージョン Assets.download=アセットのダウンロード @@ -277,7 +276,6 @@ download=ダウンロード download.hint=ゲームや modpack をインストールするか、mod、リソース パック、マップをダウンロードします download.code.404=リモートサーバーにファイルが見つかりません:%s download.content=ゲームコンテンツ -download.curseforge.customization=光と影、およびゲームのカスタマイズ download.existing=ファイルは既に存在するため、保存できません。「名前を付けて保存」を選択して、ファイルを別の場所に保存できます。 download.external_link=ダウンロードサイトを開く download.failed=%1$s のダウンロードに失敗しました、応答コード:%2$d @@ -311,9 +309,6 @@ fatal.javafx.missing=JavaFXがありません。\nJava11以降を使用してい fatal.config_loading_failure=構成にアクセスできません。\nHelloMinecraftを確認してください。Launcherには、「%s」とその中のファイルへの読み取りおよび書き込みアクセス権があります。 fatal.migration_requires_manual_reboot=更新が完了しました。Hello Minecraftを再開してください!ランチャー。 fatal.apply_update_failure=ごめんなさい、Hello Minecraft! Launcher 何か問題が発生したため、ランチャーは更新を完了できませんでした。\nただし、Hello Minecraftをダウンロードすることで、手動で更新を終了できます。%s からのランチャー。\nこの問題を報告することを検討してください。 -fatal.config_loading_failure=構成にアクセスできません。\nHelloMinecraftを確認してください。 Launcherには、「%s」とその中のファイルへの読み取りおよび書き込みアクセス権があります。\nmacOS の場合は、「デスクトップ」、「ダウンロード」、「ドキュメント」以外の権限を持つ場所に HMCL を配置して、再試行してください。 -fatal.migration_requires_manual_reboot=更新が完了しました。 Hello Minecraftを再開してください!ランチャー。 -fatal.apply_update_failure=ごめんなさい、Hello Minecraft! Launcher 何か問題が発生したため、ランチャーは更新を完了できませんでした。\nただし、Hello Minecraftをダウンロードすることで、手動で更新を終了できます。 %s からのランチャー。\nこの問題を報告することを検討してください。 fatal.samba=If you are trying to run HMCL in a shared folder by Samba, HMCL may not working, please try updating your Java or running HMCL in a local folder. fatal.illegal_char=ユーザーフォルダーのパスに不正な文字'='が含まれています, ログインアカウントやオフラインログインではスキンの変更ができなくなり。 diff --git a/HMCL/src/main/resources/assets/lang/I18N_ru.properties b/HMCL/src/main/resources/assets/lang/I18N_ru.properties index 9b7ca88be6..37b91035a7 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_ru.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_ru.properties @@ -133,8 +133,7 @@ account.username=Имя пользователя archive.author=Автор(ы) archive.date=Дата публикации -archive.game_version=Версия игры -archive.name=Имя файла +archive.file.name=Имя файла archive.version=Версия assets.download=Скачивание Assets @@ -293,7 +292,6 @@ download=Скачать download.hint=Установите игры и пакеты модов или загрузите моды, пакеты ресурсов и карты download.code.404=Файл не найден на удалённом сервере: %s download.content=Игровой контент -download.curseforge.customization=Свет и тень, а также настройка игры download.curseforge.unavailable=Лаунчер версии Nightly не поддерживает доступ к CurseForge, используйте Release или Beta для скачивания. download.existing=Файл существует и по этому не может быть сохранён. Можно использовать «Сохранить как», чтобы сохранить файл в другом месте. download.external_link=Открыть сайт diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 0063a9cb93..a11eb2474b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -106,6 +106,7 @@ account.methods.microsoft.error.country_unavailable=你所在的國家或地區 account.methods.microsoft.error.missing_xbox_account=你的微軟帳號尚未關聯 XBox 帳號,你必須先創建 XBox 帳號,才能登入遊戲。 account.methods.microsoft.error.no_character=該帳戶未包含 Minecraft Java 版購買記錄\n可能未創建遊戲檔案,請點擊上方鏈接創建 account.methods.microsoft.error.unknown=登入失敗,錯誤碼:%d +account.methods.microsoft.error.wrong_verify_method=請在 Microsoft 帳號登陸頁面使用帳號 + 密碼登入。請不要使用驗證碼登入。 account.methods.microsoft.logging_in=登入中... account.methods.microsoft.makegameidsettings=創建檔案/編輯檔案名稱 account.methods.microsoft.hint=你需要按照以下步驟添加賬戶:\n\ @@ -167,8 +168,7 @@ account.username=使用者名稱 archive.author=作者 archive.date=發布日期 -archive.game_version=遊戲版本 -archive.name=名稱 +archive.file.name=檔案名稱 archive.version=版本 assets.download=下載資源 @@ -328,7 +328,6 @@ download=下載 download.hint=安裝遊戲和整合包或下載模組、資源包和地圖 download.code.404=遠端伺服器沒有需要下載的檔案: %s download.content=遊戲內容 -download.curseforge.customization=光影與遊戲定制 download.curseforge.unavailable=HMCL 預覽版暫不支持訪問 CurseForge,請使用穩定版或測試版進行下載。 download.existing=檔案已存在,無法保存。你可以選擇另存為將檔案保存至其他地方。 download.external_link=打開下載網站 @@ -499,7 +498,7 @@ install.failed.malformed=剛才下載的檔案格式損壞。您可以切換到 install.failed.optifine_conflict=暫不支援 OptiFine 與 Forge 同時安裝在 Minecraft 1.13 上 install.failed.optifine_forge_1.17=Minecraft 1.17.1 下,僅 OptiFine H1 Pre2 及以上版本能相容 Forge。你可以從 OptiFine 測試版中選擇最新版本。 install.failed.version_mismatch=該軟體需要的遊戲版本為 %s,但實際的遊戲版本為 %s。 -install.installer.change_version=%s,該版本與當前遊戲不相容,您需要點擊此處更換版本或刪除 +install.installer.change_version=%s 與當前遊戲不相容,請更換版本 install.installer.choose=選擇 %s 版本 install.installer.depend=需要先安裝 %s install.installer.fabric=Fabric @@ -1081,6 +1080,7 @@ update.no_browser=無法開啟瀏覽器,網址已經複製到剪貼簿了, update.tooltip=更新 version=遊戲 +version.name=遊戲版本名稱 version.cannot_read=讀取遊戲版本失敗,無法進行自動安裝 version.empty=沒有遊戲版本 version.empty.add=進入下載頁安裝遊戲 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index ee0fca1ee2..ededc00cd6 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -101,12 +101,13 @@ account.methods.microsoft=微软账户 account.methods.microsoft.birth=如何修改账户出生日期 account.methods.microsoft.close_page=已完成微软账户授权,接下来启动器还需要完成剩余登录步骤。你已经可以关闭本页面了。 account.methods.microsoft.deauthorize=解除账户授权 -account.methods.microsoft.error.add_family=由于你未满 18 岁,你的账户必须被加入到家庭中才能登录游戏。你也可以点击上方【账户设置页】更改你的账户的出生日期,使年龄满 18 岁以上以继续登录。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.add_family_probably=请检查你的账户设置,如果年龄未满 18 岁,你的账户必须被加入到家庭中才能登录游戏。你也可以点击上方链接更改你的账户的出生日期,使年龄满 18 岁以上以继续登录。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.add_family=请点击上方【账户设置页】更改你的账户的出生日期,使年龄满 18 岁以上。或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.add_family_probably=请点击上方【账户设置页】更改你的账户的出生日期,使年龄满 18 岁以上。或将账户加入到家庭中。\n你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.error.country_unavailable=你所在的国家或地区不受 XBox Live 的支持。 -account.methods.microsoft.error.missing_xbox_account=你的微软账户尚未关联 XBox 账户,你必须先创建 XBox 账户,才能登录游戏。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.no_character=该账户未包含 Minecraft Java 版购买记录\n若已购买,则可能未创建游戏档案,请点击上方链接创建。\n若确定该账户完成了上述步骤,请先在 Minecraft 官网(minecraft.net)登录一次账户,然后再在启动器登录。\n你可以点击右上角帮助按钮进行求助。 -account.methods.microsoft.error.unknown=登录失败,错误码:%d +account.methods.microsoft.error.missing_xbox_account=请点击上方【创建档案】关联 XBox 账户。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.no_character=请确认你购买了 Minecraft: Java 版。若已购买,该账户未包含 Minecraft Java 版购买记录\n请点击【创建档案】创建游戏档案。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.unknown=未知问题。错误码:%d。\n你可以点击右上角帮助按钮进行求助。 +account.methods.microsoft.error.wrong_verify_method=请在 Microsoft 账户登陆页面使用账户 + 密码登录。请不要使用验证码登录。\n你可以点击右上角帮助按钮进行求助。 account.methods.microsoft.logging_in=登录中…… account.methods.microsoft.makegameidsettings=创建档案/编辑档案名称 account.methods.microsoft.hint=你需要按照以下步骤添加账户:\n\ @@ -168,8 +169,7 @@ account.username=用户名 archive.author=作者 archive.date=发布日期 -archive.game_version=游戏版本 -archive.name=名称 +archive.file.name=文件名 archive.version=版本 assets.download=下载资源 @@ -329,7 +329,6 @@ download=下载 download.hint=安装游戏和整合包或下载模组、资源包和地图 download.code.404=远程服务器不包含需要下载的文件: %s download.content=游戏内容 -download.curseforge.customization=光影与游戏定制 download.curseforge.unavailable=HMCL 预览版暂不支持访问 CurseForge,请使用稳定版或测试版进行下载。 download.existing=文件已存在,无法保存。你可以在模组选择栏中的右侧按钮另存为将文件保存至其他地方。 download.external_link=打开下载网站 @@ -498,7 +497,7 @@ install.failed.malformed=下载的文件格式损坏。您可以在设置-下载 install.failed.optifine_conflict=暂不支持 OptiFine, Fabric 或 OptiFine , Forge 同时安装在 Minecraft 1.13 及以上版本 install.failed.optifine_forge_1.17=Minecraft 1.17.1 下,仅 OptiFine H1 Pre2 及以上版本能兼容 Forge。你可以从 OptiFine 测试版中选择最新版本。 install.failed.version_mismatch=该组件需要的游戏版本为 %s,但实际的游戏版本为 %s。 -install.installer.change_version=%s,该版本与当前游戏不兼容,您需要点击此处更换版本或删除 +install.installer.change_version=%s 与当前游戏不兼容,请更换版本 install.installer.choose=选择 %s 版本 install.installer.depend=需要先安装 %s install.installer.fabric=Fabric @@ -1080,6 +1079,7 @@ update.no_browser=无法打开浏览器,网址已经复制到剪贴板了, update.tooltip=更新 version=游戏 +version.name=游戏版本名称 version.cannot_read=读取游戏版本失败,无法进行自动安装 version.empty=没有游戏版本 version.empty.add=进入下载页安装游戏 diff --git a/HMCL/src/main/resources/assets/natives.json b/HMCL/src/main/resources/assets/natives.json index ede49575d4..558d2bd3e2 100644 --- a/HMCL/src/main/resources/assets/natives.json +++ b/HMCL/src/main/resources/assets/natives.json @@ -154,6 +154,160 @@ } } }, + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.2/lwjgl-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/3.3.2/lwjgl-3.3.2.jar", + "sha1": "4421d94af68e35dcaa31737a6fc59136a1e61b94", + "size": 786196 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.2/lwjgl-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.2/lwjgl-3.3.2-natives-linux-arm64.jar", + "sha1": "8bd89332c90a90e6bc4aa997a25c05b7db02c90a", + "size": 90795 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.2/lwjgl-jemalloc-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-jemalloc/3.3.2/lwjgl-jemalloc-3.3.2.jar", + "sha1": "877e17e39ebcd58a9c956dc3b5b777813de0873a", + "size": 43233 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.2/lwjgl-jemalloc-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.2/lwjgl-jemalloc-3.3.2-natives-linux-arm64.jar", + "sha1": "5249f18a9ae20ea86c5816bc3107a888ce7a17d2", + "size": 206402 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.2/lwjgl-openal-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-openal/3.3.2/lwjgl-openal-3.3.2.jar", + "sha1": "ae5357ed6d934546d3533993ea84c0cfb75eed95", + "size": 108230 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.2/lwjgl-openal-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.2/lwjgl-openal-3.3.2-natives-linux-arm64.jar", + "sha1": "22408980cc579709feaf9acb807992d3ebcf693f", + "size": 590865 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.2/lwjgl-opengl-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-opengl/3.3.2/lwjgl-opengl-3.3.2.jar", + "sha1": "ee8e95be0b438602038bc1f02dc5e3d011b1b216", + "size": 928871 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.2/lwjgl-opengl-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.2/lwjgl-opengl-3.3.2-natives-linux-arm64.jar", + "sha1": "bb9eb56da6d1d549d6a767218e675e36bc568eb9", + "size": 58627 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.2/lwjgl-glfw-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-glfw/3.3.2/lwjgl-glfw-3.3.2.jar", + "sha1": "757920418805fb90bfebb3d46b1d9e7669fca2eb", + "size": 135828 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.2/lwjgl-glfw-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.2/lwjgl-glfw-3.3.2-natives-linux-arm64.jar", + "sha1": "bc49e64bae0f7ff103a312ee8074a34c4eb034c7", + "size": 120168 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.2/lwjgl-stb-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-stb/3.3.2/lwjgl-stb-3.3.2.jar", + "sha1": "a2550795014d622b686e9caac50b14baa87d2c70", + "size": 118874 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.2/lwjgl-stb-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.2/lwjgl-stb-3.3.2-natives-linux-arm64.jar", + "sha1": "11a380c37b0f03cb46db235e064528f84d736ff7", + "size": 207419 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.2", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.2/lwjgl-tinyfd-3.3.2.jar", + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.3.2/lwjgl-tinyfd-3.3.2.jar", + "sha1": "9f65c248dd77934105274fcf8351abb75b34327c", + "size": 13404 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.2:natives-linux-arm64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.2/lwjgl-tinyfd-3.3.2-natives-linux-arm64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.2/lwjgl-tinyfd-3.3.2-natives-linux-arm64.jar", + "sha1": "93f8c5bc1984963cd79109891fb5a9d1e580373e", + "size": 43381 + } + } + }, "org.lwjgl:lwjgl:3.2.2": { "name": "org.lwjgl:lwjgl:3.3.2", "downloads": { @@ -851,7 +1005,7 @@ } } }, - "org.lwjgl:lwjgl:3.2.2": { + "org.lwjgl:lwjgl:3.2.1": { "name": "org.lwjgl:lwjgl:3.2.3", "downloads": { "artifact": { @@ -862,7 +1016,7 @@ } } }, - "org.lwjgl:lwjgl:3.2.2:natives": { + "org.lwjgl:lwjgl:3.2.1:natives": { "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -873,7 +1027,7 @@ } } }, - "org.lwjgl:lwjgl-jemalloc:3.2.2": { + "org.lwjgl:lwjgl-jemalloc:3.2.1": { "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", "downloads": { "artifact": { @@ -884,7 +1038,7 @@ } } }, - "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": { "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -895,7 +1049,7 @@ } } }, - "org.lwjgl:lwjgl-openal:3.2.2": { + "org.lwjgl:lwjgl-openal:3.2.1": { "name": "org.lwjgl:lwjgl-openal:3.2.3", "downloads": { "artifact": { @@ -906,7 +1060,7 @@ } } }, - "org.lwjgl:lwjgl-openal:3.2.2:natives": { + "org.lwjgl:lwjgl-openal:3.2.1:natives": { "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -917,7 +1071,7 @@ } } }, - "org.lwjgl:lwjgl-opengl:3.2.2": { + "org.lwjgl:lwjgl-opengl:3.2.1": { "name": "org.lwjgl:lwjgl-opengl:3.2.3", "downloads": { "artifact": { @@ -928,7 +1082,7 @@ } } }, - "org.lwjgl:lwjgl-opengl:3.2.2:natives": { + "org.lwjgl:lwjgl-opengl:3.2.1:natives": { "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -939,7 +1093,7 @@ } } }, - "org.lwjgl:lwjgl-glfw:3.2.2": { + "org.lwjgl:lwjgl-glfw:3.2.1": { "name": "org.lwjgl:lwjgl-glfw:3.2.3", "downloads": { "artifact": { @@ -950,7 +1104,7 @@ } } }, - "org.lwjgl:lwjgl-glfw:3.2.2:natives": { + "org.lwjgl:lwjgl-glfw:3.2.1:natives": { "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -961,7 +1115,7 @@ } } }, - "org.lwjgl:lwjgl-stb:3.2.2": { + "org.lwjgl:lwjgl-stb:3.2.1": { "name": "org.lwjgl:lwjgl-stb:3.2.3", "downloads": { "artifact": { @@ -972,7 +1126,7 @@ } } }, - "org.lwjgl:lwjgl-stb:3.2.2:natives": { + "org.lwjgl:lwjgl-stb:3.2.1:natives": { "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -983,7 +1137,7 @@ } } }, - "org.lwjgl:lwjgl-tinyfd:3.2.2": { + "org.lwjgl:lwjgl-tinyfd:3.2.1": { "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", "downloads": { "artifact": { @@ -994,7 +1148,7 @@ } } }, - "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": { "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm32", "downloads": { "artifact": { @@ -1005,74 +1159,228 @@ } } }, - "org.lwjgl:lwjgl:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl:3.2.2": { + "name": "org.lwjgl:lwjgl:3.2.3", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", - "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", - "size": 82374 + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3.jar", + "sha1": "17a59ba0fe8d474ec9dbe0d5db40d2cfe59c4c08", + "size": 552997 } } }, - "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl:3.2.3:natives-linux-arm32", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", - "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", - "size": 136157 + "path": "org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.2.3/lwjgl-3.2.3-natives-linux-arm32.jar", + "sha1": "3180d363040744dfe0c6a0dd5d018cedae476e9a", + "size": 53035 } } }, - "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl-jemalloc:3.2.2": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", - "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", - "size": 400129 + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3.jar", + "sha1": "b6fd0932171ba3f2eaa4547beddca3a3e645342d", + "size": 34130 } } }, - "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.2.3:natives-linux-arm32", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", - "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", - "size": 58474 + "path": "org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.2.3/lwjgl-jemalloc-3.2.3-natives-linux-arm32.jar", + "sha1": "d7e5cecbf045b7b7863343273ffea94e0e2f6994", + "size": 137847 } } }, - "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl-openal:3.2.2": { + "name": "org.lwjgl:lwjgl-openal:3.2.3", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", - "sha1": "816d935933f2dd743074c4e717cc25b55720f294", - "size": 104027 + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3.jar", + "sha1": "106742e805803ab9eab8e343f0fb31a3d263903c", + "size": 79432 } } }, - "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl-openal:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-openal:3.2.3:natives-linux-arm32", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", - "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", - "size": 153889 + "path": "org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.2.3/lwjgl-openal-3.2.3-natives-linux-arm32.jar", + "sha1": "5c30ef08c829252e542f9fbc04772d51013326c5", + "size": 552314 } } }, - "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux-arm32", + "org.lwjgl:lwjgl-opengl:3.2.2": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3.jar", + "sha1": "bdd534a323d0c8f54969b95e424b6ac8984f7d6e", + "size": 936589 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.2.3/lwjgl-opengl-3.2.3-natives-linux-arm32.jar", + "sha1": "4925362a5f2412cb6467e6d6c6de26b9e1ccfc71", + "size": 58594 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3.jar", + "sha1": "5e520d5c290c8b012545a8d34fa5db5ab051ea53", + "size": 107999 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.2.3/lwjgl-glfw-3.2.3-natives-linux-arm32.jar", + "sha1": "aab1a5a1e21eca87f4acd5ba055f6bfd5d90951c", + "size": 138698 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2": { + "name": "org.lwjgl:lwjgl-stb:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3.jar", + "sha1": "40eccaa4fa86fc815f2e17946a392fb5fdcc286a", + "size": 104049 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-stb:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.2.3/lwjgl-stb-3.2.3-natives-linux-arm32.jar", + "sha1": "f28dc1e73025cf699a2cdd4f6db7964ed357ce50", + "size": 146890 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3.jar", + "sha1": "d5edf89c7b6ca1ea20865a6ba0a09bfc5efb29c1", + "size": 6392 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.2.3:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.2.3/lwjgl-tinyfd-3.2.3-natives-linux-arm32.jar", + "sha1": "b3ad16cb0e4c1307bf3d1ecb29559e18a4f8633c", + "size": 38752 + } + } + }, + "org.lwjgl:lwjgl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1-natives-linux-arm32.jar", + "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", + "size": 82374 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1-natives-linux-arm32.jar", + "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", + "size": 136157 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1-natives-linux-arm32.jar", + "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", + "size": 400129 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1-natives-linux-arm32.jar", + "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", + "size": 58474 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1-natives-linux-arm32.jar", + "sha1": "816d935933f2dd743074c4e717cc25b55720f294", + "size": 104027 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.1:natives-linux-arm32", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1-natives-linux-arm32.jar", + "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", + "size": 153889 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux-arm32", "downloads": { "artifact": { "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1-natives-linux-arm32.jar", @@ -1319,6 +1627,104 @@ } }, "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": null, + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", + "size": 724243 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc2", + "downloads": { + "classifiers": { + "linux-mips64el": { + "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc2/lwjgl3-natives-3.3.1-rc2-linux-mips64el.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc2-linux-mips64el/lwjgl3-natives-3.3.1-rc2-linux-mips64el.jar", + "sha1": "babec61846d8feb7a60cce1c9909281b1a3e0640", + "size": 2464146 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-mips64el" + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "sha1": "a817bcf213db49f710603677457567c37d53e103", + "size": 36601 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", + "size": 88237 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", + "size": 921563 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", + "size": 128801 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", + "size": 112380 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", + "size": 6767 + } + } + }, "org.lwjgl:lwjgl:3.2.2": { "name": "org.lwjgl:lwjgl:3.3.1", "downloads": { @@ -1624,7 +2030,111 @@ } }, "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": null, - "org.lwjgl:lwjgl:3.2.2": { + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", + "size": 724243 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc1", + "downloads": { + "classifiers": { + "linux-loongarch64": { + "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1/lwjgl3-natives-3.3.1-rc1-linux-loongarch64.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1-linux-loongarch64/lwjgl3-natives-3.3.1-rc1-linux-loongarch64.jar", + "sha1": "2375ec8e8094a765ef61f3c4f2f832b1b8dfed4b", + "size": 2651163 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-loongarch64" + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "sha1": "a817bcf213db49f710603677457567c37d53e103", + "size": 36601 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": null, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", + "size": 88237 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1:natives": null, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", + "size": 921563 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1:natives": null, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", + "size": 128801 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1:natives": null, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", + "size": 112380 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1:natives": null, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", + "size": 6767 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": null, + "org.lwjgl:lwjgl:3.2.2": { "name": "org.lwjgl:lwjgl:3.3.1", "downloads": { "artifact": { @@ -1995,6 +2505,110 @@ } }, "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": null, + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", + "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", + "size": 724243 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc1", + "downloads": { + "classifiers": { + "linux-loongarch64_ow": { + "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1/lwjgl3-natives-3.3.1-rc1-linux-loongarch64_ow.jar", + "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1-linux-loongarch64_ow/lwjgl3-natives-3.3.1-rc1-linux-loongarch64_ow.jar", + "sha1": "4c7d6978dae411e5041f478d78cc329c4c75fc73", + "size": 2311861 + } + } + }, + "extract": { + "exclude": [ + "META-INF/" + ] + }, + "natives": { + "linux": "linux-loongarch64_ow" + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", + "sha1": "a817bcf213db49f710603677457567c37d53e103", + "size": 36601 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": null, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", + "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", + "size": 88237 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1:natives": null, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", + "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", + "size": 921563 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1:natives": null, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", + "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", + "size": 128801 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1:natives": null, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", + "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", + "size": 112380 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1:natives": null, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", + "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", + "size": 6767 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": null, "org.lwjgl:lwjgl:3.2.2": { "name": "org.lwjgl:lwjgl:3.3.1", "downloads": { @@ -2200,391 +2814,948 @@ }, "linux-riscv64": { "org.lwjgl:lwjgl:3.1.6": { - "name": "org.lwjgl:lwjgl:3.3.1", + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", - "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", - "size": 724243 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, "org.lwjgl:lwjgl:3.1.6:natives": { - "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc1", + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", "downloads": { - "classifiers": { - "linux-riscv64": { - "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1-linux-riscv64/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "sha1": "8544853aa77b10692548b2a728cd890afd740ba5", - "size": 11905844 - } + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 + } + } + }, + "org.lwjgl:lwjgl-openal:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 + } + } + }, + "org.lwjgl:lwjgl-stb:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 + } + } + }, + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 + } + } + }, + "org.lwjgl:lwjgl:3.2.2": { + "name": "org.lwjgl:lwjgl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 + } + } + }, + "org.lwjgl:lwjgl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 + } + } + }, + "org.lwjgl:lwjgl:3.3.1": { + "name": "org.lwjgl:lwjgl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 + } + } + }, + "org.lwjgl:lwjgl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 + } + } + }, + "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 + } + } + }, + "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 + } + } + }, + "org.lwjgl:lwjgl:3.3.2": { + "name": "org.lwjgl:lwjgl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } - }, - "extract": { - "exclude": [ - "META-INF/" - ] - }, - "natives": { - "linux": "linux-riscv64" } }, - "org.lwjgl:lwjgl-jemalloc:3.1.6": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.1", + "org.lwjgl:lwjgl:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", - "sha1": "a817bcf213db49f710603677457567c37d53e103", - "size": 36601 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 } } }, - "org.lwjgl:lwjgl-jemalloc:3.1.6:natives": null, - "org.lwjgl:lwjgl-openal:3.1.6": { - "name": "org.lwjgl:lwjgl-openal:3.3.1", + "org.lwjgl:lwjgl-jemalloc:3.3.2": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", - "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", - "size": 88237 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, - "org.lwjgl:lwjgl-openal:3.1.6:natives": null, - "org.lwjgl:lwjgl-opengl:3.1.6": { - "name": "org.lwjgl:lwjgl-opengl:3.3.1", + "org.lwjgl:lwjgl-jemalloc:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", - "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", - "size": 921563 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 } } }, - "org.lwjgl:lwjgl-opengl:3.1.6:natives": null, - "org.lwjgl:lwjgl-glfw:3.1.6": { - "name": "org.lwjgl:lwjgl-glfw:3.3.1", + "org.lwjgl:lwjgl-openal:3.3.2": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", - "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", - "size": 128801 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, - "org.lwjgl:lwjgl-glfw:3.1.6:natives": null, - "org.lwjgl:lwjgl-stb:3.1.6": { - "name": "org.lwjgl:lwjgl-stb:3.3.1", + "org.lwjgl:lwjgl-openal:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", - "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", - "size": 112380 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 } } }, - "org.lwjgl:lwjgl-stb:3.1.6:natives": null, - "org.lwjgl:lwjgl-tinyfd:3.1.6": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.1", + "org.lwjgl:lwjgl-opengl:3.3.2": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", - "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", - "size": 6767 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, - "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": null, - "org.lwjgl:lwjgl:3.2.2": { - "name": "org.lwjgl:lwjgl:3.3.1", + "org.lwjgl:lwjgl-opengl:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.1/lwjgl-3.3.1.jar", - "sha1": "ae58664f88e18a9bb2c77b063833ca7aaec484cb", - "size": 724243 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 } } }, - "org.lwjgl:lwjgl:3.2.2:natives": { - "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc1", + "org.lwjgl:lwjgl-glfw:3.3.2": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { - "classifiers": { - "linux-riscv64": { - "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1-linux-riscv64/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "sha1": "8544853aa77b10692548b2a728cd890afd740ba5", - "size": 11905844 - } + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } - }, - "extract": { - "exclude": [ - "META-INF/" - ] - }, - "natives": { - "linux": "linux-riscv64" } }, - "org.lwjgl:lwjgl-jemalloc:3.2.2": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.1", + "org.lwjgl:lwjgl-glfw:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.1/lwjgl-jemalloc-3.3.1.jar", - "sha1": "a817bcf213db49f710603677457567c37d53e103", - "size": 36601 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 } } }, - "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": null, - "org.lwjgl:lwjgl-openal:3.2.2": { - "name": "org.lwjgl:lwjgl-openal:3.3.1", + "org.lwjgl:lwjgl-stb:3.3.2": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.1/lwjgl-openal-3.3.1.jar", - "sha1": "2623a6b8ae1dfcd880738656a9f0243d2e6840bd", - "size": 88237 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, - "org.lwjgl:lwjgl-openal:3.2.2:natives": null, - "org.lwjgl:lwjgl-opengl:3.2.2": { - "name": "org.lwjgl:lwjgl-opengl:3.3.1", + "org.lwjgl:lwjgl-stb:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.1/lwjgl-opengl-3.3.1.jar", - "sha1": "831a5533a21a5f4f81bbc51bb13e9899319b5411", - "size": 921563 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 } } }, - "org.lwjgl:lwjgl-opengl:3.2.2:natives": null, - "org.lwjgl:lwjgl-glfw:3.2.2": { - "name": "org.lwjgl:lwjgl-glfw:3.3.1", + "org.lwjgl:lwjgl-tinyfd:3.3.2": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.1/lwjgl-glfw-3.3.1.jar", - "sha1": "cbac1b8d30cb4795149c1ef540f912671a8616d0", - "size": 128801 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, - "org.lwjgl:lwjgl-glfw:3.2.2:natives": null, - "org.lwjgl:lwjgl-stb:3.2.2": { - "name": "org.lwjgl:lwjgl-stb:3.3.1", + "org.lwjgl:lwjgl-tinyfd:3.3.2:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.1/lwjgl-stb-3.3.1.jar", - "sha1": "b119297cf8ed01f247abe8685857f8e7fcf5980f", - "size": 112380 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 } } }, - "org.lwjgl:lwjgl-stb:3.2.2:natives": null, - "org.lwjgl:lwjgl-tinyfd:3.2.2": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.1", + "org.lwjgl:lwjgl:3.3.3": { + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", - "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.1/lwjgl-tinyfd-3.3.1.jar", - "sha1": "0ff1914111ef2e3e0110ef2dabc8d8cdaad82347", - "size": 6767 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, - "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": null, - "org.lwjgl:lwjgl:3.3.1:natives-linux": { - "name": "org.glavo.hmcl:lwjgl3-natives:3.3.1-rc1", + "org.lwjgl:lwjgl:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-linux-riscv64", "downloads": { - "classifiers": { - "linux-riscv64": { - "path": "org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "url": "https://repo1.maven.org/maven2/org/glavo/hmcl/lwjgl3-natives/3.3.1-rc1-linux-riscv64/lwjgl3-natives-3.3.1-rc1-linux-riscv64.jar", - "sha1": "8544853aa77b10692548b2a728cd890afd740ba5", - "size": 11905844 - } + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-linux-riscv64.jar", + "sha1": "3ce36a5c5e6feb61bad2ea1426352482e04c6db1", + "size": 80164 } - }, - "extract": { - "exclude": [ - "META-INF/" - ] - }, - "natives": { - "linux": "linux-riscv64" } }, - "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": null, - "org.lwjgl:lwjgl:3.3.2": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-jemalloc:3.3.3": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "sha1": "7202012cf0cadb9ffad4874494920fd8bbd93413", - "size": 792204 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, - "org.lwjgl:lwjgl:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-jemalloc:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "sha1": "642848dc964fc5332cda40225771a5143740b49c", - "size": 79691 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-linux-riscv64.jar", + "sha1": "6c5d38aad1dbd1c4945bcbe86640e616ceb9588f", + "size": 197209 } } }, - "org.lwjgl:lwjgl-jemalloc:3.3.2": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-openal:3.3.3": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "sha1": "41256f2c098806304fd224613d3d01b02725470e", - "size": 46421 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, - "org.lwjgl:lwjgl-jemalloc:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-openal:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "sha1": "01129d98674994eb8204f62c26b5717d4d989536", - "size": 200633 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-linux-riscv64.jar", + "sha1": "74c5ddf47ad6bee41348bbb0735008694b5315af", + "size": 516661 } } }, - "org.lwjgl:lwjgl-openal:3.3.2": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-opengl:3.3.3": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "sha1": "89d8868c2d688b55e3e923345e4a146c6d034229", - "size": 113094 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, - "org.lwjgl:lwjgl-openal:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-opengl:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "sha1": "bce3174f137d0ffcbbe88ddae305de11c5131137", - "size": 520217 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-linux-riscv64.jar", + "sha1": "6ea07b47dd91af8f3ee4a24ddb3cbf086d157a4e", + "size": 57864 } } }, - "org.lwjgl:lwjgl-opengl:3.3.2": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-glfw:3.3.3": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "sha1": "81d0a7fd96bf5eb6257fddf6b77e338d8918bf32", - "size": 931744 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } } }, - "org.lwjgl:lwjgl-opengl:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-glfw:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "sha1": "13dccf954b781883b0661bd55dfc423f8eece864", - "size": 57244 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-linux-riscv64.jar", + "sha1": "9582481036b6fb762c3f791e2ed26128152a1cec", + "size": 117084 } } }, - "org.lwjgl:lwjgl-glfw:3.3.2": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-stb:3.3.3": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "sha1": "e6dba9ab8532cb6aac273adf26496ce689999943", - "size": 146829 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, - "org.lwjgl:lwjgl-glfw:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-stb:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-linux-riscv64.jar", - "sha1": "865417f4aa171aa8e7a448d88877a82844896c92", - "size": 113875 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-linux-riscv64.jar", + "sha1": "502804ee61eb7adb30bbb5e4459899f9a0cb23cf", + "size": 215885 } } }, - "org.lwjgl:lwjgl-stb:3.3.2": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-tinyfd:3.3.3": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "sha1": "033fe42d1b37e35afd8b6e2653abc77deadb0730", - "size": 143099 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, - "org.lwjgl:lwjgl-stb:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-tinyfd:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-linux-riscv64.jar", - "sha1": "f5b96c0fd649cb1e18816f63bed49e0dfe1d1f1a", - "size": 217005 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-linux-riscv64.jar", + "sha1": "8bec171d3fa4ec3cfc20b4ddd675cb08935bd5f8", + "size": 46550 } } }, - "org.lwjgl:lwjgl-tinyfd:3.3.2": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT", + "org.lwjgl:lwjgl-freetype:3.3.3": { + "name": "org.lwjgl:lwjgl-freetype:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "sha1": "8b7c94a57f56a5b38b23c02c1cada77dccba9930", - "size": 15917 + "path": "org/lwjgl/lwjgl-freetype/3.3.4/lwjgl-freetype-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-freetype/3.3.4/lwjgl-freetype-3.3.4.jar", + "sha1": "23f7bf165068ef2ca80ae1b79fd905af20498600", + "size": 453489 } } }, - "org.lwjgl:lwjgl-tinyfd:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT:natives-linux-riscv64", + "org.lwjgl:lwjgl-freetype:3.3.3:natives-linux": { + "name": "org.lwjgl:lwjgl-freetype:3.3.4:natives-linux-riscv64", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-linux-riscv64.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-linux-riscv64.jar", - "sha1": "f042c17188c5db910b195d298c284bbfbe550c53", - "size": 46885 + "path": "org/lwjgl/lwjgl-freetype/3.3.4/lwjgl-freetype-3.3.4-natives-linux-riscv64.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-freetype/3.3.4/lwjgl-freetype-3.3.4-natives-linux-riscv64.jar", + "sha1": "2cb82939dc283686f9febf5349b66e773f515c59", + "size": 1194584 } } }, @@ -3411,618 +4582,772 @@ }, "freebsd-x86_64": { "org.lwjgl:lwjgl:3.1.6": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "sha1": "7202012cf0cadb9ffad4874494920fd8bbd93413", - "size": 792204 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, "org.lwjgl:lwjgl:3.1.6:natives": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "2d38355b453edfe2daee1a567bcdb82c0485edcf", - "size": 95872 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "sha1": "610d14530e637564d97d74af7cb98a737e70b77b", + "size": 96209 } } }, "org.lwjgl:lwjgl-jemalloc:3.1.6": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "sha1": "41256f2c098806304fd224613d3d01b02725470e", - "size": 46421 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, "org.lwjgl:lwjgl-jemalloc:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "bdba1662b621228679c7aed87945d1f28c590d5b", - "size": 155867 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "sha1": "5ee27f3bad4715067cef0630682da4bb5a1b88ac", + "size": 157297 } } }, "org.lwjgl:lwjgl-openal:3.1.6": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "sha1": "89d8868c2d688b55e3e923345e4a146c6d034229", - "size": 113094 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, "org.lwjgl:lwjgl-openal:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "0fc6495e6752727b629cf03a105c9d56087d4edd", - "size": 597512 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "sha1": "3863f8268f5515c27f1364257f8a018f0c6afa79", + "size": 597486 } } }, "org.lwjgl:lwjgl-opengl:3.1.6": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "sha1": "81d0a7fd96bf5eb6257fddf6b77e338d8918bf32", - "size": 931744 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, "org.lwjgl:lwjgl-opengl:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "d3e8ec997cef8bc66819c7e0ad7a54182f7aff2a", - "size": 81034 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "sha1": "579071d2a3714f5662522f7d3edf58e941580587", + "size": 81028 } } }, "org.lwjgl:lwjgl-glfw:3.1.6": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "sha1": "e6dba9ab8532cb6aac273adf26496ce689999943", - "size": 146829 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } } }, "org.lwjgl:lwjgl-glfw:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "4881a965c7679b4984c0d8a5890f07ea85c653c4", - "size": 101847 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "sha1": "f67b9b6c29451d8fea66db17aaba2f65e908c7e9", + "size": 104415 } } }, "org.lwjgl:lwjgl-stb:3.1.6": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "sha1": "033fe42d1b37e35afd8b6e2653abc77deadb0730", - "size": 143099 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, "org.lwjgl:lwjgl-stb:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "0aad82a857ebb9a3a212dc2c386761d57e11a8f2", - "size": 225735 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "sha1": "f5551338a1e2035ff747053f0e985dc93db1235c", + "size": 226093 } } }, "org.lwjgl:lwjgl-tinyfd:3.1.6": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "sha1": "8b7c94a57f56a5b38b23c02c1cada77dccba9930", - "size": 15917 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, "org.lwjgl:lwjgl-tinyfd:3.1.6:natives": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "sha1": "acd5e1b9b9b99ce4d21867058ee468ee45a859e5", + "size": 40104 + } + } + }, + "org.lwjgl:lwjgl:3.2.1": { + "name": "org.lwjgl:lwjgl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 + } + } + }, + "org.lwjgl:lwjgl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "sha1": "610d14530e637564d97d74af7cb98a737e70b77b", + "size": 96209 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 + } + } + }, + "org.lwjgl:lwjgl-jemalloc:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "sha1": "5ee27f3bad4715067cef0630682da4bb5a1b88ac", + "size": 157297 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1": { + "name": "org.lwjgl:lwjgl-openal:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 + } + } + }, + "org.lwjgl:lwjgl-openal:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "sha1": "3863f8268f5515c27f1364257f8a018f0c6afa79", + "size": 597486 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 + } + } + }, + "org.lwjgl:lwjgl-opengl:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "sha1": "579071d2a3714f5662522f7d3edf58e941580587", + "size": 81028 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 + } + } + }, + "org.lwjgl:lwjgl-glfw:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "sha1": "f67b9b6c29451d8fea66db17aaba2f65e908c7e9", + "size": 104415 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1": { + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "124d0e48ae1584f09e5701588ae8ad139be26003", - "size": 39077 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 + } + } + }, + "org.lwjgl:lwjgl-stb:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "sha1": "f5551338a1e2035ff747053f0e985dc93db1235c", + "size": 226093 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 + } + } + }, + "org.lwjgl:lwjgl-tinyfd:3.2.1:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-freebsd", + "downloads": { + "artifact": { + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "sha1": "acd5e1b9b9b99ce4d21867058ee468ee45a859e5", + "size": 40104 } } }, "org.lwjgl:lwjgl:3.2.2": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "sha1": "7202012cf0cadb9ffad4874494920fd8bbd93413", - "size": 792204 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, "org.lwjgl:lwjgl:3.2.2:natives": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "2d38355b453edfe2daee1a567bcdb82c0485edcf", - "size": 95872 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "sha1": "610d14530e637564d97d74af7cb98a737e70b77b", + "size": 96209 } } }, "org.lwjgl:lwjgl-jemalloc:3.2.2": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "sha1": "41256f2c098806304fd224613d3d01b02725470e", - "size": 46421 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, "org.lwjgl:lwjgl-jemalloc:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "bdba1662b621228679c7aed87945d1f28c590d5b", - "size": 155867 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "sha1": "5ee27f3bad4715067cef0630682da4bb5a1b88ac", + "size": 157297 } } }, "org.lwjgl:lwjgl-openal:3.2.2": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "sha1": "89d8868c2d688b55e3e923345e4a146c6d034229", - "size": 113094 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, "org.lwjgl:lwjgl-openal:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "0fc6495e6752727b629cf03a105c9d56087d4edd", - "size": 597512 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "sha1": "3863f8268f5515c27f1364257f8a018f0c6afa79", + "size": 597486 } } }, "org.lwjgl:lwjgl-opengl:3.2.2": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "sha1": "81d0a7fd96bf5eb6257fddf6b77e338d8918bf32", - "size": 931744 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, "org.lwjgl:lwjgl-opengl:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "d3e8ec997cef8bc66819c7e0ad7a54182f7aff2a", - "size": 81034 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "sha1": "579071d2a3714f5662522f7d3edf58e941580587", + "size": 81028 } } }, "org.lwjgl:lwjgl-glfw:3.2.2": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "sha1": "e6dba9ab8532cb6aac273adf26496ce689999943", - "size": 146829 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } } }, "org.lwjgl:lwjgl-glfw:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "4881a965c7679b4984c0d8a5890f07ea85c653c4", - "size": 101847 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "sha1": "f67b9b6c29451d8fea66db17aaba2f65e908c7e9", + "size": 104415 } } }, "org.lwjgl:lwjgl-stb:3.2.2": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "sha1": "033fe42d1b37e35afd8b6e2653abc77deadb0730", - "size": 143099 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, "org.lwjgl:lwjgl-stb:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "0aad82a857ebb9a3a212dc2c386761d57e11a8f2", - "size": 225735 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "sha1": "f5551338a1e2035ff747053f0e985dc93db1235c", + "size": 226093 } } }, "org.lwjgl:lwjgl-tinyfd:3.2.2": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "sha1": "8b7c94a57f56a5b38b23c02c1cada77dccba9930", - "size": 15917 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, "org.lwjgl:lwjgl-tinyfd:3.2.2:natives": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT:natives-freebsd", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "124d0e48ae1584f09e5701588ae8ad139be26003", - "size": 39077 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "sha1": "acd5e1b9b9b99ce4d21867058ee468ee45a859e5", + "size": 40104 } } }, "org.lwjgl:lwjgl:3.3.1": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "sha1": "7202012cf0cadb9ffad4874494920fd8bbd93413", - "size": 792204 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, - "org.lwjgl:lwjgl:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl:3.3.1:natives": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "2d38355b453edfe2daee1a567bcdb82c0485edcf", - "size": 95872 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "sha1": "610d14530e637564d97d74af7cb98a737e70b77b", + "size": 96209 } } }, "org.lwjgl:lwjgl-jemalloc:3.3.1": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "sha1": "41256f2c098806304fd224613d3d01b02725470e", - "size": 46421 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, - "org.lwjgl:lwjgl-jemalloc:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-jemalloc:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "bdba1662b621228679c7aed87945d1f28c590d5b", - "size": 155867 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "sha1": "5ee27f3bad4715067cef0630682da4bb5a1b88ac", + "size": 157297 } } }, "org.lwjgl:lwjgl-openal:3.3.1": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "sha1": "89d8868c2d688b55e3e923345e4a146c6d034229", - "size": 113094 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, - "org.lwjgl:lwjgl-openal:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-openal:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "0fc6495e6752727b629cf03a105c9d56087d4edd", - "size": 597512 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "sha1": "3863f8268f5515c27f1364257f8a018f0c6afa79", + "size": 597486 } } }, "org.lwjgl:lwjgl-opengl:3.3.1": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "sha1": "81d0a7fd96bf5eb6257fddf6b77e338d8918bf32", - "size": 931744 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, - "org.lwjgl:lwjgl-opengl:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-opengl:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "d3e8ec997cef8bc66819c7e0ad7a54182f7aff2a", - "size": 81034 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "sha1": "579071d2a3714f5662522f7d3edf58e941580587", + "size": 81028 } } }, "org.lwjgl:lwjgl-glfw:3.3.1": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "sha1": "e6dba9ab8532cb6aac273adf26496ce689999943", - "size": 146829 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } } }, - "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-glfw:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "4881a965c7679b4984c0d8a5890f07ea85c653c4", - "size": 101847 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "sha1": "f67b9b6c29451d8fea66db17aaba2f65e908c7e9", + "size": 104415 } } }, "org.lwjgl:lwjgl-stb:3.3.1": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "sha1": "033fe42d1b37e35afd8b6e2653abc77deadb0730", - "size": 143099 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, - "org.lwjgl:lwjgl-stb:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-stb:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "0aad82a857ebb9a3a212dc2c386761d57e11a8f2", - "size": 225735 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "sha1": "f5551338a1e2035ff747053f0e985dc93db1235c", + "size": 226093 } } }, "org.lwjgl:lwjgl-tinyfd:3.3.1": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "sha1": "8b7c94a57f56a5b38b23c02c1cada77dccba9930", - "size": 15917 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, - "org.lwjgl:lwjgl-tinyfd:3.3.1:natives-linux": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-tinyfd:3.3.1:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "124d0e48ae1584f09e5701588ae8ad139be26003", - "size": 39077 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "sha1": "acd5e1b9b9b99ce4d21867058ee468ee45a859e5", + "size": 40104 } } }, "org.lwjgl:lwjgl:3.3.2": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4.jar", - "sha1": "7202012cf0cadb9ffad4874494920fd8bbd93413", - "size": 792204 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4.jar", + "sha1": "b86c3e4832426e8a6b466013b7cb34b40e9ce956", + "size": 800127 } } }, - "org.lwjgl:lwjgl:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl:3.3.2:natives": { + "name": "org.lwjgl:lwjgl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl/3.3.4-SNAPSHOT/lwjgl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "2d38355b453edfe2daee1a567bcdb82c0485edcf", - "size": 95872 + "path": "org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl/3.3.4/lwjgl-3.3.4-natives-freebsd.jar", + "sha1": "610d14530e637564d97d74af7cb98a737e70b77b", + "size": 96209 } } }, "org.lwjgl:lwjgl-jemalloc:3.3.2": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4.jar", - "sha1": "41256f2c098806304fd224613d3d01b02725470e", - "size": 46421 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4.jar", + "sha1": "e3f5dcb8e13f3a5ed3f740fd30a114cee2a80bc4", + "size": 46430 } } }, - "org.lwjgl:lwjgl-jemalloc:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-jemalloc:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-jemalloc:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-jemalloc:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-jemalloc/3.3.4-SNAPSHOT/lwjgl-jemalloc-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "bdba1662b621228679c7aed87945d1f28c590d5b", - "size": 155867 + "path": "org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-jemalloc/3.3.4/lwjgl-jemalloc-3.3.4-natives-freebsd.jar", + "sha1": "5ee27f3bad4715067cef0630682da4bb5a1b88ac", + "size": 157297 } } }, "org.lwjgl:lwjgl-openal:3.3.2": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-openal:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4.jar", - "sha1": "89d8868c2d688b55e3e923345e4a146c6d034229", - "size": 113094 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4.jar", + "sha1": "9b74d3ea380c83353d42af43ad9659e04dabe84a", + "size": 113103 } } }, - "org.lwjgl:lwjgl-openal:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-openal:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-openal:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-openal:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-openal/3.3.4-SNAPSHOT/lwjgl-openal-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "0fc6495e6752727b629cf03a105c9d56087d4edd", - "size": 597512 + "path": "org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-openal/3.3.4/lwjgl-openal-3.3.4-natives-freebsd.jar", + "sha1": "3863f8268f5515c27f1364257f8a018f0c6afa79", + "size": 597486 } } }, "org.lwjgl:lwjgl-opengl:3.3.2": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-opengl:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4.jar", - "sha1": "81d0a7fd96bf5eb6257fddf6b77e338d8918bf32", - "size": 931744 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4.jar", + "sha1": "2852ac7d9f6fc71349f1ce28e2708ff1977f18af", + "size": 931960 } } }, - "org.lwjgl:lwjgl-opengl:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-opengl:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-opengl:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-opengl:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-opengl/3.3.4-SNAPSHOT/lwjgl-opengl-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "d3e8ec997cef8bc66819c7e0ad7a54182f7aff2a", - "size": 81034 + "path": "org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-opengl/3.3.4/lwjgl-opengl-3.3.4-natives-freebsd.jar", + "sha1": "579071d2a3714f5662522f7d3edf58e941580587", + "size": 81028 } } }, "org.lwjgl:lwjgl-glfw:3.3.2": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-glfw:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4.jar", - "sha1": "e6dba9ab8532cb6aac273adf26496ce689999943", - "size": 146829 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4.jar", + "sha1": "7e46ecdec85db8738053cfde1414352cd62dab74", + "size": 147044 } } }, - "org.lwjgl:lwjgl-glfw:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-glfw:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-glfw:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-glfw:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-glfw/3.3.4-SNAPSHOT/lwjgl-glfw-3.3.4-20231218.151521-4-natives-freebsd.jar", - "sha1": "4881a965c7679b4984c0d8a5890f07ea85c653c4", - "size": 101847 + "path": "org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-glfw/3.3.4/lwjgl-glfw-3.3.4-natives-freebsd.jar", + "sha1": "f67b9b6c29451d8fea66db17aaba2f65e908c7e9", + "size": 104415 } } }, "org.lwjgl:lwjgl-stb:3.3.2": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-stb:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3.jar", - "sha1": "033fe42d1b37e35afd8b6e2653abc77deadb0730", - "size": 143099 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4.jar", + "sha1": "5821735d5ef23f6da8542887344e57eb181b7cac", + "size": 143112 } } }, - "org.lwjgl:lwjgl-stb:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-stb:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-stb:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-stb:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-stb/3.3.4-SNAPSHOT/lwjgl-stb-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "0aad82a857ebb9a3a212dc2c386761d57e11a8f2", - "size": 225735 + "path": "org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-stb/3.3.4/lwjgl-stb-3.3.4-natives-freebsd.jar", + "sha1": "f5551338a1e2035ff747053f0e985dc93db1235c", + "size": 226093 } } }, "org.lwjgl:lwjgl-tinyfd:3.3.2": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT", + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3.jar", - "sha1": "8b7c94a57f56a5b38b23c02c1cada77dccba9930", - "size": 15917 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4.jar", + "sha1": "2d73789ffd8962b38d9d599cc38b2383ce818c7a", + "size": 15928 } } }, - "org.lwjgl:lwjgl-tinyfd:3.3.2:natives-linux": { - "name": "org.lwjgl:lwjgl-tinyfd:3.3.4-SNAPSHOT:natives-freebsd", + "org.lwjgl:lwjgl-tinyfd:3.3.2:natives": { + "name": "org.lwjgl:lwjgl-tinyfd:3.3.4:natives-freebsd", "downloads": { "artifact": { - "path": "org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "url": "https://oss.sonatype.org/content/repositories/snapshots/org/lwjgl/lwjgl-tinyfd/3.3.4-SNAPSHOT/lwjgl-tinyfd-3.3.4-20231218.151521-3-natives-freebsd.jar", - "sha1": "124d0e48ae1584f09e5701588ae8ad139be26003", - "size": 39077 + "path": "org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "url": "https://repo1.maven.org/maven2/org/lwjgl/lwjgl-tinyfd/3.3.4/lwjgl-tinyfd-3.3.4-natives-freebsd.jar", + "sha1": "acd5e1b9b9b99ce4d21867058ee468ee45a859e5", + "size": 40104 } } }, diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java index 79e4a32d10..214f062de0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftService.java @@ -21,8 +21,10 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; -import org.jackhuang.hmcl.auth.*; +import org.jackhuang.hmcl.auth.AuthenticationException; import org.jackhuang.hmcl.auth.OAuth; +import org.jackhuang.hmcl.auth.ServerDisconnectException; +import org.jackhuang.hmcl.auth.ServerResponseMalformedException; import org.jackhuang.hmcl.auth.yggdrasil.CompleteGameProfile; import org.jackhuang.hmcl.auth.yggdrasil.RemoteAuthenticationException; import org.jackhuang.hmcl.auth.yggdrasil.Texture; @@ -44,8 +46,8 @@ import static java.util.Objects.requireNonNull; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.threadPool; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public class MicrosoftService { private static final String SCOPE = "XboxLive.signin offline_access"; @@ -110,30 +112,40 @@ private String getUhs(XBoxLiveAuthenticationResponse response, String existingUh } private MicrosoftSession authenticateViaLiveAccessToken(String liveAccessToken, String liveRefreshToken) throws IOException, JsonParseException, AuthenticationException { - // Authenticate with XBox Live - XBoxLiveAuthenticationResponse xboxResponse = HttpRequest - .POST("https://user.auth.xboxlive.com/user/authenticate") - .json(mapOf( - pair("Properties", - mapOf(pair("AuthMethod", "RPS"), pair("SiteName", "user.auth.xboxlive.com"), - pair("RpsTicket", "d=" + liveAccessToken))), - pair("RelyingParty", "http://auth.xboxlive.com"), pair("TokenType", "JWT"))) - .retry(5) - .accept("application/json").getJson(XBoxLiveAuthenticationResponse.class); - - String uhs = getUhs(xboxResponse, null); - - // Authenticate Minecraft with XSTS - XBoxLiveAuthenticationResponse minecraftXstsResponse = HttpRequest - .POST("https://xsts.auth.xboxlive.com/xsts/authorize") - .json(mapOf( - pair("Properties", - mapOf(pair("SandboxId", "RETAIL"), - pair("UserTokens", Collections.singletonList(xboxResponse.token)))), - pair("RelyingParty", "rp://api.minecraftservices.com/"), pair("TokenType", "JWT"))) - .ignoreHttpErrorCode(401) - .retry(5) - .getJson(XBoxLiveAuthenticationResponse.class); + String uhs; + XBoxLiveAuthenticationResponse xboxResponse, minecraftXstsResponse; + try { + // Authenticate with XBox Live + xboxResponse = HttpRequest + .POST("https://user.auth.xboxlive.com/user/authenticate") + .json(mapOf( + pair("Properties", + mapOf(pair("AuthMethod", "RPS"), pair("SiteName", "user.auth.xboxlive.com"), + pair("RpsTicket", "d=" + liveAccessToken))), + pair("RelyingParty", "http://auth.xboxlive.com"), pair("TokenType", "JWT"))) + .retry(5) + .accept("application/json") + .getJson(XBoxLiveAuthenticationResponse.class); + + uhs = getUhs(xboxResponse, null); + + minecraftXstsResponse = HttpRequest + .POST("https://xsts.auth.xboxlive.com/xsts/authorize") + .json(mapOf( + pair("Properties", + mapOf(pair("SandboxId", "RETAIL"), + pair("UserTokens", Collections.singletonList(xboxResponse.token)))), + pair("RelyingParty", "rp://api.minecraftservices.com/"), pair("TokenType", "JWT"))) + .ignoreHttpErrorCode(401) + .retry(5) + .getJson(XBoxLiveAuthenticationResponse.class); + } catch (ResponseCodeException e) { + if (e.getResponseCode() == 400) { + throw new XBox400Exception(); + } + + throw e; + } getUhs(minecraftXstsResponse, uhs); @@ -290,6 +302,9 @@ public String getRedirect() { public static final long ADD_FAMILY = 2148916238L; } + public static class XBox400Exception extends AuthenticationException { + } + public static class NoMinecraftJavaEditionProfileException extends AuthenticationException { } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java index 22fd566b1a..3e4c491c11 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/microsoft/MicrosoftSession.java @@ -18,8 +18,8 @@ package org.jackhuang.hmcl.auth.microsoft; import org.jackhuang.hmcl.auth.AuthInfo; -import org.jackhuang.hmcl.util.logging.Logger; import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; +import org.jackhuang.hmcl.util.logging.Logger; import java.util.Map; import java.util.UUID; @@ -87,7 +87,7 @@ public static MicrosoftSession fromStorage(Map storage) { .orElseThrow(() -> new IllegalArgumentException("accessToken is missing")); String refreshToken = tryCast(storage.get("refreshToken"), String.class) .orElseThrow(() -> new IllegalArgumentException("refreshToken is missing")); - Long notAfter = tryCast(storage.get("notAfter"), Long.class).orElse(0L); + Long notAfter = tryCast(storage.get("notAfter"), Number.class).map(Number::longValue).orElse(0L); String userId = tryCast(storage.get("userid"), String.class) .orElseThrow(() -> new IllegalArgumentException("userid is missing")); return new MicrosoftSession(tokenType, accessToken, notAfter, refreshToken, new User(userId), new GameProfile(uuid, name)); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index d63d7d156e..ef37315eee 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -21,6 +21,7 @@ import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.util.Immutable; +import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.Validation; import org.jackhuang.hmcl.util.io.HttpRequest; @@ -30,13 +31,16 @@ import java.time.Instant; import java.time.format.DateTimeParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import static org.jackhuang.hmcl.util.Lang.mapOf; import static org.jackhuang.hmcl.util.Lang.wrap; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; public final class ForgeBMCLVersionList extends VersionList { private final String apiRoot; @@ -63,10 +67,27 @@ public CompletableFuture refreshAsync() { throw new UnsupportedOperationException("ForgeBMCLVersionList does not support loading the entire Forge remote version list."); } + private static String toLookupVersion(String gameVersion) { + return "1.7.10-pre4".equals(gameVersion) ? "1.7.10_pre4" : gameVersion; + } + + private static String fromLookupVersion(String lookupVersion) { + return "1.7.10_pre4".equals(lookupVersion) ? "1.7.10-pre4" : lookupVersion; + } + + private static String toLookupBranch(String gameVersion, String branch) { + if ("1.7.10-pre4".equals(gameVersion)) { + return "prerelease"; + } + return Lang.requireNonNullElse(branch, ""); + } + @Override public CompletableFuture refreshAsync(String gameVersion) { + String lookupVersion = toLookupVersion(gameVersion); + return CompletableFuture.completedFuture(null) - .thenApplyAsync(wrap(unused -> HttpRequest.GET(apiRoot + "/forge/minecraft/" + gameVersion).>getJson(new TypeToken>() { + .thenApplyAsync(wrap(unused -> HttpRequest.GET(apiRoot + "/forge/minecraft/" + lookupVersion).>getJson(new TypeToken>() { }.getType()))) .thenAcceptAsync(forgeVersions -> { lock.writeLock().lock(); @@ -80,16 +101,17 @@ public CompletableFuture refreshAsync(String gameVersion) { List urls = new ArrayList<>(); for (ForgeVersion.File file : version.getFiles()) if ("installer".equals(file.getCategory()) && "jar".equals(file.getFormat())) { - String classifier = gameVersion + "-" + version.getVersion() - + (StringUtils.isNotBlank(version.getBranch()) ? "-" + version.getBranch() : ""); + String branch = toLookupBranch(gameVersion, version.getBranch()); + + String classifier = lookupVersion + "-" + version.getVersion() + (branch.isEmpty() ? "" : '-' + branch); String fileName1 = "forge-" + classifier + "-" + file.getCategory() + "." + file.getFormat(); - String fileName2 = "forge-" + classifier + "-" + gameVersion + "-" + file.getCategory() + "." + file.getFormat(); + String fileName2 = "forge-" + classifier + "-" + lookupVersion + "-" + file.getCategory() + "." + file.getFormat(); urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1); - urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "-" + gameVersion + "/" + fileName2); + urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "-" + lookupVersion + "/" + fileName2); urls.add(NetworkUtils.withQuery("https://bmclapi2.bangbang93.com/forge/download", mapOf( pair("mcversion", version.getGameVersion()), pair("version", version.getVersion()), - pair("branch", version.getBranch()), + pair("branch", branch), pair("category", file.getCategory()), pair("format", file.getFormat()) ))); @@ -108,7 +130,7 @@ public CompletableFuture refreshAsync(String gameVersion) { } versions.put(gameVersion, new ForgeRemoteVersion( - version.getGameVersion(), version.getVersion(), releaseDate, urls)); + fromLookupVersion(version.getGameVersion()), version.getVersion(), releaseDate, urls)); } } finally { lock.writeLock().unlock(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java index 793a6b1223..f177e13482 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameLibrariesTask.java @@ -134,7 +134,7 @@ public void execute() throws IOException { } } } - if (shouldDownloadLibrary(gameRepository, version, library, integrityCheck) && library.hasDownloadURL()) { + if (shouldDownloadLibrary(gameRepository, version, library, integrityCheck) && (library.hasDownloadURL() || !"optifine".equals(library.getGroupId()))) { dependencies.add(new LibraryDownloadTask(dependencyManager, file, library)); } else { dependencyManager.getCacheRepository().tryCacheLibrary(library, file.toPath()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java index 10f08fdceb..89e87fc49b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/JavaRepository.java @@ -57,7 +57,7 @@ public static Stream> findMinecraftRuntimeDirs() { "Minecraft Launcher\\runtime")); case LINUX: case FREEBSD: - return Stream.of(FileUtils.tryGetPath(System.getProperty("user.home", ".minecraft/runtime"))); + return Stream.of(FileUtils.tryGetPath(System.getProperty("user.home"), ".minecraft/runtime")); case OSX: return Stream.of(FileUtils.tryGetPath(System.getProperty("user.home"), "Library/Application Support/minecraft/runtime")); default: diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java index fc4292bce6..2496b14574 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeOfficialVersionList.java @@ -56,7 +56,9 @@ public CompletableFuture refreshAsync() { } for (String version : results[1].versions) { - String mcVersion = "1." + version.substring(0, version.indexOf('.', version.indexOf('.') + 1)); + int si1 = version.indexOf('.'), si2 = version.indexOf('.', version.indexOf('.') + 1); + String mcVersion = "1." + version.substring(0, Integer.parseInt(version.substring(si1 + 1, si2)) == 0 ? si1 : si2); + versions.put(mcVersion, new NeoForgeRemoteVersion( mcVersion, NeoForgeRemoteVersion.normalize(version), Collections.singletonList( diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java index 47aeb340ee..af5f8b7546 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.download.optifine; +import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.download.VersionList; import org.jackhuang.hmcl.util.StringUtils; @@ -30,7 +31,6 @@ import java.util.concurrent.CompletableFuture; /** - * * @author huangyuhui */ public final class OptiFineBMCLVersionList extends VersionList { @@ -48,34 +48,123 @@ public boolean hasType() { return true; } + private String fromLookupVersion(String version) { + switch (version) { + case "1.8.0": + return "1.8"; + case "1.9.0": + return "1.9"; + default: + return version; + } + } + + private String toLookupVersion(String version) { + switch (version) { + case "1.8": + return "1.8.0"; + case "1.9": + return "1.9.0"; + default: + return version; + } + } + @Override public CompletableFuture refreshAsync() { return HttpRequest.GET(apiRoot + "/optifine/versionlist").>getJsonAsync(new TypeToken>() { - }.getType()) - .thenAcceptAsync(root -> { - lock.writeLock().lock(); - - try { - versions.clear(); - Set duplicates = new HashSet<>(); - for (OptiFineVersion element : root) { - String version = element.getType() + "_" + element.getPatch(); - String mirror = "https://bmclapi2.bangbang93.com/optifine/" + element.getGameVersion() + "/" + element.getType() + "/" + element.getPatch(); - if (!duplicates.add(mirror)) - continue; - - boolean isPre = element.getPatch() != null && (element.getPatch().startsWith("pre") || element.getPatch().startsWith("alpha")); - - if (StringUtils.isBlank(element.getGameVersion())) - continue; - - String gameVersion = VersionNumber.normalize(element.getGameVersion()); - versions.put(gameVersion, new OptiFineRemoteVersion(gameVersion, version, Collections.singletonList(mirror), isPre)); - } - } finally { - lock.writeLock().unlock(); - } - }); + }.getType()).thenAcceptAsync(root -> { + lock.writeLock().lock(); + + try { + versions.clear(); + Set duplicates = new HashSet<>(); + for (OptiFineVersion element : root) { + String version = element.getType() + "_" + element.getPatch(); + String mirror = "https://bmclapi2.bangbang93.com/optifine/" + toLookupVersion(element.getGameVersion()) + "/" + element.getType() + "/" + element.getPatch(); + if (!duplicates.add(mirror)) + continue; + + boolean isPre = element.getPatch() != null && (element.getPatch().startsWith("pre") || element.getPatch().startsWith("alpha")); + + if (StringUtils.isBlank(element.getGameVersion())) + continue; + + String gameVersion = VersionNumber.normalize(fromLookupVersion(element.getGameVersion())); + versions.put(gameVersion, new OptiFineRemoteVersion(gameVersion, version, Collections.singletonList(mirror), isPre)); + } + } finally { + lock.writeLock().unlock(); + } + }); } + /** + * @author huangyuhui + */ + private static final class OptiFineVersion { + + @SerializedName("dl") + private final String downloadLink; + + @SerializedName("ver") + private final String version; + + @SerializedName("date") + private final String date; + + @SerializedName("type") + private final String type; + + @SerializedName("patch") + private final String patch; + + @SerializedName("mirror") + private final String mirror; + + @SerializedName("mcversion") + private final String gameVersion; + + public OptiFineVersion() { + this(null, null, null, null, null, null, null); + } + + public OptiFineVersion(String downloadLink, String version, String date, String type, String patch, String mirror, String gameVersion) { + this.downloadLink = downloadLink; + this.version = version; + this.date = date; + this.type = type; + this.patch = patch; + this.mirror = mirror; + this.gameVersion = gameVersion; + } + + public String getDownloadLink() { + return downloadLink; + } + + public String getVersion() { + return version; + } + + public String getDate() { + return date; + } + + public String getType() { + return type; + } + + public String getPatch() { + return patch; + } + + public String getMirror() { + return mirror; + } + + public String getGameVersion() { + return gameVersion; + } + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineVersion.java deleted file mode 100644 index a18fe1b4fb..0000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineVersion.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.download.optifine; - -import com.google.gson.annotations.SerializedName; - -/** - * - * @author huangyuhui - */ -public final class OptiFineVersion { - - @SerializedName("dl") - private final String downloadLink; - - @SerializedName("ver") - private final String version; - - @SerializedName("date") - private final String date; - - @SerializedName("type") - private final String type; - - @SerializedName("patch") - private final String patch; - - @SerializedName("mirror") - private final String mirror; - - @SerializedName("mcversion") - private final String gameVersion; - - public OptiFineVersion() { - this(null, null, null, null, null, null, null); - } - - public OptiFineVersion(String downloadLink, String version, String date, String type, String patch, String mirror, String gameVersion) { - this.downloadLink = downloadLink; - this.version = version; - this.date = date; - this.type = type; - this.patch = patch; - this.mirror = mirror; - this.gameVersion = gameVersion; - } - - public String getDownloadLink() { - return downloadLink; - } - - public String getVersion() { - return version; - } - - public String getDate() { - return date; - } - - public String getType() { - return type; - } - - public String getPatch() { - return patch; - } - - public String getMirror() { - return mirror; - } - - public String getGameVersion() { - return gameVersion; - } -} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java index b50bdd83c8..16bda75f0f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java @@ -296,8 +296,8 @@ protected Version resolve(VersionProvider provider, Set resolvedSoFar) t } if (patches == null) { - // This is a version from external launcher. - thisVersion = thisVersion.merge(this, true); + // This is a version from external launcher. NO need to resolve the patches. + return thisVersion; } else if (!patches.isEmpty()) { // Assume patches themselves do not have patches recursively. List sortedPatches = patches.stream() diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java index 2b6c031326..5bda19051e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/curse/CurseForgeRemoteModRepository.java @@ -94,6 +94,10 @@ private String toSortOrder(SortOrder sortOrder) { return "asc"; } + private int calculateTotalPages(Response> response, int pageSize) { + return (int) Math.ceil((double) Math.min(response.pagination.totalCount, 10000) / pageSize); + } + @Override public SearchResult search(String gameVersion, @Nullable RemoteModRepository.Category category, int pageOffset, int pageSize, String searchFilter, SortType sortType, SortOrder sortOrder) throws IOException { int categoryId = 0; @@ -112,7 +116,7 @@ public SearchResult search(String gameVersion, @Nullable RemoteModRepository.Cat .getJson(new TypeToken>>() { }.getType()); if (searchFilter.isEmpty()) { - return new SearchResult(response.getData().stream().map(CurseAddon::toMod), (int)Math.ceil((double)response.pagination.totalCount / pageSize)); + return new SearchResult(response.getData().stream().map(CurseAddon::toMod), calculateTotalPages(response, pageSize)); } // https://github.com/HMCL-dev/HMCL/issues/1549 @@ -135,7 +139,7 @@ public SearchResult search(String gameVersion, @Nullable RemoteModRepository.Cat } return pair(remoteMod, diff); - }).sorted(Comparator.comparingInt(Pair::getValue)).map(Pair::getKey), response.getData().stream().map(CurseAddon::toMod), response.pagination.totalCount); + }).sorted(Comparator.comparingInt(Pair::getValue)).map(Pair::getKey), response.getData().stream().map(CurseAddon::toMod), calculateTotalPages(response, pageSize)); } @Override @@ -156,7 +160,7 @@ public Optional getRemoteVersionByLocalFile(LocalModFile loca long hash = Integer.toUnsignedLong(MurmurHash2.hash32(baos.toByteArray(), baos.size(), 1)); - Response response = HttpRequest.POST(PREFIX + "/v1/fingerprints") + Response response = HttpRequest.POST(PREFIX + "/v1/fingerprints/432") .json(mapOf(pair("fingerprints", Collections.singletonList(hash)))) .header("X-API-KEY", apiKey) .getJson(new TypeToken>() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java index 4cc9e06329..d20a542ac9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthRemoteModRepository.java @@ -95,7 +95,7 @@ public SearchResult search(String gameVersion, @Nullable RemoteModRepository.Cat Response response = HttpRequest.GET(NetworkUtils.withQuery(PREFIX + "/v2/search", query)) .getJson(new TypeToken>() { }.getType()); - return new SearchResult(response.getHits().stream().map(ProjectSearchResult::toMod), (int)Math.ceil((double)response.totalHits / pageSize)); + return new SearchResult(response.getHits().stream().map(ProjectSearchResult::toMod), (int) Math.ceil((double) response.totalHits / pageSize)); } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java index c8dbc8792c..29dd6d5046 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/HttpRequest.java @@ -187,13 +187,18 @@ public String getString() throws IOException { os.write(bytes); } + URL url = new URL(this.url); + if (responseCodeTester != null) { - responseCodeTester.accept(new URL(url), con.getResponseCode()); + responseCodeTester.accept(url, con.getResponseCode()); } else { if (con.getResponseCode() / 100 != 2) { if (!ignoreHttpCode && !toleratedHttpCodes.contains(con.getResponseCode())) { - String data = NetworkUtils.readData(con); - throw new ResponseCodeException(new URL(url), con.getResponseCode(), data); + try { + throw new ResponseCodeException(url, con.getResponseCode(), NetworkUtils.readData(con)); + } catch (IOException e) { + throw new ResponseCodeException(url, con.getResponseCode(), e); + } } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/ResponseCodeException.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/ResponseCodeException.java index 19d4d9a3fd..b386497646 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/ResponseCodeException.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/ResponseCodeException.java @@ -33,6 +33,13 @@ public ResponseCodeException(URL url, int responseCode) { this.data = null; } + public ResponseCodeException(URL url, int responseCode, Throwable cause) { + super("Unable to request url " + url + ", response code: " + responseCode, cause); + this.url = url; + this.responseCode = responseCode; + this.data = null; + } + public ResponseCodeException(URL url, int responseCode, String data) { super("Unable to request url " + url + ", response code: " + responseCode + ", data: " + data); this.url = url; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/GameVersionNumber.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/GameVersionNumber.java index 65564db578..fff98ea6aa 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/GameVersionNumber.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/GameVersionNumber.java @@ -1,3 +1,20 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2024 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.jackhuang.hmcl.util.versioning; import org.jetbrains.annotations.NotNull; @@ -10,6 +27,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * @author Glavo + */ public abstract class GameVersionNumber implements Comparable { public static String[] getDefaultGameVersions() { @@ -22,26 +42,21 @@ public static GameVersionNumber asGameVersion(String version) { char ch = version.charAt(0); switch (ch) { case 'r': - return Old.parsePreClassic(version); case 'a': case 'b': case 'c': - return Old.parseAlphaBetaClassic(version); case 'i': - return Old.parseInfdev(version); + return Old.parse(version); } - if (version.equals("0.0")) { + if (version.equals("0.0")) return Release.ZERO; - } - if (version.startsWith("1.")) { + if (version.startsWith("1.")) return Release.parse(version); - } - if (version.length() == 6 && version.charAt(2) == 'w') { + if (version.length() == 6 && version.charAt(2) == 'w') return Snapshot.parse(version); - } } } catch (IllegalArgumentException ignore) { } @@ -97,9 +112,8 @@ public int compareTo(@NotNull String other) { @Override public int compareTo(@NotNull GameVersionNumber other) { - if (this.getType() != other.getType()) { + if (this.getType() != other.getType()) return Integer.compare(this.getType().ordinal(), other.getType().ordinal()); - } return compareToImpl(other); } @@ -110,27 +124,25 @@ public String toString() { } static final class Old extends GameVersionNumber { - - private static final Pattern PATTERN = Pattern.compile("[abc](?[0-9]+)\\.(?[0-9]+)(\\.(?[0-9]+))?([^0-9]*(?[0-9]+).*)?"); - - static Old parsePreClassic(String value) { - int version; - try { - version = Integer.parseInt(value.substring("rd-".length())); - } catch (NumberFormatException e) { - throw new IllegalArgumentException(e); - } - return new Old(value, Type.PRE_CLASSIC, version, 0, 0, 0); - } - - static Old parseAlphaBetaClassic(String value) { - Matcher matcher = PATTERN.matcher(value); - if (!matcher.matches()) { - throw new IllegalArgumentException(value); - } - + static Old parse(String value) { Type type; + int prefixLength = 1; switch (value.charAt(0)) { + case 'r': + if (!value.startsWith("rd-")) { + throw new IllegalArgumentException(value); + } + + type = Type.PRE_CLASSIC; + prefixLength = "rd-".length(); + break; + case 'i': + if (!value.startsWith("inf-")) { + throw new IllegalArgumentException(value); + } + type = Type.INFDEV; + prefixLength = "inf-".length(); + break; case 'a': type = Type.ALPHA; break; @@ -141,60 +153,22 @@ static Old parseAlphaBetaClassic(String value) { type = Type.CLASSIC; break; default: - throw new AssertionError(value); - } - - int major = Integer.parseInt(matcher.group("major")); - int minor = Integer.parseInt(matcher.group("minor")); - - String patchString = matcher.group("patch"); - int patch = patchString != null ? Integer.parseInt(patchString) : 0; - - String additionalString = matcher.group("additional"); - int additional = additionalString != null ? Integer.parseInt(additionalString) : 0; - - return new Old(value, type, major, minor, patch, additional); - } - - static Old parseInfdev(String value) { - String version = value.substring("inf-".length()); - int major; - int patch; - - try { - major = Integer.parseInt(version); - patch = 0; - } catch (NumberFormatException e) { - int idx = version.indexOf('-'); - if (idx >= 0) { - try { - major = Integer.parseInt(version.substring(0, idx)); - patch = Integer.parseInt(version.substring(idx + 1)); - } catch (NumberFormatException ignore) { - throw new IllegalArgumentException(value); - } - } else { throw new IllegalArgumentException(value); - } } - return new Old(value, Type.INFDEV, major, 0, patch, 0); - } + if (value.length() < prefixLength + 1 || !Character.isDigit(value.charAt(prefixLength))) + throw new IllegalArgumentException(value); + return new Old(value, type, VersionNumber.asVersion(value.substring(prefixLength))); + } final Type type; - final int major; - final int minor; - final int patch; - final int additional; + final VersionNumber versionNumber; - private Old(String value, Type type, int major, int minor, int patch, int additional) { + private Old(String value, Type type, VersionNumber versionNumber) { super(value); this.type = type; - this.major = major; - this.minor = minor; - this.patch = patch; - this.additional = additional; + this.versionNumber = versionNumber; } @Override @@ -204,42 +178,26 @@ Type getType() { @Override int compareToImpl(@NotNull GameVersionNumber other) { - Old that = (Old) other; - int c = Integer.compare(this.major, that.major); - if (c != 0) { - return c; - } - - c = Integer.compare(this.minor, that.minor); - if (c != 0) { - return c; - } - - c = Integer.compare(this.patch, that.patch); - if (c != 0) { - return c; - } - - return Integer.compare(this.additional, that.additional); + return this.versionNumber.compareTo(((Old) other).versionNumber); } @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (!(o instanceof Old)) return false; Old other = (Old) o; - return major == other.major && minor == other.minor && patch == other.patch && additional == other.additional && type == other.type; + return type == other.type && this.versionNumber.compareTo(other.versionNumber) == 0; } @Override public int hashCode() { - return Objects.hash(type, major, minor, patch, additional); + return Objects.hash(type, versionNumber.hashCode()); } } static final class Release extends GameVersionNumber { - private static final Pattern PATTERN = Pattern.compile("1\\.(?[0-9]+)(\\.(?[0-9]+))?((?(-[a-zA-Z]+| Pre-Release ))(?[0-9]+))?"); + private static final Pattern PATTERN = Pattern.compile("1\\.(?[0-9]+)(\\.(?[0-9]+))?((?(-[a-zA-Z]+| Pre-Release ))(?.+))?"); static final int TYPE_GA = Integer.MAX_VALUE; @@ -248,7 +206,7 @@ static final class Release extends GameVersionNumber { static final int TYPE_PRE = 2; static final int TYPE_RC = 3; - static final Release ZERO = new Release("0.0", 0, 0, 0, TYPE_GA, 0); + static final Release ZERO = new Release("0.0", 0, 0, 0, TYPE_GA, VersionNumber.ZERO); static Release parse(String value) { Matcher matcher = PATTERN.matcher(value); @@ -276,7 +234,7 @@ static Release parse(String value) { } String eaVersionString = matcher.group("eaVersion"); - int eaVersion = eaVersionString == null ? 0 : Integer.parseInt(eaVersionString); + VersionNumber eaVersion = eaVersionString != null ? VersionNumber.asVersion(eaVersionString) : VersionNumber.ZERO; return new Release(value, 1, minor, patch, eaType, eaVersion); } @@ -286,9 +244,9 @@ static Release parse(String value) { private final int patch; private final int eaType; - private final int eaVersion; + private final VersionNumber eaVersion; - Release(String value, int major, int minor, int patch, int eaType, int eaVersion) { + Release(String value, int major, int minor, int patch, int eaType, VersionNumber eaVersion) { super(value); this.major = major; this.minor = minor; @@ -323,36 +281,31 @@ int compareToRelease(Release other) { return c; } - return Integer.compare(this.eaVersion, other.eaVersion); + return this.eaVersion.compareTo(other.eaVersion); } int compareToSnapshot(Snapshot other) { int idx = Arrays.binarySearch(Versions.SNAPSHOT_INTS, other.intValue); - if (idx >= 0) { + if (idx >= 0) return this.compareToRelease(Versions.SNAPSHOT_PREV[idx]) <= 0 ? -1 : 1; - } idx = -(idx + 1); - if (idx == Versions.SNAPSHOT_INTS.length) { + if (idx == Versions.SNAPSHOT_INTS.length) return -1; - } return this.compareToRelease(Versions.SNAPSHOT_PREV[idx]) <= 0 ? -1 : 1; } @Override int compareToImpl(@NotNull GameVersionNumber other) { - if (other instanceof Release) { + if (other instanceof Release) return compareToRelease((Release) other); - } - if (other instanceof Snapshot) { + if (other instanceof Snapshot) return compareToSnapshot((Snapshot) other); - } - if (other instanceof Special) { + if (other instanceof Special) return -((Special) other).compareToReleaseOrSnapshot(this); - } throw new AssertionError(other.getClass()); } @@ -367,15 +320,14 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Release other = (Release) o; - return major == other.major && minor == other.minor && patch == other.patch && eaType == other.eaType && eaVersion == other.eaVersion; + return major == other.major && minor == other.minor && patch == other.patch && eaType == other.eaType && eaVersion.equals(other.eaVersion); } } static final class Snapshot extends GameVersionNumber { static Snapshot parse(String value) { - if (value.length() != 6 || value.charAt(2) != 'w') { + if (value.length() != 6 || value.charAt(2) != 'w') throw new IllegalArgumentException(value); - } int year; int week; @@ -387,9 +339,8 @@ static Snapshot parse(String value) { } char suffix = value.charAt(5); - if ((suffix < 'a' || suffix > 'z') && suffix != '~') { + if ((suffix < 'a' || suffix > 'z') && suffix != '~') throw new IllegalArgumentException(value); - } return new Snapshot(value, year, week, suffix); } @@ -412,17 +363,14 @@ Type getType() { @Override int compareToImpl(@NotNull GameVersionNumber other) { - if (other instanceof Release) { + if (other instanceof Release) return -((Release) other).compareToSnapshot(this); - } - if (other instanceof Snapshot) { + if (other instanceof Snapshot) return Integer.compare(this.intValue, ((Snapshot) other).intValue); - } - if (other instanceof Special) { + if (other instanceof Special) return -((Special) other).compareToReleaseOrSnapshot(this); - } throw new AssertionError(other.getClass()); } @@ -460,9 +408,8 @@ boolean isUnknown() { } VersionNumber asVersionNumber() { - if (versionNumber != null) { + if (versionNumber != null) return versionNumber; - } return versionNumber = VersionNumber.asVersion(value); } @@ -473,9 +420,7 @@ GameVersionNumber getPrevNormalVersion() { v = ((Special) v).prev; } - if (v == null) { - throw new AssertionError("version: " + value); - } + if (v == null) throw new AssertionError("version: " + value); return v; } @@ -493,28 +438,23 @@ int compareToReleaseOrSnapshot(GameVersionNumber other) { } int compareToSpecial(Special other) { - if (this.isUnknown()) { + if (this.isUnknown()) return other.isUnknown() ? this.asVersionNumber().compareTo(other.asVersionNumber()) : 1; - } - if (other.isUnknown()) { + if (other.isUnknown()) return -1; - } - if (this.value.equals(other.value)) { + if (this.value.equals(other.value)) return 0; - } int c = this.getPrevNormalVersion().compareTo(other.getPrevNormalVersion()); - if (c != 0) { + if (c != 0) return c; - } GameVersionNumber v = prev; while (v instanceof Special) { - if (v == other) { + if (v == other) return 1; - } v = ((Special) v).prev; } @@ -524,17 +464,14 @@ int compareToSpecial(Special other) { @Override int compareToImpl(@NotNull GameVersionNumber o) { - if (o instanceof Release) { + if (o instanceof Release) return compareToReleaseOrSnapshot(o); - } - if (o instanceof Snapshot) { + if (o instanceof Snapshot) return compareToReleaseOrSnapshot(o); - } - if (o instanceof Special) { + if (o instanceof Special) return compareToSpecial((Special) o); - } throw new AssertionError(o.getClass()); } @@ -566,7 +503,6 @@ static final class Versions { List snapshots = new ArrayList<>(1024); List snapshotPrev = new ArrayList<>(1024); - // Convert it to dynamic resource after the website is repaired? try (BufferedReader reader = new BufferedReader(new InputStreamReader(GameVersionNumber.class.getResourceAsStream("/assets/game/versions.txt"), StandardCharsets.US_ASCII))) { Release currentRelease = null; GameVersionNumber prev = null; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java index 0344125500..0753d02505 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/versioning/VersionNumber.java @@ -33,6 +33,8 @@ */ public final class VersionNumber implements Comparable { + public static final VersionNumber ZERO = asVersion("0"); + public static VersionNumber asVersion(String version) { Objects.requireNonNull(version); return new VersionNumber(version); diff --git a/HMCLCore/src/main/resources/assets/game/versions.txt b/HMCLCore/src/main/resources/assets/game/versions.txt index 287242f5c9..82cef053a6 100644 --- a/HMCLCore/src/main/resources/assets/game/versions.txt +++ b/HMCLCore/src/main/resources/assets/game/versions.txt @@ -756,4 +756,15 @@ 1.20.5 1.20.6-rc1 1.20.6 -24w18a \ No newline at end of file +24w18a +24w19a +24w19b +24w20a +24w21a +24w21b +1.21-pre1 +1.21-pre2 +1.21-pre3 +1.21-pre4 +1.21-rc1 +1.21 \ No newline at end of file diff --git a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/GameVersionNumberTest.java b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/GameVersionNumberTest.java index e6e4881b04..8fb4650d2f 100644 --- a/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/GameVersionNumberTest.java +++ b/HMCLCore/src/test/java/org/jackhuang/hmcl/util/versioning/GameVersionNumberTest.java @@ -1,3 +1,20 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2024 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package org.jackhuang.hmcl.util.versioning; import org.junit.jupiter.api.Test; @@ -5,6 +22,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.util.*; @@ -13,18 +31,25 @@ /** * @author Glavo */ -public class GameVersionNumberTest { +public final class GameVersionNumberTest { - @Test - public void testSortVersions() throws IOException { + private static List readVersions() { List versions = new ArrayList<>(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(GameVersionNumber.class.getResourceAsStream("/assets/game/versions.txt"), StandardCharsets.UTF_8))) { for (String line; (line = reader.readLine()) != null && !line.isEmpty(); ) { versions.add(line); } + } catch (IOException e) { + throw new UncheckedIOException(e); } + return versions; + } + + @Test + public void testSortVersions() { + List versions = readVersions(); List copied = new ArrayList<>(versions); Collections.shuffle(copied, new Random(0)); copied.sort(Comparator.comparing(GameVersionNumber::asGameVersion)); @@ -42,52 +67,57 @@ private static void assertGameVersionEquals(String version) { private static void assertGameVersionEquals(String version1, String version2) { assertEquals(0, GameVersionNumber.asGameVersion(version1).compareTo(version2), errorMessage(version1, version2)); + assertEquals(GameVersionNumber.asGameVersion(version1), GameVersionNumber.asGameVersion(version2), errorMessage(version1, version2)); } - private static void assertLessThan(String version1, String version2) { - assertTrue(GameVersionNumber.asGameVersion(version1).compareTo(version2) < 0, errorMessage(version1, version2)); + private static String toString(GameVersionNumber gameVersionNumber) { + return gameVersionNumber.getClass().getSimpleName(); } private static void assertOrder(String... versions) { for (int i = 0; i < versions.length - 1; i++) { GameVersionNumber version1 = GameVersionNumber.asGameVersion(versions[i]); - //noinspection EqualsWithItself - assertEquals(0, version1.compareTo(version1), "version=" + versions[i]); + assertGameVersionEquals(versions[i]); for (int j = i + 1; j < versions.length; j++) { GameVersionNumber version2 = GameVersionNumber.asGameVersion(versions[j]); - assertEquals(-1, version1.compareTo(version2), String.format("version1=%s, version2=%s", versions[i], versions[j])); - assertEquals(1, version2.compareTo(version1), String.format("version1=%s, version2=%s", versions[i], versions[j])); + assertEquals(-1, version1.compareTo(version2), String.format("version1=%s (%s), version2=%s (%s)", versions[i], toString(version1), versions[j], toString(version2))); + assertEquals(1, version2.compareTo(version1), String.format("version1=%s (%s), version2=%s (%s)", versions[i], toString(version1), versions[j], toString(version2))); } } assertGameVersionEquals(versions[versions.length - 1]); } + private void assertOldVersion(String oldVersion, GameVersionNumber.Type type, String versionNumber) { + GameVersionNumber version = GameVersionNumber.asGameVersion(oldVersion); + assertInstanceOf(GameVersionNumber.Old.class, version); + GameVersionNumber.Old old = (GameVersionNumber.Old) version; + assertSame(type, old.type); + assertEquals(VersionNumber.asVersion(versionNumber), old.versionNumber); + } + @Test public void testParseOld() { - { - GameVersionNumber version = GameVersionNumber.asGameVersion("b1.0"); - assertInstanceOf(GameVersionNumber.Old.class, version); - GameVersionNumber.Old old = (GameVersionNumber.Old) version; - assertEquals(GameVersionNumber.Type.BETA, old.type); - assertEquals(1, old.major); - assertEquals(0, old.minor); - assertEquals(0, old.patch); - assertEquals(0, old.additional); - } + assertOldVersion("rd-132211", GameVersionNumber.Type.PRE_CLASSIC, "132211"); + assertOldVersion("inf-20100618", GameVersionNumber.Type.INFDEV, "20100618"); + assertOldVersion("inf-20100330-1", GameVersionNumber.Type.INFDEV, "20100330-1"); + assertOldVersion("a1.0.6", GameVersionNumber.Type.ALPHA, "1.0.6"); + assertOldVersion("a1.0.8_01", GameVersionNumber.Type.ALPHA, "1.0.8_01"); + assertOldVersion("a1.0.13_01-1", GameVersionNumber.Type.ALPHA, "1.0.13_01-1"); + assertOldVersion("b1.0", GameVersionNumber.Type.BETA, "1.0"); + assertOldVersion("b1.0_01", GameVersionNumber.Type.BETA, "1.0_01"); + assertOldVersion("b1.8-pre1-2", GameVersionNumber.Type.BETA, "1.8-pre1-2"); + assertOldVersion("b1.9-pre1", GameVersionNumber.Type.BETA, "1.9-pre1"); + } - { - GameVersionNumber version = GameVersionNumber.asGameVersion("b1.0_01"); - assertInstanceOf(GameVersionNumber.Old.class, version); - GameVersionNumber.Old old = (GameVersionNumber.Old) version; - assertEquals(GameVersionNumber.Type.BETA, old.type); - assertEquals(1, old.major); - assertEquals(0, old.minor); - assertEquals(0, old.patch); - assertEquals(1, old.additional); + @Test + public void testParseNew() { + List versions = readVersions(); + for (String version : versions) { + assertFalse(GameVersionNumber.asGameVersion(version) instanceof GameVersionNumber.Old, "version=" + version); } } @@ -138,15 +168,24 @@ public void testCompareMix() { "inf-20100330-2", "inf-20100618", "a1.0.4", + "a1.0.8_01", + "a1.0.10", + "a1.0.13_01-1", "a1.0.17_02", "a1.0.17_04", "a1.1.0", + "a1.1.1", "b1.0", "b1.0_01", "b1.1_02", "b1.2", + "b1.8-pre1-2", "b1.8.1", "0.0", + "1.0.0-rc1", + "1.0.0-rc2-1", + "1.0.0-rc2-2", + "1.0.0-rc2-3", "1.0", "11w47a", "1.1", diff --git a/PLATFORM.md b/PLATFORM.md index 3205c5ee37..3826696f8e 100644 --- a/PLATFORM.md +++ b/PLATFORM.md @@ -2,17 +2,17 @@ English | [简体中文](PLATFORM_cn.md) -| | Windows | Linux | Mac OS | FreeBSD | -|----------------------------|:--------------------------------------------------|:---------------------------|:------------------------------------------------------------------------|:---------------------------| -| x86-64 | ✅️ | ✅️ | ✅️ | 👌 (Minecraft 1.13~1.20.4) | -| x86 | ✅️ | ✅️ | / | / | -| ARM64 | 👌 (Minecraft 1.8~1.18.2)
✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.20.6) | 👌 (Minecraft 1.6~1.18.2)
✅ (Minecraft 1.19+)
✅ (use Rosetta 2) | ❔ | -| ARM32 | /️ | 👌 (Minecraft 1.8~1.20.1) | / | / | -| MIPS64el | / | 👌 (Minecraft 1.8~1.20.1) | / | / | -| RISC-V 64 | / | 👌 (Minecraft 1.13~1.20.4) | / | / | -| LoongArch64 | / | 👌 (Minecraft 1.6~1.20.1) | / | / | -| PowerPC-64 (Little-Endian) | / | ❔ | / | / | -| S390x | / | ❔ | / | / | +| | Windows | Linux | Mac OS | FreeBSD | +|----------------------------|:--------------------------------------------------|:--------------------------|:------------------------------------------------------------------------|:-------------------------| +| x86-64 | ✅️ | ✅️ | ✅️ | 👌 (Minecraft 1.13~1.21) | +| x86 | ✅️ (~1.20.4) | ✅️ (~1.20.4) | / | / | +| ARM64 | 👌 (Minecraft 1.8~1.18.2)
✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.20.6) | 👌 (Minecraft 1.6~1.18.2)
✅ (Minecraft 1.19+)
✅ (use Rosetta 2) | ❔ | +| ARM32 | /️ | 👌 (Minecraft 1.8~1.20.1) | / | / | +| MIPS64el | / | 👌 (Minecraft 1.8~1.20.1) | / | / | +| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21) | / | / | +| LoongArch64 | / | 👌 (Minecraft 1.6~1.20.1) | / | / | +| PowerPC-64 (Little-Endian) | / | ❔ | / | / | +| S390x | / | ❔ | / | / | Legend: diff --git a/PLATFORM_cn.md b/PLATFORM_cn.md index c0298173b6..0fe094933f 100644 --- a/PLATFORM_cn.md +++ b/PLATFORM_cn.md @@ -2,17 +2,17 @@ [English](PLATFORM.md) | 简体中文 -| | Windows | Linux | Mac OS | FreeBSD | -|------------------|:---------------------------------------------------|:---------------------------|:-----------------------------------------------------------------------|:--------------------------| -| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.20.4) | -| x86 | ✅️ | ✅️ | / | / | -| ARM64 | 👌 (Minecraft 1.8~1.18.2)
✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.20.6) | 👌 (Minecraft 1.6~1.18.2)
✅ (Minecraft 1.19+)
✅ (使用 Rosetta 2) | ❔ | -| ARM32 | /️ | 👌 (Minecraft 1.6~1.20.1) | / | / | -| MIPS64el | / | 👌 (Minecraft 1.6~1.20.1) | / | / | -| RISC-V 64 | / | 👌 (Minecraft 1.13~1.20.4) | / | / | -| LoongArch64 | / | 👌 (Minecraft 1.6~1.20.1) | / | / | -| PowerPC-64 (小端序) | / | ❔ | / | / | -| S390x | / | ❔ | / | / | +| | Windows | Linux | Mac OS | FreeBSD | +|----------------------------|:--------------------------------------------------|:---------------------------|:-----------------------------------------------------------------------|:------------------------| +| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.21) | +| x86 | ✅️ (~1.20.4) | ✅️ (~1.20.4) | / | / | +| ARM64 | 👌 (Minecraft 1.8~1.18.2)
✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21) | 👌 (Minecraft 1.6~1.18.2)
✅ (Minecraft 1.19+)
✅ (使用 Rosetta 2) | ❔ | +| ARM32 | /️ | 👌 (Minecraft 1.6~1.20.1) | / | / | +| MIPS64el | / | 👌 (Minecraft 1.6~1.20.1) | / | / | +| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21) | / | / | +| LoongArch64 | / | 👌 (Minecraft 1.6~1.20.1) | / | / | +| PowerPC-64 (Little-Endian) | / | ❔ | / | / | +| S390x | / | ❔ | / | / | 图例: diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index daa5be2bf0..900c4340d8 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -54,7 +54,7 @@ - +