
Vanilla Core
A comprehensive all-in-one SMP plugin for PvP balance, custom mechanics, and server management. (Alternative to SMP Core)
Список изменений
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
