Customizable Player Models

## Customizable Player Models
Create a custom avatar using the built-in editor.
![Creating a hat in the editor](https://media.forgecdn.net/attachments/337/167/2021-01-30_12.png)
The models are stored in unused space on your Minecraft Skin, or as a Gist on GitHub.
Upload the exported image file as your skin to load the custom model.
Browse uploaded models on the [Models Website](https://cpmmodels.tom5454.com/).

The additional parts can have custom textures, higher resolution skins can be used (Steve skin from [Soartex Fanver – Vanilla](https://www.curseforge.com/minecraft/texture-packs/soartex-fanver-vanilla))
Parts of the normal player model can be hidden or moved around.
![Examples](https://raw.githubusercontent.com/tom5454/CustomPlayerModels/master/examples.png)
You can even make parts of your skin “glow” like a glow squid.
![Glow](https://media.forgecdn.net/attachments/337/173/2021-01-30_12.png)
Plugin for Bukkit/Spigot servers for changing skins ingame (not required): [https://github.com/tom5454/CustomPlayerModels/releases](https://github.com/tom5454/CustomPlayerModels/releases)

CME is Bad

# Abstract
Players and modpack developers sometimes find the game crashed with `ConcurrentModificationExceptions` (CME) and `IndexOutOfBoundsExceptions` (IOOBE), which only give stacktrace of current thread and are hard to trace which mod causes them. Here’s one of the crashes which is caused by SimpleReloadInstance in 1.20.1 Forge:

![CME from SimpleReloadInstance](https://cdn.modrinth.com/data/cached_images/877cd1d1976b1969fffb619bdbd62b13244e02c8.png)

So this is what the mod is developed for. Players who install this mod and add javaagent to JVM Argument correctly will receive a full log for modification history of a certain collection:

![log of this mod](https://cdn.modrinth.com/data/cached_images/d3d00f23694f96591fc77d8387540d7ce29c078a.png)

# Usage
First, add this jar to mods folder.

Second, edit your Java Virtual Machine Argument in your launcher. Add `-javaagent:mods/CMESuckMyDuck-.jar=;;;`.

Finally, run the game, play and wait until the crash happens.

# Usage for Other Java Projects
This mod can not only be used for Minecraft debugging, but also be utilized to debug other java projects. Similar to Minecraft. The only different step is that you should add gson and asm jar to classpath (`-cp`) before javaagent, and add our `CMESuckMyDuck-.jar` to classpath after javaagent.

# Arguments
##
A full name of the class, which has a container that you would like to monitor. Use “ instead of `.` (a.k.a. the internal name of class).

##
A field name of the container in target class, which you would like to monitor. For Forge, use SRG name. For Fabric, use intermediary name. For NeoForge, use official name.

##
Currently, we only support three containers: `List`, `Set`, `Map`. This argument indicates the type of monitored container.

## `static` or `nonstatic`. This argument indicates the container is a static field or non-static field.

# How to get and
Let’s start with an example.

First, take a look at the stacktrace of CME/IOOBE:

![Replace this with a description](https://cdn.modrinth.com/data/cached_images/f4908f0fb44bc480d0fba4a1714bf9dbca4b8043.png)

Second, read the source code of SoundEngine and confirm which container is facing this issue:

![Replace this with a description](https://cdn.modrinth.com/data/cached_images/26c2eefabbde9a9ce3aea62dbfdf1012d736c16d.png)

Now we know we should monitor map `field_217942_m` (`instanceToChannel` in `SoundEngine`). Keep going.

Third, install this mod, and add “`-javaagent:mods/CMESuckMyDuck-1.0.0.jar=net/minecraft/client/audio/SoundEngine;field_217942_m;Map;nonstatic`” to Java Virtual Machine Argument. Relaunch the game and wait for the next crash.

Finally, open `CMESuckMyDuck.log` file and you will see which thread and which mod has concurrently modified the container.

# Examples (JVM Arguments)
## ConcurrentModificationException from SoundEngine in Forge 1.16.5 Environment
`-javaagent:mods/CMESuckMyDuck-1.0.0.jar=net/minecraft/client/audio/SoundEngine;field_217942_m;Map;nonstatic`

## ConcurrentModificationException from PotionBrewing in Forge 1.20.1 Environment
`-javaagent:mods/CMESuckMyDuck-1.0.0.jar=net/minecraft/world/item/alchemy/PotionBrewing;f_43494_;List;static`

## ArrayIndexOutOfBoundsException from Zeta mod
`-javaagent:CMESuckMyDuck-1.0.0.jar=org/violetmoon/zetaimplforge/event/ForgeZetaEventBus;convertedHandlers;Map;nonstatic`

# Other options
## Log Level
Use system property `-Dcme_suck_my_duck.log_level=` to set custom log level.

Default 1, which means no debug message will be logged.

Users can set it to 0 to output debug message, which is not recommended – query functions like Map#get, Set#containsAll will also be logged when set to 0, and make the file very very long.

## ASM API Version (v1.0.2+)

In order to maintain compatibility with the latest version of Minecraft, this mod is compiled with asm version 9.7. For older versions of Minecraft (such as 1.12.2), API level operations such as ASM_9 cannot be applied, so players need to use `-Dcme_suck_my_duck.asm_api_version=` to modify the ASM API version compatibility. For example, game version 1.12.2: `-Dcme_suck_my_duck.asm_api_version=5`.

## File Max Entries (v1.0.3+)

Since we notice that when crash happens, the last few operations in the log are much more important than the previous ones. So our mod adopts a paging strategy after v1.0.3, and only the last two pages are retained at the end. The number of logs output on each page (that is, the number of operation call stacks) is fixed, and the default value is 500. Players can use `-Dcme_suck_my_duck.file_max_entries=` to modify the maximum number of elements on the page.

## Whitelist of Constructor (v1.0.3+)

Sometimes a container in a certain class is used in many places (eg. CompoundTag#tags). Directly using this mod will cause the log to be too long or the valid content to be replaced by subsequent operations. Therefore, players can specify an additional constructor whitelist to monitor the corresponding container in the corresponding class of a specific module. The default is empty, that is, there is no whitelist. Players can use `-Dcme_suck_my_duck.whitelist_constructor_stacktrace=` to specify it. If any line in the stack trace where the container is constructed includes the content of the whitelist string, the container will be monitored – otherwise, the container will not be monitored, which greatly simplifies the log output information.

## Transform to Thread Safe (v1.0.4+)
Use system property `-Dcme_suck_my_duck.transform_to_thread_safe=true` to transform the field into a thread-safe container.

This is NOT recommended unless you like slowness and don’t want to fix the problem.

## Inject method (v1.0.4+)
Use system property `-Dcme_suck_my_duck.inject_method=true` to switch to inject mode.

If set, you should use `-javaagent:CMESuckMyDuck-.jar=;` and whenever this method is called, you will receive a stack trace in log files.

## Ignore threads (v1.0.5+)
Use system property `-Dcme_suck_my_duck.ignore_threads=;;;…` to ignore some thread that is expected to modify the given container (or call the given method). For example, `-Dcme_suck_my_duck.ignore_threads=”Server thread”`.

## Stop logging early (v1.0.7+)
Use system property `-Dcme_suck_my_duck.stop_logging_if_exception_created=false` to stop logging if critical error occurs.

## Trace ID Updater (v1.0.8+)
Use system property `-Dcme_suck_my_duck.trace_id_updater=;` to update trace ID when calling the given method. This might be useful in inject mode.

## Monitoring Local Variables (v1.1.0+)
Use system property `-Dcme_suck_my_duck.local_var_index=` to monitor local variable at given index in the given method.

If set, you should use `-javaagent:CMESuckMyDuck-.jar=;;`. By the way, the index can be reused by different local variables. So you might have to use `-Dcme_suck_my_duck.match_local_index=` to specify the ordinal of ASTORE operation to indicate which local variable to monitor.

# Conclusion
I like eating peking duck. It’s so delicious!

![Photo by Polina Tankilevitch: https://www.pexels.com/photo/close-up-photo-of-savory-peking-duck-dish-on-a-ceramic-bowl-5848604/](https://cdn.modrinth.com/data/cached_images/d4ce4bba6f0bef8780cd5843390bf3358dd9b55b_0.webp)

Agenta

# Agenta

A authserver and skin fix for legacy versions of minecraft.

# Compatibility

Requires Java 7. (In theory this can be built for Java 5, but I lack the build tools required for that.)
If running this on Java 12 and newer, please add the following JVM argument: `–add-exports java.base/sun.net.www.protocol.http=ALL-UNNAMED`

1. As a mod: The same Jar will run on forge, bukkit and Risugami’s modloader for Minecaft versions Alpha 1.0.4 to Minecraft release 1.7.10 (These are merely the versions I tested)
2. As a JavaAgent: Add the following JVM argument: `-javaagent:{path}/agent.jar` (replace path with the location of the agent.jar)
3. Inline/static: In this setup, Agenta is essentially taking over the role of Launching minecraft. Add the following JVM argument and change out `{mainClass}` as needed depending on which minecraft version you are launching: `-Dagenta.main.class={mainClass}`
4. As a Bukkit plugin (Tested with bukkit for Minecraft Beta 1.2_01)

# JVM/Congig settings

Non of these are needed to launch Agenta. The available contexts are
“*” => ALL
“static” => When Agenta is launched as the main class with the expectation of chainloading another class manually.
“config” => Only appears in the config file.

Context property Argument description
* agenta.assets.fml -Dagenta.assets.fml={value} A link to an archive Agenta should forward legacy forge download requests to
* agenta.assets.index -Dagenta.assets.index={value} The URL for the asset index Agenta should use as a base
* agenta.assets.routing -Dagenta.assets.routing=true Should agenta reroute requests the mojang’s asset servers? (default: “true”)
* agenta.assets.url -Dagenta.assets.url={value} The URL for the resource server Agenta should pull assets from
* agenta.prt.color -Dagenta.prt.color=false Pass the value ‘false’ to disable colour printing.
* agenta.prt.debug -Dagenta.prt.debug=false Should agenta show debug messages?
* agenta.save.file -Dagenta.save.file=saves.json When handling saving for certain versions of old Minecraft that relied on long dead mojang endpoints, what should agenta call the save file? (default: “saves.json”)
* agenta.skin.resize -Dagenta.skin.resize=true Should agenta try to resize skins from 64×64 to 64×32 for better compatibility? (default: “true”)
* agenta.skin.merge -Dagenta.skin.merge=true Should Agenta take multi layered skins and attempt to flatten the layers down? (default: “true”)
* agenta.skin.cache -Dagenta.skin.cache=true Should agenta cache skin lookups? (default: “true”)
config agenta.config.version The version of agenta that generated a set config file. Will be used to detect if agenta should upgrade a set config file
static agenta.main.class -Dagenta.main.class={value} The class Agenta should try to load next when running in static/inline mode

# Fixes

– Skin support for pre 1.7.10 versions
– Cape support for pre 1.7.10 versions
– Sound for versions of the game that predate 1.6
– World savings for certain pre-alpha builds (experimental)
– Forge 1.5.2 being unable to fetch it’s library files (experimental)

# Note

– The same jar will work for almost every version of minecraft that predates Release 1.8
– Any miscellaneous fabric based modloader _should_ be supported.
– NilLoader can load Agenta. (Agenta doesn’t meet the criteria of a [NilLoader mod](https://git.sleeping.town/Nil/NilLoader#:~:text=A%20NilLoader%20mod%20includes%20a%20complete%20copy%20of%20NilLoader%20within%20itself))
– Some ancient versions of Forge/modloader may require you to load Agenta as a jar mod.
– LiteLoader inforces compatibility checks and so can never be fully supported