Tags
Creators
Details
0.2.5a
Compatibility
Changes
Allium v0.2.5a
Wiki: https://github.com/castledking/Allium/wiki
Highlights
- Translation probe config corruption fixed —
applyBundledDefaultsno longer callsconfig.save(), preventing the old JAR's defaults from being written to disk on every restart. A newseedMissingProbeConfig()method writes thetranslation-probesection to disk only when the file actually lacks it (usingcontains(path, true)to ignore in-memory defaults). - Hardcoded probe check fallback —
loadChecks()now cascades: disk config → bundled resource →createDefaultChecks()with 16 hardcoded checks (meteor + 14 IPN + 2 libIPN). This ensures the probe always has checks even when both the disk config and old JAR resource lack the section. - Probe enabled fallback —
isEnabled()now falls back to rootenabled, so the probe registers even when thetranslation-probesection is entirely absent from the config file. - Stealthier probe —
CloseWindowis sent immediately (no 2-tick delay, sign GUI never renders), and the sign position isY - 30below the player (out of view). Zero visual flicker. /allium modguard reload— New command unregisters the probe, reloads the config from disk, and re-registers. Requiresallium.admin.
Bug Fixes
| Bug | Root Cause | Fix |
|---|---|---|
| Config file overwritten on every restart | applyBundledDefaults called config.save() with copyDefaults(true), writing old JAR defaults back to disk |
Removed config.save() and copyDefaults(true) from applyBundledDefaults |
translation-probe section never persisted to disk |
seedMissingProbeConfig used config.contains("translation-probe") which returned true from defaults set by applyBundledDefaults — even though the file lacked the section |
Changed to config.contains("translation-probe", true) to ignore defaults and check only the file |
| Probe has no checks after config corruption | loadChecks() had no fallback when both disk config and bundled resource lacked the checks section |
Added createDefaultChecks() with 16 hardcoded checks as final fallback |
Probe doesn't fire when translation-probe section is missing |
registerTranslationProbe() and isEnabled() returned false for config.getBoolean("translation-probe.enabled", false) when the section was absent |
Changed fallback to config.getBoolean("translation-probe.enabled", config.getBoolean("enabled", false)) |
| Probe delay too slow (3s) and timeout too long (4s) | Config defaults for delay-ticks (60) and timeout-ticks (80) were unnecessarily conservative |
Changed to 10 ticks (0.5s) and 30 ticks (1.5s) |
| Sign GUI visible to player on join | CloseWindow was sent after a 2-tick delay, giving the client time to render the sign |
CloseWindow sent immediately in the same packet batch; sign placed 30 blocks below player |
| No reload command — required full restart for config changes | No implementation | Added /allium modguard reload which calls ModGuardManager.reload() |
Files Changed (4)
| File | Change |
|---|---|
managers/security/ModGuardManager.java |
applyBundledDefaults no longer saves to disk; added seedMissingProbeConfig() with contains(path, true) guard; added reload() static method; added /allium modguard reload dispatcher |
managers/security/ModGuardTranslationProbe.java |
Added createDefaultChecks() (16 hardcoded checks); loadChecks() now cascades config → bundled → hardcoded; isEnabled() falls back to root enabled; CloseWindow immediate; sign Y -30; delay-ticks 10, timeout-ticks 30 |
modguard/config.yml |
Cleaned up: removed debug, regex-matching, case-sensitive, banned-mods, allowed-mods; added translation-probe section with all 16 checks with require-corroboration-for-kick: false |
commands/Core.java |
Added handleModGuardCommand() for /allium modguard reload |
Technical Details
Config Persistence Chain
The old code had two bugs forming a corruption loop:
applyBundledDefaultscalledconfig.save()with the old JAR's bundled config (notranslation-probesection), overwriting user changes on every restart- Even after removing
config.save(),seedMissingProbeConfigcheckedconfig.contains("translation-probe")— butapplyBundledDefaultshad already set the NEW bundled resource as defaults, which DO contain the section. Socontains()returnedtruefrom defaults andseedMissingProbeConfigreturned early without persisting
Fix: seedMissingProbeConfig now uses config.contains("translation-probe", true) to skip default-only matches. It also writes the full 16-check section to disk when absent, so subsequent restarts load it directly from the file.
Probe Check Fallback Chain
loadChecks() now follows this order:
config().getConfigurationSection("translation-probe.checks")— reads from the in-memory config (loaded from disk or defaults)loadBundledChecks()— reads from the JAR resource (modguard/config.yml) and copies checks into the in-memory configcreateDefaultChecks()— 16 hardcoded checks: meteor + 14 IPN (key.inventoryprofiles.*) + 2 libIPN
This ensures the probe always has checks regardless of which JAR version is deployed or whether the config file contains the section.
Support and Feedback
Issues: https://github.com/castledking/Allium/issues Wiki: https://github.com/castledking/Allium/wiki Discord: https://discord.com/invite/pCKdCX6nYr Website: https://castled.codes/
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:ygnk0YMD:3NXLBlJD"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:ygnk0YMD:3NXLBlJD"
}

