Repository navigation
Bug fixes + 2 new mod menu modules
Switches the Installations tab to mcpe-planet.com, fixes three combat-module defects (settings not saving, and hit registration / aim settings adding input delay), and adds two new PvP modules: Hitboxes and Select Hit.
- Installations source → mcpe-planet.com
McpePlanetSource is added and registered first in SourceRegistry, so it becomes the active source out of the box. mcpedl.org is retained as an alternative — adding a mirror remains the documented two-step process (implement BedrockSource, add to all()), with no change to the UI, download client or import pipeline.
Verified against the live site rather than a hand-written fixture: 12 versions parsed (1.26.60.28/24, 26.51, 26.50) and the full POST download flow resolved end-to-end to a real wp-content/uploads/version/...apk.
2. Module settings not saving
Root cause: configNode() mapped every non-toggle config type to slider_int. Consequences:
The Crystal keybind rendered as a 0–100 slider and wrote a small integer over the stored key code.
The Aim Settings style radio lost its options entirely.
Fixed with schemaTypeFor(), which covers every ConfigType, plus InbuiltModuleProviderTypeTest pinning the mapping (including that a keybind must never collapse to a slider).
While there I found the _desc help strings and all the module scope notes had no consumer in code or layout — they were dead strings. They are now wired into the dialog, including an info node per combat module carrying its scope note. configDescriptionRes is an explicit switch rather than a name lookup, so a renamed key cannot silently bind to an unrelated string.
3. Hit registration / aim settings adding delay
A real bug, and the exact opposite of the module's stated purpose:
BURST_GAP_MS was 16L, just under one 60 Hz frame (16.7 ms). The smoothing filter therefore classified nearly every frame as a new gesture and reseeded constantly.
The reseed zeroed the filter, discarding (1 − smoothing) of each gesture's opening delta.
Both fixed in HitRegistrationMod and AimSettingsMod: window raised to 120 ms, and the filter is seeded with the frame instead of zero, so steady motion passes 1:1 and smoothing only damps frame-to-frame jitter. Tests updated to assert the first frame of a gesture is not attenuated and that 60 Hz frame pacing stays within one burst.
4. New: Hitboxes
Entity boxes plus an aim line. Players additionally get a red critical-hit line and a red best-combo box, both turning blue when aimed at.
HitboxProjector is pure (no Android/game types) and holds all the arithmetic: camera basis, box projection, crit band, combo box, and a crosshair slab test so the blue highlight cannot disagree with the geometry actually drawn. 18 tests.
The tests caught a real bug: Camera.forward() used the naive spherical form (sin yaw, …), which is counter-clockwise, while the documented Minecraft convention is clockwise from +Z. That would have mirrored every projected box horizontally once a real feed supplied yaw. Fixed, with new tests pinning the up vector too.
HitboxMod.EntitySource is the game-data seam. With no provider nothing is drawn — an invented box is worse than no box, because the player would aim at it.
The overlay is FLAG_NOT_TOUCHABLE and non-draggable, since boxes are world-positioned and the whole screen is the canvas.
- New: Select Hit
A small top-centre green/red pill (96×26 dp, deliberately clear of the crosshair and hotbar) showing when the next hit will land, with a combo count and a slim progress bar.
HitTimingSolver is pure; 13 tests. A click inside the window must not advance the combo or push the window out — counting a discarded click would make the indicator lie about both the streak and the next hit. A backwards clock is treated as a fresh engagement rather than producing a negative remaining time.
The window is clamped (50..2000 ms) and exposed as a slider, because the real cooldown varies by version.
Attack input is recorded from the paths that actually send an attack (mouse primary, and the controller mouse-button path in dispatchKeyEvent), before the preloader may consume the press — the player pressed attack either way, so the timing is the real input timing.
Honest limitations
Armor HUD still cannot display real durability, and Hitboxes cannot display real entity positions. I investigated rather than assuming: the preloader submodule exports only menu/HUD hooks, input handling and mod loading — there are no game-state entry points for entities, armor or position. Any values would have to be fabricated. Both DataSource/EntitySource are left as honest seams that render nothing (or a dimmed -), and the dialog now states this in-app rather than the feature appearing silently broken.
Fixing this needs new native hooks in the preloader submodule, which is a separate change.
Testing
381 unit tests, 0 failures, 0 errors (baseline on main: 322).
:app:compileDebugJavaWithJavac, :app:compileDebugKotlin and a full :app:assembleDebug all pass.
APK verified: lib/arm64-v8a/libgxcore.so present, and all six new classes present in the dex.
No mocks — every new test exercises real code paths.
Lint is unchanged: the project has no lint baseline and lintDebug already fails on ~355 pre-existing MissingTranslation errors, which is not a regression from this change.
Notes for reviewers
New modules are in ModIds.PVP_MODULES so they land in the PvP tab, and ModIds.requiresGameData() now marks three modules (armor, crystal, hitbox).
AGENTS.md updated with the new modules, the yaw convention, the config-description wiring, and the input-delay root cause.