Skip to content

Conversation

modmuss50
Copy link
Member

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?

Copy link
Contributor

@Player3324 Player3324 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fine imo, but don't merge before we at least verified it works with a JDK build that has applets removed - unless it substantially improves using these old versions for other reasons.

@modmuss50
Copy link
Member Author

It doesn't improve much, I made the PR mostly so it's not forgotten about.

@modmuss50
Copy link
Member Author

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.

@modmuss50
Copy link
Member Author

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.

Comment on lines +36 to +38
// TODO move this transformer into the minecraft specific code.
renames.put("java/applet/Applet", "net/fabricmc/loader/impl/game/minecraft/applet/stub/Applet");
renames.put("java/applet/AppletStub", "net/fabricmc/loader/impl/game/minecraft/applet/stub/AppletStub");
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Im not sure keen on how this brings minecraft specific code over into the none minecraft part of loader, this will likely need to be solved by some future refactoring work.

@modmuss50
Copy link
Member Author

image

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.

@modmuss50 modmuss50 requested a review from Player3324 October 4, 2025 12:43
@modmuss50 modmuss50 marked this pull request as ready for review October 4, 2025 12:43
@Lassebq
Copy link

Lassebq commented Oct 17, 2025

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) ~[?:?]

@Player3324
Copy link
Contributor

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants