Skip to content

Commit 63474f3

Browse files
committed
Fix Java 5 compatibility. Make applet removal opt-in. Update Fabric instructions
1 parent 366848b commit 63474f3

File tree

19 files changed

+297
-101
lines changed

19 files changed

+297
-101
lines changed

doc/MultiMC.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ For this instance, perform the following steps:
2525
- Perform the same steps but instead of `org.mcphackers.launchwrapper.json` use the contents of [org.mcphackers.launchwrapper.fabric.json](org.mcphackers.launchwrapper.fabric.json)
2626
- Make sure it's the bottom-most component and is below the regular "LaunchWrapper" component
2727

28-
## Forge
29-
To install LaunchWrapper with Forge follow instructions for Vanilla, then move "LaunchWrapper" component above Forge.
28+
Recent versions of Fabric loader will refuse to launch the game if multiple instances of asm libraries are present. You need to remove them.
3029

3130
Edit "LaunchWrapper" component and modify `libraries` array:
3231

@@ -50,8 +49,13 @@ Edit "LaunchWrapper" component and modify `libraries` array:
5049
}
5150
],
5251
```
52+
## Forge
53+
To install LaunchWrapper with Forge follow instructions for Vanilla, then move "LaunchWrapper" component above Forge.
54+
55+
Remove asm libraries from LaunchWrapper component (refer to Fabric instructions)
5356

5457
This only applies to versions where Forge isn't considered a jarmod. For versions where Forge is a jarmod, use Vanilla instructions.
58+
<!-- TODO: Determine version range -->
5559

5660
## Micromixin
5761
Micromixin is a lightweight alternative mixin implementation which can be used with standalone LaunchWrapper. Currently the implementation is barebones so many mixin annotations aren't supported. However, if the mod uses exclusively the annotations from base Mixin (Not MixinExtras) there's a high chance it'll work when recompiled with

doc/org.mcphackers.launchwrapper.fabric.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
"url": "https://maven.glass-launcher.net/releases/"
1010
}
1111
],
12-
"mainClass": "org.mcphackers.launchwrapper.fabric.FabricBridge"
12+
"mainClass": "org.mcphackers.launchwrapper.Launch",
13+
"minecraftArguments": "--username ${auth_player_name} --session ${auth_session} --version ${version_name} --gameDir ${game_directory} --assetsDir ${assets_root} --assetIndex ${assets_index_name} --accessToken ${auth_access_token} --userType ${user_type} --versionType ${version_type} --tweakClass org.mcphackers.launchwrapper.tweak.FabricLoaderTweak"
1314
}

launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/fabric/FabricBridge.java

Lines changed: 0 additions & 49 deletions
This file was deleted.

launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameProvider.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
import org.mcphackers.launchwrapper.Launch;
3535
import org.mcphackers.launchwrapper.LaunchConfig;
36-
import org.mcphackers.launchwrapper.fabric.FabricBridge;
3736
import org.mcphackers.launchwrapper.target.MainLaunchTarget;
3837
import org.mcphackers.launchwrapper.tweak.FabricLoaderTweak;
3938
import org.mcphackers.launchwrapper.tweak.Tweak;
@@ -44,7 +43,8 @@ public class LWGameProvider implements GameProvider {
4443
private static final Set<BuiltinTransform> TRANSFORM_WIDENALL_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS, BuiltinTransform.CLASS_TWEAKS);
4544
private static final Set<BuiltinTransform> TRANSFORM_STRIPENV = EnumSet.of(BuiltinTransform.STRIP_ENVIRONMENT);
4645

47-
public LaunchConfig config = FabricBridge.getInstance().config;
46+
public Launch launch = Launch.getInstance();
47+
public LaunchConfig config = launch.config;
4848
public MainLaunchTarget target = null;
4949

5050
private Arguments arguments;
@@ -58,10 +58,6 @@ public class LWGameProvider implements GameProvider {
5858
private boolean hasModLoader;
5959
private final GameTransformer transformer = new LWGameTransformer(this);
6060

61-
public Tweak getTweak(ClassNodeSource source) {
62-
return new FabricLoaderTweak(Tweak.get(source, config), config);
63-
}
64-
6561
@Override
6662
public void launch(ClassLoader loader) {
6763
String targetClass = target.targetClass;
@@ -169,7 +165,7 @@ public String getEntrypoint() {
169165

170166
@Override
171167
public Path getLaunchDirectory() {
172-
return FabricBridge.getInstance().config.gameDir.get().toPath();
168+
return launch.config.gameDir.get().toPath();
173169
}
174170

175171
@Override

launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/inject/LWGameTransformer.java

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111
import java.util.function.Function;
1212
import java.util.zip.ZipError;
1313

14+
import org.mcphackers.launchwrapper.loader.SafeClassWriter;
15+
import org.mcphackers.launchwrapper.target.MainLaunchTarget;
16+
import org.mcphackers.launchwrapper.tweak.FabricLoaderTweak;
17+
import org.mcphackers.launchwrapper.tweak.Tweak;
18+
import org.mcphackers.launchwrapper.tweak.Tweaker;
19+
import org.mcphackers.launchwrapper.util.ClassNodeSource;
20+
import org.mcphackers.launchwrapper.util.asm.NodeHelper;
21+
import org.objectweb.asm.ClassWriter;
22+
import org.objectweb.asm.tree.ClassNode;
23+
1424
import net.fabricmc.loader.impl.game.patch.GameTransformer;
1525
import net.fabricmc.loader.impl.launch.FabricLauncher;
1626
import net.fabricmc.loader.impl.util.ExceptionUtil;
@@ -20,20 +30,14 @@
2030
import net.fabricmc.loader.impl.util.log.Log;
2131
import net.fabricmc.loader.impl.util.log.LogCategory;
2232

23-
import org.mcphackers.launchwrapper.loader.SafeClassWriter;
24-
import org.mcphackers.launchwrapper.target.MainLaunchTarget;
25-
import org.mcphackers.launchwrapper.tweak.Tweak;
26-
import org.mcphackers.launchwrapper.util.ClassNodeSource;
27-
import org.mcphackers.launchwrapper.util.asm.NodeHelper;
28-
import org.objectweb.asm.ClassWriter;
29-
import org.objectweb.asm.tree.ClassNode;
30-
3133
public class LWGameTransformer extends GameTransformer implements ClassNodeSource {
3234
private final LWGameProvider gameProvider;
3335
private FabricLauncher launcher;
3436
private Map<String, ClassNode> modified;
3537
private Function<String, ClassNode> classSource;
3638
private boolean entrypointsLocated = false;
39+
private FabricLoaderTweak tweak;
40+
private List<Tweaker> tweakers;
3741

3842
public LWGameTransformer(LWGameProvider gameProvider) {
3943
this.gameProvider = gameProvider;
@@ -62,7 +66,8 @@ public void locateEntrypoints(FabricLauncher launcher, List<Path> gameJars) {
6266
}
6367

6468
try (InputStream is = entry.getInputStream()) {
65-
return NodeHelper.readClass(is, 0);
69+
node = NodeHelper.readClass(is, 0);
70+
return node;
6671
} catch (IOException | ZipError e) {
6772
throw new RuntimeException(String.format("error reading %s in %s: %s", name, LoaderUtil.normalizePath(entry.getOrigin()), e), e);
6873
}
@@ -71,9 +76,10 @@ public void locateEntrypoints(FabricLauncher launcher, List<Path> gameJars) {
7176
}
7277
};
7378

74-
Tweak tweak = gameProvider.getTweak(this);
75-
tweak.transform(this);
76-
gameProvider.target = (MainLaunchTarget)tweak.getLaunchTarget();
79+
this.tweak = new FabricLoaderTweak(Tweak.getDefault(this, gameProvider.config), gameProvider.config);
80+
this.tweakers = this.tweak.getTweakers();
81+
this.tweak.transform(this);
82+
gameProvider.target = (MainLaunchTarget)tweak.getBaseTweak().getLaunchTarget();
7783

7884
} catch (IOException e) {
7985
throw ExceptionUtil.wrap(e);
@@ -88,19 +94,35 @@ public ClassNode getClass(String name) {
8894
if (node == null) {
8995
try {
9096
node = NodeHelper.readClass(launcher.getResourceAsStream(LoaderUtil.getClassFileName(name)), 0);
97+
return node;
9198
} catch (IOException e) {
9299
e.printStackTrace();
93100
}
94101
}
95102
return node;
96103
}
97104

105+
private void runTransformers(ClassNode node) {
106+
if(tweakers == null || node == null) {
107+
return;
108+
}
109+
boolean modified = false;
110+
for (Tweaker tweak : tweakers) {
111+
modified |= tweak.tweakClass(this, node.name);
112+
}
113+
if (modified) {
114+
overrideClass(node);
115+
}
116+
}
117+
118+
@Override
98119
public void overrideClass(ClassNode node) {
99120
modified.put(node.name.replace("/", "."), node);
100121
}
101122

102123
public byte[] transform(String className) {
103124
ClassNode node = modified.get(className);
125+
runTransformers(node);
104126
if (node == null) {
105127
return null;
106128
}

launchwrapper-fabric/src/main/java/org/mcphackers/launchwrapper/tweak/FabricLoaderTweak.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
package org.mcphackers.launchwrapper.tweak;
22

3+
import java.security.CodeSource;
34
import java.util.ArrayList;
45
import java.util.List;
56

67
import org.mcphackers.launchwrapper.LaunchConfig;
8+
import org.mcphackers.launchwrapper.loader.LaunchClassLoader;
79
import org.mcphackers.launchwrapper.target.LaunchTarget;
10+
import org.mcphackers.launchwrapper.target.MainLaunchTarget;
811
import org.mcphackers.launchwrapper.tweak.injection.Injection;
912
import org.mcphackers.launchwrapper.tweak.injection.MinecraftGetter;
1013
import org.mcphackers.launchwrapper.tweak.injection.fabric.FabricHook;
1114

1215
public class FabricLoaderTweak extends Tweak {
16+
private static final String FABRIC_KNOT_CLIENT = "net/fabricmc/loader/impl/launch/knot/KnotClient";
17+
private static final String FABRIC_KNOT = "net/fabricmc/loader/impl/launch/knot/Knot";
1318

1419
protected Tweak baseTweak;
1520

@@ -37,8 +42,30 @@ public List<Tweaker> getTweakers() {
3742
return baseTweak.getTweakers();
3843
}
3944

45+
private static String gameProdiverSource() {
46+
// Location of META-INF/services/net.fabricmc.loader.impl.game.GameProvider
47+
CodeSource resource = FabricLoaderTweak.class.getProtectionDomain().getCodeSource();
48+
if (resource == null) {
49+
return null;
50+
}
51+
return resource.getLocation().getPath();
52+
}
53+
54+
public Tweak getBaseTweak() {
55+
return baseTweak;
56+
}
57+
4058
@Override
4159
public LaunchTarget getLaunchTarget() {
42-
return baseTweak.getLaunchTarget();
60+
MainLaunchTarget target = new MainLaunchTarget(FABRIC_KNOT_CLIENT, new String[0]) {
61+
@Override
62+
public void launch(LaunchClassLoader loader) {
63+
System.setProperty("fabric.skipMcProvider", "true");
64+
loader.overrideClassSource(FABRIC_KNOT, gameProdiverSource());
65+
loader.overrideClassSource(FABRIC_KNOT_CLIENT, gameProdiverSource());
66+
loader.invokeMain(FABRIC_KNOT_CLIENT.replace('/', '.'), config.getArgs());
67+
}
68+
};
69+
return target;
4370
}
4471
}

src/main/java/org/mcphackers/launchwrapper/LaunchConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,11 @@ public class LaunchConfig {
6565
public final LaunchParameterEnum<SkinType> skinProxy = new LaunchParameterEnum<SkinType>("skinProxy", SkinType.DEFAULT, true);
6666
public final LaunchParameterSkinOptions skinOptions = new LaunchParameterSkinOptions("skinOptions");
6767
public final LaunchParameterFile levelsDir = new LaunchParameterFile("levelsDir", null, true);
68+
public final LaunchParameterSwitch useFakeApplet = new LaunchParameterSwitch("useFakeApplet", false, true);
6869
public final LaunchParameterSwitch isom = new LaunchParameterSwitch("isom", false, true);
6970
public final LaunchParameterFileList icon = new LaunchParameterFileList("icon", null, true);
7071
public final LaunchParameterString title = new LaunchParameterString("title", null, true);
7172
public final LaunchParameterSwitch vsync = new LaunchParameterSwitch("vsync", false, true);
72-
public final LaunchParameterSwitch resizable = new LaunchParameterSwitch("resizable", false, true);
7373
public final LaunchParameterSwitch applet = new LaunchParameterSwitch("applet", false);
7474
public final LaunchParameterSwitch oneSixFlag = new LaunchParameterSwitch("oneSixFlag", false, true);
7575
public final LaunchParameterSwitch unlicensedCopy = new LaunchParameterSwitchReverse("unlicensedCopy", haspaid);

src/main/java/org/mcphackers/launchwrapper/loader/LaunchClassLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private static ClassLoader getParentClassLoader() {
9999
return (ClassLoader)ClassLoader.class.getMethod("getPlatformClassLoader").invoke(null); // Java 9+ only
100100
} catch (NoSuchMethodException e) {
101101
return null; // fall back to boot cl
102-
} catch (ReflectiveOperationException e) {
102+
} catch (Exception e) {
103103
throw new RuntimeException(e);
104104
}
105105
}

src/main/java/org/mcphackers/launchwrapper/protocol/skin/ElyBySkinProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public Skin getSkin(String name, SkinTexture type) {
2929

3030
URL texturesURL = new URL("http://skinsystem.ely.by/textures/" + name);
3131
String response = new String(Util.readStream(openDirectConnection(texturesURL).getInputStream()), "UTF-8");
32-
if (response.isEmpty()) {
32+
if (response.length() == 0) {
3333
return null;
3434
}
3535
JSONObject texturesJson = new JSONObject(response);

src/main/java/org/mcphackers/launchwrapper/protocol/skin/MojangSkinProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public static Profile getProfile(String uuid) {
119119
return null;
120120
}
121121
String response = new String(Util.readStream(connection.getInputStream()), "UTF-8");
122-
if (response.isEmpty()) {
122+
if (response.length() == 0) {
123123
return null;
124124
}
125125
JSONObject profileJson = new JSONObject(response);

0 commit comments

Comments
 (0)