Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
064b39d753 | ||
|
|
c669026312 | ||
|
|
d9b95b28b2 | ||
|
|
d492884927 | ||
|
|
cf4fde5592 | ||
|
|
fd959c41c3 | ||
|
|
e34037c055 | ||
|
|
417c804f48 | ||
|
|
ea6eced136 | ||
|
|
432465ab46 | ||
|
|
03c95cd726 | ||
|
|
730febca8c | ||
|
|
bc41499d1c | ||
|
|
60fae5cc88 | ||
|
|
c11837baa4 | ||
|
|
aaf1218536 |
No files matched your search
@@ -19,10 +19,13 @@ package org.jackhuang.hmcl;
|
||||
|
||||
import org.jackhuang.hmcl.util.StringUtils;
|
||||
import org.jackhuang.hmcl.util.io.JarUtils;
|
||||
import org.jackhuang.hmcl.util.platform.Architecture;
|
||||
import org.jackhuang.hmcl.util.platform.OperatingSystem;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.EnumSet;
|
||||
|
||||
/**
|
||||
* Stores metadata about this application.
|
||||
@@ -35,6 +38,9 @@ public final class Metadata {
|
||||
public static final String FULL_NAME = "Hello Minecraft! Launcher";
|
||||
public static final String VERSION = System.getProperty("hmcl.version.override", JarUtils.getManifestAttribute("Implementation-Version", "@develop@"));
|
||||
|
||||
public static final int MINIMUM_REQUIRED_JAVA_VERSION = 8;
|
||||
public static final int MINIMUM_SUPPORTED_JAVA_VERSION = 11;
|
||||
|
||||
public static final String TITLE = NAME + " " + VERSION;
|
||||
public static final String FULL_TITLE = FULL_NAME + " v" + VERSION;
|
||||
|
||||
@@ -93,4 +99,32 @@ public final class Metadata {
|
||||
public static boolean isNightly() {
|
||||
return !isStable() && !isDev();
|
||||
}
|
||||
|
||||
public static @Nullable String getSuggestedJavaDownloadLink() {
|
||||
if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX && Architecture.SYSTEM_ARCH == Architecture.LOONGARCH64_OW)
|
||||
return "https://www.loongnix.cn/zh/api/java/downloads-jdk21/index.html";
|
||||
else {
|
||||
EnumSet<Architecture> supportedArchitectures;
|
||||
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS)
|
||||
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.X86, Architecture.ARM64);
|
||||
else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX)
|
||||
supportedArchitectures = EnumSet.of(
|
||||
Architecture.X86_64, Architecture.X86,
|
||||
Architecture.ARM64, Architecture.ARM32,
|
||||
Architecture.RISCV64, Architecture.LOONGARCH64
|
||||
);
|
||||
else if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS)
|
||||
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.ARM64);
|
||||
else
|
||||
supportedArchitectures = EnumSet.noneOf(Architecture.class);
|
||||
|
||||
if (supportedArchitectures.contains(Architecture.SYSTEM_ARCH))
|
||||
return String.format("https://docs.hmcl.net/downloads/%s/%s.html",
|
||||
OperatingSystem.CURRENT_OS.getCheckedName(),
|
||||
Architecture.SYSTEM_ARCH.getCheckedName()
|
||||
);
|
||||
else
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -163,6 +163,16 @@ public final class FontManager {
|
||||
}
|
||||
}
|
||||
|
||||
if (family.indexOf(',') >= 0) {
|
||||
for (String candidateFamily : family.split(",")) {
|
||||
for (Font font : fonts) {
|
||||
if (font.getFamily().equalsIgnoreCase(candidateFamily)) {
|
||||
return font;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOG.warning(String.format("Family '%s' not found in font file '%s'", family, path));
|
||||
return fonts[0];
|
||||
} catch (NoSuchMethodException | IllegalAccessException ignored) {
|
||||
|
||||
@@ -63,7 +63,6 @@ import org.jackhuang.hmcl.util.platform.Architecture;
|
||||
import org.jackhuang.hmcl.util.platform.OperatingSystem;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
@@ -320,39 +319,13 @@ public final class Controllers {
|
||||
LOG.warning("Invalid type for shown tips key: " + JAVA_VERSION_TIP, e);
|
||||
}
|
||||
|
||||
if (shownTipVersion == null || shownTipVersion.intValue() < 11) {
|
||||
String downloadLink = null;
|
||||
|
||||
if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX && Architecture.SYSTEM_ARCH == Architecture.LOONGARCH64_OW)
|
||||
downloadLink = "https://www.loongnix.cn/zh/api/java/downloads-jdk21/index.html";
|
||||
else {
|
||||
|
||||
EnumSet<Architecture> supportedArchitectures;
|
||||
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS)
|
||||
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.X86, Architecture.ARM64);
|
||||
else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX)
|
||||
supportedArchitectures = EnumSet.of(
|
||||
Architecture.X86_64, Architecture.X86,
|
||||
Architecture.ARM64, Architecture.ARM32,
|
||||
Architecture.RISCV64, Architecture.LOONGARCH64
|
||||
);
|
||||
else if (OperatingSystem.CURRENT_OS == OperatingSystem.MACOS)
|
||||
supportedArchitectures = EnumSet.of(Architecture.X86_64, Architecture.ARM64);
|
||||
else
|
||||
supportedArchitectures = EnumSet.noneOf(Architecture.class);
|
||||
|
||||
if (supportedArchitectures.contains(Architecture.SYSTEM_ARCH))
|
||||
downloadLink = String.format("https://docs.hmcl.net/downloads/%s/%s.html",
|
||||
OperatingSystem.CURRENT_OS.getCheckedName(),
|
||||
Architecture.SYSTEM_ARCH.getCheckedName()
|
||||
);
|
||||
}
|
||||
|
||||
if (shownTipVersion == null || shownTipVersion.intValue() < Metadata.MINIMUM_SUPPORTED_JAVA_VERSION) {
|
||||
MessageDialogPane.Builder builder = new MessageDialogPane.Builder(i18n("fatal.deprecated_java_version"), null, MessageType.WARNING);
|
||||
String downloadLink = Metadata.getSuggestedJavaDownloadLink();
|
||||
if (downloadLink != null)
|
||||
builder.addHyperLink(i18n("fatal.deprecated_java_version.download_link", 21), downloadLink);
|
||||
Controllers.dialog(builder
|
||||
.ok(() -> config().getShownTips().put(JAVA_VERSION_TIP, 11))
|
||||
.ok(() -> config().getShownTips().put(JAVA_VERSION_TIP, Metadata.MINIMUM_SUPPORTED_JAVA_VERSION))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class GameCrashWindow extends Stage {
|
||||
crashReport = CrashReportAnalyzer.extractCrashReport(rawLog);
|
||||
}
|
||||
|
||||
return pair(CrashReportAnalyzer.anaylze(rawLog), crashReport != null ? CrashReportAnalyzer.findKeywordsFromCrashReport(crashReport) : new HashSet<>());
|
||||
return pair(CrashReportAnalyzer.analyze(rawLog), crashReport != null ? CrashReportAnalyzer.findKeywordsFromCrashReport(crashReport) : new HashSet<>());
|
||||
}), Task.supplyAsync(() -> {
|
||||
Path latestLog = repository.getRunDirectory(version.getId()).toPath().resolve("logs/latest.log");
|
||||
if (!Files.isReadable(latestLog)) {
|
||||
@@ -142,7 +142,7 @@ public class GameCrashWindow extends Stage {
|
||||
return pair(new HashSet<CrashReportAnalyzer.Result>(), new HashSet<String>());
|
||||
}
|
||||
|
||||
return pair(CrashReportAnalyzer.anaylze(log), CrashReportAnalyzer.findKeywordsFromCrashReport(log));
|
||||
return pair(CrashReportAnalyzer.analyze(log), CrashReportAnalyzer.findKeywordsFromCrashReport(log));
|
||||
})).whenComplete(Schedulers.javafx(), (taskResult, exception) -> {
|
||||
loading.set(false);
|
||||
|
||||
|
||||
@@ -121,19 +121,14 @@ public abstract class AbstractInstallersPage extends Control implements WizardPa
|
||||
InstallerItem[] libraries = control.group.getLibraries();
|
||||
|
||||
FlowPane libraryPane = new FlowPane(libraries);
|
||||
libraryPane.setVgap(16);
|
||||
libraryPane.setVgap(8);
|
||||
libraryPane.setHgap(16);
|
||||
|
||||
if (libraries.length <= 8) {
|
||||
BorderPane.setMargin(libraryPane, new Insets(16, 0, 16, 0));
|
||||
root.setCenter(libraryPane);
|
||||
} else {
|
||||
ScrollPane scrollPane = new ScrollPane(libraryPane);
|
||||
scrollPane.setFitToWidth(true);
|
||||
scrollPane.setFitToHeight(true);
|
||||
BorderPane.setMargin(scrollPane, new Insets(16, 0, 16, 0));
|
||||
root.setCenter(scrollPane);
|
||||
}
|
||||
ScrollPane scrollPane = new ScrollPane(libraryPane);
|
||||
scrollPane.setFitToWidth(true);
|
||||
scrollPane.setFitToHeight(true);
|
||||
BorderPane.setMargin(scrollPane, new Insets(16, 0, 16, 0));
|
||||
root.setCenter(scrollPane);
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
@@ -61,6 +61,8 @@ public final class ProfilePage extends BorderPane implements DecoratorPage {
|
||||
* @param profile null if creating a new profile.
|
||||
*/
|
||||
public ProfilePage(Profile profile) {
|
||||
getStyleClass().add("gray-background");
|
||||
|
||||
this.profile = profile;
|
||||
String profileDisplayName = Optional.ofNullable(profile).map(Profiles::getProfileDisplayName).orElse("");
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ import javafx.scene.layout.*;
|
||||
import org.jackhuang.hmcl.game.Version;
|
||||
import org.jackhuang.hmcl.mod.RemoteMod;
|
||||
import org.jackhuang.hmcl.mod.RemoteModRepository;
|
||||
import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository;
|
||||
import org.jackhuang.hmcl.setting.Profile;
|
||||
import org.jackhuang.hmcl.task.Schedulers;
|
||||
import org.jackhuang.hmcl.task.Task;
|
||||
@@ -189,7 +190,9 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP
|
||||
}
|
||||
|
||||
protected String getLocalizedCategory(String category) {
|
||||
return i18n("curse.category." + category);
|
||||
return repository instanceof ModrinthRemoteModRepository
|
||||
? i18n("modrinth.category." + category)
|
||||
: i18n("curse.category." + category);
|
||||
}
|
||||
|
||||
private String getLocalizedCategoryIndent(ModDownloadListPageSkin.CategoryIndented category) {
|
||||
@@ -200,7 +203,11 @@ public class DownloadListPage extends Control implements DecoratorPage, VersionP
|
||||
}
|
||||
|
||||
protected String getLocalizedOfficialPage() {
|
||||
return i18n("mods.curseforge");
|
||||
if (repository instanceof ModrinthRemoteModRepository) {
|
||||
return i18n("mods.modrinth");
|
||||
} else {
|
||||
return i18n("mods.curseforge");
|
||||
}
|
||||
}
|
||||
|
||||
protected Profile.ProfileVersion getProfileVersion() {
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.jackhuang.hmcl.task.Task;
|
||||
import org.jackhuang.hmcl.task.TaskExecutor;
|
||||
import org.jackhuang.hmcl.ui.Controllers;
|
||||
import org.jackhuang.hmcl.ui.UpgradeDialog;
|
||||
import org.jackhuang.hmcl.ui.construct.MessageDialogPane;
|
||||
import org.jackhuang.hmcl.ui.construct.MessageDialogPane.MessageType;
|
||||
import org.jackhuang.hmcl.util.StringUtils;
|
||||
import org.jackhuang.hmcl.ui.SwingUtils;
|
||||
@@ -102,6 +103,16 @@ public final class UpdateHandler {
|
||||
return;
|
||||
}
|
||||
|
||||
if (JavaRuntime.CURRENT_VERSION < Metadata.MINIMUM_SUPPORTED_JAVA_VERSION) {
|
||||
MessageDialogPane.Builder builder = new MessageDialogPane.Builder(i18n("fatal.deprecated_java_version.update"), i18n("message.error"), MessageType.ERROR);
|
||||
String downloadLink = Metadata.getSuggestedJavaDownloadLink();
|
||||
if (downloadLink != null)
|
||||
builder.addHyperLink(i18n("fatal.deprecated_java_version.download_link", 21), downloadLink);
|
||||
builder.ok(null);
|
||||
Controllers.dialog(builder.build());
|
||||
return;
|
||||
}
|
||||
|
||||
Controllers.dialog(new UpgradeDialog(version, () -> {
|
||||
Path downloaded;
|
||||
try {
|
||||
|
||||
@@ -403,6 +403,10 @@ fatal.deprecated_java_version=HMCL will require Java 11 or later to run in the f
|
||||
It is recommended to install the latest version of Java to ensure that HMCL works properly.\n\
|
||||
\n\
|
||||
You can continue to keep the old version of Java. HMCL can recognize and manage multiple Java versions and will automatically select the appropriate Java for you based on the game version.
|
||||
fatal.deprecated_java_version.update=HMCL will require Java 11 or later to run in the future. Please install the latest version of Java to ensure that HMCL can complete the upgrade.\n\
|
||||
\n\
|
||||
You can continue to keep the old version of Java.\
|
||||
HMCL can recognize and manage multiple Java versions and will automatically select the appropriate Java for you based on the game version.
|
||||
fatal.deprecated_java_version.download_link=Download Java %d
|
||||
fatal.samba=If you opened Hello Minecraft! Launcher from a Samba network drive, some features might not be working. Please try updating your Java or moving the launcher to another directory.
|
||||
fatal.illegal_char=Your user path contains an illegal character "=". You will not be able to use authlib-injector or change the skin of your offline account.
|
||||
@@ -934,11 +938,16 @@ modpack.wizard.step.initialization.warning=Before making a modpack, please make
|
||||
modpack.wizard.step.initialization.server=Click here for more information on how to make a server modpack that can be automatically updated.
|
||||
|
||||
modrinth.category.adventure=Adventure
|
||||
modrinth.category.atmosphere=Atmosphere
|
||||
modrinth.category.audio=Audio
|
||||
modrinth.category.blocks=Blocks
|
||||
modrinth.category.bloom=Bloom
|
||||
modrinth.category.bukkit=Bukkit
|
||||
modrinth.category.bungeecord=BungeeCord
|
||||
modrinth.category.canvas=Canvas
|
||||
modrinth.category.cartoon=Cartoon
|
||||
modrinth.category.challenging=Challenging
|
||||
modrinth.category.colored-lighting=Colored Lighting
|
||||
modrinth.category.core-shaders=Core Shaders
|
||||
modrinth.category.combat=Combat
|
||||
modrinth.category.cursed=Cursed
|
||||
@@ -948,19 +957,25 @@ modrinth.category.entities=Entities
|
||||
modrinth.category.environment=Environment
|
||||
modrinth.category.equipment=Equipment
|
||||
modrinth.category.fabric=Fabric
|
||||
modrinth.category.fantasy=Fantasy
|
||||
modrinth.category.foliage=Foliage
|
||||
modrinth.category.fonts=Fonts
|
||||
modrinth.category.food=Food
|
||||
modrinth.category.forge=Forge
|
||||
modrinth.category.game-mechanics=Game Mechanics
|
||||
modrinth.category.gui=GUI
|
||||
modrinth.category.high=High
|
||||
modrinth.category.iris=Iris
|
||||
modrinth.category.items=Items
|
||||
modrinth.category.kitchen-sink=Kitchen-Sink
|
||||
modrinth.category.library=Library
|
||||
modrinth.category.lightweight=Lightweight
|
||||
modrinth.category.liteloader=LiteLoader
|
||||
modrinth.category.locale=Locale
|
||||
modrinth.category.low=Low
|
||||
modrinth.category.magic=Magic
|
||||
modrinth.category.management=Management
|
||||
modrinth.category.medium=Medium
|
||||
modrinth.category.minecraft=Minecraft
|
||||
modrinth.category.minigame=Minigame
|
||||
modrinth.category.misc=Misc
|
||||
@@ -970,13 +985,21 @@ modrinth.category.models=Models
|
||||
modrinth.category.modloader=Modloader
|
||||
modrinth.category.multiplayer=Multiplayer
|
||||
modrinth.category.neoforge=NeoForge
|
||||
modrinth.category.optifine=OptiFine
|
||||
modrinth.category.optimization=Optimization
|
||||
modrinth.category.paper=Paper
|
||||
modrinth.category.path-tracing=Path Tracing
|
||||
modrinth.category.pbr=PBR
|
||||
modrinth.category.potato=Potato
|
||||
modrinth.category.purpur=Purpur
|
||||
modrinth.category.quests=Quests
|
||||
modrinth.category.quilt=Quilt
|
||||
modrinth.category.realistic=Realistic
|
||||
modrinth.category.reflections=Reflections
|
||||
modrinth.category.rift=Rift
|
||||
modrinth.category.screenshot=Screenshot
|
||||
modrinth.category.semi-realistic=Semi-realistic
|
||||
modrinth.category.shadows=Shadows
|
||||
modrinth.category.simplistic=Simplistic
|
||||
modrinth.category.social=Social
|
||||
modrinth.category.spigot=Spigot
|
||||
@@ -987,6 +1010,7 @@ modrinth.category.themed=Themed
|
||||
modrinth.category.transportation=Transportation
|
||||
modrinth.category.tweaks=Tweaks
|
||||
modrinth.category.utility=Utility
|
||||
modrinth.category.vanilla=Vanilla
|
||||
modrinth.category.vanilla-like=Vanilla-like
|
||||
modrinth.category.velocity=Velocity
|
||||
modrinth.category.waterfall=Waterfall
|
||||
|
||||
@@ -404,7 +404,12 @@ fatal.deprecated_java_version=HMCL requerirá Java 11 o posterior para funcionar
|
||||
\n\
|
||||
Se recomienda instalar la última versión de Java para garantizar el correcto funcionamiento de HMCL.\n\
|
||||
\n\
|
||||
Puede seguir manteniendo la versión antigua de Java. HMCL puede reconocer y gestionar varias versiones de Java y elegirá automáticamente la adecuada para usted en función de la versión del juego.
|
||||
Puedes conservar la versión antigua de Java. HMCL puede reconocer y gestionar varias versiones de Java y elegirá automáticamente la adecuada para usted en función de la versión del juego.
|
||||
fatal.deprecated_java_version.update=HMCL requerirá Java 11 o posterior para funcionar en el futuro. Por favor, instalar la última versión de Java para asegurarse de que el lanzador puede completar la actualización.\n\
|
||||
\n\
|
||||
Puedes conservar la versión antigua de Java.\
|
||||
HMCL puede reconocer y gestionar varias versiones de Java \
|
||||
y elegirá automáticamente la adecuada para usted en función de la versión del juego.
|
||||
fatal.deprecated_java_version.download_link=Descargar Java %d
|
||||
fatal.samba=Si ha abierto Hello Minecraft! Launcher desde una unidad de red Samba, es posible que algunas funciones no funcionen. Intenta actualizar tu Java o mover el launcher a otro directorio.
|
||||
fatal.illegal_char=Su ruta de usuario contiene un carácter ilegal «=», por lo que algunas características podrían no funcionar correctamente.\n\
|
||||
@@ -441,6 +446,7 @@ folder.shaderpacks=Paquetes de sombreados
|
||||
folder.saves=Mundos
|
||||
folder.schematics=Esquemas
|
||||
folder.screenshots=Capturas de pantalla
|
||||
folder.world=Directorio del mundo
|
||||
|
||||
game=Juegos
|
||||
game.crash.feedback=<b>¡Por favor, no comparta capturas de pantalla de esta interfaz con otras personas!</b> Si pide ayuda a otras personas, haga clic en <b>Exportar registros de colgado</b> y envíe el archivo exportado a otras personas para que lo analicen.
|
||||
@@ -938,11 +944,16 @@ modpack.wizard.step.initialization.warning=Antes de hacer un modpack, por favor
|
||||
modpack.wizard.step.initialization.server=Haga clic aquí para ver más tutoriales para hacer un modpack de servidor que se pueda actualizar automáticamente.
|
||||
|
||||
modrinth.category.adventure=Aventura
|
||||
modrinth.category.atmosphere=Atmósfera
|
||||
modrinth.category.audio=Audio
|
||||
modrinth.category.blocks=Bloqueos
|
||||
modrinth.category.bloom=Resplandor
|
||||
modrinth.category.bukkit=Bukkit
|
||||
modrinth.category.bungeecord=BungeeCord
|
||||
modrinth.category.canvas=Canvas
|
||||
modrinth.category.cartoon=Caricatura
|
||||
modrinth.category.challenging=Desafío
|
||||
modrinth.category.colored-lighting=Iluminación de color
|
||||
modrinth.category.core-shaders=Sombreadores de núcleo
|
||||
modrinth.category.combat=Combate
|
||||
modrinth.category.cursed=Maldición
|
||||
@@ -952,19 +963,25 @@ modrinth.category.entities=Entidades
|
||||
modrinth.category.environment=Medio ambiente
|
||||
modrinth.category.equipment=Equipo
|
||||
modrinth.category.fabric=Fabric
|
||||
modrinth.category.fantasy=Fantasía
|
||||
modrinth.category.foliage=Vegetación
|
||||
modrinth.category.fonts=Fonts
|
||||
modrinth.category.food=Alimentos
|
||||
modrinth.category.forge=Forge
|
||||
modrinth.category.game-mechanics=Mecánica de juego
|
||||
modrinth.category.gui=GUI
|
||||
modrinth.category.high=Alto
|
||||
modrinth.category.iris=Iris
|
||||
modrinth.category.items=Objetos
|
||||
modrinth.category.kitchen-sink=Fregadero de cocina
|
||||
modrinth.category.library=Biblioteca
|
||||
modrinth.category.lightweight=Peso ligero
|
||||
modrinth.category.liteloader=LiteLoader
|
||||
modrinth.category.locale=Locale
|
||||
modrinth.category.low=Bajo
|
||||
modrinth.category.magic=Magia
|
||||
modrinth.category.management=Gestión
|
||||
modrinth.category.medium=Medio
|
||||
modrinth.category.minecraft=Minecraft
|
||||
modrinth.category.minigame=Minijuego
|
||||
modrinth.category.misc=Misceláneo
|
||||
@@ -974,13 +991,21 @@ modrinth.category.models=Modelos
|
||||
modrinth.category.modloader=Cargador de mods
|
||||
modrinth.category.multiplayer=Multijugador
|
||||
modrinth.category.neoforge=NeoForge
|
||||
modrinth.category.optifine=OptiFine
|
||||
modrinth.category.optimization=Optimización
|
||||
modrinth.category.paper=Paper
|
||||
modrinth.category.path-tracing=Trazado de rutas
|
||||
modrinth.category.pbr=PBR
|
||||
modrinth.category.potato=Mínimo
|
||||
modrinth.category.purpur=Purpur
|
||||
modrinth.category.quests=Misiones
|
||||
modrinth.category.quilt=Quilt
|
||||
modrinth.category.realistic=Realista
|
||||
modrinth.category.reflections=Reflexiones
|
||||
modrinth.category.rift=Rift
|
||||
modrinth.category.screenshot=Extremo
|
||||
modrinth.category.semi-realistic=Semirrealista
|
||||
modrinth.category.shadows=Sombras
|
||||
modrinth.category.simplistic=Simplista
|
||||
modrinth.category.social=Social
|
||||
modrinth.category.spigot=Spigot
|
||||
@@ -991,6 +1016,7 @@ modrinth.category.themed=Temática
|
||||
modrinth.category.transportation=Transporte
|
||||
modrinth.category.tweaks=Ajustes
|
||||
modrinth.category.utility=Utilidad
|
||||
modrinth.category.vanilla=Vainilla
|
||||
modrinth.category.vanilla-like=Similar a la vainilla
|
||||
modrinth.category.velocity=Velocity
|
||||
modrinth.category.waterfall=Waterfall
|
||||
@@ -1078,7 +1104,12 @@ world.backup.create.locked=El mundo está actualmente en uso. Por favor, cierra
|
||||
world.backup.create.success=Creada con éxito una nueva copia de seguridad: %s
|
||||
world.backup.delete=Eliminar esta copia de seguridad
|
||||
world.backup.processing=Creando nueva copia de seguridad ...
|
||||
world.datapack=Gestionar paquetes de datos
|
||||
world.chunkbase=Chunk Base
|
||||
world.chunkbase.end_city=Ciudad del End
|
||||
world.chunkbase.seed_map=Vista previa de la generación mundial
|
||||
world.chunkbase.stronghold=Fortaleza
|
||||
world.chunkbase.nether_fortress=Fortaleza del Nether
|
||||
world.datapack=Paquetes de datos
|
||||
world.datetime=Jugado por última vez en %s
|
||||
world.download=Descargar Mundo
|
||||
world.download.title=Descargar mundo - %1s
|
||||
@@ -1123,7 +1154,8 @@ world.info.time=Tiempo de juego
|
||||
world.info.time.format=%s días
|
||||
world.locked=En uso
|
||||
world.manage=Mundos
|
||||
world.manage.title=Mundos - %s
|
||||
world.manage.button=Administrar
|
||||
world.manage.title=Mundo - %s
|
||||
world.name=Nombre del mundo
|
||||
world.name.enter=Introducir el nombre del mundo
|
||||
world.show_all=Mostrar todo
|
||||
|
||||
@@ -403,6 +403,11 @@ fatal.deprecated_java_version=В будущем для работы HMCL пот
|
||||
Рекомендуется установить последнюю версию Java, чтобы обеспечить правильную работу HMCL.\n\
|
||||
\n\
|
||||
Вы можете продолжать использовать старую версию Java. HMCL может распознавать и управлять несколькими версиями Java и автоматически выбирать подходящую Java в зависимости от версии игры.
|
||||
fatal.deprecated_java_version.update=В будущем для работы HMCL потребуется Java 11 или более поздняя версия. Пожалуйста, установить последнюю версию Java, чтобы убедиться, что приложение сможет завершить обновление.\n\
|
||||
\n\
|
||||
Вы можете продолжать использовать старую версию Java.\
|
||||
HMCL может распознавать и управлять несколькими версиями Java \
|
||||
и автоматически выбирать подходящую Java в зависимости от версии игры.
|
||||
fatal.deprecated_java_version.download_link=Скачать Java %d
|
||||
fatal.samba=Если вы пытаетесь открыть лаунчер в общей папке Samba, он может не работать, попробуйте обновить Java или запустить лаунчер из локальной папки.
|
||||
fatal.illegal_char=Недопустимый символ «=» в пути к папке пользователя. Лаунчер может работать, но некоторые функции не будут работать.\n\
|
||||
@@ -439,6 +444,7 @@ folder.shaderpacks=Пакеты шейдеров
|
||||
folder.saves=Миры
|
||||
folder.schematics=Схемы
|
||||
folder.screenshots=Снимки экрана
|
||||
folder.world=Папка мира
|
||||
|
||||
game=Игры
|
||||
game.crash.feedback=<b>Пожалуйста, не делитесь скриншотами этого интерфейса с другими!</b> Если вы просите помощи у других, нажмите <b>«Экспорт журналов с ошибками»</b> и отправьте экспортированный файл другим для анализа.
|
||||
@@ -937,11 +943,16 @@ modpack.wizard.step.initialization.warning=Перед созданием мод
|
||||
modpack.wizard.step.initialization.server=Нажмите здесь для получения дополнительных руководств по созданию модпака на сервере, который может автообновляться.
|
||||
|
||||
modrinth.category.adventure=Приключение
|
||||
modrinth.category.atmosphere=Атмосфера
|
||||
modrinth.category.audio=Аудио
|
||||
modrinth.category.blocks=Блоки
|
||||
modrinth.category.bloom=Свечение
|
||||
modrinth.category.bukkit=Bukkit
|
||||
modrinth.category.bungeecord=BungeeCord
|
||||
modrinth.category.canvas=Canvas
|
||||
modrinth.category.cartoon=Мультяшный
|
||||
modrinth.category.challenging=Вызов
|
||||
modrinth.category.colored-lighting=Цветное освещение
|
||||
modrinth.category.core-shaders=Ядро шейдеров
|
||||
modrinth.category.combat=Бой
|
||||
modrinth.category.cursed=Cursed
|
||||
@@ -951,19 +962,25 @@ modrinth.category.entities=Сущности
|
||||
modrinth.category.environment=Окружающая среда
|
||||
modrinth.category.equipment=Оборудование
|
||||
modrinth.category.fabric=Fabric
|
||||
modrinth.category.fantasy=Фэнтези
|
||||
modrinth.category.foliage=Растительность
|
||||
modrinth.category.fonts=Шрифты
|
||||
modrinth.category.food=Еда
|
||||
modrinth.category.forge=Forge
|
||||
modrinth.category.game-mechanics=Игровая механика
|
||||
modrinth.category.gui=ГИП
|
||||
modrinth.category.high=Высокий
|
||||
modrinth.category.iris=Iris
|
||||
modrinth.category.items=Предметы
|
||||
modrinth.category.kitchen-sink=Kitchen-Sink
|
||||
modrinth.category.library=Библиотека
|
||||
modrinth.category.lightweight=Легкий
|
||||
modrinth.category.liteloader=LiteLoader
|
||||
modrinth.category.locale=Язык
|
||||
modrinth.category.low=Низкий
|
||||
modrinth.category.magic=Магия
|
||||
modrinth.category.management=Управление
|
||||
modrinth.category.medium=Средний
|
||||
modrinth.category.minecraft=Minecraft
|
||||
modrinth.category.minigame=Мини-игра
|
||||
modrinth.category.misc=Разное
|
||||
@@ -973,13 +990,21 @@ modrinth.category.models=Модели
|
||||
modrinth.category.modloader=Мод-загрузчик
|
||||
modrinth.category.multiplayer=Сетевая игра
|
||||
modrinth.category.neoforge=NeoForge
|
||||
modrinth.category.optifine=OptiFine
|
||||
modrinth.category.optimization=Оптимизация
|
||||
modrinth.category.paper=Paper
|
||||
modrinth.category.path-tracing=Трассировка пути
|
||||
modrinth.category.pbr=PBR
|
||||
modrinth.category.potato=Минимум
|
||||
modrinth.category.purpur=Purpur
|
||||
modrinth.category.quests=Квесты
|
||||
modrinth.category.quilt=Quilt
|
||||
modrinth.category.realistic=Реалистичный
|
||||
modrinth.category.reflections=Отражения
|
||||
modrinth.category.rift=Rift
|
||||
modrinth.category.screenshot=Экстрим
|
||||
modrinth.category.semi-realistic=Полуреалистичный
|
||||
modrinth.category.shadows=Тени
|
||||
modrinth.category.simplistic=Упрощенный
|
||||
modrinth.category.social=Социальная
|
||||
modrinth.category.spigot=Spigot
|
||||
@@ -990,6 +1015,7 @@ modrinth.category.themed=Тематический
|
||||
modrinth.category.transportation=Транспорт
|
||||
modrinth.category.tweaks=Усовершенствование
|
||||
modrinth.category.utility=Утилиты
|
||||
modrinth.category.vanilla=Ванильное
|
||||
modrinth.category.vanilla-like=Ванильное
|
||||
modrinth.category.velocity=Velocity
|
||||
modrinth.category.waterfall=Waterfall
|
||||
@@ -1077,7 +1103,12 @@ world.backup.create.locked=В настоящее время мир находи
|
||||
world.backup.create.success=Успешно создано новое резервное копирование: %s
|
||||
world.backup.delete=Удалить эту резервную копию
|
||||
world.backup.processing=Создание новой резервной копии ...
|
||||
world.datapack=Управлять наборами данных
|
||||
world.chunkbase=Chunk Base
|
||||
world.chunkbase.end_city=Город Края
|
||||
world.chunkbase.seed_map=Предпросмотр генерации мира
|
||||
world.chunkbase.stronghold=Крепость
|
||||
world.chunkbase.nether_fortress=Крепость Нижнего мира
|
||||
world.datapack=Наборы данных
|
||||
world.datetime=Последний запуск игры %s
|
||||
world.download=Скачать мир
|
||||
world.download.title=Скачать мир - %1s
|
||||
@@ -1122,7 +1153,8 @@ world.info.time=Время игры
|
||||
world.info.time.format=%s дн.
|
||||
world.locked=В эксплуатации
|
||||
world.manage=Миры
|
||||
world.manage.title=Миры - %s
|
||||
world.manage.button=Управлять
|
||||
world.manage.title=Мир - %s
|
||||
world.name=Название мира
|
||||
world.name.enter=Введите название мира
|
||||
world.show_all=Показать все
|
||||
|
||||
@@ -381,6 +381,7 @@ fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即將升級完
|
||||
fatal.apply_update_failure=我們很抱歉 Hello Minecraft! Launcher 無法自動完成升級程式,因為出現了一些問題。\n但你依然可以從 %s 處手動下載 HMCL 來完成升級。
|
||||
fatal.apply_update_need_win7=Hello Minecraft! Launcher 無法在 Windows XP/Vista 上進行自動更新。請從 %s 處手動下載 HMCL 來完成升級。
|
||||
fatal.deprecated_java_version=HMCL 未來需要 Java 11 或更高版本才能執行,但依然支援使用 Java 8 啟動遊戲。建議安裝最新版本的 Java 以確保 HMCL 正常執行。\n你可以繼續保留舊版本 Java。HMCL 能夠識別與管理多個 Java,並會自動根據遊戲版本為你選取合適的 Java。
|
||||
fatal.deprecated_java_version.update=更高版本的 HMCL 需要 Java 11 或更高版本才能執行,請安裝最新版本的 Java 以確保 HMCL 能夠完成升級。\n你可以繼續保留舊版本 Java。HMCL 能夠識別與管理多個 Java,並會自動根據遊戲版本為你選取合適的 Java。
|
||||
fatal.deprecated_java_version.download_link=下載 Java %d
|
||||
fatal.samba=如果您正在透過 Samba 共亯的目錄中開啟 Hello Minecraft! Launcher,啟動器可能無法正常工作,請嘗試更新您的 Java 或在本機目錄內開啟 HMCL。
|
||||
fatal.illegal_char=由於您的使用者目錄路徑中存在無效字元『=』,您將無法使用外部登入帳戶以及離線登入更換外觀功能。
|
||||
@@ -744,11 +745,16 @@ modpack.wizard.step.initialization.warning=在製作模組包前,請你確認
|
||||
modpack.wizard.step.initialization.server=點選此處查看有關伺服器自動更新模組包的製作教學
|
||||
|
||||
modrinth.category.adventure=冒險
|
||||
modrinth.category.atmosphere=氛圍
|
||||
modrinth.category.audio=聲音
|
||||
modrinth.category.blocks=方塊
|
||||
modrinth.category.bloom=泛光
|
||||
modrinth.category.bukkit=Bukkit
|
||||
modrinth.category.bungeecord=BungeeCord
|
||||
modrinth.category.canvas=Canvas
|
||||
modrinth.category.cartoon=卡通
|
||||
modrinth.category.challenging=高難度
|
||||
modrinth.category.colored-lighting=彩色光照
|
||||
modrinth.category.core-shaders=核心著色器
|
||||
modrinth.category.combat=戰鬥
|
||||
modrinth.category.cursed=Cursed
|
||||
@@ -758,19 +764,25 @@ modrinth.category.entities=實體
|
||||
modrinth.category.environment=環境
|
||||
modrinth.category.equipment=裝備
|
||||
modrinth.category.fabric=Fabric
|
||||
modrinth.category.fantasy=幻想
|
||||
modrinth.category.foliage=植被
|
||||
modrinth.category.fonts=字體
|
||||
modrinth.category.food=食物
|
||||
modrinth.category.forge=Forge
|
||||
modrinth.category.game-mechanics=遊戲機制
|
||||
modrinth.category.gui=GUI
|
||||
modrinth.category.high=高
|
||||
modrinth.category.iris=Iris
|
||||
modrinth.category.items=物品
|
||||
modrinth.category.kitchen-sink=大雜燴
|
||||
modrinth.category.library=支援庫
|
||||
modrinth.category.lightweight=輕量
|
||||
modrinth.category.liteloader=LiteLoader
|
||||
modrinth.category.locale=在地化
|
||||
modrinth.category.low=低
|
||||
modrinth.category.magic=魔法
|
||||
modrinth.category.management=管理
|
||||
modrinth.category.medium=中
|
||||
modrinth.category.minecraft=Minecraft
|
||||
modrinth.category.minigame=小遊戲
|
||||
modrinth.category.misc=其他
|
||||
@@ -780,13 +792,21 @@ modrinth.category.models=模型
|
||||
modrinth.category.modloader=ModLoader
|
||||
modrinth.category.multiplayer=多人
|
||||
modrinth.category.neoforge=NeoForge
|
||||
modrinth.category.optifine=OptiFine
|
||||
modrinth.category.optimization=最佳化
|
||||
modrinth.category.paper=Paper
|
||||
modrinth.category.path-tracing=路径追踪
|
||||
modrinth.category.pbr=PBR
|
||||
modrinth.category.potato=極低
|
||||
modrinth.category.purpur=Purpur
|
||||
modrinth.category.quests=任務
|
||||
modrinth.category.quilt=Quilt
|
||||
modrinth.category.realistic=寫實
|
||||
modrinth.category.reflections=反射
|
||||
modrinth.category.rift=Rift
|
||||
modrinth.category.screenshot=極高
|
||||
modrinth.category.semi-realistic=半寫實
|
||||
modrinth.category.shadows=陰影
|
||||
modrinth.category.simplistic=簡單
|
||||
modrinth.category.social=社交
|
||||
modrinth.category.spigot=Spigot
|
||||
@@ -797,6 +817,7 @@ modrinth.category.themed=主題
|
||||
modrinth.category.transportation=運輸
|
||||
modrinth.category.tweaks=最佳化
|
||||
modrinth.category.utility=實用
|
||||
modrinth.category.vanilla=原生
|
||||
modrinth.category.vanilla-like=類原生
|
||||
modrinth.category.velocity=Velocity
|
||||
modrinth.category.waterfall=Waterfall
|
||||
|
||||
@@ -390,6 +390,7 @@ fatal.migration_requires_manual_reboot=Hello Minecraft! Launcher 即将完成升
|
||||
fatal.apply_update_failure=我们很抱歉 Hello Minecraft! Launcher 无法自动完成升级,因为出现了一些问题。\n但你依可以从 %s 手动下载 HMCL 来完成升级。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。
|
||||
fatal.apply_update_need_win7=Hello Minecraft! Launcher 无法在 Windows XP/Vista 上进行自动更新。请从 %s 手动下载 HMCL 来完成升级。
|
||||
fatal.deprecated_java_version=HMCL 未来需要 Java 11 或更高版本才能运行,但依然支持使用 Java 8 启动游戏。建议安装最新版本的 Java 以确保 HMCL 能正常工作。\n你可以继续保留旧版本 Java。HMCL 能够识别与管理多个 Java,并会自动根据游戏版本为你选择合适的 Java。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。
|
||||
fatal.deprecated_java_version.update=更高版本的 HMCL 需要 Java 11 或更高版本才能运行,请安装最新版本的 Java 以确保 HMCL 能够完成升级。\n你可以继续保留旧版本 Java。HMCL 能够识别与管理多个 Java,并会自动根据游戏版本为你选择合适的 Java。
|
||||
fatal.deprecated_java_version.download_link=下载 Java %d
|
||||
fatal.samba=如果你正在通过 Samba 共享的文件夹中运行 Hello Minecraft! Launcher,启动器可能无法正常工作。请尝试更新你的 Java 或在本地文件夹内运行 HMCL。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。
|
||||
fatal.illegal_char=由于你的用户文件夹路径中存在非法字符“=”,你将无法使用外置登录账户以及离线登录更换皮肤功能。\n你可以访问 https://docs.hmcl.net/help.html 页面寻求帮助。
|
||||
@@ -754,11 +755,16 @@ modpack.wizard.step.initialization.warning=在制作整合包前,请你确认
|
||||
modpack.wizard.step.initialization.server=点击此处查看有关服务器自动更新整合包的制作教程
|
||||
|
||||
modrinth.category.adventure=冒险
|
||||
modrinth.category.atmosphere=氛围
|
||||
modrinth.category.audio=声音
|
||||
modrinth.category.blocks=方块
|
||||
modrinth.category.bloom=泛光
|
||||
modrinth.category.bukkit=Bukkit
|
||||
modrinth.category.bungeecord=BungeeCord
|
||||
modrinth.category.canvas=Canvas
|
||||
modrinth.category.cartoon=卡通
|
||||
modrinth.category.challenging=高难度
|
||||
modrinth.category.colored-lighting=彩色光照
|
||||
modrinth.category.core-shaders=核心着色器
|
||||
modrinth.category.combat=战斗
|
||||
modrinth.category.cursed=Cursed
|
||||
@@ -768,19 +774,25 @@ modrinth.category.entities=实体
|
||||
modrinth.category.environment=环境
|
||||
modrinth.category.equipment=装备
|
||||
modrinth.category.fabric=Fabric
|
||||
modrinth.category.fantasy=幻想
|
||||
modrinth.category.foliage=植被
|
||||
modrinth.category.fonts=字体
|
||||
modrinth.category.food=食物
|
||||
modrinth.category.forge=Forge
|
||||
modrinth.category.game-mechanics=游戏机制
|
||||
modrinth.category.gui=GUI
|
||||
modrinth.category.high=高
|
||||
modrinth.category.iris=Iris
|
||||
modrinth.category.items=物品
|
||||
modrinth.category.kitchen-sink=大杂烩
|
||||
modrinth.category.library=支持库
|
||||
modrinth.category.lightweight=轻量
|
||||
modrinth.category.liteloader=LiteLoader
|
||||
modrinth.category.locale=本地化
|
||||
modrinth.category.low=低
|
||||
modrinth.category.magic=魔法
|
||||
modrinth.category.management=管理
|
||||
modrinth.category.medium=中
|
||||
modrinth.category.minecraft=Minecraft
|
||||
modrinth.category.minigame=小游戏
|
||||
modrinth.category.misc=其他
|
||||
@@ -790,13 +802,21 @@ modrinth.category.models=模型
|
||||
modrinth.category.modloader=Modloader
|
||||
modrinth.category.multiplayer=多人
|
||||
modrinth.category.neoforge=NeoForge
|
||||
modrinth.category.optifine=OptiFine
|
||||
modrinth.category.optimization=优化
|
||||
modrinth.category.paper=Paper
|
||||
modrinth.category.path-tracing=路径追踪
|
||||
modrinth.category.pbr=PBR
|
||||
modrinth.category.potato=极低
|
||||
modrinth.category.purpur=Purpur
|
||||
modrinth.category.quests=任务
|
||||
modrinth.category.quilt=Quilt
|
||||
modrinth.category.realistic=写实
|
||||
modrinth.category.reflections=反射
|
||||
modrinth.category.rift=Rift
|
||||
modrinth.category.screenshot=极高
|
||||
modrinth.category.semi-realistic=半写实
|
||||
modrinth.category.shadows=阴影
|
||||
modrinth.category.simplistic=简单
|
||||
modrinth.category.social=社交
|
||||
modrinth.category.spigot=Spigot
|
||||
@@ -807,6 +827,7 @@ modrinth.category.themed=主题
|
||||
modrinth.category.transportation=运输
|
||||
modrinth.category.tweaks=优化
|
||||
modrinth.category.utility=实用
|
||||
modrinth.category.vanilla=原生
|
||||
modrinth.category.vanilla-like=类原生
|
||||
modrinth.category.velocity=Velocity
|
||||
modrinth.category.waterfall=Waterfall
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+2
@@ -41,6 +41,8 @@ public enum DiscoJavaDistribution implements JavaDistribution<DiscoJavaRemoteVer
|
||||
pair(WINDOWS, EnumSet.of(X86_64, X86, ARM64)),
|
||||
pair(LINUX, EnumSet.of(X86_64, X86, ARM64, ARM32, RISCV64, PPC64, PPC64LE, S390X, SPARCV9)),
|
||||
pair(MACOS, EnumSet.of(X86_64, ARM64))),
|
||||
// Fucking javac generates an anonymous inner class here, whose constructor takes no @SafeVarargs annotation, causing a compile-time warning.
|
||||
@SuppressWarnings({"unchecked", "RedundantSuppression"})
|
||||
LIBERICA("BellSoft Liberica", "liberica", "BellSoft",
|
||||
EnumSet.of(JDK, JRE, JDKFX, JREFX),
|
||||
pair(WINDOWS, EnumSet.of(X86_64, X86, ARM64)),
|
||||
|
||||
@@ -209,7 +209,7 @@ public final class CrashReportAnalyzer {
|
||||
}
|
||||
}
|
||||
|
||||
public static Set<Result> anaylze(String log) {
|
||||
public static Set<Result> analyze(String log) {
|
||||
Set<Result> results = new HashSet<>();
|
||||
for (Rule rule : Rule.values()) {
|
||||
Matcher matcher = rule.pattern.matcher(log);
|
||||
|
||||
@@ -47,7 +47,6 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -190,12 +189,14 @@ public final class MultiMCInstancePatch {
|
||||
return value != null && !value.isEmpty() ? value : Collections.emptyList();
|
||||
}
|
||||
|
||||
private static <T, K> List<T> dropDuplicate(List<T> original, Function<T, K> mapper) {
|
||||
Set<K> values = new HashSet<>();
|
||||
private static <T> List<T> dropDuplicate(List<T> original) {
|
||||
// TODO: Maybe new ArrayList(new LinkedHashSet(original)) ?
|
||||
|
||||
Set<T> values = new HashSet<>();
|
||||
List<T> result = new ArrayList<>();
|
||||
|
||||
for (T item : original) {
|
||||
if (values.add(mapper.apply(item))) {
|
||||
if (values.add(item)) {
|
||||
result.add(item);
|
||||
}
|
||||
}
|
||||
@@ -285,6 +286,8 @@ public final class MultiMCInstancePatch {
|
||||
Library mainJar;
|
||||
List<String> traits;
|
||||
List<String> tweakers;
|
||||
/* TODO: MultiMC use a slightly different way to store jars containing jni files.
|
||||
Transforming them to Official Scheme might boost compatibility with other launchers. */
|
||||
List<Library> libraries;
|
||||
List<Library> mavenOnlyFiles;
|
||||
List<String> jarModFileNames;
|
||||
@@ -338,10 +341,9 @@ public final class MultiMCInstancePatch {
|
||||
}
|
||||
}
|
||||
|
||||
traits = dropDuplicate(traits, Function.identity());
|
||||
tweakers = dropDuplicate(tweakers, Function.identity());
|
||||
libraries = dropDuplicate(libraries, Library::getName);
|
||||
jarModFileNames = dropDuplicate(jarModFileNames, Function.identity());
|
||||
traits = dropDuplicate(traits);
|
||||
tweakers = dropDuplicate(tweakers);
|
||||
jarModFileNames = dropDuplicate(jarModFileNames);
|
||||
|
||||
for (String tweaker : tweakers) {
|
||||
minecraftArguments.add("--tweakClass");
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ public final class MacOSHardwareDetector extends HardwareDetector {
|
||||
|
||||
try {
|
||||
Map<String, String> values = SystemUtils.run(Arrays.asList("/usr/sbin/sysctl", "machdep.cpu"),
|
||||
inputStream -> KeyValuePairUtils.loadProperties(
|
||||
inputStream -> KeyValuePairUtils.loadPairs(
|
||||
new BufferedReader(new InputStreamReader(inputStream, OperatingSystem.NATIVE_CHARSET))));
|
||||
|
||||
String brandString = values.get("machdep.cpu.brand_string");
|
||||
|
||||
@@ -813,4 +813,20 @@
|
||||
1.21.5-rc1
|
||||
1.21.5-rc2
|
||||
1.21.5
|
||||
25w14craftmine
|
||||
25w14craftmine
|
||||
25w15a
|
||||
25w16a
|
||||
25w17a
|
||||
25w18a
|
||||
25w19a
|
||||
25w20a
|
||||
25w21a
|
||||
1.21.6-pre1
|
||||
1.21.6-pre2
|
||||
1.21.6-pre3
|
||||
1.21.6-pre4
|
||||
1.21.6-rc1
|
||||
1.21.6
|
||||
1.21.7-rc1
|
||||
1.21.7-rc2
|
||||
1.21.7
|
||||
@@ -47,42 +47,42 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void jdk9() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/java9.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/java9.txt")),
|
||||
CrashReportAnalyzer.Rule.JDK_9);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jadeForestOptifine() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/jade_forest_optifine.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/jade_forest_optifine.txt")),
|
||||
CrashReportAnalyzer.Rule.JADE_FOREST_OPTIFINE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void rtssForestSodium() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/rtss_forest_sodium.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/rtss_forest_sodium.txt")),
|
||||
CrashReportAnalyzer.Rule.RTSS_FOREST_SODIUM);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jvm32() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/jvm_32bit.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/jvm_32bit.txt")),
|
||||
CrashReportAnalyzer.Rule.JVM_32BIT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void jvm321() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/jvm_32bit2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/jvm_32bit2.txt")),
|
||||
CrashReportAnalyzer.Rule.JVM_32BIT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modResolution() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/mod_resolution.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/mod_resolution.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION);
|
||||
assertEquals(("Errors were found!\n" +
|
||||
" - Mod test depends on mod {fabricloader @ [>=0.11.3]}, which is missing!\n" +
|
||||
@@ -94,7 +94,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void forgemodResolution() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/forgemod_resolution.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/forgemod_resolution.txt")),
|
||||
CrashReportAnalyzer.Rule.FORGEMOD_RESOLUTION);
|
||||
assertEquals(("\tMod ID: 'vampirism', Requested by: 'werewolves', Expected range: '[1.9.0-beta.1,)', Actual version: '[MISSING]'\n").replaceAll("\\s+", ""),
|
||||
result.getMatcher().group("reason").replaceAll("\\s+", ""));
|
||||
@@ -103,7 +103,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void forgeFoundDuplicateMods() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/forge_found_duplicate_mods.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/forge_found_duplicate_mods.txt")),
|
||||
CrashReportAnalyzer.Rule.FORGE_FOUND_DUPLICATE_MODS);
|
||||
assertEquals(("\tMod ID: 'jei' from mod files: REIPluginCompatibilities-forge-12.0.93.jar, jei-1.20.1-forge-15.2.0.27.jar\n").replaceAll("\\s+", ""),
|
||||
result.getMatcher().group("reason").replaceAll("\\s+", ""));
|
||||
@@ -112,7 +112,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void modResolutionCollection() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/mod_resolution_collection.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/mod_resolution_collection.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION_COLLECTION);
|
||||
assertEquals("tabtps-fabric", result.getMatcher().group("sourcemod"));
|
||||
assertEquals("{fabricloader @ [>=0.11.1]}", result.getMatcher().group("destmod"));
|
||||
@@ -121,7 +121,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void forgeEroor() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/forge_error.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/forge_error.txt")),
|
||||
CrashReportAnalyzer.Rule.FORGE_ERROR);
|
||||
assertEquals(("\nnet.minecraftforge.fml.common.MissingModsException: Mod pixelmon (Pixelmon) requires [forge@[14.23.5.2860,)]\n" +
|
||||
"\tat net.minecraftforge.fml.common.Loader.sortModList(Loader.java:264) ~[Loader.class:?]\n" +
|
||||
@@ -148,14 +148,14 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void modResolution0() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod_resolution0.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod_resolution0.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tooOldJava() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/too_old_java.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/too_old_java.txt")),
|
||||
CrashReportAnalyzer.Rule.TOO_OLD_JAVA);
|
||||
assertEquals("60", result.getMatcher().group("expected"));
|
||||
}
|
||||
@@ -163,7 +163,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void tooOldJava1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/too_old_java.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/too_old_java.txt")),
|
||||
CrashReportAnalyzer.Rule.TOO_OLD_JAVA);
|
||||
assertEquals("52", result.getMatcher().group("expected"));
|
||||
}
|
||||
@@ -171,7 +171,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void tooOldJava2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/too_old_java2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/too_old_java2.txt")),
|
||||
CrashReportAnalyzer.Rule.TOO_OLD_JAVA);
|
||||
assertEquals("52", result.getMatcher().group("expected"));
|
||||
}
|
||||
@@ -179,14 +179,14 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void javaVersionIsTooHigh() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/java_version_is_too_high.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/java_version_is_too_high.txt")),
|
||||
CrashReportAnalyzer.Rule.JAVA_VERSION_IS_TOO_HIGH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void securityException() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/security.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/security.txt")),
|
||||
CrashReportAnalyzer.Rule.FILE_CHANGED);
|
||||
assertEquals("assets/minecraft/texts/splashes.txt", result.getMatcher().group("file"));
|
||||
}
|
||||
@@ -194,7 +194,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void noClassDefFoundError1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/no_class_def_found_error.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/no_class_def_found_error.txt")),
|
||||
CrashReportAnalyzer.Rule.NO_CLASS_DEF_FOUND_ERROR);
|
||||
assertEquals("blk", result.getMatcher().group("class"));
|
||||
}
|
||||
@@ -202,7 +202,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void noClassDefFoundError2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/no_class_def_found_error2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/no_class_def_found_error2.txt")),
|
||||
CrashReportAnalyzer.Rule.NO_CLASS_DEF_FOUND_ERROR);
|
||||
assertEquals("cer", result.getMatcher().group("class"));
|
||||
}
|
||||
@@ -210,7 +210,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fileAlreadyExists() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/file_already_exists.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/file_already_exists.txt")),
|
||||
CrashReportAnalyzer.Rule.FILE_ALREADY_EXISTS);
|
||||
assertEquals(
|
||||
"D:\\Games\\Minecraft\\Minecraft Longtimeusing\\.minecraft\\versions\\1.12.2-forge1.12.2-14.23.5.2775\\config\\pvpsettings.txt",
|
||||
@@ -220,7 +220,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void loaderExceptionModCrash() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/loader_exception_mod_crash.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/loader_exception_mod_crash.txt")),
|
||||
CrashReportAnalyzer.Rule.LOADING_CRASHED_FORGE);
|
||||
assertEquals("Better PvP", result.getMatcher().group("name"));
|
||||
assertEquals("xaerobetterpvp", result.getMatcher().group("id"));
|
||||
@@ -229,7 +229,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void loaderExceptionModCrash2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/loader_exception_mod_crash2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/loader_exception_mod_crash2.txt")),
|
||||
CrashReportAnalyzer.Rule.LOADING_CRASHED_FORGE);
|
||||
assertEquals("Inventory Sort", result.getMatcher().group("name"));
|
||||
assertEquals("invsort", result.getMatcher().group("id"));
|
||||
@@ -238,7 +238,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void loaderExceptionModCrash3() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/loader_exception_mod_crash3.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/loader_exception_mod_crash3.txt")),
|
||||
CrashReportAnalyzer.Rule.LOADING_CRASHED_FORGE);
|
||||
assertEquals("SuperOres", result.getMatcher().group("name"));
|
||||
assertEquals("superores", result.getMatcher().group("id"));
|
||||
@@ -247,7 +247,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void loaderExceptionModCrash4() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/loader_exception_mod_crash4.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/loader_exception_mod_crash4.txt")),
|
||||
CrashReportAnalyzer.Rule.LOADING_CRASHED_FORGE);
|
||||
assertEquals("Kathairis", result.getMatcher().group("name"));
|
||||
assertEquals("kathairis", result.getMatcher().group("id"));
|
||||
@@ -256,7 +256,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void loadingErrorFabric() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/loading_error_fabric.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/loading_error_fabric.txt")),
|
||||
CrashReportAnalyzer.Rule.LOADING_CRASHED_FABRIC);
|
||||
assertEquals("test", result.getMatcher().group("id"));
|
||||
}
|
||||
@@ -264,56 +264,56 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void graphicsDriver() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/graphics_driver.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/graphics_driver.txt")),
|
||||
CrashReportAnalyzer.Rule.GRAPHICS_DRIVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void graphicsDriverJVM() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/graphics_driver.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/graphics_driver.txt")),
|
||||
CrashReportAnalyzer.Rule.GRAPHICS_DRIVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void splashScreen() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/splashscreen.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/splashscreen.txt")),
|
||||
CrashReportAnalyzer.Rule.GRAPHICS_DRIVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void macosFailedToFindServicePortForDisplay() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/macos_failed_to_find_service_port_for_display.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/macos_failed_to_find_service_port_for_display.txt")),
|
||||
CrashReportAnalyzer.Rule.MACOS_FAILED_TO_FIND_SERVICE_PORT_FOR_DISPLAY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void modName() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/mod_name.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/mod_name.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_NAME);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void openj9() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/openj9.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/openj9.txt")),
|
||||
CrashReportAnalyzer.Rule.OPENJ9);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resolutionTooHigh() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/resourcepack_resolution.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/resourcepack_resolution.txt")),
|
||||
CrashReportAnalyzer.Rule.RESOLUTION_TOO_HIGH);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bootstrapFailed() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/bootstrap.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/bootstrap.txt")),
|
||||
CrashReportAnalyzer.Rule.BOOTSTRAP_FAILED);
|
||||
assertEquals("prefab", result.getMatcher().group("id"));
|
||||
}
|
||||
@@ -321,7 +321,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void mixinApplyModFailed() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/mixin_apply_mod_failed.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/mixin_apply_mod_failed.txt")),
|
||||
CrashReportAnalyzer.Rule.MIXIN_APPLY_MOD_FAILED);
|
||||
assertEquals("enhancedblockentities", result.getMatcher().group("id"));
|
||||
}
|
||||
@@ -329,7 +329,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void unsatisfiedLinkError() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/unsatisfied_link_error.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/unsatisfied_link_error.txt")),
|
||||
CrashReportAnalyzer.Rule.UNSATISFIED_LINK_ERROR);
|
||||
assertEquals("lwjgl.dll", result.getMatcher().group("name"));
|
||||
}
|
||||
@@ -337,35 +337,35 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void outOfMemoryMC() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/out_of_memory.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/out_of_memory.txt")),
|
||||
CrashReportAnalyzer.Rule.OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outOfMemoryJVM() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/out_of_memory.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/out_of_memory.txt")),
|
||||
CrashReportAnalyzer.Rule.OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outOfMemoryJVM1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/out_of_memory2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/out_of_memory2.txt")),
|
||||
CrashReportAnalyzer.Rule.OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void memoryExceeded() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/memory_exceeded.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/memory_exceeded.txt")),
|
||||
CrashReportAnalyzer.Rule.MEMORY_EXCEEDED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void config() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/config.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/config.txt")),
|
||||
CrashReportAnalyzer.Rule.CONFIG);
|
||||
assertEquals("jumbofurnace", result.getMatcher().group("id"));
|
||||
assertEquals("jumbofurnace-server.toml", result.getMatcher().group("file"));
|
||||
@@ -374,7 +374,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabricWarnings() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric_warnings.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric_warnings.txt")),
|
||||
CrashReportAnalyzer.Rule.FABRIC_WARNINGS);
|
||||
assertEquals((" - Conflicting versions found for fabric-api-base: used 0.3.0+a02b446313, also found 0.3.0+a02b44633d, 0.3.0+a02b446318\n" +
|
||||
" - Conflicting versions found for fabric-rendering-data-attachment-v1: used 0.1.5+a02b446313, also found 0.1.5+a02b446318\n" +
|
||||
@@ -390,7 +390,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabricWarnings1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric_warnings2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric_warnings2.txt")),
|
||||
CrashReportAnalyzer.Rule.FABRIC_WARNINGS);
|
||||
assertEquals(("net.fabricmc.loader.impl.FormattedException: Mod resolution encountered an incompatible mod set!\n" +
|
||||
"A potential solution has been determined:\n" +
|
||||
@@ -404,7 +404,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabricWarnings2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric_warnings3.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric_warnings3.txt")),
|
||||
CrashReportAnalyzer.Rule.FABRIC_WARNINGS);
|
||||
assertEquals(("net.fabricmc.loader.impl.FormattedException: Some of your mods are incompatible with the game or each other!\n" +
|
||||
"确定了一种可能的解决方法,这样做可能会解决你的问题:\n" +
|
||||
@@ -420,7 +420,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabricConflicts() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric-mod-conflict.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric-mod-conflict.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION_CONFLICT);
|
||||
assertEquals("phosphor", result.getMatcher().group("sourcemod"));
|
||||
assertEquals("{starlight @ [*]}", result.getMatcher().group("destmod"));
|
||||
@@ -429,7 +429,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabricMissing() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric-mod-missing.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric-mod-missing.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION_MISSING);
|
||||
assertEquals("pca", result.getMatcher().group("sourcemod"));
|
||||
assertEquals("{fabric @ [>=0.39.2]}", result.getMatcher().group("destmod"));
|
||||
@@ -438,35 +438,35 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void fabric0_12() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric-version-0.12.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric-version-0.12.txt")),
|
||||
CrashReportAnalyzer.Rule.FABRIC_VERSION_0_12);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void twilightForestOptiFineIncompatible() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod/twilightforest_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod/twilightforest_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.Rule.TWILIGHT_FOREST_OPTIFINE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void performantOptiFineIncompatible() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod/performant_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod/performant_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.Rule.PERFORMANT_FOREST_OPTIFINE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void neoforgeForestOptiFineIncompatible() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod/neoforgeforest_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod/neoforgeforest_optifine_incompatibility.txt")),
|
||||
CrashReportAnalyzer.Rule.NEOFORGE_FOREST_OPTIFINE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fabricMissingMinecraft() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/fabric-minecraft.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/fabric-minecraft.txt")),
|
||||
CrashReportAnalyzer.Rule.MOD_RESOLUTION_MISSING_MINECRAFT);
|
||||
assertEquals("fabric", result.getMatcher().group("mod"));
|
||||
assertEquals("[~1.16.2-alpha.20.28.a]", result.getMatcher().group("version"));
|
||||
@@ -475,161 +475,161 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void optifineRepeatInstallation() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_repeat_installation.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_repeat_installation.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_REPEAT_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation2.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation3() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation3.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation3.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation4() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation4.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation4.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation5() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation5.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation5.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation6() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation6.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation6.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompleteForgeInstallation7() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/incomplete_forge_installation7.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/incomplete_forge_installation7.txt")),
|
||||
CrashReportAnalyzer.Rule.INCOMPLETE_FORGE_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forgeRepeatInstallation() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/forge_repeat_installation.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/forge_repeat_installation.txt")),
|
||||
CrashReportAnalyzer.Rule.FORGE_REPEAT_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forgeRepeatInstallation1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/forge_repeat_installation2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/forge_repeat_installation2.txt")),
|
||||
CrashReportAnalyzer.Rule.FORGE_REPEAT_INSTALLATION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void needJDK11() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/need_jdk11.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/need_jdk11.txt")),
|
||||
CrashReportAnalyzer.Rule.NEED_JDK11);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void needJDK112() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/need_jdk112.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/need_jdk112.txt")),
|
||||
CrashReportAnalyzer.Rule.NEED_JDK11);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void needJDK113() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/need_jdk113.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/need_jdk113.txt")),
|
||||
CrashReportAnalyzer.Rule.NEED_JDK11);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge1() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge2.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge2.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge2() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge3.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge3.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge3() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge4.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge4.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge4() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge5.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge5.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void optifineIsNotCompatibleWithForge5() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/optifine_is_not_compatible_with_forge6.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/optifine_is_not_compatible_with_forge6.txt")),
|
||||
CrashReportAnalyzer.Rule.OPTIFINE_IS_NOT_COMPATIBLE_WITH_FORGE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shadersMod() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/shaders_mod.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/shaders_mod.txt")),
|
||||
CrashReportAnalyzer.Rule.SHADERS_MOD);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void installMixinbootstrap() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/logs/install_mixinbootstrap.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/logs/install_mixinbootstrap.txt")),
|
||||
CrashReportAnalyzer.Rule.INSTALL_MIXINBOOTSTRAP);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void nightconfigfixes() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/night_config_fixes.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/night_config_fixes.txt")),
|
||||
CrashReportAnalyzer.Rule.NIGHT_CONFIG_FIXES);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void customNpc() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod/customnpc.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod/customnpc.txt")),
|
||||
CrashReportAnalyzer.Rule.ENTITY);
|
||||
assertEquals("customnpcs.CustomNpc (noppes.npcs.entity.EntityCustomNpc)",
|
||||
result.getMatcher().group("type"));
|
||||
@@ -644,7 +644,7 @@ public class CrashReportAnalyzerTest {
|
||||
@Test
|
||||
public void tconstruct() throws IOException {
|
||||
CrashReportAnalyzer.Result result = findResultByRule(
|
||||
CrashReportAnalyzer.anaylze(loadLog("/crash-report/mod/tconstruct.txt")),
|
||||
CrashReportAnalyzer.analyze(loadLog("/crash-report/mod/tconstruct.txt")),
|
||||
CrashReportAnalyzer.Rule.BLOCK);
|
||||
assertEquals("Block{tconstruct:seared_drain}[active=true,facing=north]",
|
||||
result.getMatcher().group("type"));
|
||||
|
||||
+4
-4
@@ -4,13 +4,13 @@
|
||||
|
||||
| | Windows | Linux | macOS | FreeBSD |
|
||||
|----------------------------|:--------------------------------------------------|:---------------------------|:------------------------------------------------------------------------|:---------------------------|
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌 (Minecraft 1.13~1.21.4) |
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌 (Minecraft 1.13~1.21.7) |
|
||||
| x86 | ✅️ (~1.20.4) | ✅️ (~1.20.4) | / | / |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.4) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (use Rosetta 2) | ❔ |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.7) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (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.4) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.4) | / | / |
|
||||
| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21.7) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.7) | / | / |
|
||||
| LoongArch64 (Old World) | / | 👌 (Minecraft 1.6~1.20.1) | / | / |
|
||||
| PowerPC-64 (Little-Endian) | / | ❔ | / | / |
|
||||
| S390x | / | ❔ | / | / |
|
||||
|
||||
+4
-4
@@ -4,13 +4,13 @@
|
||||
|
||||
| | Windows | Linux | macOS | FreeBSD |
|
||||
|----------------------------|:--------------------------------------------------|:---------------------------|:-----------------------------------------------------------------------|:--------------------------|
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.21.4) |
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.21.7) |
|
||||
| x86 | ✅️ (~1.20.4) | ✅️ (~1.20.4) | / | / |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.4) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (使用 Rosetta 2) | ❔ |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.7) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (使用 Rosetta 2) | ❔ |
|
||||
| ARM32 | /️ | 👌 (Minecraft 1.8~1.20.1) | / | / |
|
||||
| MIPS64el | / | 👌 (Minecraft 1.8~1.20.1) | / | / |
|
||||
| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21.4) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.4) | / | / |
|
||||
| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21.7) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.7) | / | / |
|
||||
| LoongArch64 (旧世界) | / | 👌 (Minecraft 1.6~1.20.1) | / | / |
|
||||
| PowerPC-64 (Little-Endian) | / | ❔ | / | / |
|
||||
| S390x | / | ❔ | / | / |
|
||||
|
||||
+4
-4
@@ -4,13 +4,13 @@
|
||||
|
||||
| | Windows | Linux | macOS | FreeBSD |
|
||||
|----------------------------|:--------------------------------------------------|:---------------------------|:-----------------------------------------------------------------------|:--------------------------|
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.21.4) |
|
||||
| x86-64 | ✅️ | ✅️ | ✅️ | 👌(Minecraft 1.13~1.21.7) |
|
||||
| x86 | ✅️ (~1.20.4) | ✅️ (~1.20.4) | / | / |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.4) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (使用 Rosetta 2) | ❔ |
|
||||
| ARM64 | 👌 (Minecraft 1.8~1.18.2)<br/>✅ (Minecraft 1.19+) | 👌 (Minecraft 1.8~1.21.7) | 👌 (Minecraft 1.6~1.18.2)<br/>✅ (Minecraft 1.19+)<br/>✅ (使用 Rosetta 2) | ❔ |
|
||||
| ARM32 | /️ | 👌 (Minecraft 1.8~1.20.1) | / | / |
|
||||
| MIPS64el | / | 👌 (Minecraft 1.8~1.20.1) | / | / |
|
||||
| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21.4) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.4) | / | / |
|
||||
| RISC-V 64 | / | 👌 (Minecraft 1.13~1.21.7) | / | / |
|
||||
| LoongArch64 | / | 👌 (Minecraft 1.6~1.21.7) | / | / |
|
||||
| LoongArch64 (舊世界) | / | 👌 (Minecraft 1.6~1.20.1) | / | / |
|
||||
| PowerPC-64 (Little-Endian) | / | ❔ | / | / |
|
||||
| S390x | / | ❔ | / | / |
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
/*
|
||||
* Hello Minecraft! Launcher
|
||||
* Copyright (C) 2025 huangyuhui <huanghongxun2008@126.com> 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 <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.jackhuang.hmcl.gradle.mod;
|
||||
|
||||
import com.google.gson.*;
|
||||
@@ -24,6 +41,9 @@ import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* @author Glavo
|
||||
*/
|
||||
public abstract class ParseModDataTask extends DefaultTask {
|
||||
|
||||
@InputFile
|
||||
@@ -44,15 +64,12 @@ public abstract class ParseModDataTask extends DefaultTask {
|
||||
Pattern.compile("^/projects/(?<modid>[\\w-]+)(/(.*?))?$"),
|
||||
Pattern.compile("^/mc-mods/minecraft/(?<modid>[\\w-]+)(/(.*?))?$"),
|
||||
Pattern.compile("^/legacy/mc-mods/minecraft/(\\d+)-(?<modid>[\\w-]+)"),
|
||||
Pattern.compile("^//minecraft/mc-mods/(?<modid>eyes-mod)$") // Workaround for Eye Blocks
|
||||
};
|
||||
|
||||
private static String parseCurseforge(String url) {
|
||||
URI res = URI.create(url);
|
||||
|
||||
if (!"http".equals(res.getScheme())
|
||||
&& !"https".equals(res.getScheme())
|
||||
&& !"www.curseforge.com".equals(res.getHost())) { // Workaround for DakerACG
|
||||
if (!"http".equals(res.getScheme()) && !"https".equals(res.getScheme())) {
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -77,10 +94,10 @@ public abstract class ParseModDataTask extends DefaultTask {
|
||||
return "";
|
||||
}
|
||||
|
||||
private static final Set<String> skip = new HashSet<>(Arrays.asList(
|
||||
private static final Set<String> skip = Set.of(
|
||||
"Minecraft",
|
||||
"The Building Game"
|
||||
));
|
||||
);
|
||||
|
||||
@TaskAction
|
||||
public void run() throws IOException {
|
||||
|
||||
Reference in new issue
Block a user