GithubHelp home page GithubHelp logo

quilt-loader's People

Contributors

alexiil avatar ampflower avatar arc-blroth avatar asiekierka avatar chocohead avatar ennuil avatar haven-king avatar haykam821 avatar heipiao233 avatar i509vcb avatar ix0rai avatar jamierocks avatar jamieswhiteshirt avatar johni0702 avatar juuxel avatar kb-1000 avatar liach avatar lostluma avatar minegame159 avatar modmuss50 avatar mysterious-dev avatar polaris257 avatar ramidzkh avatar sfplayer1 avatar shadowfacts avatar siuolplex avatar theglitch76 avatar tibinonest avatar unascribed avatar zeroeightysix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quilt-loader's Issues

Refactors to language adapters

At the moment the way language adapters work currently may cause issues when using kotlin or other languages in mixin plugins, causing the classloader to be broken. Loader plugins being on the todo list will likely push this issue even farther forward in the launch process.

A fix to this issue will require reworking how language adapters function. Specifically we need to load language adapters very early on, probably just before loader plugins.

I would also like to change the implementation detail regarding language adapters. Specifically only loading the language specific stuff, and being disallowed from doing anything else.

Further discussion is needed before we move forward here.

Give a better way to figure out where Jar in Jar mods originate

Some mods, such as Exotic Blocks, include extra jars kind of shadowed or some other way included in there, sometimes it goes many levels deep(jar-in-jar-in-jar etc.).Sometimes these libraries bundled mods included conflict with other mods and cause problems. And yes while shadowing, fat jars and other methods to include libraries in mods is often a bad idea, it is commonly used by many mods, and it makes modpack making a pain for mods which do it. It is possible that the game could crash because of some mod you have never heard of and do not know where it is coming from. I would like a way to know which jar file the crash is coming from and a way to know which mod a bundled mod is actually coming from.

Mod.jar -> IncludedMod.jar

An example would be if IncludedMod.jar were to crash you would be able to know that it was included in Mod.jar so you know to disable Mod.jar rather than just having the modid of the mod which failed.

Kotlin Support Soon?

I'm a Kotlin coder, and i don't understand somethings on java. So... there will be Kotlin support in the future?

Allow Minecraft-version-specific subfolders in the mods folder

The main use case is for people who use the vanilla launcher, which only has one mods folder shared between potentially many instances. Forge allows you to create subfolders in the mods folder named the same as each Minecraft version, and FML will not attempt to load mods from subfolders not matching your current version. I know quite a few people find it annoying that Fabric loader does not allow you to do the same thing, so it would be nice if Quilt loader had this feature.

Allow specifying download link for dependencies in a dependency object

You should have the ability to recommend a download link for users in dependency objects, so that users can quickly find + (manually) download mods they are missing.

This is different from automatic dependency downloading; it would just be something like a url field on a dependency object that can be any web page.

Document quilt-server-launch.properties and quilt-server-launcher.properties

This has always been extremely opaque for Fabric, and it would be nice to have some central documentation for Quilt on this file. I personally use it to modify the serverJar property so I can move the quilt-server-launch.jar to a common location for multiple servers.

It appears that these two files exist probably by mistake, since I'm assuming that they're supposed to be the same file, although they've probably been separate on Fabric for who knows how long.

Suggestion: Make all private and protected Minecraft fields and methods automatically public by default

I was having a conversation with a couple of individuals about fabric, and I had the idea of just by default why not have all Minecraft's fields and methods public, so you can always call the methods, or change the fields. The reasoning behind not doing this is because it could lead to an individual messing with something without understanding it, however, just by using mixins/accessors anyone can do that anyway, by setting all Fields and Methods to public it would ease and speed up mod development. I think we should trust the mod makers to know what they're doing, and having an artificial barrier of requiring someone to learn how to use accessors, as an example, or mixins, in order to use private fields or methods does no one any good.
image

Add the current os and architecture as mods

As a logical conclusion to the Java version being declared as a mod for dependencies, I think the platform is the next reasonable step here.

Use cases for depending on a specific os could include relying on os impl detail for libraries and JNI.

Ideally to simplify the dependency hierarchy, if your machine is running macos, the value of the operating system mod would be "macos". This might conflict with the fact we want semver in most spots?

Sketching how error output should look like

Here's some thoughts on how error output should look like, so it is easily readable by anyone, and less confusing.
Error output that will be read by users, especially if it's a dedicated dialog box, should be clear, written fully in English, and avoid any confusion. Keep stacktraces and technical information to logs.

Simple missing dependency

Mod A depends on any version of mod B, but mod B cannot be found, please install it.

Mod C depends on mod D version 1.5 and up, but only mod D version 1.3 could be found, please update it.

Jar In Jar case

Mod B, included in mod A, depends on Mod C versions 1.17.x, but mod C could not be found, please install it.

Mod B, included in mod A, cannot be loaded with mod D version up to 1.5, and mod D version 1.4.6 is present, please either:

  • install a new version of mod B that is compatible with mod D version 1.4.6;
  • or remove mod D and its dependent mods

Breakage

Mod A cannot be loaded alongside any version of mod B, and mod B version 1.6 is present, please either:

  • install a new version of mod A that is compatible with mod B version 1.6;
  • or remove mod B and its dependent mods

Version pretty printing:

* -> any version of mod
>=1.17 -> version 1.17 and up
<=1.17 -> up to version 1.17
1.17.x -> versions 1.17.x
1.17 -> version 1.17

Autogenerate the `quilt-installer(.launchwrapper).json` files

The last few updates to loader and it's dependencies, I've noticed we haven't updated the entries in those files. We should consider auto generating this using gradle's own dependency resolution. We can do things such as launchwrapper specific dependencies via a custom configuration if needed.

Disallow "version" as a field inside of dependency objects

Since the correct field name is versions - and I think we want to allow plugins to add their own fields. This should help find issues such as henkelmax/simple-voice-chat#419.

(However we could make plugins prefix their custom fields with their ID, so minecraft:environment might be the field name of side restrictions. Technically this is a problem we should solve separately though).

Mods not loaded due to environment type aren't handled gracefully

The loader simply refuses to load mods in the wrong environment. This means it doesn't interact at all with the mod dependency system. An easy way to reproduce would be to have a regular mod depend on a serversided library. As the serversided library isn't removed whilst mods are resolved the regular mod is loaded without any errors. This also causes an issue for jij'd mods.

A simple fix would be to filter out mods in the wrong environment before the mods are resolved, although something providing nicer errors might be better.

Better entrypoints

This issue might be closed once entrypoints are not in loader anymore.

Entrypoints should have a ModContainer parameter passed to them, I don't know why it wasn't from the start but it can be pretty annoying in the case a mod needs to get its ModContainer as it has to get it with a call using its own mod id which returns an Optional.

This mostly have a use-case for resource loader and the built-in resource packs, could be used for other things too.
It's also a way to get the root Path of the mod.

OptiFabric doesn't load

When I try to load optifabric with the Quilt loader, I get a crash with no error message.

Issue regarding compatibility with Fabric (missing Fabric class)

Hi!

I have a new issue with my Fabric mod by a Quilt user (Please refer to Xujiayao/Discord-MC-Chat#62).

It seems that the problem occurs because my mod uses the following class:

net.fabricmc.loader.impl.metadata.EntrypointMetadata
net.fabricmc.loader.impl.metadata.LoaderModMetadata

I looked at Quilt's source code (https://github.com/QuiltMC/quilt-loader/tree/develop/src/fabric/impl/java/net/fabricmc/loader/impl/metadata) and didn't seem to find this class either.

Quilt is compatible with the vast majority of Fabric mods. Is there any way to achieve compatibility with Quilt and Fabric at the same time?

Thank you very much!

Pls help!

The game crashed whilst initializing game

Error: org.quiltmc.loader.impl.entrypoint.QuiltEntrypointException: Exception while loading entries for entrypoint 'client_init' provided by 'quilt_networking'

Exit Code: -1

latest.log
crash-2022-08-17_13.58.43-client.txt

Chasm support

Introduction

One of the goals of The Quilt Project is to eventually replace Mixin and Accesswidener with Chasm. While this is likely still some ways off, I'm opening this issue to keep track of what needs to be done in order to achieve this.

Knot Launcher

First, let me summarize the current behaviour of Knot:

  1. Scan the class path for a GameProvider using the ServiceLoader
  2. Create a ClassLoader
  3. Initialize the GameProvider (discover the game jar)
  4. Find mod candidates
  5. Resolve mod set
  6. Add mods to class path
  7. Load AccessWideners
  8. Bootstrap mixin
  9. Add game and libs to classpath
  10. Invoke pre-launch entrypoints
  11. Launch game

Quilt Launcher

This works fine, but since note that the classpath gets created before mixin bootstrap, but completed after it. For Chasm this means that there never is an easy place have access to the entire classpath while also having the ability to easily transform it and cache results. Because of this, I propose a cleanup and reimplementation of Knot, i.e. create a new QuiltLauncher:

  1. Use the ServiceLoader to discover a GameProvider
  2. Initialize the game provider
  3. Find mod candidates (including built-in mods)
  4. Resolve mods (including plugins)
  5. Apply Chasm
  6. Create a ClassLoader
  7. Invoke pre-launch entry points
  8. Launch game

Legacy Transformations

With Chasm, Mixin will have to work differently. While it would be nice to still apply Sponge-Mixin and AccessWideners besides Chasm to allow for a transition period, this is against the design principle of Chasm. Therefore, legacy bytecode transformers will have to be transformed to Chasm transformers at launch. This will probably be done via a built-in compatibility plugin. This plugin would have to consume a mod jar and generate a new one, replacing legacy mixins with transformer files.

Timeline

As mentioned before, this would have to happen after loader plugins.
Additionally, since running Mixin and Chasm side-by-side is probably not feasible, this will require Chasm to be production ready.
Even further, Chasm-Mixin and Chasm-AccessWidener would also need to be functional.
Integration into build-tools would not be necessary, but preferred.

Mod Resolution fails if a JiJ mod provides the ID of a mod present at root level

Essentially as the title says, if a mod JiJ'd in another mod declares the ID of a root-level mod in its provides block, mod resolution fails with the following error:
org.quiltmc.loader.impl.discovery.ModSolvingError: <id> is already provided by ModCandidate{<providing mod>} - something has gone wrong internally!

For a concrete example, Numismatic Overhaul and owo-lib may be used where the error will then be
org.quiltmc.loader.impl.discovery.ModSolvingError: owo is already provided by ModCandidate{[email protected]+1.18} - something has gone wrong internally!. owo-sentinel here is JiJ'd in Numismatic Overhaul and is only supposed to be loaded when owo is not present to then offer the user the option to automatically download it.

`*_loader_dependencies.json` doesn't work

I have tested both fabric_loader_dependencies.json and quilt_loader_dependencies.json, and neither of them work. I have tested them with the basic configuration of:

{
    "version": 1,
    "overrides": {
        "tiefix": {
            "-depends": {
                "fabric-resource-loader-v0": "IGNORED"
            }
        }
}

but I still get an error on launch declaring a missing fabric resource loader dependency. This occurs with any other mods/dependencies I have tried it on.

The files were placed in **/.minecraft/config/, as with fabric.

On fabric, as expected, fabric_loader_dependencies.json works fine.

@wafflecoffee mentioned on the QuiltMC discord server that she had some issues too.

Test run fails under eclipse

This is a regression from latest fabric-loader. Running via gradle works fine, as well.

Crash log: (Note: TestMod does implement PreLaunchEntrypoint, but it's loaded by KnotClassLoader, and the PreLaunchEntrypoint referenced in the crash report is loaded by the system classloader.)

Exception in thread "main" java.lang.RuntimeException: Could not execute entrypoint stage 'preLaunch' due to errors, provided by 'test'!
	at org.quiltmc.loader.impl.entrypoint.minecraft.hooks.EntrypointUtils.invoke0(EntrypointUtils.java:50)
	at org.quiltmc.loader.impl.entrypoint.minecraft.hooks.EntrypointUtils.invoke(EntrypointUtils.java:33)
	at org.quiltmc.loader.impl.launch.knot.Knot.init(Knot.java:138)
	at org.quiltmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:28)
	at org.quiltmc.devlaunchinjector.Main.main(Main.java:86)
Caused by: net.fabricmc.loader.api.EntrypointException: Exception while loading entries for entrypoint 'preLaunch' provided by 'test'
	at org.quiltmc.loader.impl.EntrypointStorage.lambda$1(EntrypointStorage.java:186)
	at org.quiltmc.loader.impl.entrypoint.EntrypointContainerImpl.getEntrypoint(EntrypointContainerImpl.java:37)
	at org.quiltmc.loader.impl.entrypoint.minecraft.hooks.EntrypointUtils.invoke0(EntrypointUtils.java:47)
	... 4 more
Caused by: net.fabricmc.loader.api.LanguageAdapterException: Class net.fabricmc.test.TestMod cannot be cast to net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint!
	at org.quiltmc.loader.impl.util.DefaultLanguageAdapter.create(DefaultLanguageAdapter.java:58)
	at org.quiltmc.loader.impl.EntrypointStorage$NewEntry.create(EntrypointStorage.java:112)
	at org.quiltmc.loader.impl.EntrypointStorage$NewEntry.getOrCreate(EntrypointStorage.java:99)
	at org.quiltmc.loader.impl.EntrypointStorage.lambda$1(EntrypointStorage.java:184)
	... 6 more```

Fabric ASM entrypoint is not being loaded/triggered

Entrypoint mm:early_risers for Fabric ASM is not being loaded/triggered at all, when running the mod(with Fabric it is fine), i can link source code if wanted. Also com_github_chocohead_fabric-asm v2.3 is normally loaded between the mods

net.fabricmc Namespace Compatibility

Fabric mods using the net.fabricmc namespace cause build and execution issues due to a recent namespace change from net.fabricmc to org.quiltmc.

Mod paths with `[` and `]` cause loading to fail

As reported in discord.

This results in an error like this:

java.lang.RuntimeException: Could not execute entrypoint stage 'client' due to errors, provided by 'inventoryhud'!
	at Not Enough Crashes deobfuscated stack trace.(1.18.1+build.22)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.lambda$invoke0$2(EntrypointUtils.java:63)
	at org.quiltmc.loader.impl.util.ExceptionUtil.gatherExceptions(ExceptionUtil.java:33)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.invoke0(EntrypointUtils.java:61)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.invokeContainer(EntrypointUtils.java:46)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.invoke(EntrypointUtils.java:33)
	at org.quiltmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:53)
	at net.minecraft.client.MinecraftClient.<init>(MinecraftClient:443)
	at net.minecraft.client.main.Main.main(Main:198)
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:568)
	at org.quiltmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:423)
	at org.quiltmc.loader.impl.launch.knot.Knot.launch(Knot.java:76)
	at org.quiltmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:24)
Caused by: org.quiltmc.loader.impl.entrypoint.QuiltEntrypointException: Exception while loading entries for entrypoint 'client' provided by 'inventoryhud'
	at org.quiltmc.loader.impl.entrypoint.EntrypointStorage.lambda$getEntrypointContainers$1(EntrypointStorage.java:222)
	at org.quiltmc.loader.impl.entrypoint.EntrypointContainerImpl.getEntrypoint(EntrypointContainerImpl.java:51)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.lambda$invoke$0(EntrypointUtils.java:33)
	at org.quiltmc.loader.impl.entrypoint.EntrypointUtils.invoke0(EntrypointUtils.java:59)
	... 12 more
Caused by: org.quiltmc.loader.impl.util.ExceptionUtil$WrappedException: java.net.URISyntaxException: Illegal character in path at index 75: file:/C:/Users/mDragon/AppData/Roaming/.minecraft/mods/InventoryHUD-fabric-[1.19]+-3.4.2.jar
	at org.quiltmc.loader.impl.util.ExceptionUtil.wrap(ExceptionUtil.java:51)
	at org.quiltmc.loader.impl.util.UrlUtil.asPath(UrlUtil.java:67)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.lambda$getMetadata$0(KnotClassDelegate.java:196)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.getMetadata(KnotClassDelegate.java:190)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.getMetadata(KnotClassDelegate.java:186)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:153)
	at org.quiltmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:156)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:467)
	at org.quiltmc.loader.impl.util.DefaultLanguageAdapter.create(DefaultLanguageAdapter.java:49)
	at org.quiltmc.loader.impl.entrypoint.EntrypointStorage$NewEntry.getOrCreate(EntrypointStorage.java:112)
	at org.quiltmc.loader.impl.entrypoint.EntrypointStorage.lambda$getEntrypointContainers$1(EntrypointStorage.java:220)
	... 15 more
Caused by: java.net.URISyntaxException: Illegal character in path at index 75: file:/C:/Users/mDragon/AppData/Roaming/.minecraft/mods/InventoryHUD-fabric-[1.19]+-3.4.2.jar
	at java.net.URI$Parser.fail(URI.java:2974)
	at java.net.URI$Parser.checkChars(URI.java:3145)
	at java.net.URI$Parser.parseHierarchical(URI.java:3227)
	at java.net.URI$Parser.parse(URI.java:3175)
	at java.net.URI.<init>(URI.java:623)
	at java.net.URL.toURI(URL.java:1056)
	at org.quiltmc.loader.impl.util.UrlUtil.asPath(UrlUtil.java:65)
	... 27 more

A likely culprit is UrlUtil.asPath, which might need to perform url unencoding

Rationalize whether we should update to Java 17

In the latest snapshot, Mojang updated the Java version of Minecraft to 16.

We should strongly consider doing this for Loader too (remember, not only Loader is affected by this but also its dependencies like ASMR), but there is one big caveat: Older versions will have a CME at random times in-game.

There are several options:

  1. Do nothing and stay on java 8
  2. Update to java 16, drop support for <1.17 versions entirely and leave older versions to a Legacy Fabric-style project, since Quilt is only maintaining 1.17+ QSL anyway.
  3. Update to java 16 and leave the game breaking bug present in older version
  4. Update to java 16 and package the Voyager fix in Loader.

What should we do?

[Suggestion] A dedicated website or even a custom launcher for quilt mods?

I think there should be a website and/or custom minecraft launcher (like curse or gd) specifically for managing quilt mods (maybe including mods from other loaders, up to the team). Let me explain how I can see this being helpful:

  1. It would be difficult to be sure that quilt's goals of inclusiveness and transparency were upheld on curseforge (for example)
  2. Curseforge's searching system is royally scuffed, and it would be great to have a better alternative.
  3. If implemented correctly it could be very convenient for the user. Example below โฌ‡๏ธ

Soooo... If you decide to make a custom launcher (please do, I would be so happy!) I have some feature ideas.. The ability to create separate modded instances along with an integrated mod installer. The ability to create and share modpacks through the launcher. The ability to make separate downloads for client and server branches of a modpack. (I've used "the ability" way too much now and I'm not going to edit it, I'm sorry)

That's it, hope you enjoyed my suggestion!

Custom Language adapter for scala not finding "net.fabricmc.api.ModInitializer.<init>()"

Hello,

I was making a custom language adapter for scala which I might use in the future (afaik there is no official one yet).
the example mod can be found here: quilt-template-mod-scala.

Whenever I start the mod outside of IntelliJ I get the following error:

Caused by: java.lang.NoSuchMethodException: net.fabricmc.api.ModInitializer.<init>()
-> The full crashlog <-

I do not import anything from the Fabric API anywhere in my code.

I launched Minecraft in version 1.19 with a fresh install of Quilt and the newest version of Quilted Fabric API (QFAPI) and Quilt Standard Libraries (QSL) (qfapi beta.9, qsl beta.16). I do not run any other mods besides those and the quilt-template-mod-scala.

I don't know if this is a mistake on my part, a QFAPI error or an loader error, so I decided to open the issue here.

Thank you in advance.

Declare intermediate mappings in `quilt.mod.json`

This is a good first issue for anyone looking to dip in to contributing to Loader. If you are interested in getting this done, feel free to ask me questions at glitch#3274 on the Toolchain Discord.

The issue

Currently, Loader does not have a reliable way of telling what intermediate mappings were used when compiling a mod. This is a problem, because mods currently use the (legacy) Intermediary mappings, but in the future they will be compiled to Hashed.

Motivation

We want to support Quilt mods compiled to Intermediary, even after we switch to Hashed, for two reasons:

  • (major) We aren't sure when our toolchain will support compiling to Hashed, and we'd like to avoid unnecessarily breaking already compiled Quilt mods, especially since the infrastructure for remapping mods from intermediary to hashed will be present due to Fabric compatibility,
  • (minor) Since (as mentioned above) we will be able to remap int -> hashed anyway, it would be nice to allow multi-loader jars (i.e. Fabric and Quilt) to use the same mapping set, to reduce file size and complexity in the build process.
    • side note: Multi-loader jars are important to Quilt during the beta period, because it allows major mods to experiment with the new Quilt APIs without forcing their users onto an unknown, experimental, and unstable modloader.

Proposed Solution

This solution is intended to be as simple as possible,

QMJ Specification in RFC Repository

Add a new, optional field to the quilt_loader field of the quilt.mod.json, named intermediate_mappings. It is a string value that defaults to "hashed", but can be set to "intermediary".

Implementation in Loader

Parser

For now, we can simply implement a no-op in Loader that asserts that the intermediate_mappings field is set to intermediary. It should be read during mod parsing, and mod parsing should fail if:

  • The value is unknown (something like "Error: Unknown intermediate mappings 'example'")
  • The value is hashed, since we don't support it in Loader yet. This one should have a more user-friendly error message, directing the user to update Quilt Loader, since if we see this field we know that this is a mod from the future!

Mod Metadata

The InternalModMetadata metadata interface should gain a new method,:
String intermediateMappings()
that would return the string read in the quilt.mod.json. For now, this can default to always return intermediary (see future steps below)

Future Steps

  • We will need to properly track the string given in the quilt.mod.json for intermediate_mappings, instead of asserting that it exists and throwing the value away, so that it can be properly exposed to Loader. Bonus points if you implement it this way in your PR, but it's not required.
  • In the future, we may want to allow loader plugins to support additional intermediate_mappings kinds, but that isn't relevant right now.

Loader does not report an invalid (quilt.mod.json) entrypoint entry

Came across this while attempting to use a language adapter, but anything besides a STRING or ARRAY type after the entrypoint ID is silently dropped. This is notable because if you miss the ~15 words in the spec its very easy to attempt something like

"entrypoints": {
  "init": {
    "adapter": "some-adapter",
    "value": "mymod.Main"
  }
}

which due to these lines simply falls through into nothing.

quiltmc trying to use internals of fabric loader

i was trying to install fabric api to play with some mods and i got this error

A mod crashed on startup! net.fabricmc.loader.impl.FormattedException: java.lang.RuntimeException: Could not execute entrypoint stage 'preLaunch' due to errors, provided by 'adventure-platform-fabric'! at net.fabricmc.loader.impl.launch.knot.Knot.init(Knot.java:164) at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:68) at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at crystallauncher.MinecraftConstructor.run(MinecraftConstructor.java:29) at crystallauncher.MineClient.start(MineClient.java:213) at crystallauncher.MineClient.main(MineClient.java:36) Caused by: java.lang.RuntimeException: Could not execute entrypoint stage 'preLaunch' due to errors, provided by 'adventure-platform-fabric'! at net.fabricmc.loader.impl.entrypoint.EntrypointUtils.lambda$invoke0$0(EntrypointUtils.java:51) at net.fabricmc.loader.impl.util.ExceptionUtil.gatherExceptions(ExceptionUtil.java:33) at net.fabricmc.loader.impl.entrypoint.EntrypointUtils.invoke0(EntrypointUtils.java:49) at net.fabricmc.loader.impl.entrypoint.EntrypointUtils.invoke(EntrypointUtils.java:35) at net.fabricmc.loader.impl.launch.knot.Knot.init(Knot.java:162) ... 9 more Suppressed: java.lang.ExceptionInInitializerError at org.quiltmc.qsl.command.impl.PreLaunchInitializer.onPreLaunch(PreLaunchInitializer.java:33) at net.fabricmc.loader.impl.entrypoint.EntrypointUtils.invoke0(EntrypointUtils.java:47) ... 11 more Caused by: java.lang.RuntimeException: Failed to load Classloader fields at org.quiltmc.qsl.base.impl.PreLaunchHacks.(PreLaunchHacks.java:49) ... 13 more Caused by: java.lang.NoSuchMethodException: net.fabricmc.loader.impl.launch.knot.KnotClassLoader.addURL(java.net.URL) at java.base/java.lang.Class.getMethod(Class.java:2227) at org.quiltmc.qsl.base.impl.PreLaunchHacks.(PreLaunchHacks.java:46) ... 13 more Caused by: java.lang.ExceptionInInitializerError at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467) at net.fabricmc.loader.impl.util.DefaultLanguageAdapter.create(DefaultLanguageAdapter.java:50) at net.fabricmc.loader.impl.entrypoint.EntrypointStorage$NewEntry.getOrCreate(EntrypointStorage.java:117) at net.fabricmc.loader.impl.entrypoint.EntrypointContainerImpl.getEntrypoint(EntrypointContainerImpl.java:53) at net.fabricmc.loader.impl.entrypoint.EntrypointUtils.invoke0(EntrypointUtils.java:47) ... 11 more Caused by: java.lang.RuntimeException: Failed to load Classloader fields at net.kyori.adventure.platform.fabric.impl.AdventurePrelaunch.(AdventurePrelaunch.java:48) ... 17 more Caused by: java.lang.NoSuchMethodException: net.fabricmc.loader.impl.launch.knot.KnotClassLoader.addURL(java.net.URL) at java.base/java.lang.Class.getMethod(Class.java:2227) at net.kyori.adventure.platform.fabric.impl.AdventurePrelaunch.(AdventurePrelaunch.java:45) ... 17 more

so i went to the fabric api discussion thing and asked for help
i was told that quiltmc was trying to use fabric loader's internals that are removed on the latest version and that i needed to report it

Caused by: java.lang.NoSuchMethodException: net.fabricmc.loader.impl.launch.knot.KnotClassLoader.addURL(java.net.URL) at java.base/java.lang.Class.getMethod(Class.java:2227) at org.quiltmc.qsl.base.impl.PreLaunchHacks.(PreLaunchHacks.java:46)

help pls

[CRASH] Game crashed when joining a Singleplayer World

What Happens
The game crashes when I join a Singleplayer world with Minecraft 1.19 with Quilt 0.17,
However, this doesn't happen when I join a Multiplayer server.

About my system
OS: GNU/Linux (Debian 11)
Kernel: Linux 5.10.0-16-amd64
Architecture: x86 64-bits
Minecraft Launcher: PolyMC (Flatpak)
Minecraft Version: 1.19
Quilt version: 0.17

Crash report

---- Minecraft Crash Report ----
// On the bright side, I bought you a teddy bear!

Time: 16/07/2022, 01:36
Description: Starting integrated server

java.lang.RuntimeException: Mixin transformation of net.minecraft.class_3324 failed
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:248)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:146)
	at org.quiltmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:156)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at net.minecraft.class_310.method_29603(class_310.java:2005)
	at net.minecraft.server.MinecraftServer.method_29740(MinecraftServer.java:265)
	at net.minecraft.class_310.method_29610(class_310.java:2005)
	at net.minecraft.class_7196.method_43326(class_7196.java:179)
	at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718)
	at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:754)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735)
	at java.base/java.util.concurrent.CompletableFuture.thenAcceptAsync(CompletableFuture.java:2191)
	at net.minecraft.class_7196.method_41899(class_7196.java:177)
	at net.minecraft.class_7196.method_41894(class_7196.java:57)
	at net.minecraft.class_528$class_4272.method_20174(class_528.java:528)
	at net.minecraft.class_528$class_4272.method_20164(class_528.java:436)
	at net.minecraft.class_528$class_4272.method_25402(class_528.java:372)
	at net.minecraft.class_350.method_25402(class_350.java:359)
	at net.minecraft.class_4069.method_25402(class_4069.java:27)
	at net.minecraft.class_312.method_1611(class_312.java:94)
	at net.minecraft.class_437.method_25412(class_437.java:491)
	at net.minecraft.class_312.method_1601(class_312.java:94)
	at net.minecraft.class_312.method_22686(class_312.java:165)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at net.minecraft.class_312.method_22684(class_312.java:165)
	at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:43)
	at org.lwjgl.system.JNI.invokeV(Native Method)
	at org.lwjgl.glfw.GLFW.glfwWaitEventsTimeout(GLFW.java:3474)
	at com.mojang.blaze3d.systems.RenderSystem.limitDisplayFPS(RenderSystem.java:222)
	at net.minecraft.class_310.method_1523(class_310.java:1174)
	at net.minecraft.class_310.method_1514(class_310.java:734)
	at net.minecraft.client.main.Main.main(Main.java:237)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.quiltmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:423)
	at org.quiltmc.loader.impl.launch.knot.Knot.launch(Knot.java:76)
	at org.quiltmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:24)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.multimc.impl.OneSixLauncher.invokeMain(OneSixLauncher.java:104)
	at org.multimc.impl.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:175)
	at org.multimc.impl.OneSixLauncher.launch(OneSixLauncher.java:185)
	at org.multimc.EntryPoint.listen(EntryPoint.java:127)
	at org.multimc.EntryPoint.main(EntryPoint.java:57)
Caused by: org.spongepowered.asm.mixin.transformer.throwables.MixinTransformerError: An unexpected critical error was encountered
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:392)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:234)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:243)
	... 49 more
Caused by: org.spongepowered.asm.mixin.throwables.MixinApplyError: Mixin [quilted_fabric_message_api_v1.mixins.json:PlayerManagerMixin] from phase [DEFAULT] in config [quilted_fabric_message_api_v1.mixins.json] from mod [quilted_fabric_message_api_v1] FAILED during APPLY
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinError(MixinProcessor.java:638)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.handleMixinApplyError(MixinProcessor.java:589)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:379)
	... 52 more
Caused by: org.spongepowered.asm.mixin.transformer.throwables.InvalidMixinException: Unexpecteded ClassMetadataNotFoundException whilst transforming the mixin class: [MAIN Applicator Phase -> quilted_fabric_message_api_v1.mixins.json:PlayerManagerMixin -> Apply Methods -> (Lnet/minecraft/class_5837;Lnet/minecraft/class_3222;Lnet/minecraft/class_2556$class_7602;Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V:handler$bbn000$onSendChatMessage -> Transform LVT -> var=params -> desc=Lnet/minecraft/class_2556$class_7602;]
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethod(MixinTargetContext.java:510)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyNormalMethod(MixinApplicatorStandard.java:533)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMethods(MixinApplicatorStandard.java:519)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:386)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:325)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:421)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:403)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:363)
	... 52 more
Caused by: org.spongepowered.asm.mixin.throwables.ClassMetadataNotFoundException: net.minecraft.class_2556$class_7602
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformSingleDescriptor(MixinTargetContext.java:1002)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformSingleDescriptor(MixinTargetContext.java:962)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformLVT(MixinTargetContext.java:563)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.transformMethod(MixinTargetContext.java:469)
	... 59 more


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Thread: Render thread
Stacktrace:
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:248)
	at org.quiltmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:146)
	at org.quiltmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:156)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at net.minecraft.class_310.method_29603(class_310.java:2005)
	at net.minecraft.server.MinecraftServer.method_29740(MinecraftServer.java:265)
	at net.minecraft.class_310.method_29610(class_310.java:2005)
	at net.minecraft.class_7196.method_43326(class_7196.java:179)
	at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718)
	at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:754)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735)
	at java.base/java.util.concurrent.CompletableFuture.thenAcceptAsync(CompletableFuture.java:2191)
	at net.minecraft.class_7196.method_41899(class_7196.java:177)
	at net.minecraft.class_7196.method_41894(class_7196.java:57)
	at net.minecraft.class_528$class_4272.method_20174(class_528.java:528)
	at net.minecraft.class_528$class_4272.method_20164(class_528.java:436)
	at net.minecraft.class_528$class_4272.method_25402(class_528.java:372)
	at net.minecraft.class_350.method_25402(class_350.java:359)
	at net.minecraft.class_4069.method_25402(class_4069.java:27)
	at net.minecraft.class_312.method_1611(class_312.java:94)
	at net.minecraft.class_437.method_25412(class_437.java:491)
	at net.minecraft.class_312.method_1601(class_312.java:94)
	at net.minecraft.class_312.method_22686(class_312.java:165)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at net.minecraft.class_312.method_22684(class_312.java:165)
	at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:43)
	at org.lwjgl.system.JNI.invokeV(Native Method)

-- Starting integrated server --
Details:
	Level ID: Servivalen
	Level Name: Freek's Let's play
Stacktrace:
	at net.minecraft.class_310.method_29610(class_310.java:2005)
	at net.minecraft.class_7196.method_43326(class_7196.java:179)
	at java.base/java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:718)
	at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:754)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735)
	at java.base/java.util.concurrent.CompletableFuture.thenAcceptAsync(CompletableFuture.java:2191)
	at net.minecraft.class_7196.method_41899(class_7196.java:177)
	at net.minecraft.class_7196.method_41894(class_7196.java:57)
	at net.minecraft.class_528$class_4272.method_20174(class_528.java:528)
	at net.minecraft.class_528$class_4272.method_20164(class_528.java:436)
	at net.minecraft.class_528$class_4272.method_25402(class_528.java:372)
	at net.minecraft.class_350.method_25402(class_350.java:359)
	at net.minecraft.class_4069.method_25402(class_4069.java:27)
	at net.minecraft.class_312.method_1611(class_312.java:94)
	at net.minecraft.class_437.method_25412(class_437.java:491)
	at net.minecraft.class_312.method_1601(class_312.java:94)
	at net.minecraft.class_312.method_22686(class_312.java:165)
	at net.minecraft.class_1255.execute(class_1255.java:103)
	at net.minecraft.class_312.method_22684(class_312.java:165)
	at org.lwjgl.glfw.GLFWMouseButtonCallbackI.callback(GLFWMouseButtonCallbackI.java:43)
	at org.lwjgl.system.JNI.invokeV(Native Method)
	at org.lwjgl.glfw.GLFW.glfwWaitEventsTimeout(GLFW.java:3474)
	at com.mojang.blaze3d.systems.RenderSystem.limitDisplayFPS(RenderSystem.java:222)
	at net.minecraft.class_310.method_1523(class_310.java:1174)
	at net.minecraft.class_310.method_1514(class_310.java:734)
	at net.minecraft.client.main.Main.main(Main.java:237)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.quiltmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:423)
	at org.quiltmc.loader.impl.launch.knot.Knot.launch(Knot.java:76)
	at org.quiltmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:24)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.multimc.impl.OneSixLauncher.invokeMain(OneSixLauncher.java:104)
	at org.multimc.impl.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:175)
	at org.multimc.impl.OneSixLauncher.launch(OneSixLauncher.java:185)
	at org.multimc.EntryPoint.listen(EntryPoint.java:127)
	at org.multimc.EntryPoint.main(EntryPoint.java:57)

-- Last reload --
Details:
	Reload number: 1
	Reload reason: initial
	Finished: Yes
	Packs: Default, continuity/default, BlockyCraft DEV9, VanillaTweaks, replaymod_lang
Stacktrace:
	at net.minecraft.class_6360.method_36565(class_6360.java:49)
	at net.minecraft.class_310.method_1587(class_310.java:2295)
	at net.minecraft.class_310.method_43589(class_310.java:822)
	at net.minecraft.class_310.method_1514(class_310.java:723)
	at net.minecraft.client.main.Main.main(Main.java:237)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.quiltmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:423)
	at org.quiltmc.loader.impl.launch.knot.Knot.launch(Knot.java:76)
	at org.quiltmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:24)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.multimc.impl.OneSixLauncher.invokeMain(OneSixLauncher.java:104)
	at org.multimc.impl.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:175)
	at org.multimc.impl.OneSixLauncher.launch(OneSixLauncher.java:185)
	at org.multimc.EntryPoint.listen(EntryPoint.java:127)
	at org.multimc.EntryPoint.main(EntryPoint.java:57)

-- System Details --
Details:
	Minecraft Version: 1.19
	Minecraft Version ID: 1.19
	Operating System: Linux (amd64) version 5.10.0-16-amd64
	Java Version: 17.0.1, Flathub
	Java VM Version: OpenJDK 64-Bit Server VM (mixed mode, sharing), Flathub
	Memory: 1429113984 bytes (1362 MiB) / 3498049536 bytes (3336 MiB) up to 6442450944 bytes (6144 MiB)
	CPUs: 12
	Processor Vendor: AuthenticAMD
	Processor Name: AMD Ryzen 5 3600 6-Core Processor
	Identifier: AuthenticAMD Family 23 Model 113 Stepping 0
	Microarchitecture: Zen 2
	Frequency (GHz): -0,00
	Number of physical packages: 1
	Number of physical CPUs: 6
	Number of logical CPUs: 12
	Graphics card #0 name: Ellesmere [Radeon RX 470/480/570/570X/580/580X/590]
	Graphics card #0 vendor: Advanced Micro Devices, Inc. [AMD/ATI] (0x1002)
	Graphics card #0 VRAM (MB): 258,00
	Graphics card #0 deviceId: 0x67df
	Graphics card #0 versionInfo: unknown
	Virtual memory max (MB): 25627,59
	Virtual memory used (MB): 9482,50
	Swap memory total (MB): 17619,13
	Swap memory used (MB): 0,00
	JVM Flags: 2 total; -Xms512m -Xmx6144m
	Loaded Shaderpack: ComplementaryShaders_v4.3.3
		Profile: Custom (+15 options changed by user)
	Quilted Fabric API: !! WARNING !! This instance is using Fabric API modules re-implemented by QSL. If the issue comes from Quilted Fabric API, DO NOT report to Fabric; report them to Quilt instead!
	Quilt Mods: 
		autoclicker-fabric: Auto Clicker 1.19-1.4.0-build.17
		cem: Custom Entity Models 0.7.1
		citresewn: CIT Resewn 1.1.1+1.19
		citresewn-defaults: CIT Resewn: Defaults 1.1.1+1.19
		com_github_llamalad7_mixinextras: MixinExtras 0.0.11
		completeconfig-base: completeconfig-base 2.0.0-beta.3
		completeconfig-gui-cloth: completeconfig-gui-cloth 2.0.0-beta.3
		continuity: Continuity 2.0.0+1.19
		indium: Indium 1.0.6+mc1.19
		iris: Iris 1.2.5
		itemscroller: Item Scroller 0.16.0
		java: OpenJDK 64-Bit Server VM 17
		lanserverproperties: Lan Server Properties 1.9
		libzoomer: LibZoomer 0.5.0+1.19
		litematica: Litematica 0.11.3
		malilib: MaLiLib 0.12.1
		minecraft: Minecraft 1.19
		minihud: MiniHUD 0.22.0
		no-telemetry: No Telemetry 1.4.0
		nochatreports: No Chat Reports 1.19-v1.2.3
		ok_zoomer: Ok Zoomer 5.0.0-beta.9+1.19
		org_anarres_jcpp: jcpp 1.4.14
		org_joml_joml: joml 1.10.4
		quilt_advancement: Quilt Advancement API 2.0.0-beta.14+1.19
		quilt_base: Quilt Base API 2.0.0-beta.14+1.19
		quilt_biome: Quilt Biome API 2.0.0-beta.14+1.19
		quilt_block_entity: Quilt Block Entity API 2.0.0-beta.14+1.19
		quilt_block_extensions: Quilt Block Extensions API 2.0.0-beta.14+1.19
		quilt_client_command: Quilt Client Command API 2.0.0-beta.14+1.19
		quilt_command: Quilt Command API 2.0.0-beta.14+1.19
		quilt_crash_info: Quilt Crash Info 2.0.0-beta.14+1.19
		quilt_dimension: Quilt Dimension API 2.0.0-beta.14+1.19
		quilt_item_content_registry: Quilt Item Content Registry API 2.0.0-beta.14+1.19
		quilt_item_group: Quilt Item Group API 2.0.0-beta.14+1.19
		quilt_item_setting: Quilt Item Setting API 2.0.0-beta.14+1.19
		quilt_lifecycle_events: Quilt Lifecycle Events 2.0.0-beta.14+1.19
		quilt_loader: Quilt Loader 0.17.0
		quilt_networking: Quilt Networking 2.0.0-beta.14+1.19
		quilt_recipe: Quilt Recipe API 2.0.0-beta.14+1.19
		quilt_registry: Quilt Registry API 2.0.0-beta.14+1.19
		quilt_registry_entry_attachments: Quilt Registry Entry Attachments 2.0.0-beta.14+1.19
		quilt_resource_loader: Quilt Resource Loader 2.0.0-beta.14+1.19
		quilt_screen: Quilt Screen API 2.0.0-beta.14+1.19
		quilt_tags: Quilt Tags API 2.0.0-beta.14+1.19
		quilt_tooltip: Quilt Tooltip API 2.0.0-beta.14+1.19
		quilted_fabric_api: Quilted Fabric API 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_api_base: Quilted Fabric API Base 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_api_lookup_api_v1: Quilted Fabric API Lookup API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_biome_api_v1: Quilted Fabric Biome API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_blockrenderlayer_v1: Quilted Fabric BlockRenderLayer Registration (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_command_api_v1: Quilted Fabric Command API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_command_api_v2: Quilted Fabric Command API (v2) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_commands_v0: Quilted Fabric Commands (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_containers_v0: Quilted Fabric Containers (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_content_registries_v0: Quilted Fabric Content Registries (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_convention_tags_api_v1: Quilted Fabric Convention Tags API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_crash_report_info_v1: Quilted Fabric Crash Report Info (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_data_generation_api_v1: Quilted Fabric Data Generation API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_dimensions_v1: Quilted Fabric Dimensions API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_entity_events_v1: Quilted Fabric Entity Events (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_events_interaction_v0: Quilted Fabric Events Interaction (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_events_lifecycle_v0: Quilted Fabric Events Lifecycle (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_game_rule_api_v1: Quilted Fabric Game Rule API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_item_api_v1: Quilted Fabric Item API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_item_groups_v0: Quilted Fabric Item Groups (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_key_binding_api_v1: Quilted Fabric Key Binding API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_keybindings_v0: Quilted Fabric Key Bindings (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_lifecycle_events_v1: Quilted Fabric Lifecycle Events (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_loot_api_v2: Quilted Fabric Loot API (v2) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_loot_tables_v1: Quilted Fabric Loot Tables (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_message_api_v1: Quilted Fabric Message API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_mining_level_api_v1: Quilted Fabric Mining Level API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_models_v0: Quilted Fabric Models (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_networking_api_v1: Quilted Fabric Networking API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_networking_v0: Quilted Fabric Networking (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_object_builder_api_v1: Quilted Fabric Object Builder API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_particles_v1: Quilted Fabric Particles (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_registry_sync_v0: Quilted Fabric Registry Sync (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_renderer_api_v1: Quilted Fabric Renderer API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_renderer_indigo: Quilted Fabric Renderer - Indigo 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_renderer_registries_v1: Quilted Fabric Renderer Registries (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_rendering_data_attachment_v1: Quilted Fabric Rendering Data Attachment (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_rendering_fluids_v1: Quilted Fabric Rendering Fluids (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_rendering_v0: Quilted Fabric Rendering (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_rendering_v1: Quilted Fabric Rendering (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_resource_conditions_api_v1: Quilted Fabric Resource Conditions API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_resource_loader_v0: Quilted Fabric Resource Loader (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_screen_api_v1: Quilted Fabric Screen API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_screen_handler_api_v1: Quilted Fabric Screen Handler API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_textures_v0: Quilted Fabric Textures (v0) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_transfer_api_v1: Quilted Fabric Transfer API (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		quilted_fabric_transitive_access_wideners_v1: Quilted Fabric Transitive Access Wideners (v1) 3.0.0-alpha.3+0.57.2-1.19.1
		replaymod: Replay Mod 1.19-2.6.6
		sodium: Sodium 0.4.2+build.16
		spruceui: SpruceUI 4.0.0+1.19
		tweakeroo: Tweakeroo 0.13.3
		worldedit: WorldEdit 7.2.11-beta-01+6200-0877589
	Launched Version: 1.19
	Backend library: LWJGL version 3.3.1 build 7
	Backend API: Radeon RX 580 Series (POLARIS10, DRM 3.40.0, 5.10.0-16-amd64, LLVM 12.0.1) GL version 4.6 (Core Profile) Mesa 21.3.8 (git-813ee839be), AMD
	Window size: 1920x1080
	GL Caps: Using framebuffer using OpenGL 3.2
	GL debug messages: 
	Using VBOs: Yes
	Is Modded: Definitely; Client brand changed to 'quilt'
	Type: Client (map_client.txt)
	Graphics mode: fast
	Resource Packs: vanilla, continuity/default, file/BlockyCraft DEV9 (incompatible), file/VanillaTweaks (incompatible)
	Current Language: English (US)
	CPU: 12x AMD Ryzen 5 3600 6-Core Processor

[Loader Plugins] Allow loader plugins to define version schemes

Pretty self-explanatory, once loader plugins are a thing, it would be nice if they could define new version schemes rather than forcing everyone to use semver as some people use either their own version schemes, or use other standards.

Saw that in the QMJ spec the loader should crash on non-semver versions, this seems to be a bit of a pointless holy war and would only cause trouble to mod developers in a way.

Dependencies not declared in pom on Maven

Loader doesn't declare its dependencies in the pom metadata. This means that to depend on it, you have to special-case pulling them from the json instead. This is bad.

Explore zip files within the mods folder

A feature I would love to see is allowing for users to place plain zip files full of mods into the mod folder. It is just a much simpler approach than the curseforge modpack for the user creating the pack.

Many fabric servers ive been on and even one i had myself just post zip file full of mods to extract into the mods folder cause its just easiest. Ive seen many number of times users have issue with extracting zip files or just not being technical and not understanding they need to extract. Ive seen users just place a zip into the mods folder and get confused why it does not work. Or to extract it in the folder but leave the mods within the extracted folder. Would just alleviate one of the infinite number of issues less technical players end up getting stuck on.

I have no idea how hard this would be to implement. I suggest it as a very easy feature for less technical users (and still technical users I would love to just stick a zip file in and be done or if mods update just replace the zip).

Load mods from subfolders

This will allow modpack makers and users to organize their mods however they want, e.g. put optimization mods into their own subfolder like mods/optimizations/...

This is different from #15 as it just removes current limitation when searching for mods.

Currently Fabric/Quilt loader uses 1 for max depth, I suggest change it to Integer.MAX_VALUE in this line:

Files.walkFileTree(this.path, EnumSet.of(FileVisitOption.FOLLOW_LINKS), 1, new SimpleFileVisitor<Path>() {

Environment stripping improvements - Lambda stripping

Sided lambdas have been quite terrible to modders, every month at least one modder falls under its wrath.

But what is actually the issue?

Let me pull up a very simple example code:

@Environment(EnvType.CLIENT)
public void hello() {
    this.hi(client -> client.player.sendMessage(new LiteralText("Hi!"), false));
}

@Environment(EnvType.CLIENT)
public void hi(ClientConsumer toDo) {
    toDo.consume(MinecraftClient.getInstance());
}

@Environment(EnvType.CLIENT)
public interface ClientConsumer {
    void consume(MinecraftClient client);
}

And let's consider this is in a common class, when loaded on a dedicated server 2 methods will be stripped: hello and hi.
BUT WAIT! There isn't just 2 methods, there's 3! The lambda is another method too, but wait, it doesn't have the annotation, meaning it won't get stripped.

When loading the class, the server will crash due to ClientConsumer not existing, which will be quite unintuitive to modders unaware of this specific behavior.

The loader should strip lambda methods that are generated from a stripped method, it's not trivial but it would resolve a lot of seemingly "random" crashes.

Now there's the argument of "you should not use sided methods, you should separate your client code"! Which I partially agree, in some cases separating a feature to the opposite part of the codebase and have all the remaining code in another part will make understanding and maintaining the feature more difficult, sided methods are very practical in that case, they should not be the "always" go-to, but they should not be straight out rejected from designs.
Fixing this will make codebases significantly more stable when those kind of methods are involved.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.