Compare commits

...
Author SHA1 Message Date
辞庐 064b39d753 修复添加游戏文件夹页面缺少灰色背景的问题 (#4065) 2025-07-06 15:46:08 +08:00
Glavo c669026312 Fix #4067: 修复使用 JavaFX 25 启动时下载界面布局错位的问题 (#4069) 2025-07-05 22:29:07 +08:00
Glavo d9b95b28b2 Update PLATFORM.md (#4062) 2025-07-04 17:06:41 +08:00
Glavo d492884927 使用 Java 8 运行时禁止更新 (#4032) 2025-07-02 23:44:27 +08:00
3gf8jv4dv cf4fde5592 chore(locale): add shader category translation for russian and spanish (#4042) 2025-07-01 07:58:40 +08:00
Glavo fd959c41c3 Update versions.txt to 1.21.7 (#4035) 2025-07-01 07:52:54 +08:00
3gf8jv4dv e34037c055 chore(locale): add world management translation for russian and spanish (#4041)
Some terminology is consistent with Minecraft Wiki.
2025-06-29 07:13:44 +08:00
3gf8jv4dv 417c804f48 chore(locale): add tip translation of deprecated java ver for ru and es (#4043)
and fix a previous typo.
2025-06-29 07:12:34 +08:00
Glavo ea6eced136 更新 mod_data.txt (#4040) 2025-06-29 04:07:48 +08:00
Glavo 432465ab46 修复部分 Linux 环境中未正确选择默认字体的问题 (#4036) 2025-06-27 17:23:27 +08:00
Burning_TNT 03c95cd726 Fix: 压制 DiscoJavaDistribution 编译警告 (#4038)
* Fix: Suppress compile-time warning.

* Fix: typo

* Adjust F*** -> Fucking.
2025-06-27 17:16:40 +08:00
Burning_TNT 730febca8c Fix: MultiMC allows libraries with the same artifact descriptor string. (#4016) 2025-06-21 21:18:53 +08:00
Kieran Moy bc41499d1c fix typo (#4015) 2025-06-19 17:19:09 +08:00
3gf8jv4dv 60fae5cc88 chore: update versions.txt to 1.21.6 (#4011) 2025-06-18 23:58:12 +08:00
Glavo c11837baa4 修复光影下载页面中标签名称未翻译的问题 (#4007) 2025-06-17 09:07:47 +08:00
Glavo aaf1218536 修复 macOS 上无法读取 CPU 信息的问题 (#4009) 2025-06-16 11:48:05 +08:00
24 changed files with 3188 additions and 821 deletions

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
@@ -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");
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {