Compare commits

...

14 Commits

Author SHA1 Message Date
Wily 68651b2ca6
Merge 6d72779ef0 into 847106f1fb 2024-01-07 20:08:42 +01:00
Henry 847106f1fb
Linux XDG folder support (#518) 2024-01-02 23:23:57 +00:00
Henry 93f60488fa
Prevent Forge's Log4j configuration from being overridden (#513) 2024-01-02 21:03:06 +00:00
Henry Le Grys b5fe175650 Add support for NeoForge 2024-01-02 20:58:51 +00:00
Henry Le Grys 11808457fe Fix launcher trying to download processor outputs
Fix for forge 1.20.4; the generated client jar is specified as a library
because it goes on the classpath now.
2024-01-02 20:22:23 +00:00
Ch. König 5712eb1dfb
rewritten xdg folder fetcher.
tries old dotfolder first
2023-09-20 10:12:17 +02:00
Ch. König 9428dbbe7b
Linux XDG folder support 2023-09-13 19:50:49 +02:00
DaPorkchop_ 5668e567a1
move vanilla jar to the end of the classpath
this emulates the behavior of the vanilla launcher. it's important because if the vanilla jar is first, Log4j will always auto-detect the vanilla log4j.xml instead of Forge's.
2023-08-04 18:14:14 +02:00
DaPorkchop_ 31a13115fb
copy logging config from loader version manifest 2023-08-04 18:14:09 +02:00
WILLIAM8812 6d72779ef0 Create Launcher.properties 2021-08-10 19:49:45 +02:00
WILLIAM8812 c5a9c4c3aa Create Launcher_fr.properties 2021-08-10 19:47:36 +02:00
WILLIAM8812 c668cad390
Delete lang 2021-08-10 19:43:23 +02:00
WILLIAM8812 9f2cfcffde
Create lang 2021-08-10 19:43:16 +02:00
WILLIAM8812 b916cb3ccb
Delete Launcher.properties 2021-08-10 19:42:32 +02:00
11 changed files with 274 additions and 10 deletions

View File

@ -194,9 +194,21 @@ public class Bootstrap {
String osName = System.getProperty("os.name").toLowerCase();
if (osName.contains("win")) {
return new File(getFileChooseDefaultDir(), getProperties().getProperty("homeFolderWindows"));
} else {
return new File(System.getProperty("user.home"), getProperties().getProperty("homeFolder"));
}
File dotFolder = new File(System.getProperty("user.home"), getProperties().getProperty("homeFolder"));
String xdgFolderName = getProperties().getProperty("homeFolderLinux");
if (osName.contains("linux") && !dotFolder.exists() && !xdgFolderName.isEmpty()) {
String xdgDataHome = System.getenv("XDG_DATA_HOME");
if (xdgDataHome.isEmpty()) {
xdgDataHome = System.getProperty("user.home") + "/.local/share";
}
return new File(xdgDataHome, xdgFolderName);
}
return dotFolder;
}
private static boolean isPortableMode() {

View File

@ -5,6 +5,7 @@
#
homeFolderWindows=Example Launcher
homeFolderLinux=example_launcher
homeFolder=.examplelauncher
launcherClass=com.skcraft.launcher.Launcher
latestUrl=http://update.skcraft.com/quark/launcher/latest.json
latestUrl=http://update.skcraft.com/quark/launcher/latest.json

View File

@ -164,7 +164,7 @@ public class PackageBuilder {
if (basicProfile.isLegacy()) {
processor = new OldForgeLoaderProcessor();
} else if (basicProfile.getProfile().equalsIgnoreCase("forge")) {
} else {
processor = new ModernForgeLoaderProcessor();
}
} else if (BuilderUtils.getZipEntry(jarFile, "fabric-installer.json") != null) {

View File

@ -73,6 +73,12 @@ public class ModernForgeLoaderProcessor implements ILoaderProcessor {
}
}
// Copy logging config
SidedData<VersionManifest.LoggingConfig> loggingConfig = info.getLogging();
if (loggingConfig != null) {
version.setLogging(loggingConfig);
}
// Copy main class
String mainClass = info.getMainClass();
if (mainClass != null) {
@ -150,6 +156,22 @@ public class ModernForgeLoaderProcessor implements ILoaderProcessor {
// Add loader manifest to the map
manifest.getLoaders().put(loaderName, new LoaderManifest(profile.getLibraries(), profile.getData(), extraFiles));
// Find name of final patched library and mark it as excluded from download
// TODO: we should generalize this to all process outputs, really
SidedData<String> finalJars = profile.getData().get("PATCHED");
if (finalJars != null) {
String libraryName = finalJars.getClient();
libraryName = libraryName.substring(1, libraryName.length() - 1);
for (Library lib : result.getLoaderLibraries()) {
if (lib.matches(libraryName)) {
lib.setGenerated(true);
log.info(String.format("Setting generated flag on library '%s'", lib.getName()));
break;
}
}
}
// Add processors
manifest.getTasks().addAll(profile.toProcessorEntries(loaderName));
}

View File

@ -140,7 +140,6 @@ public class Runner implements Callable<Process>, ProgressObservable {
}
progress = new DefaultProgress(0.9, SharedLocale.tr("runner.collectingArgs"));
builder.classPath(getJarPath());
builder.setMainClass(versionManifest.getMainClass());
addWindowArgs();
@ -232,6 +231,9 @@ public class Runner implements Callable<Process>, ProgressObservable {
tr("runner.missingLibrary", instance.getTitle(), library.getName()));
}
}
// The official launcher puts the vanilla jar at the end of the classpath, we'll do the same
builder.classPath(getJarPath());
}
/**
@ -307,7 +309,7 @@ public class Runner implements Callable<Process>, ProgressObservable {
}
}
if (versionManifest.getLogging() != null) {
if (versionManifest.getLogging() != null && versionManifest.getLogging().getClient() != null) {
log.info("Logging config present, log4j2 bug likely mitigated");
VersionManifest.LoggingConfig config = versionManifest.getLogging().getClient();

View File

@ -19,7 +19,7 @@ public class LoaderManifest {
public Library findLibrary(String name) {
for (Library library : getLibraries()) {
if (library.getName().equals(name)) {
if (library.matches(name)) {
return library;
}
}

View File

@ -12,6 +12,7 @@ import com.google.common.base.Splitter;
import com.skcraft.launcher.model.minecraft.GameArgument;
import com.skcraft.launcher.model.minecraft.Library;
import com.skcraft.launcher.model.minecraft.MinecraftArguments;
import com.skcraft.launcher.model.minecraft.VersionManifest;
import lombok.Data;
import java.util.List;
@ -23,6 +24,7 @@ public class VersionInfo {
private MinecraftArguments arguments;
private String mainClass;
private List<Library> libraries;
private SidedData<VersionManifest.LoggingConfig> logging;
@JsonIgnore private transient boolean overridingArguments;

View File

@ -8,6 +8,7 @@ package com.skcraft.launcher.model.minecraft;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
@ -33,7 +34,8 @@ public class Library {
private String comment;
// Custom
private boolean locallyAvailable;
@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
private boolean generated;
public boolean matches(Environment environment) {
boolean allow = false;
@ -201,6 +203,12 @@ public class Library {
}
public void setName(String name) {
int classifierPos = name.indexOf("@");
if (classifierPos != -1) {
// Take off classifiers
name = name.substring(0, classifierPos);
}
this.name = name;
// [DEEP SIGH]
@ -226,6 +234,20 @@ public class Library {
}
}
/**
* Classifier-independent library name check
* @param mavenName Maven name of a library, possibly with a classifier
* @return True if this library is named 'mavenName'.
*/
public boolean matches(String mavenName) {
int classifierPos = mavenName.indexOf('@');
if (classifierPos != -1) {
mavenName = mavenName.substring(0, classifierPos);
}
return this.name.equals(mavenName);
}
public static String mavenNameToPath(String mavenName) {
List<String> split = Splitter.on(':').splitToList(mavenName);
int size = split.size();

View File

@ -249,6 +249,8 @@ public abstract class BaseUpdater {
}
for (Library library : allLibraries) {
if (library.isGenerated()) continue; // Skip generated libraries.
if (library.matches(environment)) {
checkInterrupted();
@ -282,7 +284,7 @@ public abstract class BaseUpdater {
}
// Use our custom logging config depending on what the manifest specifies
if (versionManifest.getLogging() != null) {
if (versionManifest.getLogging() != null && versionManifest.getLogging().getClient() != null) {
VersionManifest.LoggingConfig config = versionManifest.getLogging().getClient();
VersionManifest.Artifact file = config.getFile();

View File

@ -207,4 +207,4 @@ features.install=OK
features.selectForInfo=Select a feature to see more information.
features.intro=Please select the optional features to install.
features.starred=(recommended)
features.avoid=(not recommended)
features.avoid=(not recommended)

View File

@ -0,0 +1,201 @@
#
# SK's Minecraft Launcher
# Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
# Please see LICENSE.txt for license information.
#
# Traduction made by : https://github.com/WILLIAM8812
#
errorTitle=Une erreur est survenue
confirmTitle=Confirmer
context.cut=Couper
context.copy=Copier
context.paste=Coller
context.delete=Supprimer
context.selectAll=Tout selectionner
errors.openUrlError=Echec de l''ouverture de l''URL\ : {0}
errors.openDirError=Impossible d''ouvrir ''{0}''. Peut-Etre qu''il n''existe pas ?
errors.reportErrorPreface=Pour signaler cette erreur, veuillez fournir\:\n\n
errors.genericError=Une erreur est survenue.
errors.updateRequiredError=Veuillez telecharger une nouvelle version du lanceur pour continuer la mise a jour.
errors.selfUpdateCheckError=La recherche d''une mise a jour du lanceur a echoue.
button.cancel=Annuler
button.ok=OK
options.title = Options
options.useProxyCheck = Utiliser le proxy suivant dans Minecraft
options.jvmPath=Chemin JVM\:
options.jvmArguments=Arguments JVM\:
options.64BitJavaWarning=<html>Assurez-vous d''avoir <strong>Java 64 bits installe</strong> si vous prevoyez de definir des limites de memoire plus elevees.
options.minMemory=Memoire minimale (Mo)\:
options.maxMemory=Memoire maximale (Mo)\:
options.permGen=PermGen (Mo)\:
options.javaTab=Java
options.windowWidth=Largeur de la fenEtre\:
options.windowHeight=Hauteur de la fenEtre\:
options.minecraftTab=Minecraft
options.proxyHost=Hote proxy\:
options.proxyPort=Port proxy\:
options.proxyUsername=Nom d''utilisateur du proxy\:
options.proxyPassword=Mot de passe proxy\:
options.proxyTab=Proxy
options.gameKey=Cle du jeu\:
options.advancedTab=Avancee
options.about=A propos
options.launcherConsole=Console
instance.launch=Lancer
instance.install=Installer
instance.openFolder=Afficher le dossier
instance.openSaves=Afficher les sauvegardes
instance.openResourcePacks=Afficher les packs de ressources
instance.openScreenshots=Afficher les captures d''ecran
instance.copyAsPath=Copier comme chemin
instance.forceUpdate=Forcer la mise a jour
instance.hardForceUpdate=Mise a jour forcee...
instance.deleteFiles=Supprimer les fichiers...
instance.confirmDelete=Etes-vous sur de vouloir supprimer TOUS LES FICHIERS (captures d''ecran, mondes, configurations) pour ''{0}'' ?
instance.deletingTitle=Suppression de l''instance...
instance.deletingStatus=Suppression de ''{0}'' et des fichiers...
instance.confirmHardUpdate=Une mise a jour forcee supprimera le contenu de config/ et mods/ et necessitera ensuite une mise a jour. Etes-vous sur de vouloir continuer ?
instance.resettingTitle=Reinitialisation de l''instance...
instance.resettingStatus=Reinitialisation de ''{0}''...
launcher.launch=Lancer...
launcher.checkForUpdates=Verifier les mises a jour
launcher.options=Options...
launcher.updateLauncher=Mettre a jour le lanceur...
launcher.downloadUpdates=Telecharger les mises a jour modpacks
launcher.title= SKCRAFT Launcher Launcher (v{0})
launcher.appTitle= SKCRAFT Launcher Launcher
launcher.refreshList=Rafraîchir la liste
launcher.checkingTitle=Obtention des modpacks disponibles...
launcher.checkingStatus=Obtention des modpacks disponibles... Veuillez patienter.
launcher.selfUpdatingTitle=Mise a jour du lanceur...
launcher.selfUpdatingStatus=Telechargement de la mise a jour du lanceur...
launcher.selfUpdateComplete=Redemarrez le lanceur pour utiliser la nouvelle version.
launcher.selfUpdateCompleteTitle=Mise a jour terminee
launcher.updatingTitle=Mise a jour...
launcher.updatingStatus=Mise a jour de ''{0}''... Veuillez patienter.
launcher.noInstanceError=Veuillez selectionner un modpack a lancer.
launcher.noInstanceTitle=Aucun Modpack selectionne
launcher.launchingTItle=Lancement du jeu...
launcher.launchingStatus=Lancement de ''{0}''. S''il vous plaît, attendez.
launcher.modpackColumn=Modpack
launcher.notInstalledHint=(pas installe)
launcher.requiresUpdateHint=(necessite une mise a jour)
launcher.updatePendingHint=(en attente de mise a jour)
accounts.title=Selectionnez le compte avec lequel jouer
accounts.play=Jouer!
accounts.refreshingStatus=Rafraîchissement de la session de connexion...
accounts.addMojang=Ajouter un compte Mojang
accounts.addMicrosoft=Ajouter un compte Microsoft
accounts.removeSelected=Oublier le compte selectionne
accounts.confirmForgetTitle=Oublier le compte
accounts.confirmForget=Etes-vous sur de vouloir oublier ce compte ?
login.login=Connexion...
login.recoverAccount=Identifiant oublie ?
login.playOffline=Jouer hors-ligne
login.title=Connexion Minecraft
login.defaultMessage=Connectez-vous avec votre compte Mojang
login.idEmail=ID/Email\:
login.password=Mot de passe\:
login.noPasswordError=Veuillez entrer un mot de passe.
login.noPasswordTitle=Mot de passe manquant
login.loggingInTitle=Se connecter...
login.loggingInStatus=Connexion a Minecraft...
login.noLoginError=Veuillez saisir les details de votre compte.
login.noLoginTitle=Compte manquant
login.minecraftNotOwnedError=Desole, Minecraft n''est pas achete sur ce compte.
login.microsoft.seeBrowser=Verifiez votre navigateur pour vous connecter avec Microsoft.
login.xbox.generic=echec de l''authentification avec Xbox Live.
login.xbox.noXboxAccount=Ce compte n''a pas de compte Xbox associe !
login.xbox.isChild=Le compte est un enfant (moins de 18 ans) et ne peut Etre ouvert que s''il fait partie d''une famille.
login.xbox.unknown=Une erreur inconnue s''est produite lors de la connexion avec Xbox (XErr {0})
login.xbox.errorMessage=Une erreur inconnue s''est produite lors de la connexion avec Xbox : {0}
login.minecraft.error=Une erreur s''est produite lors de l''autorisation avec les services Minecraft : {0}
console.title=Console
console.launcherConsoleTitle=Messages du lanceur
console.uploadLog=Telecharger le journal
console.pasteUploading=Telechargement de {0} octets...\n
console.pasteUploaded=Coller importe\ : {0}\n
console.pasteFailed=echec du telechargement\ : {0}\n
console.processEndCode=Process ended with code\: {0}
console.attachedToProcess=Le jeu est en marche. S''il vous plaît, attendez.
console.forceClose=Forcer la fermeture
console.trayTooltip= SKCRAFT Launcher
console.trayTitle= SKCRAFT Launcher
console.tray.showWindow=Afficher la fenEtre
console.tray.forceClose=Forcer la fermeture...
console.closeWindow=Fermer la fenEtre
console.hideWindow=Masquer la fenEtre
console.confirmKill=Etes-vous sur de vouloir fermer le jeu de force ? Vous risquez de perdre des donnees.
console.confirmKillTitle=Es-tu sur?
console.clearLog=Vider
downloader.downloadingItem=Telechargement de {0}...
downloader.downloadingList=Telechargement de {0} fichiers... ({1} restant, {2} echoue)
downloader.jobProgress={1,number}%\t{0}
downloader.jobPending=...\t{0}
downloader.noDownloads=Aucun telechargement en attente.
downloader.failedCount=({0} ont echoue)
progress.details=Details...
progress.less=Moins...
progress.viewLog=Afficher le journal
progress.confirmCancel=Etes-vous sur de vouloir annuler ?
progress.confirmCancelTitle=Annuler
progress.defaultStatus=En cours...
progress.percentTitle=({0}%) {1}
installer.installing=Installation...
installer.executing=Execution des tâches... ({0} restant)
installer.copyingFile=Copie de {0} vers {1}
installer.movingFile=Deplacement de {0} vers {1}
installer.runningProcessor=Lancement du processeur {0} : {1}
updater.updating=Mise a jour du lanceur...
updater.updateRequiredButOffline=Une mise a jour est necessaire mais vous devez Etre en mode en-ligne.
updater.updateRequiredButNoManifest=Une mise a jour est requise, mais les informations de mise a jour pour cette instance ne sont plus disponibles.
instanceUpdater.preparingUpdate=Preparation de la mise a jour...
instanceUpdater.readingManifest=Lecture du manifeste du package...
instanceUpdater.readingVersion=Lecture du manifeste de la version...
instanceUpdater.buildingDownloadList=Collecte des fichiers a telecharger...
instanceUpdater.collectingLibraries=Collecte des bibliothèques a telecharger...
instanceUpdater.collectingAssets=Collecte des bibliothèques a telecharger...
instanceDeleter.deleting=Suppression de {0}...
instanceDeleter.failures={0} fichier(s) n''on pas pu Etre supprime.
instanceResetter.resetting=Reinitialisation de {0}...
instanceLoader.loadingLocal=Chargement des instances locales a partir du disque...
instanceLoader.checkingRemote=Recherche de nouveaux modpacks...
runner.preparing=Preparation du lancement...
runner.collectingArgs=Collecte des arguments de processus...
runner.startingJava=Demarrage de Java...
runner.updateRequired=Cette instance doit Etre mise a jour avant de pouvoir Etre executee.
runner.missingLibrary={0} doit Etre relance et mis a jour car la bibliothèque ''{1}'' est manquante.
runner.missingAssetsIndex={0} doit Etre relance et mis a jour car son index d''actifs est manquant.
runner.corruptAssetsIndex={0} doit Etre relance et mis a jour car son index d''actifs est corrompu.
assets.expanding1=Expension de {0} asset... ({1} restant)
assets.expandingN=Expension de {0} asset... ({1} restants)
assets.missingIndex=Vous devez mettre a jour cette instance car son fichier d''index a ''{0}'' est manquant.
assets.missingObject=Vous devez mettre a jour cette instance car le fichier a ''{0}'' est manquant.
features.nameColumn=Fonctionnalite
features.title=Selectionnez les fonctionnalites
features.install=OK
features.selectForInfo=Selectionnez une fonctionnalite pour afficher plus d''informations.
features.intro=Veuillez selectionner les fonctionnalites optionnelles a installer.
features.starred=(recommande)
features.avoid=(non recommande)