Skip to content

Biggest update so far....

Choose a tag to compare

@ChimeraAnt-DEV ChimeraAnt-DEV released this 27 Sep 13:29
· 180 commits to main since this release
74903c9

Summary

Implements the .AntEgg multi-language mod packaging format, adds a proximity voice chat module and an opt-in in-game resource-pack changer, and fixes the cosmetics/3D-preview/paper-cape defects plus the Mod Menu white-overlay bug.

Dependency: the preloader submodule pointer moves to preloader-android@antegg-mod-loader (commit 1ff3721). The submodule branch must be merged (or its commit made reachable) before this PR's pointer resolves.

Changes

.AntEgg mod packaging (core.antegg + preloader AntEggLoader)

  • ZIP container with a custom extension; egg.json manifest at the archive root (name, version, author, type, entry_point, optional dependencies, description).
  • Strict validation (Java AntEggManifest and C++ pl::runtime::AntEggManifest parse the same grammar): required fields, semantic version, type must agree with the entry-point extension, entry_point may not escape the package.
  • native: extracted .so's absolute path is handed to the preloader's existing native-mod injection entry point (ModManager.initializeLoadedMod). .AntEgg adds packaging/validation, not a second injection mechanism. The original spec calls this API "ApexAntLamina"; no class/symbol by that name exists in this tree — the pl preloader bridge is the API in question.
  • script: entry .lua runs on an embedded Lua VM (LuaJ, Lua 5.2) via AntEggScriptHost, which exposes a mod table (name, version, author, id, dir, sandbox, dependencies). Failures are returned, not thrown.
  • Sandboxed atomic extraction to getExternalFilesDir()/AntEggs/<mod-id>/ (internal fallback). Every ZIP entry is resolved and checked to stay inside the sandbox; the archive is staged in a temp sibling and moved into place only when complete, so a failed import leaves no partial mod.
  • Import wired through FileHandler; .antegg intent-filter path patterns/suffixes added; template + format docs at examples/antegg-template/.
  • Native uses zlib raw inflate (no new third-party ZIP dependency); JNI bound via AntEggBridge with Java_org_chimeramc_client_core_antegg_* symbols.

Proximity voice chat (core.voice + VoiceChatOverlay)

  • Peer link between Chimera users in the same world over LAN multicast UDP (VoiceTransport), raw 16 kHz mono PCM framing (VoiceProtocol), mixing (VoiceRegistry + VoiceChannel), device (VoiceAudioEngine).
  • Multi-channel support: a listener hears their own channel plus the open world channel in both directions, so switching to a private channel never cuts off someone standing next to you; two different private channels do not hear each other.
  • Mic capture with a runtime RECORD_AUDIO request; a denied permission still starts listen-only. ensureCapture/stopCapture handle a mic toggled on after a listen-only start.
  • Honest scope: distance/range needs a world position that lives in libminecraftpe.so (see the native-feed notes in AGENTS.md), so the module runs in channel mode — everyone on a reachable channel is audible. The overlay states this rather than pretending a range applies.

In-game pack changer (InGamePackChanger + PackChangerPanel)

  • Per-instance opt-in toggle in Instance Settings (GameVersion.inGamePackChangerEnabled, persisted in VersionProfileMetadata).
  • When enabled, the in-game Mod Menu's Packs section lists the instance's resource packs with a per-pack on/off toggle that rewrites minecraftpe/global_resource_packs.json, across every candidate game-data root.

Cosmetics / 3D preview / paper cape

  • Fixed the left arm and left leg base/overlay UVs (they pointed at neighbouring strips, so one side of the body sampled the wrong atlas region). Pinned by new SkinModelTest cases.
  • The built-in placeholder now paints from the same UV table the renderer samples, so it cannot drift from the model.
  • The cape texture now paints every face (back panel, front panel, side columns, edge rows) — previously the transparent strips showed as holes when the cape swung, reading as flapping paper.
  • The cape mesh is now depth-sorted per quad with two-sided shading; the old row-major paint order let a fold's far side paint over its near side.

Mod Menu white overlay

  • The full-screen translucent white wash was Android's default focus highlight: the overlay root is clickable, hence focusable, so a controller stick/d-pad input moved focus onto it and the framework painted the highlight. Fixed by making the root focusable="false" + defaultFocusHighlightEnabled="false" (XML and programmatically), while keeping children focusable for controller nav.

Testing

  • ./gradlew :app:assembleDebug — BUILD SUCCESSFUL.
  • ./gradlew :app:testDebugUnitTest — 510 tests, 0 failures, 0 errors.
  • Verified the three Java_org_chimeramc_client_core_antegg_AntEggBridge_* symbols are present in the packaged libpreloader.so inside the debug APK.
  • New tests: AntEggScriptLoadingTest, VoiceChannelTest, VoiceProtocolTest, VoiceModuleGroupingTest, InGamePackChangerTest, plus expanded SkinModelTest / CapeResourcePackBuilderTest.

Not done (deliberately, with reasons)

  • Hitboxes / Crystal Optimizer / Armor HUD live data. These need a native entity/camera feed. As documented at length in AGENTS.md (verified against the real libminecraftpe.so), game classes are stripped of exported symbols and the reachable RTTI vtables are pure-virtual interface bases, so there is no way to obtain Level*/ClientInstance* without per-build byte-pattern signatures. The modules keep their honest "awaiting game data" state rather than fabricating readings.
  • Lint: lintDebug already fails on ~355 pre-existing MissingTranslation errors unrelated to this change; not addressed here.

This change was created by Malice 🤔🤔