Repository navigation
Biggest update so far....
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(commit1ff3721). 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.jsonmanifest at the archive root (name,version,author,type,entry_point, optionaldependencies,description). - Strict validation (Java
AntEggManifestand C++pl::runtime::AntEggManifestparse the same grammar): required fields, semantic version,typemust agree with the entry-point extension,entry_pointmay not escape the package. - native: extracted
.so's absolute path is handed to the preloader's existing native-mod injection entry point (ModManager.initializeLoadedMod)..AntEggadds packaging/validation, not a second injection mechanism. The original spec calls this API "ApexAntLamina"; no class/symbol by that name exists in this tree — theplpreloader bridge is the API in question. - script: entry
.luaruns on an embedded Lua VM (LuaJ, Lua 5.2) viaAntEggScriptHost, which exposes amodtable (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;.anteggintent-filter path patterns/suffixes added; template + format docs atexamples/antegg-template/. - Native uses zlib raw inflate (no new third-party ZIP dependency); JNI bound via
AntEggBridgewithJava_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
worldchannel 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_AUDIOrequest; a denied permission still starts listen-only.ensureCapture/stopCapturehandle 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 inAGENTS.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 inVersionProfileMetadata). - 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
SkinModelTestcases. - 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 rootfocusable="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 packagedlibpreloader.soinside the debug APK. - New tests:
AntEggScriptLoadingTest,VoiceChannelTest,VoiceProtocolTest,VoiceModuleGroupingTest,InGamePackChangerTest, plus expandedSkinModelTest/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 reallibminecraftpe.so), game classes are stripped of exported symbols and the reachable RTTI vtables are pure-virtual interface bases, so there is no way to obtainLevel*/ClientInstance*without per-build byte-pattern signatures. The modules keep their honest "awaiting game data" state rather than fabricating readings. - Lint:
lintDebugalready fails on ~355 pre-existingMissingTranslationerrors unrelated to this change; not addressed here.
This change was created by Malice 🤔🤔