No longer use java.applet as it's scheduled for removal.
Seems to work, and wasnt too crazy, this should help ensure future java version support, see: https://openjdk.org/jeps/8345525
Tested only in b1.8.1 so far, needs testing in a wide range of versions.
Can we take this opertunity to fix some of the bugs with the applet versions, especially the incorrectly sized windows?
It doesn't improve much, I made the PR mostly so it's not forgotten about.
This has been proposed to be removed in J26: https://openjdk.org/projects/jdk/26/
Once there is an EA build for 26 this should be re tested.
Tested with the latest Java 26 EA build 17 this works fine for most older versions, but 1.4.7 is proving to be a bit tricky as it uses the applet classes in its own obfucated classes that the same gamepatch doesnt cover.
I think the solution here is to make a builtin transform that runs on every single class load, to point to the stubbed classes. This has an additional benefit of also patching mods that use applet classes (do any exist?).
I may also look into only applying these changes when running with Java 26 or later as there is no point in breaking something that already works.
Now seems to work with all versions (that I have tested), we cannot easily skip these changes pre java 26 as our own AppletLauncher class needs to compile against either loaders stub or java's real applet. As we wont want to be stuck forever using Java 25 or older to compile loader I think the best solution is to just take the jump and move fully away from it now, with no option to go back.
Mixins utilizing Applet don't work with this PR. Such as one seen here: https://github.com/OrnitheMC/ornithe-standard-libraries/blob/main/libraries/entrypoints/entrypoints-client-mca1.0.6-mc12w30e/src/main/java/net/ornithemc/osl/entrypoints/impl/mixin/client/MinecraftAppletMixin.java
23:15:19.801 [AWT-EventQueue-0] ERROR FabricLoader/Mixin - osl.entrypoints.mixins.json:client.MinecraftAppletMixin from mod osl-entrypoints: Super class 'java.applet.Applet' of client.MinecraftAppletMixin was not found in the hierarchy of target class 'net/minecraft/client/MinecraftApplet'
org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException: Super class 'java.applet.Applet' of client.MinecraftAppletMixin was not found in the hierarchy of target class 'net/minecraft/client/MinecraftApplet'
at org.spongepowered.asm.mixin.transformer.MixinInfo$SubType$Standard.validate(MixinInfo.java:593) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinInfo$State.validate(MixinInfo.java:327) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinInfo.validate(MixinInfo.java:913) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinConfig.postInitialise(MixinConfig.java:884) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.prepareConfigs(MixinProcessor.java:616) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.select(MixinProcessor.java:510) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.checkSelect(MixinProcessor.java:486) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.lockAndSelect(MixinProcessor.java:438) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.couldTransformClass(MixinProcessor.java:398) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.couldTransformClass(MixinTransformer.java:265) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:233) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202) ~[sponge-mixin-0.16.5+mixin.0.8.7.jar:0.16.5+mixin.0.8.7]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435) ~[fabric-loader-0.17.2+local.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336) ~[fabric-loader-0.17.2+local.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231) ~[fabric-loader-0.17.2+local.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119) ~[fabric-loader-0.17.2+local.jar:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:490) ~[?:?]
at net.fabricmc.loader.impl.game.minecraft.applet.AppletLauncher.<init>(AppletLauncher.java:67) ~[fabric-loader-0.17.2+local.jar:?]
at net.fabricmc.loader.impl.game.minecraft.applet.AppletFrame.launch(AppletFrame.java:110) ~[fabric-loader-0.17.2+local.jar:?]
at net.fabricmc.loader.impl.game.minecraft.applet.AppletMain.run(AppletMain.java:47) ~[fabric-loader-0.17.2+local.jar:?]
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:323) ~[?:?]
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723) ~[?:?]
at java.awt.EventQueue.dispatchEvent(EventQueue.java:702) ~[?:?]
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) ~[?:?]
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) ~[?:?]
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) ~[?:?]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) ~[?:?]
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) ~[?:?]
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) ~[?:?]
I don't think this is really fixable easily, for now it seems reasonable to require that the mod adapts to the new hierarchy instead. We chose to enable the applet transform for all JVM version to allow mods to migrate easily with a single code path.