A lot more cleanup

Signed-off-by: TheKodeToad <TheKodeToad@proton.me>
This commit is contained in:
TheKodeToad 2022-11-08 17:51:18 +00:00
parent f2ca9a6b31
commit 32c2ad2bbd
20 changed files with 417 additions and 861 deletions

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* PolyMC - Minecraft Launcher * Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (C) 2022 Jamie Mansfield <jmansfield@cadixdev.org> * Copyright (C) 2022 Jamie Mansfield <jmansfield@cadixdev.org>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -438,6 +438,17 @@ QStringList MinecraftInstance::javaArguments()
return args; return args;
} }
QString MinecraftInstance::getLauncher()
{
auto profile = m_components->getProfile();
// use legacy launcher if the traits are set
if (profile->getTraits().contains("legacyLaunch") || profile->getTraits().contains("alphaLaunch"))
return "legacy";
return "standard";
}
QMap<QString, QString> MinecraftInstance::getVariables() QMap<QString, QString> MinecraftInstance::getVariables()
{ {
QMap<QString, QString> out; QMap<QString, QString> out;
@ -634,15 +645,7 @@ QString MinecraftInstance::createLaunchScript(AuthSessionPtr session, MinecraftS
launchScript += "traits " + trait + "\n"; launchScript += "traits " + trait + "\n";
} }
launchScript += "launcher "; launchScript += "launcher " + getLauncher() + "\n";
// use legacy launcher if the traits are set
if (profile->getTraits().contains("legacyLaunch") || profile->getTraits().contains("alphaLaunch"))
launchScript += "legacy";
else
launchScript += "standard";
launchScript += "\n";
// qDebug() << "Generated launch script:" << launchScript; // qDebug() << "Generated launch script:" << launchScript;
return launchScript; return launchScript;
@ -779,6 +782,8 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr
out << "Window size: " + QString::number(width) + " x " + QString::number(height); out << "Window size: " + QString::number(width) + " x " + QString::number(height);
} }
out << ""; out << "";
out << "Launcher: " + getLauncher();
out << "";
return out; return out;
} }

View File

@ -1,7 +1,8 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* PolyMC - Minecraft Launcher * Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net> * Copyright (C) 2022 Sefa Eyeoglu <contact@scrumplex.net>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -130,6 +131,7 @@ public:
QString createLaunchScript(AuthSessionPtr session, MinecraftServerTargetPtr serverToJoin); QString createLaunchScript(AuthSessionPtr session, MinecraftServerTargetPtr serverToJoin);
/// get arguments passed to java /// get arguments passed to java
QStringList javaArguments(); QStringList javaArguments();
QString getLauncher();
/// get variables for launch command variable substitution/environment /// get variables for launch command variable substitution/environment
QMap<QString, QString> getVariables() override; QMap<QString, QString> getVariables() override;

View File

@ -42,19 +42,20 @@ MIT licensed.
Java launcher part for Minecraft. Java launcher part for Minecraft.
It: It does the following:
- Starts a process - Waits for a launch script on stdin.
- Waits for a launch script on stdin - Consumes the launch script you feed it.
- Consumes the launch script you feed it - Proceeds with launch when it gets the `launcher` command.
- Proceeds with launch when it gets the `launcher` command
If "abort" is sent, the process will exit.
This means the process is essentially idle until the final command is sent. You can, for example, attach a profiler before you send it. This means the process is essentially idle until the final command is sent. You can, for example, attach a profiler before you send it.
A `legacy` and `standard` launchers are available. The `standard` and `legacy` launchers are available.
- `legacy` is intended for use with Minecraft versions < 1.6 and is deprecated.
- `standard` can handle launching any Minecraft version, at the cost of some extra features `legacy` enables (custom window icon and title). - `standard` can handle launching any Minecraft version, at the cost of some extra features `legacy` enables (custom window icon and title).
- `legacy` is intended for use with Minecraft versions < 1.6 and is deprecated.
Example (some parts have been censored): Example (some parts have been censored):
@ -64,7 +65,7 @@ mainClass net.minecraft.launchwrapper.Launch
param --username param --username
param CENSORED param CENSORED
param --version param --version
param MultiMC5 param Prism Launcher
param --gameDir param --gameDir
param /home/peterix/minecraft/FTB/17ForgeTest/minecraft param /home/peterix/minecraft/FTB/17ForgeTest/minecraft
param --assetsDir param --assetsDir
@ -81,57 +82,10 @@ param --userType
param mojang param mojang
param --tweakClass param --tweakClass
param cpw.mods.fml.common.launcher.FMLTweaker param cpw.mods.fml.common.launcher.FMLTweaker
windowTitle MultiMC: 172ForgeTest windowTitle Prism Launcher: 172ForgeTest
windowParams 854x480 windowParams 854x480
userName CENSORED userName CENSORED
sessionId token:CENSORED:CENSORED sessionId token:CENSORED:CENSORED
cp /home/peterix/minecraft/FTB/libraries/com/mojang/realms/1.3.5/realms-1.3.5.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/httpcomponents/httpclient/4.3.3/httpclient-4.3.3.jar
cp /home/peterix/minecraft/FTB/libraries/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar
cp /home/peterix/minecraft/FTB/libraries/java3d/vecmath/1.3.1/vecmath-1.3.1.jar
cp /home/peterix/minecraft/FTB/libraries/net/sf/trove4j/trove4j/3.0.3/trove4j-3.0.3.jar
cp /home/peterix/minecraft/FTB/libraries/com/ibm/icu/icu4j-core-mojang/51.2/icu4j-core-mojang-51.2.jar
cp /home/peterix/minecraft/FTB/libraries/net/sf/jopt-simple/jopt-simple/4.5/jopt-simple-4.5.jar
cp /home/peterix/minecraft/FTB/libraries/com/paulscode/codecjorbis/20101023/codecjorbis-20101023.jar
cp /home/peterix/minecraft/FTB/libraries/com/paulscode/codecwav/20101023/codecwav-20101023.jar
cp /home/peterix/minecraft/FTB/libraries/com/paulscode/libraryjavasound/20101123/libraryjavasound-20101123.jar
cp /home/peterix/minecraft/FTB/libraries/com/paulscode/librarylwjglopenal/20100824/librarylwjglopenal-20100824.jar
cp /home/peterix/minecraft/FTB/libraries/com/paulscode/soundsystem/20120107/soundsystem-20120107.jar
cp /home/peterix/minecraft/FTB/libraries/io/netty/netty-all/4.0.10.Final/netty-all-4.0.10.Final.jar
cp /home/peterix/minecraft/FTB/libraries/com/google/guava/guava/16.0/guava-16.0.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/commons/commons-lang3/3.2.1/commons-lang3-3.2.1.jar
cp /home/peterix/minecraft/FTB/libraries/commons-io/commons-io/2.4/commons-io-2.4.jar
cp /home/peterix/minecraft/FTB/libraries/commons-codec/commons-codec/1.9/commons-codec-1.9.jar
cp /home/peterix/minecraft/FTB/libraries/net/java/jinput/jinput/2.0.5/jinput-2.0.5.jar
cp /home/peterix/minecraft/FTB/libraries/net/java/jutils/jutils/1.0.0/jutils-1.0.0.jar
cp /home/peterix/minecraft/FTB/libraries/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar
cp /home/peterix/minecraft/FTB/libraries/com/mojang/authlib/1.5.16/authlib-1.5.16.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/logging/log4j/log4j-api/2.0-beta9/log4j-api-2.0-beta9.jar
cp /home/peterix/minecraft/FTB/libraries/org/apache/logging/log4j/log4j-core/2.0-beta9/log4j-core-2.0-beta9.jar
cp /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl/2.9.1/lwjgl-2.9.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl_util/2.9.1/lwjgl_util-2.9.1.jar
cp /home/peterix/minecraft/FTB/libraries/tv/twitch/twitch/5.16/twitch-5.16.jar
cp /home/peterix/minecraft/FTB/libraries/net/minecraftforge/forge/1.7.10-10.13.0.1178/forge-1.7.10-10.13.0.1178.jar
cp /home/peterix/minecraft/FTB/libraries/net/minecraft/launchwrapper/1.9/launchwrapper-1.9.jar
cp /home/peterix/minecraft/FTB/libraries/org/ow2/asm/asm-all/4.1/asm-all-4.1.jar
cp /home/peterix/minecraft/FTB/libraries/com/typesafe/akka/akka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar
cp /home/peterix/minecraft/FTB/libraries/com/typesafe/config/1.2.1/config-1.2.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-actors-migration_2.11/1.1.0/scala-actors-migration_2.11-1.1.0.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-compiler/2.11.1/scala-compiler-2.11.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/plugins/scala-continuations-library_2.11/1.0.2/scala-continuations-library_2.11-1.0.2.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/plugins/scala-continuations-plugin_2.11.1/1.0.2/scala-continuations-plugin_2.11.1-1.0.2.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-library/2.11.1/scala-library-2.11.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-parser-combinators_2.11/1.0.1/scala-parser-combinators_2.11-1.0.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-reflect/2.11.1/scala-reflect-2.11.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-swing_2.11/1.0.1/scala-swing_2.11-1.0.1.jar
cp /home/peterix/minecraft/FTB/libraries/org/scala-lang/scala-xml_2.11/1.0.2/scala-xml_2.11-1.0.2.jar
cp /home/peterix/minecraft/FTB/libraries/lzma/lzma/0.0.1/lzma-0.0.1.jar
ext /home/peterix/minecraft/FTB/libraries/org/lwjgl/lwjgl/lwjgl-platform/2.9.1/lwjgl-platform-2.9.1-natives-linux.jar
ext /home/peterix/minecraft/FTB/libraries/net/java/jinput/jinput-platform/2.0.5/jinput-platform-2.0.5-natives-linux.jar
natives /home/peterix/minecraft/FTB/17ForgeTest/natives
cp /home/peterix/minecraft/FTB/versions/1.7.10/1.7.10.jar
launcher standard launcher standard
``` ```

View File

@ -9,10 +9,10 @@ set(CMAKE_JAVA_COMPILE_FLAGS -target 7 -source 7)
set(SRC set(SRC
org/prismlauncher/EntryPoint.java org/prismlauncher/EntryPoint.java
org/prismlauncher/launcher/Launcher.java org/prismlauncher/launcher/Launcher.java
org/prismlauncher/launcher/impl/legacy/LegacyFrame.java
org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java
org/prismlauncher/launcher/impl/AbstractLauncher.java org/prismlauncher/launcher/impl/AbstractLauncher.java
org/prismlauncher/launcher/impl/StandardLauncher.java org/prismlauncher/launcher/impl/StandardLauncher.java
org/prismlauncher/launcher/impl/legacy/LegacyLauncher.java
org/prismlauncher/launcher/impl/legacy/LegacyFrame.java
org/prismlauncher/exception/ParameterNotFoundException.java org/prismlauncher/exception/ParameterNotFoundException.java
org/prismlauncher/exception/ParseException.java org/prismlauncher/exception/ParseException.java
org/prismlauncher/utils/Parameters.java org/prismlauncher/utils/Parameters.java

View File

@ -1,399 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="22">
<profile kind="CodeFormatterProfile" name="Prism Launcher" version="22">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
@ -62,8 +61,10 @@ import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.TreeMap;
import org.prismlauncher.utils.logging.Log;
/** /**
* WARNING: This class is reflectively accessed by legacy Forge versions. * WARNING: This class is reflectively accessed by legacy Forge versions.
@ -75,7 +76,7 @@ public final class Launcher extends Applet implements AppletStub {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final Map<String, String> params = new TreeMap<>(); private final Map<String, String> params = new HashMap<>();
private Applet wrappedApplet; private Applet wrappedApplet;
private final URL documentBase; private final URL documentBase;
@ -88,75 +89,75 @@ public final class Launcher extends Applet implements AppletStub {
public Launcher(Applet applet, URL documentBase) { public Launcher(Applet applet, URL documentBase) {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
this.add(applet, "Center"); add(applet, "Center");
wrappedApplet = applet; wrappedApplet = applet;
try { try {
if (documentBase != null) { if (documentBase == null) {
this.documentBase = documentBase; if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) {
} else if (applet.getClass().getPackage().getName().startsWith("com.mojang.")) { // Special case only for Classic versions
// Special case only for Classic versions documentBase = new URL("http", "www.minecraft.net", 80, "/game/");
} else {
// TODO: 2022-10-27 Can this be changed to https documentBase = new URL("http://www.minecraft.net/game/");
this.documentBase = new URL("http", "www.minecraft.net", 80, "/game/"); }
} else {
// TODO: 2022-10-27 Can this be changed to https?
this.documentBase = new URL("http://www.minecraft.net/game/");
} }
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new RuntimeException(e); // handle gracefully - it won't happen, but Java requires that it is caught
Log.error("Failed to parse document base URL", e);
} }
this.documentBase = documentBase;
} }
public void replace(Applet applet) { public void replace(Applet applet) {
wrappedApplet = applet; wrappedApplet = applet;
applet.setStub(this); applet.setStub(this);
applet.setSize(this.getWidth(), this.getHeight()); applet.setSize(getWidth(), getHeight());
setLayout(new BorderLayout()); setLayout(new BorderLayout());
this.add(applet, "Center"); add(applet, "Center");
applet.init(); applet.init();
this.active = true; active = true;
applet.start(); applet.start();
this.validate(); validate();
} }
@Override @Override
public boolean isActive() { public boolean isActive() {
return this.active; return active;
} }
@Override @Override
public URL getDocumentBase() { public URL getDocumentBase() {
return this.documentBase; return documentBase;
} }
@Override @Override
public URL getCodeBase() { public URL getCodeBase() {
try { try {
// TODO: 2022-10-27 Can this be changed to https?
return new URL("http://www.minecraft.net/game/"); return new URL("http://www.minecraft.net/game/");
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
throw new RuntimeException(e); Log.error("Failed to parse codebase URL", e);
return null;
} }
} }
@Override @Override
public String getParameter(String name) { public String getParameter(String key) {
String param = this.params.get(name); String param = params.get(key);
if (param != null) if (param != null)
return param; return param;
try { try {
return super.getParameter(name); return super.getParameter(key);
} catch (Exception ignored) { } catch (Throwable ignored) {
} }
return null; return null;
@ -164,49 +165,49 @@ public final class Launcher extends Applet implements AppletStub {
@Override @Override
public void resize(int width, int height) { public void resize(int width, int height) {
this.wrappedApplet.resize(width, height); wrappedApplet.resize(width, height);
} }
@Override @Override
public void resize(Dimension size) { public void resize(Dimension size) {
this.wrappedApplet.resize(size); wrappedApplet.resize(size);
} }
@Override @Override
public void init() { public void init() {
if (this.wrappedApplet != null) if (wrappedApplet != null)
this.wrappedApplet.init(); wrappedApplet.init();
} }
@Override @Override
public void start() { public void start() {
this.wrappedApplet.start(); wrappedApplet.start();
this.active = true; active = true;
} }
@Override @Override
public void stop() { public void stop() {
this.wrappedApplet.stop(); wrappedApplet.stop();
this.active = false; active = false;
} }
@Override @Override
public void destroy() { public void destroy() {
this.wrappedApplet.destroy(); wrappedApplet.destroy();
} }
@Override @Override
public void appletResize(int width, int height) { public void appletResize(int width, int height) {
this.wrappedApplet.resize(width, height); wrappedApplet.resize(width, height);
} }
@Override @Override
public void setVisible(boolean visible) { public void setVisible(boolean visible) {
super.setVisible(visible); super.setVisible(visible);
this.wrappedApplet.setVisible(visible); wrappedApplet.setVisible(visible);
} }
@Override @Override
@ -217,8 +218,12 @@ public final class Launcher extends Applet implements AppletStub {
public void update(Graphics graphics) { public void update(Graphics graphics) {
} }
public void setParameter(String name, String value) { public void setParameter(String key, String value) {
this.params.put(name, value); params.put(key, value);
}
public void setParameter(String key, boolean value) {
setParameter(key, value ? "true" : "false");
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
@ -56,7 +55,6 @@
package org.prismlauncher; package org.prismlauncher;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -70,63 +68,40 @@ import org.prismlauncher.utils.logging.Log;
public final class EntryPoint { public final class EntryPoint {
private EntryPoint() {
}
public static void main(String[] args) { public static void main(String[] args) {
ExitCode exitCode = listen(); ExitCode code = listen();
if (exitCode != ExitCode.NORMAL) { if (code != ExitCode.NORMAL) {
Log.fatal("Exiting with " + exitCode); Log.fatal("Exiting with " + code);
System.exit(exitCode.numericalCode); System.exit(code.numeric);
}
}
private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException {
if (input.isEmpty())
return PreLaunchAction.PROCEED;
if ("launch".equalsIgnoreCase(input))
return PreLaunchAction.LAUNCH;
else if ("abort".equalsIgnoreCase(input))
return PreLaunchAction.ABORT;
else {
String[] pair = StringUtils.splitStringPair(' ', input);
if (pair == null)
throw new ParseException(String.format(
"Could not split input string '%s' by space. All input provided from stdin must be either 'launch', 'abort', or "
+ "in the format '[param name] [param]'.",
input));
params.add(pair[0], pair[1]);
return PreLaunchAction.PROCEED;
} }
} }
private static ExitCode listen() { private static ExitCode listen() {
Parameters parameters = new Parameters(); Parameters params = new Parameters();
PreLaunchAction preLaunchAction = PreLaunchAction.PROCEED; PreLaunchAction action = PreLaunchAction.PROCEED;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
String line; String line;
while (preLaunchAction == PreLaunchAction.PROCEED) { while (action == PreLaunchAction.PROCEED) {
if ((line = reader.readLine()) != null) if ((line = reader.readLine()) != null)
preLaunchAction = parseLine(line, parameters); action = parseLine(line, params);
else else
preLaunchAction = PreLaunchAction.ABORT; action = PreLaunchAction.ABORT;
} }
} catch (IOException | ParseException e) { } catch (IllegalArgumentException e) {
Log.fatal("Launcher abort due to exception", e); Log.fatal("Aborting due to wrong argument", e);
return ExitCode.ILLEGAL_ARGUMENT; return ExitCode.ILLEGAL_ARGUMENT;
} catch (Throwable e) {
Log.fatal("Aborting due to exception", e);
return ExitCode.ABORT;
} }
// Main loop if (action == PreLaunchAction.ABORT) {
if (preLaunchAction == PreLaunchAction.ABORT) {
Log.fatal("Launch aborted by the launcher"); Log.fatal("Launch aborted by the launcher");
return ExitCode.ABORT; return ExitCode.ABORT;
@ -134,33 +109,28 @@ public final class EntryPoint {
try { try {
Launcher launcher; Launcher launcher;
String type = parameters.getString("launcher"); String type = params.getString("launcher");
switch (type) { switch (type) {
case "standard": case "standard":
launcher = new StandardLauncher(parameters); launcher = new StandardLauncher(params);
break; break;
case "legacy": case "legacy":
launcher = new LegacyLauncher(parameters); launcher = new LegacyLauncher(params);
break; break;
default: default:
throw new IllegalArgumentException("Invalid launcher type: " + type); throw new IllegalArgumentException("Invalid launcher type: " + type);
} }
Log.launcher("Using " + type + " launcher");
Log.blankLine();
launcher.launch(); launcher.launch();
return ExitCode.NORMAL; return ExitCode.NORMAL;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Log.fatal("Wrong argument", e); Log.fatal("Illegal argument", e);
return ExitCode.ILLEGAL_ARGUMENT; return ExitCode.ILLEGAL_ARGUMENT;
} catch (ReflectiveOperationException e) {
Log.fatal("Caught reflection exception from launcher", e);
return ExitCode.ERROR;
} catch (Throwable e) { } catch (Throwable e) {
Log.fatal("Exception caught from launcher", e); Log.fatal("Exception caught from launcher", e);
@ -168,6 +138,29 @@ public final class EntryPoint {
} }
} }
private static PreLaunchAction parseLine(String input, Parameters params) throws ParseException {
switch (input) {
case "":
break;
case "launch":
return PreLaunchAction.LAUNCH;
case "abort":
return PreLaunchAction.ABORT;
default:
String[] pair = StringUtils.splitStringPair(' ', input);
if (pair == null)
throw new ParseException(input, "[key] [value]");
params.add(pair[0], pair[1]);
}
return PreLaunchAction.PROCEED;
}
private enum PreLaunchAction { private enum PreLaunchAction {
PROCEED, LAUNCH, ABORT PROCEED, LAUNCH, ABORT
} }
@ -175,10 +168,10 @@ public final class EntryPoint {
private enum ExitCode { private enum ExitCode {
NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(65); NORMAL(0), ABORT(1), ERROR(2), ILLEGAL_ARGUMENT(65);
private final int numericalCode; private final int numeric;
ExitCode(int numericalCode) { ExitCode(int numeric) {
this.numericalCode = numericalCode; this.numeric = numeric;
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -42,23 +41,8 @@ public final class ParameterNotFoundException extends IllegalArgumentException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public ParameterNotFoundException(String message, Throwable cause) { public ParameterNotFoundException(String key) {
super(message, cause); super(String.format("Required parameter '%s' was not found", key));
}
public ParameterNotFoundException(Throwable cause) {
super(cause);
}
public ParameterNotFoundException(String message) {
super(message);
}
public ParameterNotFoundException() {
}
public static ParameterNotFoundException forParameterName(String parameterName) {
return new ParameterNotFoundException(String.format("Unknown parameter name '%s'", parameterName));
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -42,27 +41,8 @@ public final class ParseException extends IllegalArgumentException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public ParseException(String message) { public ParseException(String input, String format) {
super(message); super(String.format("For input '%s' - should match '%s'", input, format));
}
public ParseException(String message, Throwable cause) {
super(message, cause);
}
public ParseException(Throwable cause) {
super(cause);
}
public ParseException() {
}
public static ParseException forInputString(String inputString) {
return new ParseException(String.format("Could not parse input string '%s'", inputString));
}
public static ParseException forInputString(String inputString, Throwable cause) {
return new ParseException(String.format("Could not parse input string '%s'", inputString), cause);
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
@ -55,21 +54,20 @@
package org.prismlauncher.launcher.impl; package org.prismlauncher.launcher.impl;
import java.util.ArrayList;
import java.util.List;
import org.prismlauncher.exception.ParseException; import org.prismlauncher.exception.ParseException;
import org.prismlauncher.launcher.Launcher; import org.prismlauncher.launcher.Launcher;
import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.Parameters;
import org.prismlauncher.utils.StringUtils; import org.prismlauncher.utils.StringUtils;
import java.util.ArrayList;
import java.util.List;
public abstract class AbstractLauncher implements Launcher { public abstract class AbstractLauncher implements Launcher {
private static final int DEFAULT_WINDOW_WIDTH = 854; private static final int DEFAULT_WINDOW_WIDTH = 854, DEFAULT_WINDOW_HEIGHT = 480;
private static final int DEFAULT_WINDOW_HEIGHT = 480;
// parameters, separated from ParamBucket // parameters, separated from ParamBucket
protected final List<String> mcParams; protected final List<String> gameArgs;
// secondary parameters // secondary parameters
protected final int width, height; protected final int width, height;
@ -79,34 +77,34 @@ public abstract class AbstractLauncher implements Launcher {
protected final String mainClassName; protected final String mainClassName;
protected AbstractLauncher(Parameters params) { protected AbstractLauncher(Parameters params) {
this.mcParams = params.getList("param", new ArrayList<String>()); gameArgs = params.getList("param", new ArrayList<String>());
this.mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft"); mainClassName = params.getString("mainClass", "net.minecraft.client.Minecraft");
this.serverAddress = params.getString("serverAddress", null); serverAddress = params.getString("serverAddress", null);
this.serverPort = params.getString("serverPort", null); serverPort = params.getString("serverPort", null);
String windowParams = params.getString("windowParams", null); String windowParams = params.getString("windowParams", null);
this.maximize = "max".equalsIgnoreCase(windowParams); if ("max".equals(windowParams) || windowParams == null) {
maximize = windowParams != null;
width = DEFAULT_WINDOW_WIDTH;
height = DEFAULT_WINDOW_HEIGHT;
} else {
maximize = false;
if (windowParams != null && !"max".equalsIgnoreCase(windowParams)) {
String[] sizePair = StringUtils.splitStringPair('x', windowParams); String[] sizePair = StringUtils.splitStringPair('x', windowParams);
if (sizePair != null) { if (sizePair != null) {
try { try {
this.width = Integer.parseInt(sizePair[0]); width = Integer.parseInt(sizePair[0]);
this.height = Integer.parseInt(sizePair[1]); height = Integer.parseInt(sizePair[1]);
} catch (NumberFormatException e) { return;
throw new ParseException(String.format("Could not parse window parameters from '%s'", windowParams), } catch (NumberFormatException ignored) {
e);
} }
} else {
throw new ParseException(
String.format("Invalid window size parameters '%s'. Format: [height]x[width]", windowParams));
} }
} else {
this.width = DEFAULT_WINDOW_WIDTH; throw new ParseException(windowParams, "[width]x[height]");
this.height = DEFAULT_WINDOW_HEIGHT;
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
@ -55,11 +54,11 @@
package org.prismlauncher.launcher.impl; package org.prismlauncher.launcher.impl;
import java.lang.invoke.MethodHandle;
import org.prismlauncher.utils.Parameters; import org.prismlauncher.utils.Parameters;
import org.prismlauncher.utils.ReflectionUtils; import org.prismlauncher.utils.ReflectionUtils;
import java.lang.invoke.MethodHandle;
public final class StandardLauncher extends AbstractLauncher { public final class StandardLauncher extends AbstractLauncher {
public StandardLauncher(Parameters params) { public StandardLauncher(Parameters params) {
@ -69,27 +68,24 @@ public final class StandardLauncher extends AbstractLauncher {
@Override @Override
public void launch() throws Throwable { public void launch() throws Throwable {
// window size, title and state // window size, title and state
// FIXME doesn't support maximisation
// FIXME: there is no good way to maximize the minecraft window from here. if (!maximize) {
// the following often breaks linux screen setups gameArgs.add("--width");
// mcparams.add("--fullscreen"); gameArgs.add(Integer.toString(width));
gameArgs.add("--height");
if (!this.maximize) { gameArgs.add(Integer.toString(height));
this.mcParams.add("--width");
this.mcParams.add(Integer.toString(this.width));
this.mcParams.add("--height");
this.mcParams.add(Integer.toString(this.height));
} }
if (this.serverAddress != null) { if (serverAddress != null) {
this.mcParams.add("--server"); gameArgs.add("--server");
this.mcParams.add(this.serverAddress); gameArgs.add(serverAddress);
this.mcParams.add("--port"); gameArgs.add("--port");
this.mcParams.add(this.serverPort); gameArgs.add(serverPort);
} }
MethodHandle method = ReflectionUtils.findMainMethod(this.mainClassName); // find and invoke the main method
method.invokeExact(this.mcParams.toArray(new String[0])); MethodHandle method = ReflectionUtils.findMainMethod(mainClassName);
method.invokeExact(gameArgs.toArray(new String[0]));
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 flow <flowlnlnln@gmail.com> * Copyright (C) 2022 flow <flowlnlnln@gmail.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -55,13 +54,6 @@
package org.prismlauncher.launcher.impl.legacy; package org.prismlauncher.launcher.impl.legacy;
import net.minecraft.Launcher;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import org.prismlauncher.utils.logging.Log;
import java.applet.Applet; import java.applet.Applet;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
@ -75,6 +67,13 @@ import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import org.prismlauncher.utils.logging.Log;
import net.minecraft.Launcher;
public final class LegacyFrame extends JFrame { public final class LegacyFrame extends JFrame {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -84,85 +83,85 @@ public final class LegacyFrame extends JFrame {
public LegacyFrame(String title, Applet applet) { public LegacyFrame(String title, Applet applet) {
super(title); super(title);
this.launcher = new Launcher(applet); launcher = new Launcher(applet);
applet.setStub(this.launcher); applet.setStub(launcher);
try { try {
this.setIconImage(ImageIO.read(new File("icon.png"))); setIconImage(ImageIO.read(new File("icon.png")));
} catch (IOException e) { } catch (IOException e) {
Log.error("Unable to read Minecraft icon", e); Log.error("Failed to read window icon", e);
} }
this.addWindowListener(new ForceExitHandler()); addWindowListener(new ForceExitHandler());
} }
public void start(String user, String session, int width, int height, boolean maximize, String serverAddress, public void start(String user, String session, int width, int height, boolean maximize, String serverAddress,
String serverPort, boolean isDemo) { String serverPort, boolean demo) {
// Implements support for launching in to multiplayer on classic servers using a // Implements support for launching in to multiplayer on classic servers using a
// mpticket // mpticket file generated by an external program and stored in the instance's
// file generated by an external program and stored in the instance's root // root folder.
// folder. Path instanceFolder = Paths.get("..");
Path mpticket = instanceFolder.resolve("mpticket");
Path mpticketCorrupt = instanceFolder.resolve("mpticket.corrupt");
Path mpticketFile = Paths.get(System.getProperty("user.dir"), "..", "mpticket"); if (Files.exists(mpticket)) {
Path mpticketFileCorrupt = Paths.get(System.getProperty("user.dir"), "..", "mpticket.corrupt");
if (Files.exists(mpticketFile)) {
try { try {
List<String> lines = Files.readAllLines(mpticketFile, StandardCharsets.UTF_8); List<String> lines = Files.readAllLines(mpticket, StandardCharsets.UTF_8);
if (lines.size() < 3) { if (lines.size() < 3) {
Files.move(mpticketFile, mpticketFileCorrupt, StandardCopyOption.REPLACE_EXISTING); Files.move(mpticket, mpticketCorrupt, StandardCopyOption.REPLACE_EXISTING);
Log.warning("Mpticket file is corrupted!"); Log.warning("mpticket file is corrupted");
} else { } else {
// Assumes parameters are valid and in the correct order // Assumes parameters are valid and in the correct order
this.launcher.setParameter("server", lines.get(0)); launcher.setParameter("server", lines.get(0));
this.launcher.setParameter("port", lines.get(1)); launcher.setParameter("port", lines.get(1));
this.launcher.setParameter("mppass", lines.get(2)); launcher.setParameter("mppass", lines.get(2));
} }
} catch (IOException e) { } catch (IOException e) {
Log.error("Unable to read mpticket file", e); Log.error("Failed to read mpticket file", e);
} }
} }
if (serverAddress != null) { if (serverAddress != null) {
this.launcher.setParameter("server", serverAddress); launcher.setParameter("server", serverAddress);
this.launcher.setParameter("port", serverPort); launcher.setParameter("port", serverPort);
} }
this.launcher.setParameter("username", user); launcher.setParameter("username", user);
this.launcher.setParameter("sessionid", session); launcher.setParameter("sessionid", session);
this.launcher.setParameter("stand-alone", "true"); // Show the quit button. TODO: why won't this work? launcher.setParameter("stand-alone", true); // Show the quit button. TODO: why won't this work?
this.launcher.setParameter("haspaid", "true"); // Some old versions need this for world saves to work. launcher.setParameter("haspaid", true); // Some old versions need this for world saves to work.
this.launcher.setParameter("demo", isDemo ? "true" : "false"); launcher.setParameter("demo", demo);
this.launcher.setParameter("fullscreen", "false"); launcher.setParameter("fullscreen", false);
this.add(this.launcher); add(launcher);
this.launcher.setPreferredSize(new Dimension(width, height)); launcher.setPreferredSize(new Dimension(width, height));
this.pack(); pack();
this.setLocationRelativeTo(null); setLocationRelativeTo(null);
this.setResizable(true); setResizable(true);
if (maximize) if (maximize)
setExtendedState(MAXIMIZED_BOTH); setExtendedState(MAXIMIZED_BOTH);
this.validate(); validate();
this.launcher.init(); launcher.init();
this.launcher.start(); launcher.start();
this.setVisible(true); setVisible(true);
} }
private final class ForceExitHandler extends WindowAdapter { private final class ForceExitHandler extends WindowAdapter {
@Override @Override
public void windowClosing(WindowEvent event) { public void windowClosing(WindowEvent event) {
// FIXME better solution
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -177,9 +176,9 @@ public final class LegacyFrame extends JFrame {
} }
}).start(); }).start();
if (LegacyFrame.this.launcher != null) { if (launcher != null) {
LegacyFrame.this.launcher.stop(); launcher.stop();
LegacyFrame.this.launcher.destroy(); launcher.destroy();
} }
// old minecraft versions can hang without this >_< // old minecraft versions can hang without this >_<

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 flow <flowlnlnln@gmail.com> * Copyright (C) 2022 flow <flowlnlnln@gmail.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -56,17 +55,17 @@
package org.prismlauncher.launcher.impl.legacy; package org.prismlauncher.launcher.impl.legacy;
import org.prismlauncher.launcher.impl.AbstractLauncher;
import org.prismlauncher.utils.Parameters;
import org.prismlauncher.utils.ReflectionUtils;
import org.prismlauncher.utils.logging.Log;
import java.io.File; import java.io.File;
import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.prismlauncher.launcher.impl.AbstractLauncher;
import org.prismlauncher.utils.Parameters;
import org.prismlauncher.utils.ReflectionUtils;
import org.prismlauncher.utils.logging.Log;
/** /**
* Used to launch old versions that support applets. * Used to launch old versions that support applets.
*/ */
@ -75,51 +74,53 @@ public final class LegacyLauncher extends AbstractLauncher {
private final String user, session; private final String user, session;
private final String title; private final String title;
private final String appletClass; private final String appletClass;
private final boolean usesApplet; private final boolean useApplet;
private final String cwd; private final String gameDir;
public LegacyLauncher(Parameters params) { public LegacyLauncher(Parameters params) {
super(params); super(params);
this.user = params.getString("userName"); user = params.getString("userName");
this.session = params.getString("sessionId"); session = params.getString("sessionId");
this.title = params.getString("windowTitle", "Minecraft"); title = params.getString("windowTitle", "Minecraft");
this.appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet"); appletClass = params.getString("appletClass", "net.minecraft.client.MinecraftApplet");
List<String> traits = params.getList("traits", Collections.<String>emptyList()); List<String> traits = params.getList("traits", Collections.<String>emptyList());
this.usesApplet = !traits.contains("noapplet"); useApplet = !traits.contains("noapplet");
this.cwd = System.getProperty("user.dir"); gameDir = System.getProperty("user.dir");
} }
@Override @Override
public void launch() throws Throwable { public void launch() throws Throwable {
Class<?> main = ClassLoader.getSystemClassLoader().loadClass(this.mainClassName); Class<?> main = ClassLoader.getSystemClassLoader().loadClass(mainClassName);
Field gameDirField = ReflectionUtils.getMinecraftGameDirField(main); Field gameDirField = ReflectionUtils.findMinecraftGameDirField(main);
if (gameDirField == null) if (gameDirField == null)
Log.warning("Could not find Minecraft path field"); Log.warning("Could not find Minecraft folder field");
else { else {
gameDirField.setAccessible(true); gameDirField.setAccessible(true);
gameDirField.set(null /* field is static, so instance is null */, new File(this.cwd)); gameDirField.set(null, new File(gameDir));
} }
if (this.usesApplet) { if (useApplet) {
Log.launcher("Launching with applet wrapper..."); System.setProperty("minecraft.applet.TargetDirectory", gameDir);
try { try {
LegacyFrame window = new LegacyFrame(this.title, ReflectionUtils.createAppletClass(this.appletClass)); LegacyFrame window = new LegacyFrame(title, ReflectionUtils.createAppletClass(appletClass));
window.start(this.user, this.session, this.width, this.height, this.maximize, this.serverAddress, window.start(user, session, width, height, maximize, serverAddress, serverPort,
this.serverPort, this.mcParams.contains("--demo")); gameArgs.contains("--demo"));
return; return;
} catch (Throwable e) { } catch (Throwable e) {
Log.error("Running applet wrapper failed with exception; falling back to main class", e); Log.error("Running applet wrapper failed with exception; falling back to main class", e);
} }
} }
MethodHandle method = ReflectionUtils.findMainEntrypoint(main); // find and invoke the main method, this time without size parameters
method.invokeExact(this.mcParams.toArray(new String[0])); // in all versions that support applets, these are ignored
MethodHandle method = ReflectionUtils.findMainMethod(main);
method.invokeExact(gameArgs.toArray(new String[0]));
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
@ -55,40 +54,40 @@
package org.prismlauncher.utils; package org.prismlauncher.utils;
import org.prismlauncher.exception.ParameterNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.prismlauncher.exception.ParameterNotFoundException;
public final class Parameters { public final class Parameters {
private final Map<String, List<String>> map = new HashMap<>(); private final Map<String, List<String>> map = new HashMap<>();
public void add(String key, String value) { public void add(String key, String value) {
List<String> params = this.map.get(key); List<String> params = map.get(key);
if (params == null) { if (params == null) {
params = new ArrayList<>(); params = new ArrayList<>();
this.map.put(key, params); map.put(key, params);
} }
params.add(value); params.add(value);
} }
public List<String> getList(String key) throws ParameterNotFoundException { public List<String> getList(String key) throws ParameterNotFoundException {
List<String> params = this.map.get(key); List<String> params = map.get(key);
if (params == null) if (params == null)
throw ParameterNotFoundException.forParameterName(key); throw new ParameterNotFoundException(key);
return params; return params;
} }
public List<String> getList(String key, List<String> def) { public List<String> getList(String key, List<String> def) {
List<String> params = this.map.get(key); List<String> params = map.get(key);
if (params == null || params.isEmpty()) if (params == null || params.isEmpty())
return def; return def;
@ -97,16 +96,16 @@ public final class Parameters {
} }
public String getString(String key) throws ParameterNotFoundException { public String getString(String key) throws ParameterNotFoundException {
List<String> list = this.getList(key); List<String> list = getList(key);
if (list.isEmpty()) if (list.isEmpty())
throw ParameterNotFoundException.forParameterName(key); throw new ParameterNotFoundException(key);
return list.get(0); return list.get(0);
} }
public String getString(String key, String def) { public String getString(String key, String def) {
List<String> params = this.map.get(key); List<String> params = map.get(key);
if (params == null || params.isEmpty()) if (params == null || params.isEmpty())
return def; return def;

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 icelimetea <fr3shtea@outlook.com> * Copyright (C) 2022 icelimetea <fr3shtea@outlook.com>
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
@ -67,68 +66,57 @@ import org.prismlauncher.utils.logging.Log;
public final class ReflectionUtils { public final class ReflectionUtils {
private ReflectionUtils() { private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
} private static final ClassLoader LOADER = ClassLoader.getSystemClassLoader();
/** /**
* Instantiate an applet class by name * Construct a Java applet by its class name.
* *
* @param appletClassName The name of the applet class to resolve * @param clazz The class name
* * @return The applet instance
* @return The instantiated applet class * @throws Throwable
*
* @throws ClassNotFoundException if the provided class name cannot be found
* @throws NoSuchMethodException if the no-args constructor cannot be found
* @throws IllegalAccessException if the constructor cannot be accessed via
* method handles
* @throws Throwable any exceptions from the class's constructor
*/ */
public static Applet createAppletClass(String appletClassName) throws Throwable { public static Applet createAppletClass(String clazz) throws Throwable {
Class<?> appletClass = ClassLoader.getSystemClassLoader().loadClass(appletClassName); Class<?> appletClass = LOADER.loadClass(clazz);
MethodHandle appletConstructor = MethodHandles.lookup().findConstructor(appletClass, MethodHandle appletConstructor = LOOKUP.findConstructor(appletClass, MethodType.methodType(void.class));
MethodType.methodType(void.class));
return (Applet) appletConstructor.invoke(); return (Applet) appletConstructor.invoke();
} }
/** /**
* Finds a field that looks like a Minecraft base folder in a supplied class * Best guess of the game directory field within net.minecraft.client.Minecraft.
* Designed for legacy versions - newer versions do not use a static field.
* *
* @param minecraftMainClass the class to scan * @param clazz The class
* * @return The first field matching criteria
* @return The found field.
*/ */
public static Field getMinecraftGameDirField(Class<?> minecraftMainClass) { public static Field findMinecraftGameDirField(Class<?> clazz) {
Log.debug("Resolving minecraft game directory field"); Log.debug("Resolving minecraft game directory field");
// Field we're looking for is always
// private static File obfuscatedName = null; // search for private static File
for (Field field : minecraftMainClass.getDeclaredFields()) { for (Field field : clazz.getDeclaredFields()) {
// Has to be File
if (field.getType() != File.class) { if (field.getType() != File.class) {
continue; continue;
} }
int fieldModifiers = field.getModifiers(); int fieldModifiers = field.getModifiers();
// Must be static
if (!Modifier.isStatic(fieldModifiers)) { if (!Modifier.isStatic(fieldModifiers)) {
Log.debug("Rejecting field " + field.getName() + " because it is not static"); Log.debug("Rejecting field " + field.getName() + " because it is not static");
continue; continue;
} }
// Must be private
if (!Modifier.isPrivate(fieldModifiers)) { if (!Modifier.isPrivate(fieldModifiers)) {
Log.debug("Rejecting field " + field.getName() + " because it is not private"); Log.debug("Rejecting field " + field.getName() + " because it is not private");
continue; continue;
} }
// Must not be final
if (Modifier.isFinal(fieldModifiers)) { if (Modifier.isFinal(fieldModifiers)) {
Log.debug("Rejecting field " + field.getName() + " because it is final"); Log.debug("Rejecting field " + field.getName() + " because it is final");
continue; continue;
} }
Log.debug("Identified field " + field.getName() + " to match conditions for minecraft game directory field"); Log.debug("Identified field " + field.getName() + " to match conditions for game directory field");
return field; return field;
} }
@ -137,51 +125,30 @@ public final class ReflectionUtils {
} }
/** /**
* Resolve main entrypoint and returns method handle for it. * Gets the main method within a class.
* <p>
* Resolves a method that matches the following signature <code>
* public static void main(String[] args) {
* <p>
* }
* </code>
* *
* @param entrypointClass The entrypoint class to resolve the method from * @param clazz The class
* * @return A method matching the descriptor of a main method
* @return The method handle for the resolved entrypoint * @throws ClassNotFoundException
* * @throws NoSuchMethodException
* @throws NoSuchMethodException If no method matching the correct signature * @throws IllegalAccessException
* can be found
* @throws IllegalAccessException If method handles cannot access the entrypoint
*/ */
public static MethodHandle findMainEntrypoint(Class<?> entrypointClass) public static MethodHandle findMainMethod(Class<?> clazz) throws NoSuchMethodException, IllegalAccessException {
throws NoSuchMethodException, IllegalAccessException { return LOOKUP.findStatic(clazz, "main", MethodType.methodType(void.class, String[].class));
return MethodHandles.lookup().findStatic(entrypointClass, "main",
MethodType.methodType(void.class, String[].class));
} }
/** /**
* Resolve main entrypoint and returns method handle for it. * Gets the main method within a class by its name.
* <p>
* Resolves a method that matches the following signature <code>
* public static void main(String[] args) {
* <p>
* }
* </code>
* *
* @param entrypointClassName The name of the entrypoint class to resolve the * @param clazz The class name
* method from * @return A method matching the descriptor of a main method
* * @throws ClassNotFoundException
* @return The method handle for the resolved entrypoint * @throws NoSuchMethodException
* * @throws IllegalAccessException
* @throws ClassNotFoundException If a class cannot be found with the provided
* name
* @throws NoSuchMethodException If no method matching the correct signature
* can be found
* @throws IllegalAccessException If method handles cannot access the entrypoint
*/ */
public static MethodHandle findMainMethod(String entrypointClassName) public static MethodHandle findMainMethod(String clazz)
throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException { throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException {
return findMainEntrypoint(ClassLoader.getSystemClassLoader().loadClass(entrypointClassName)); return findMainMethod(LOADER.loadClass(clazz));
} }
} }

View File

@ -1,7 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* Prism Launcher * Prism Launcher - Minecraft Launcher
*
* Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com> * Copyright (C) 2022 solonovamax <solonovamax@12oclockpoint.com>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -38,15 +37,13 @@ package org.prismlauncher.utils;
public final class StringUtils { public final class StringUtils {
private StringUtils() { public static String[] splitStringPair(char splitChar, String str) {
} int splitPoint = str.indexOf(splitChar);
public static String[] splitStringPair(char splitChar, String input) {
int splitPoint = input.indexOf(splitChar);
if (splitPoint == -1) if (splitPoint == -1)
return null; return null;
return new String[] { input.substring(0, splitPoint), input.substring(splitPoint + 1) }; return new String[] { str.substring(0, splitPoint), str.substring(splitPoint + 1) };
} }
} }

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* PolyMC - Minecraft Launcher * Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -36,8 +36,13 @@
package org.prismlauncher.utils.logging; package org.prismlauncher.utils.logging;
public enum Level { public enum Level {
LAUNCHER("Launcher"), DEBUG("Debug"), INFO("Info"), MESSAGE("Message"), LAUNCHER("Launcher"),
WARNING("Warning"), ERROR("Error", true), FATAL("Fatal", true); DEBUG("Debug"),
INFO("Info"),
MESSAGE("Message"),
WARNING("Warning"),
ERROR("Error", true),
FATAL("Fatal", true);
String name; String name;
boolean stderr; boolean stderr;

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only // SPDX-License-Identifier: GPL-3.0-only
/* /*
* PolyMC - Minecraft Launcher * Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me> * Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,37 +44,12 @@ import java.io.PrintStream;
*/ */
public final class Log { public final class Log {
private static final PrintStream ERROR_PREFIX = new PrintStream(System.err) { // original before overridden
@Override private static final PrintStream OUT = new PrintStream(System.out), ERR = new PrintStream(System.err);
public void println(String x) { private static final PrintStream ERROR_PREFIX = new LogPrintStream(System.err, Level.ERROR),
error(x); FATAL_PREFIX = new LogPrintStream(System.err, Level.FATAL);
}
@Override
public void println(Object x) {
error(String.valueOf(x));
}
}, FATAL_PREFIX = new PrintStream(System.err) {
@Override
public void println(String x) {
fatal(x);
}
@Override
public void println(Object x) {
fatal(String.valueOf(x));
}
};
private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug"); private static final boolean DEBUG = Boolean.getBoolean("org.prismlauncher.debug");
private Log() {
}
public static void blankLine() {
System.out.println();
}
public static void launcher(String message) { public static void launcher(String message) {
log(message, Level.LAUNCHER); log(message, Level.LAUNCHER);
} }
@ -84,16 +59,9 @@ public final class Log {
} }
public static void debug(String message) { public static void debug(String message) {
if (!DEBUG)
return;
log(message, Level.DEBUG); log(message, Level.DEBUG);
} }
public static void info(String message) {
log(message, Level.INFO);
}
public static void warning(String message) { public static void warning(String message) {
log(message, Level.WARNING); log(message, Level.WARNING);
} }
@ -113,12 +81,16 @@ public final class Log {
} }
/** /**
* Logs a message with the prefix !![LEVEL]!. * Logs a message with the prefix <code>!![LEVEL]!</code>. This is picked up by
* the log viewer to give it nice colours.
* *
* @param message The message * @param message The message
* @param level The level * @param level The level
*/ */
public static void log(String message, Level level) { public static void log(String message, Level level) {
if (!DEBUG && level == Level.DEBUG)
return;
String prefix = "!![" + level.name + "]!"; String prefix = "!![" + level.name + "]!";
// prefix first line // prefix first line
message = prefix + message; message = prefix + message;
@ -126,9 +98,9 @@ public final class Log {
message = message.replace("\n", "\n" + prefix); message = message.replace("\n", "\n" + prefix);
if (level.stderr) if (level.stderr)
System.err.println(message); ERR.println(message);
else else
System.out.println(message); OUT.println(message);
} }
} }

View File

@ -0,0 +1,99 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 TheKodeToad <TheKodeToad@proton.me>
*
* 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, version 3.
*
* 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.
*
* Linking this library statically or dynamically with other modules is
* making a combined work based on this library. Thus, the terms and
* conditions of the GNU General Public License cover the whole
* combination.
*
* As a special exception, the copyright holders of this library give
* you permission to link this library with independent modules to
* produce an executable, regardless of the license terms of these
* independent modules, and to copy and distribute the resulting
* executable under terms of your choice, provided that you also meet,
* for each linked independent module, the terms and conditions of the
* license of that module. An independent module is a module which is
* not derived from or based on this library. If you modify this
* library, you may extend this exception to your version of the
* library, but you are not obliged to do so. If you do not wish to do
* so, delete this exception statement from your version.
*
* 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.prismlauncher.utils.logging;
import java.io.OutputStream;
import java.io.PrintStream;
/**
* Used to create a print stream that redirects to Log.
*/
final class LogPrintStream extends PrintStream {
private final Level level;
public LogPrintStream(OutputStream out, Level level) {
super(out);
this.level = level;
}
@Override
public void println(String x) {
Log.log(x, level);
}
@Override
public void println(Object x) {
println(String.valueOf(x));
}
@Override
public void println(boolean x) {
println(String.valueOf(x));
}
@Override
public void println(char x) {
println(String.valueOf(x));
}
@Override
public void println(int x) {
println(String.valueOf(x));
}
@Override
public void println(long x) {
println(String.valueOf(x));
}
@Override
public void println(float x) {
println(String.valueOf(x));
}
@Override
public void println(double x) {
println(String.valueOf(x));
}
@Override
public void println(char[] x) {
println(String.valueOf(x));
}
}