# Handoff: client source refactor (packages + class names) ## Current state The catastrophic part is done. All 400 obfuscated helper classes have been moved out of the root package into 18 meaningful sub-packages, and the source tree compiles and builds. - Source tree: `project/client/src/main/java/dev/zprestige/prestige` - 543 Java classes total: - 21 already-named API classes intentionally left at the root (`Module`, `Setting`, `SettingHolder`, the 9 setting types, `EventBus`, `Category`, `ModuleManager`, `MenuModule`, `Gamemode`, `Native`, `Constants`, `Subscribe`, `ListenerEntry`) - `client/Prestige` - 121 modules under `module//` - 400 renamed helpers under `event/ hud/ render/ data/ type/ mixin/ world/ math/ combat/ inventory/ network/ reflect/ gui/ config/ util/ social/ annotation/ input/` - Zero obfuscated class names remain at the root. Verified by listing the renamed jar: the root contains only the 21 API classes. - `./gradlew.bat build -PwithClient=true` succeeds (`BUILD SUCCESSFUL`, one deprecation warning about `ThreadDeath`). Artifacts: `project/build/libs/prestige-0.1.0.jar`, `prestige-0.1.0-sources.jar`. - **Boot has not been tested yet.** That is the first remaining step. ## What was changed ### New files (`project/client/tools/`) - `gen_class_mapping.py` — generates `docs/classmap.tsv` (400 `C old new` rows) from the decompiled source by classifying superclass/interface/mixin target/HUD description/shader path/record components/enum constants/ module references. - `merge_mapping.py` — merges `docs/mapping.tsv` + `docs/classmap.tsv` into `work/rename.map.tsv`, refusing duplicate owners. - `clsmapping.py` — shared lookup used by the fixers: - `Mapping(srcdir).path(old_source_name)` -> real path after renames - `Mapping.source_to_new` -> class-token map for source snippets - `rewrite_tokens()` — token rewrite that skips string literals and fully-qualified package paths ### Changed files - `client/tools/rename.sh` - now merges `docs/classmap.tsv` into the mapping before running tiny-remapper and `rename_manifest.py`. - The class map therefore applies to both routes (source regeneration and runtime jar). - `client/tools/fix_reflect.py` - resolves `cU`/`cW`/`EventBus` through `clsmapping` instead of hardcoded root paths - uses the renamed `Event.class` instead of `aH.class` - `client/tools/fix_ctor.py` - constructor-noise regex accepts both `aH.b();` and `Event.b();` - `client/tools/manual_edits.py` - uses `clsmapping.Mapping`; snippets are token-rewritten outside string literals - removed one obsolete `PostShader` edit (the `i_cF` bridge no longer exists) - the restored `TextRenderer` bridge now implements `a_WorldContract` (the method name generated after the class rename) - `client/tools/notry.txt` - `ConfigManager.a(...)Lcom/google/gson/JsonObject;` updated to the new FQN. Without this the config loader fails to decompile again. - `docs/classmap.tsv` — 400 generated class rows (frozen; treat as source of truth). - `docs/classmap_src.tsv` — source-tree name -> new internal name, used by `clsmapping.py` to survive the `_`-suffixed case-collision twins (`cg_` is jar `cg`, `d_` is jar `d`). Also frozen. ### Naming decisions - Events: `event/Event` (base `aH`), 70 `*Event` subclasses. Fieldless events are `TickEvent`, `TickEvent2`, ... - HUD: `hud/HudElement` (base `b4`), names derived from the `super("Name", ...)` string, e.g. `ModuleListElement`, `WatermarkElement`. - Mixins: `mixin/Mixin` from `@CTransformer`, e.g. `MinecraftClientMixin`, `EntityMixin`, `InGameHudMixin`. Duplicate targets get `2`, `3`, `4`. - Shaders: `render/Shader` from the `.frag` path (`AuraOutlineShader`, `ChamsOutlineShader`, ...). - Enums: `type/*` with semantic overrides (`BowMode`, `AnchorState`, `CartState`, `GlPrimitive`, `Easing`, ...). - Records/data: `data/*` (`IntData`, `LongData`, `VecIntData`, ...). - API classes stay at root on purpose. Moving them would require editing hardcoded FQNs in `src/main/java/dev/prestige/ui/bridge/Bootstrap.java` and `Bridge.java`, and gains nothing for this task. ## Important caveats - **Do not blindly re-run `gen_class_mapping.py` on the new tree.** It was written for the pre-refactor tree and reads `client/work/renames.tsv`, which is overwritten by every `build_source.sh` run. The new live tree already has the final names. `docs/classmap.tsv` + `docs/classmap_src.tsv` are the frozen mapping. - `work/renames.tsv` now reflects the *renamed* jar, so its `old -> new` pairs are for collision handling of the post-classmap jar, not the original obfuscated names. - `manual_edits.py` token rewriting deliberately ignores single-letter class tokens (`C`, `I`, `M`, `q`, ...) because method names are also single letters. Do not weaken that filter. - `docs/mapping.tsv` still maps old jar names (`dV`, `d_`, ...) to API/module names. `d_` there is the module `AutoCart`; the enum that the tree calls `d_` is jar class `d` (`type/BowMode`). This collision is handled by `classmap_src.tsv`; do not "fix" it by hand. - Some generated names are functionally consistent but semantically imperfect: `RenderHelperN`, `WorldContract` (this is the text-renderer interface implemented by `TextRenderer`), `RenderContract*`. Renaming them is cosmetic and requires regenerating the decompiled source (method names in these contracts are derived from the class name). - 5 method bodies are still TODO no-ops from the stripping stage. Search for `body lost` / `unresolved ZKM reference` in the tree. - Strings are not restored, and helper **member** names are still obfuscated. Only class/package names changed. ## Next steps (in order) 1. **Boot the source route.** ```powershell cd project .\gradlew.bat runClient -PwithClient=true --console=plain ``` or, for a timed logged run: ```bash cd project/client "C:/Program Files/Git/bin/bash.exe" -lc "bash tools/boot_test.sh 200 -PwithClient=true" ``` Use Git Bash, not the WSL `bash` in PATH (WSL has no `cygpath`/Windows Python). Check `project/run/logs/latest.log` for `[prestige-ui] bridge bound: N modules` (expect 121) and for `ClassNotFoundException` / `NoClassDefFoundError`. The manifest was rewritten (903 setting prop keys), so this primarily validates module + setting binding after the package moves. 2. **Test the runtime jar route.** The class map is applied by `rename.sh`, so the boot jar should contain the same renamed classes: ```bash cd project/client "C:/Program Files/Git/bin/bash.exe" -lc "bash tools/build_runtime.sh" ``` Then boot through the normal launcher path and compare the bridge line with step 1. 3. **Real input test.** Open the ClickGUI, HUD editor, toggle modules, change settings, move HUD elements. This was never tested in this refactor; package moves can expose package-private access that `Widen` masked at bytecode level but that no longer matches after decompilation. 4. **Restore the 5 lost bodies** (currently comments with `TODO(compile)`): `dE.run`, `av.run`, `ca.q`, `cb.q`, `b4.q` in the old names. After renaming, locate with: ```powershell Get-ChildItem client/src/main/java -Recurse -Filter *.java | Select-String -Pattern 'body lost|unresolved ZKM reference' ``` `client/TODO_COMPILE.md` has the original phase notes. 5. **Restore strings / member names** if desired. `gen_mapping.py` is provenance only; add `F`/`M` rows to `docs/mapping.tsv` and regenerate. Do not touch `docs/classmap.tsv` for member work. 6. **Update docs.** `client/TODO_COMPILE.md` and `liberate/HANDOFF_2.md` still describe the pre-refactor tree. Record the new package layout, the classmap files, and the boot result. ## Useful commands / paths - Root: `C:\Users\Tyler\Documents\Shared\prestige\liberate\project` - Regenerate source into `client/work/src_gen` (does not touch live tree): ```bash cd client "C:/Program Files/Git/bin/bash.exe" -lc "bash tools/build_source.sh" ``` - Compile generated tree only: ```bash "C:/Program Files/Git/bin/bash.exe" -lc "cd project/client && bash tools/compile.sh work/src_gen work/javac_final.log" ``` - Rename a jar manually: ```bash "C:/Program Files/Git/bin/bash.exe" -lc "cd project/client && bash tools/rename.sh work/strip1.jar work/test.renamed.jar" ``` - Build from source: `.\gradlew.bat build -PwithClient=true` - Manifest: `project/src/main/resources/prestige_ui/manifest_live.json` - Bridge FQNs (unchanged): `project/src/main/java/dev/prestige/ui/bridge/{Bridge,Bootstrap}.java` - Class map: `project/docs/classmap.tsv`, `project/docs/classmap_src.tsv` - Merge check: `python client/tools/merge_mapping.py docs/mapping.tsv docs/classmap.tsv `