Tags
Creators
Details
1.4.0
Compatibility
Changes
Fixed
VanillaCorePlugin: removed duplicate"vanillacore"entries in the data-folder migration array (was listed three times)VanillaCorePlugin: re-added"SMPCore"legacy alias to data-folder migration array so configs from that legacy folder name are migrated correctlyConfigManager: corrected default config keyfeatures.mace-limiter.mace-crafted→features.mace-limiter.maces-craftedso config migration properly seeds the mace craft counterConfigManager: added explicit migration step to remove the old booleanmace-craftedkey and convert its value to the new integermaces-craftedkey in existing configsConfigManager: fixed migration log message reporting total defaults instead of actually-added entry count; also removed dead empty features arrayConfigManager: bumpedCURRENT_CONFIG_VERSIONto 3 to reflect the newfeatures.stop-item-despawnconfig sectionDimensionLockFeature.toggle(): CDN-sourced messages are now escaped withMiniMessage.escapeTags()before being passed toMessageManager.parse()to prevent MiniMessage tag injection from remote payloads; also added null checks on CDN message gettersDimensionLockFeature: madesharedListenerand registration flag static soNetherLockFeatureandEndLockFeatureshare oneDimensionLockListenerinstance instead of each registering their own, preventing everyPlayerPortalEventfrom firing twiceDimensionLockFeature.toggle(): added remote-disable and maintenance-mode checks (matchingBaseFeature.toggleDefault()) before processing the toggleFeatureManager.getClasses(): removed// Skip classes that can't be loadedcomments from both catch blocks (production code no-comment rule); also added null check fordirectory.listFiles()return valueOnePlayerSleepListener: player name and display name are now escaped withMiniMessage.escapeTags()before substitution to prevent tag injection; sleep message is parsed once and reused for all recipients; skip message is also parsed once outside the loopOnePlayerSleepListener: sleep and skip messages now parsed throughMessageManager.parse()so MiniMessage tags (e.g.<yellow>{player}) render correctly instead of showing literallyMaceLimiterListener: shift-click mace crafting now validates cursor is empty and inventory has space before consuming ingredients; result is added viaaddItem()instead ofsetItemOnCursor()to properly handle shift-click semanticsMaceLimiterListener: shift-click mace crafting now sets matrix slots tonullinstead ofsetAmount(0)when an ingredient stack reaches zero, preventing ghost items in the crafting gridServerRestartFeature:setScheduledRestartsEnabled(false)now cancels the running checker task, preventing it from continuing after scheduled restarts are disabledServerRestartFeature:startScheduledRestartChecker()now stores its task ID;reload()andonDisable()cancel the old checker task before starting a new one, preventing accumulated duplicate restart-checker tasks across reloadsStopItemDespawnListener: double-death within 60-tick window no longer causes the second death location to be prematurely removed; previous cleanup task is cancelled before scheduling a new oneStopItemDespawnListener: stale UUID accumulation fixed —onItemDespawnnow always removes item UUID fromdeathDropseven when feature is disabled, preventing unbounded set growth for items destroyed by lava/void/explosionsStopItemDespawnListener: proximity radius check changed from< 16to<= 16so items spawning exactly 4 blocks from the death location are includedStopItemDespawnListener:onItemMergenow checksisEnabled()to avoid silently transferring tags when feature is toggled off mid-sessionMenuClickListener: ARROW back-button click in Mob Manager World Select GUI now also validates the slot (inventorySize - 3) to prevent any future ARROW item from accidentally triggering navigationFeatureManager.getClasses(): added null check fordirectory.listFiles()return value to preventNullPointerExceptionwhen an I/O error occurs in dev/directory modeInvisibleKillsFeature: standardised default death-message fallback tag from<obfuscated>to<obf>to match the default inInvisibleKillsListenerMinimapControlFeature.sendTellraw(): switched from player name to UUID when targeting thetellrawcommand to be future-proof against edge casesNetheriteDisablerListener:event.getView().getPlayer()guarded withinstanceof Playerpattern-match to prevent aClassCastExceptionif a non-player human entity ever triggers the smithing event
Added
- Stop Item Despawn feature: items dropped when a player dies will never despawn naturally; they persist indefinitely until picked up; enabled via
features.stop-item-despawn.enabled - Back button (ARROW) to Shield Mechanics settings GUI (slot 22) to navigate back to the main menu
- Back button (ARROW) to Mob Manager World Select GUI (slot
size-3) to navigate back to the main menu
Changed
-
VanillaCorePlugin: scheduledCooldownManager.cleanup()as an async repeating task (every 5 minutes) to evict expired cooldown entries for offline players and prevent unbounded memory growth -
CDNManager: removed the unusedCachedDatainner class -
ChatInputListener: migrated from deprecatedAsyncPlayerChatEvent(Bukkit) toAsyncChatEvent(Paper) andPlainTextComponentSerializerfor message extraction -
Breach Swap: swapping between a Breach-enchanted mace and a sword/axe is now allowed freely; the first attack within 500ms of that swap is blocked instead, removing the attribute-swap PvP advantage without restricting movement
-
Breach Swap GUI: the mace icon in the settings menu now displays with an enchantment glint
Optional dependencies
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:GH4H8ndx:cKFcdQrJ"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:GH4H8ndx:cKFcdQrJ"
}

