Skip to content

Latest commit

 

History

History
179 lines (147 loc) · 13.6 KB

CHANGELOG.md

File metadata and controls

179 lines (147 loc) · 13.6 KB

Running changelog document, will be added to as I commit things.

Next version: 2.5 (agency.highlysuspect:voldeloom:2.5-SNAPSHOT)

No changes yet.

Roadmap

  • Supply required arguments to launch 1.6 and 1.7 instead of requiring you to customize the run config
  • Fix 1.2.5 and make it "nice" (split sourcesets etc)
  • Read data from the Exceptor, maybe apply parameter names

2.4 (agency.highlysuspect:voldeloom:2.4)

Critical bugfixes

  • Very important fix: Fix reobfuscation of method calls that mention a class from Minecraft in their parameter list or return type.
    • Which is, frankly, "most of them".
    • Bug only cropped up if you didn't have srgsAsFallback = true. This option has been removed and is now effectively always true.
  • Fix the Forge-added class amq$1/net/minecraft/src/Block$1 getting put in the wrong spot (for like, the millionth time)
    • Fixes several IllegalAccessError crashes in the dev workspace, e.g. a canSustainPlant-related crash on 1.4.7

Breaking changes

  • srgsAsFallback as a configurable option is removed. It is now effectively set to true.
    • Proguarded names can now only show up in your dev workspace if they are not mentioned in your joined.srg (which'd probably mean you're using mappings for the wrong version).
    • Supporting both true and false turned out to be very complicated and buggy for little benefit. false mode wasn't working properly anyway; it still dumped SRG names into your workspace - and did you know that enum values weren't given MCP names? A correct implementation of srgsAsFallback = false stripped all enum value names. That's no good.
    • If your mod was calling methods or accessing fields with their proguarded names, you'll need to update it to use the func_ or field_-prefixed names.
  • The run dir is now correctly resolved against the current subproject project directory, instead of the root project directory.
    • Sorry about that. If you were using voldeloom in a subproject, you can probably remove your custom runDir now.

Changes

  • Bumped internal mappings version. Expect a slightly longer import time after doing this update.

2.3 (agency.highlysuspect:voldeloom:2.3)

Breaking changes

Some volde.layered method names are different, sorry:

  • baseZip becomes importBaseZip
  • unmapClass becomes removeClass (single String argument) / removeClasses (Collection<String> argument)

Changes

  • Rewrote basically all of the mappings guts
    • I researched how MCP actually works, instead of simply throwing tiny-remapper at everything
    • tiny-remapper is used where MCP uses RetroGuard/SpecialSource, and an in-house NaiveRenamer is used where MCP uses "regular expressions over the source code"
      • The main difference is that NaiveRenamer also operates over Java bytecode as well as source code, but uses the same "just find-and-replace" algorithm that ignores things like method descriptors.
      • deobf: tiny-remapper is used for the initial deobfuscation to SRG names, NaiveRenamer takes it the rest of the way to named
      • reobf: the SRG is extended to cover MCP names instead of just SRGs (mirroring a find-replace step in MCP), inverted, and tiny-remapper is used
    • Side effect: maybe improves --refresh-dependencies performance a bit, NaiveRenamer is very fast (because it doesn't do much)
    • Deleted lots of tiny-remapper stuff that fell unused due to this change
  • Reobf-to-srg also works in the new mapping system
    • release 1.5/1.6/1.7 mods again! maybe! (test them!!!)
  • tiny-remapper output is postprocessed to remove things not compatible with ASM api level 4, like the parameter-name table
  • .srg parser can also handle the more compact MCPBot .csrg format too
  • Fixed cache soundness issues
    • Most files in your Gradle cache will now end in an 8-character hash of some metadata about their provenance. For example, version_manifest_{HASH}.json's filename now carries the URL that the manifest was downloaded from (if using the customManifestUrl feature).
    • The metadata trickles into files derived from it, so minecraft-1.4.7-client-{HASH}.jar's filename includes the same information, and so does the binpatched client, and the merged jar...
    • This fixes longstanding cache-coherency bugs, where changing the configuration of a file at the top of the tree would leave stale cache entries downstream from it, requiring a --refresh-dependencies to fix.
    • This also removes the need to store files in the per-project Gradle cache. Even if you use customized mappings in your project, it will not clash with other files in the cache.
    • I should probably expose the actual, not-hashed metadata somewhere
  • Linemapping now works, fixing stacktrace line numbers and debugger breakpoints
    • didn't understand what it was before 😅
    • After running genSources, might need to refresh your gradle to get your IDE to use the linemapped jar.
  • fixed 1.7.10 asset loading
  • Small performance/memory improvements
    • Forge binpatches only parsed when it's necessary to binpatch a jar
    • Reduced the amount of Files.readAllBytes calls, instead reading the files in chunks
    • Data structure used for packages.csv parsing is more memory-efficient
    • Mapping-related files are extracted from the mappings archive in a single pass
  • New interfaces for volde.layered:
    • importBaseZip imports (c)srgs, packages.csv, fields/methods csvs
    • importClasses imports (c)srgs/packages only (from a zip)
    • importFieldsMethods imports fields/methods csvs only (from a zip)
    • removeClasses deletes class mappings
    • importMCPBot is a convenience to import mappings from an MCPBot mirror service
      • try importMCPBot("https://mcpbot.unascribed.com/", minecraftVersion, "stable", "12-1.7.10")!
    • if that's not enough, modify lets you directly interface with the mcp mappings builder
      • I'm not really sure what people need/want out of layered mappings so if there's something i'm missing, let me know

2.2 (agency.highlysuspect:voldeloom:2.2)

Remapping is in a bit of a weird state, but i'm about to do massive breaking changes to the system, so this is a release cut in haste

New

  • Preliminary support for Gradle 8
    • "preliminary" as in "I don't know if it's super busted, but at least the basics work"
  • The 1.3.2, 1.6.4, and 1.7.10 development environments work
    • 1.3.2 is ok but there is a wall of warnings about Minecraft being in the net.minecraft.src namespace, i think they're harmless(?)
    • 1.6.4 i'm a bit unsure about (just because binpatches are pretty weird to deal with) but it looks ok
    • 1.7.10 has janky unfinished MCP mappings because we are entering the MCPBot era now, and it can't read MCPBot exports just yet
  • Preliminary "layered mappings system"
    • Access with mappings volde.layered { ... }.
    • Available commands:
      • baseZip(Object), which parses the mappings through... the exact same mappings parsing system used before (look i said it was preliminary)
      • unmapClass(String) and unmapClass(Collection<String>), which remove class mappings
        • functionally replaces hackHackHackDontMapTheseClasses
    • conceptually, a blank MCP mappings set is created, then each command visits it top-to-bottom
    • commands that take Object can accept:
      • File or Path arguments
      • Dependency objects from gradle
      • Strings:
        • if it "looks like a URL" (starts with http:/ or https:/), it will be automatically downloaded (to (project dir)/.gradle/voldeloom-cache/layered-mappings/downloads)
        • if not, it will be treated as a maven coordinate
    • computed mappings go in (project dir)/.gradle/voldeloom-cache/layered-mappings/(hash).zip, where hash is computed from the settings on each layer (ideally you shouldn't have to manually cachebust mappings when messing around with the settings)

Changes

  • Dependency on Stitch removed
    • It was used only for JarMerger, and i now use a modified version (that doesn't need to "remap annotations" from Environment to SideOnly)
  • Removed remapSources and migrateMappings (and removed their dependencies, Mercury and lorenz-tiny). They might return later, but they're a maintenance burden while i prepare for the new mappings system, and there are no other mappings to migrate to other than MCP lol
  • Updated fabricmc fernflower.
    • This version can use multiple CPU cores to make it even faster. I didnt implement this, blame covers i think.
    • (i made it default to processor count minus 1, so u can actually use your computer in the mean time lmao)
  • The genSourcesDecompile and genSourcesRemapLineNumbers plumbing tasks have been removed and merged into the regular genSources task
    • this alone somehow melted away like 5 zillion lines of complexity in afterEvaluate

2.1 (agency.highlysuspect:voldeloom:2.1)

Breaking changes

  • Changed the Gradle extension's name from minecraft { } to volde { }.
    • Preparation for adding some more free-functions to the extension (it'd be weird if you referred to them with minecraft)
    • Possibly preparation for "getting out of the way of other extensions", so you can use it and another Minecraft plugin in the same project? Maybe?
    • Echoes what Loom did - the name is more accurate
  • Moved srgsAsFallback.
    • Replace it with forgeCapabilities { srgsAsFallback = true }.
  • Adjusted file paths to some intermediate products, to be more consistent:
    • Forge's libraries are downloaded to a folder containing the complete Forge artifact name, not just the version
    • Mappings have one canonical name, which also contains the complete mappings artifact name (instead of ad-hoc gluing the artifact id and version together in a slightly different way every time)
    • Mapped Minecrafts, as well as -sources and the like, are in (cache dir)/mapped/(mappings name)/(...).jar.
    • (idk if this is breaking) - Mapped Minecraft is added to the project using a file dependency instead of a flatDir dependency.
    • (workspace-breaking) - You may need to delete files using the old naming convention from ./run/coremods.
  • The hack that erased some classes from the mappings so Ears 1.4.7 would work in deobf is removed
    • Replaced with hackHackHackDontMapTheseClasses property inside volde
    • As the name suggests ™️ i will remove it later when i get the good mappings system up

New

  • Small system for "changing behavior of the plugin based on what era of Forge you're using".
    • Configure this with volde { forgeCapabilities { /* ... */ } }.
    • Set distributionNamingScheme to pick which naming scheme your mods are remapped to.
    • Set srgsAsFallback to assert that this Forge version maps everything to SRG names; don't set it to assert that unmapped names show through as proguarded names.
    • If you don't set them, they will be guessed from the Minecraft version and Forge version:
      • distributionNamingScheme is intermediary since 1.5 and official before it
      • srgsAsFallback is false since 1.5 and true before it
  • Rudimentary custom access transformers.
    • Specify dependencies in the accessTransformers configuration, e.g. accessTransformers files("./src/main/resources/my_ats.cfg").
    • (currently you will need to refresh dependencies to force-update artifacts derived from it... sorry)
    • The plugin will not create a Forge coremod for you that will cause ATs to be found in production - you must do this yourself.
    • The plugin will not retrieve ATs transitively from mod dependencies.
      • Forge has them configurable through Java in the coremod, so it's impossible in the general case.
      • Just paste them into the project. (Because I don't try to auto generate a coremod, you don't have to worry about them showing up in the built jar)
  • Binpatches.
    • 1.6.4 stopped being a jarmod, instead distributing patches inside a binpatches.pack.lzma file.
    • Now, if this file exists, Voldeloom is able to parse the file and apply the binary patches.
    • You can't quite launch 1.6 yet, but it's a start.

Other changes

  • Rewrote how genSources interacts with Fernflower.
    • It does not attempt to interact with the Gradle ProgressLogger system anymore, because it didn't appear to be working. This also removed a lot of logging being swallowed by the progress logger.
    • Another optimization (rather brazenly using NIO for reading classes from the jar) improved the runtime a fair bit on my computer. This is a tinge unsafe, so -Pvoldeloom.saferFernflower will toggle back to the old ZipFile/ZipEntry system.
  • Reduced retained size of in-memory MCP mappings by about 50%.
    • You can also reduce the retained size of the in-memory Tiny mappings tree with -Pvoldeloom.lowMemory, but it's a bit slow and unsafe, whcih is why it's behind a flag. Might be useful if you're very memory constrained and want to squeeze out every drop.
  • Redid the whole "dependency provider" system to be less garbage.
    • Names of providers have changed. The general shape of log output also changed, a bit less spammy, but I will still spam you with file paths.
  • The project-wide offline and refreshDependencies flags were moved from Constants into the extension:
    • Set the voldeloom.offline system property, project property, pass --offline to Gradle, or configure offline in the extension to configure offline mode
    • Set the voldeloom.refreshDependencies system property, project property, pass --refresh-dependencies to Gradle, or configure refreshDependencies in the extension to configure refreshDependencies mode
    • These are different from the global Gradle flags so that you can force Voldeloom to re-remap its derived artifacts, but not cause Gradle to do a bunch of redownloading too

2.0 (agency.highlysuspect:voldeloom:2.0)

Initial release of my fork.