SDK
ECHO Native Troubleshooting
Cause: An addon descriptor is missing a required field or contains invalid JSON. Fix:
ECHO Native Troubleshooting
Installation Issues
NativeAddonDescriptorValidationException on launch
Cause: An addon descriptor is missing a required field or contains invalid JSON. Fix:
- Check
logs/latest.logfor the exact field name and addon ID. - Open the addon jar and inspect
META-INF/echo-native-addon.descriptor.json. - Ensure
id,version,nativePolicy, andsideare present and valid. - Re-package the addon after fixing the descriptor.
UnsupportedClassVersionError
Cause: Running with Java older than 25. Fix: Install Java 25 and point your launcher to it.
Loader does not discover an addon
Cause: Jar is not in mods/, descriptor is missing, or nativePolicy is unsupported.
Fix:
- Confirm the jar filename ends with
.jarand is in the correct folder. - Open the jar and verify
META-INF/echo-native-addon.descriptor.jsonexists. - Check that
nativePolicyis one ofNATIVE,NEOFORGE_BRIDGE, orSTANDALONE.
Runtime Issues
NoClassDefFoundError for an optional addon
Cause: Hard import of an optional addon class without EchoOptionalServices guard.
Fix: Replace direct references with service lookups or EchoOptionalServices:
// Wrong
TerminalService t = TerminalService.instance(); // crashes if absent
// Right
EchoOptionalServices.terminal().ifPresent(t -> t.registerCard(card));
Crash during onInitialize
Cause: Service registration throwing an exception prevents further addon boot. Fix:
- Wrap registration in try/catch and log instead of crash.
- Use
EchoNativeAddonRuntime.registerService(contract, impl, true)for best-effort registration. - Check the addon's parity report for missing NeoForge bridge dependencies.
Networking packets not arriving
Cause: Packet descriptor missing side or channel mismatch.
Fix:
- Verify
EchoNetService.registerPacketDescriptor()was called during initialization. - Ensure the packet record implements
EchoPacketand has a validchannelfield. - Check that sender and receiver agree on schema version.
Build Issues
./gradlew validateAddon fails with contract errors
Cause: A registered service does not implement its declared contract. Fix:
- Compare the service class against the contract interface.
- Ensure the contract ID in
echo-native-addon.descriptor.jsonmatches the runtime registration.
./gradlew packageAddon produces no jar
Cause: Missing packageAddon task configuration or descriptor validation blocked packaging.
Fix:
- Run
./gradlew validateAddonfirst and resolve errors. - Ensure
echo-sdk-gradle-pluginis applied and theechoNativeblock is configured.
Performance Issues
Stuttering or high tick times
Cause: An addon registered a heavy system without a RuntimeGuard budget. Fix:
- Check
echocore.tomlfor budget warnings. - Register a budget for your heavy system:
EchoCoreServices.runtimeGuard().registerBudget("echoexample:heavy_sim", 2.0);
- Split work across multiple ticks or use async datapack loading where possible.
Getting More Help
- Run
/echo export-diagnosticsin-game to produce a support bundle. - Open an issue using the Bug Report or Addon Author Support template.
- Include
latest.log,debug.log, the parity report, and your descriptor JSON.