
Vanilla Core
A comprehensive all-in-one SMP plugin for PvP balance, custom mechanics, and server management. (Alternative to SMP Core)
- Загрузки
- 727
- Подписчики
- 6
- Обновлён
- 5 июля 2026 г.
- Лицензия
- MIT
Опубликован 2 декабря 2025 г.
Vanilla Core
A plugin for SMP servers. Handles PvP balance, item limits, mob control, and server management.
This is an open-source project. View the source code, contribute, or report issues on GitHub.
What is Vanilla Core?
Instead of running 10+ different plugins, Vanilla Core handles most of what you need for an SMP:
- PvP Balance: Gap limits, mace limits, enchantment caps
- Gear Control: Disable netherite, limit enchantments
- Dimension Locks: Keep Nether/End closed until you're ready
- Mob Control: Disable specific mobs per world with WorldGuard support
- Server Restart: Scheduled restarts with countdown warnings
- QoL Features: Infinite villager trades, one player sleep, minimap control
Everything is off by default. Turn on what you need, ignore the rest.
Documentation
Full documentation, guides, and configuration details:
vanillacore.tejaslamba.com
The wiki includes:
Quick Start
- Drop in
pluginsfolder - Restart server
- Run
/vanillato open settings - Click to toggle features, right-click for settings
Requirements
- Minecraft 1.21.1+
- Paper or Spigot
- Java 21+
- WorldGuard (optional, for Mob Manager region bypass)
Support
- Discord: Join for support
- Documentation: Full wiki and guides
- Issues: Report bugs on GitHub
- Contribute: Open source on GitHub
- Donate: Support development
Open Source
This plugin is open source. You can:
- View and contribute to the code on GitHub
- Report bugs and request features
- Submit pull requests
- Help improve documentation
License: MIT License (see LICENSE)
Ченджлог
1.5.1Релиз26.2 · 5 июля 2026 г.
Release 1.5.1 - See full changelog at https://github.com/TejasLamba2006/vanilla-core/releases/tag/v1.5.1
1.5.0Релиз26.1.1, 26.1.2, 26.2 · 2 июля 2026 г.
[1.5.0] - 2026-07-02
Added
- Added Faster Happy Ghasts (
features.faster-happy-ghasts) with configurable flying speed for newly spawned happy ghasts. - Added Potion Bans (
features.potion-bans) with per-effect tier flags inblocked-effects(effect:tier1:tier2) and GUI controls for Tier 1/Tier 2 toggles. - Added Ritual (
features.ritual) with/ritual start,/ritual status, and/ritual cancel, plus optional end effects:- Beacon beam (
features.ritual.end-effect-beacon-beam) - Beacon beam duration (
features.ritual.beacon-beam-duration-seconds) - Firework burst (
features.ritual.end-effect-firework-burst)
- Beacon beam (
- Added standalone combat restriction features:
- Bed Bombing Ban (
features.bed-bombing-ban) - TNT Minecart Ban (
features.tnt-minecart-ban) - Villager Killing Ban (
features.villager-killing-ban) - Crystal PvP Ban (
features.crystal-pvp-ban) - Anchor Restriction (
features.anchor-restriction) - Pearl Restriction (
features.pearl-restriction)
- Bed Bombing Ban (
- Added Item Cooldowns (
features.item-cooldowns) for GUI-managed cooldowns (golden apple, enchanted golden apple, ender pearl, wind charge) with optional extra material entries via config. - Added Spectator On Death (
features.spectator-on-death) to move players into spectator mode after death. - Added Ender Chest Item Limiter (
features.ender-chest-item-limiter) with Item Limiter-style GUI management and support for custom item matching (customModelData,displayName,potionType) to block specific items from being stored in ender chests. - Added persistent social data layer with SQLite-backed player preferences and player blocking storage.
- Added Folia-aware scheduler utility used for async/sync/repeating task safety.
- Added social/communication engine under
/smpincluding PM/reply, mentions with notifications, URL formatting, social spy, chat/PM/mention toggles, player block/unblock/list, and command-level toggles/cooldowns from config. - Added announcements engine with configurable interval and messages.
- Added teleport stack:
/tpa,/tpahere,/tpaccept,/tpdeny,/spawn,/setspawn,/back,/tp, and/tphere, with configurable safety checks. - Added persistent homes and warps systems with GUI navigation (
/home,/homes,/sethome,/delhome,/warp,/warps,/setwarp,/delwarp). - Added kits system with
/kit,/kits, cooldown persistence, and first-join starter kit support. - Added utility/admin command pack:
/fly,/god,/speed,/repair,/giveitem,/workbench,/anvil,/ec,/invsee, and/clearinv.
Changed
- Bumped config version to
9so new defaults and migrations are applied automatically. - Registered standalone social commands
/msg,/reply, and/socialspywhile keeping/smp msg,/smp reply, and/smp socialspyavailable. - Updated permission defaults so
smp.msgandsmp.replynow default totrue(no OP required). - Rebranded the plugin display name and user-facing branding to "Vanilla Core" across
plugin.yml, runtime messages, logs, and documentation. - Switched the admin command to
/smponly and removed the/vanillaalias. - Removed legacy
vanillacore.*permission mapping and standardized permission checks onsmp.*nodes. - Upgraded
/smp reloadto support module-scoped hot reload targets:all,config,messages,menus, andfeatures, with elapsed-time feedback and per-module failure reporting. - Added
/smp versionwithsmp.versionpermission for quick in-game/admin version checks. - Update checks now fetch the latest release version directly from Modrinth (
vanillacorewastaken) while keeping CDN-backed remote feature-control and maintenance messaging. - Split combat restrictions into separate features instead of one combined settings screen.
- Extended
/ritual startto support runtime overrides:/ritual start [time] [color]with durations like30s,1m,1h,1d, and1h30m, plus color tab completion. - Added a full Ritual settings GUI in
/smp menu(right-click Ritual) for duration, radius, particle color, start sound toggle, and end-effect toggles. - Reworked Potion Bans config and GUI: removed
ban-all/ban-tier2keys and switched to per-effect tier entries (effect:tier1:tier2) with computed "Ban All Potions" behavior. - Main menu pagination now clamps page bounds and keeps feature slots dedicated to features so overflow moves to later pages automatically.
- Removed the auto-generated
messages.ymlcodebase-string-catalogsection somessages.ymlnow contains only proper runtime message keys. - Centralized feature card/menu text into
messages.ymlunderfeature-menus.*and moved Infinite Restock/Netherite GUI title and control labels to message keys. - Updated docs to reflect runtime-only
messages.ymlkeys and Ender Chest Item Limiter message keys.
Fixed
- MiniMessage Crash: Fixed an
IllegalArgumentExceptioncrash by renaming camelCase tags ({configPath},{maxLevel},{customModelData}, etc.) tosnake_casein code and config. - Menu Interaction Bug: Fixed a bug where left-click and right-click actions on features failed in the main menu due to double-prefixing of the configuration path (e.g.,
features.features.ritual). - Docs Styling: Stripped emojis from the documentation and injected scalable React-style SVG icons via CSS masking in the Docusaurus frontend for a sleek, professional UI.
- Documentation: Rewrote
README.mdto use human-friendly descriptions and fully documented missing features like Server Restarts, Mob Manager, Minimap Control, and ported AirCore features (TPA, Kits, Homes, Utility Commands, Social Systems).
1.4.1Релиз1.21.9, 1.21.10, 1.21.11 · 18 марта 2026 г.
[1.4.1] - 2026-03-19
Fixed
- : replaced console dispatch with direct delivery so Xaero control strings are sent as chat text without Brigadier JSON parsing errors during GUI clicks
Security
- All plugin GUIs now use (a typed ) as the inventory holder instead of ; click and close dispatch in and all individual feature listeners now identify plugin GUIs by holder type rather than title string, preventing spoofed inventory titles from triggering plugin GUI handlers
- : added handler that cancels any drag action into plugin GUIs (covers -backed inventories and )
1.4.0Релиз1.21.9, 1.21.10, 1.21.11 · 6 марта 2026 г.
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 growthCDNManager: removed the unusedCachedDatainner classChatInputListener: migrated from deprecatedAsyncPlayerChatEvent(Bukkit) toAsyncChatEvent(Paper) andPlainTextComponentSerializerfor message extractionBreach 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
1.3.3Релиз1.21.9, 1.21.10, 1.21.11 · 1 марта 2026 г.
Changed
- Migrated all player messaging from legacy §-code strings to Adventure API (
Component/MiniMessage) across all command and listener classes - Migrated
UpdateNotificationListenerfrom BungeeCord chat API to Adventure API (ClickEvent,HoverEvent,Componentbuilder) - Fixed
InfiniteRestockFeatureblacklist GUI:statusText/statusColornow use MiniMessage tags (<red>,<green>) instead of §-codes so they render correctly when passed toMessageManager.parse() - Item Limiter:
findMatchingItemKeyno longer scans all configured limits linearly. AMaterial → keyindex is built at load time so lookups are O(1) for the common case instead of O(n limits) - Item Limiter: inventory scan is now distributed across ticks (1 player per tick) instead of checking every online player in a single 20-tick burst
- Item Limiter:
getPlayerItemCountno longer re-runsfindMatchingItemKeyfor each inventory slot — the target limit is resolved once andItemLimit.matches()is used directly - Item Limiter: potion material detection replaced
toString().contains("POTION")with a properEnumSet<Material>coveringPOTION,SPLASH_POTION, andLINGERING_POTION - Completed Adventure API migration: replaced all remaining legacy § color codes in
ServerRestartFeature,ShieldMechanicsFeature,MinimapControlFeature,ItemLimiterListener,MaceLimiterListener,InvisibleKillsFeature, andMainMenuwith MiniMessage format; GUI title constants inMaceLimiterFeature,ShieldMechanicsFeature,MobManagerFeature, andServerRestartFeatureconverted from §-coded strings toComponentconstants; corresponding listeners updated to useInventoryView.title()(Component API) for title matching ServerRestartFeature: migrated from BungeeCord ActionBar API and Bukkit BossBar to Adventure API (player.sendActionBar,player.showTitle,net.kyori.adventure.bossbar.BossBar)MainMenu: replaced deprecatedgetLore()+ §-detection withlore()+PlainTextComponentSerializerfor lore inspectionconfig.yml: migrated all message values from § codes to MiniMessage format- Added JUnit 5 (
junit-jupiter:5.10.0) as a test dependency ServerRestartListener: replaced non-thread-safeHashMapwithConcurrentHashMapforawaitingInput; async chat handler now uses atomicremove-and-null-check pattern to eliminate TOCTOU raceUpdateNotificationListener: CDN-provided title and message text is now escaped withMiniMessage.escapeTags()before parsing to prevent tag injectionMinimapControlFeature: world name, environment, and minimap mode values are escaped withMiniMessage.escapeTags()before being embedded in MiniMessage stringsMessageManager.get(String, Object...): now throwsIllegalArgumentExceptionimmediately when an odd number of replacement arguments is supplied or a key isnull, instead of silently ignoring the trailing argumentShieldMechanicsFeature: extracted shared stun-lore assembly intobuildStunLore(boolean, int)helper to eliminate duplication betweenbuildMaceStunItemandbuildAxeStunItemServerRestartFeature.getRestartMessage: consolidated{time}and{player}substitution into a single overloaded method; callers no longer chain.replace("{player}", ...)at the call siteMobManagerFeature.onRightClick: disabled warning now uses the centralizedmob-manager.feature-disabledmessages.yml key instead of a hardcoded literalInfiniteRestockFeature,ItemLimiterFeature:fillBordernow usesmeta.displayName(Component.empty())instead of the deprecatedmeta.setDisplayName(" ")messages.yml: removed UTF-8 BOM from file header
Fixed
VanillaCommandreload: each feature'sreload()is now wrapped in its owntry/catch; a failure in one feature no longer aborts the reload loop for all subsequent featuresMainMenu: removed unreachable duplicate slot-50 handler that could never be reached after the earlier slot-50 Wiki handler returnedMainMenu: removed duplicateimport net.kyori.adventure.text.Componentimport
Added
- Fixed
DimensionLockConfigdefaultlockedMessagevalues to use MiniMessage (<red>The End/Nether is currently locked!) - Fixed
InvisibleKillsConfigdefaultdeathMessageto use MiniMessage ({victim} was killed by <obfuscated>?????????) - Documentation: updated all
§-coded examples indocs/docs/configuration.mdto MiniMessage format
1.3.2Релиз1.21.9, 1.21.10, 1.21.11 · 26 февраля 2026 г.
Added
- Shield Mechanics feature: configurable shield stun when a player is hit while blocking
- Mace hitting a blocking player puts their shield on cooldown
- Axe hitting a blocking player puts their shield on cooldown
- Stun duration adjustable per weapon type (in ticks) via GUI
- All settings accessible via /vanilla menu → Shield Mechanics → Right Click
Fixed
- Enchantment Limiter config GUI: clicking an enchantment on page 2+ would apply the action to the enchantment at the same slot on page 1 instead. Caused by firing synchronously, which wiped the stored page number before the new page was written. The page is now recorded after the inventory opens. Rare in practice — only affects servers with enough custom enchantments (from datapacks or other plugins) to fill more than 45 slots
1.3.1Релиз1.21.9, 1.21.10, 1.21.11 · 26 февраля 2026 г.
Fixed
- Enchantment Limiter event handlers (enchanting table, anvil, pickup) no longer run when the feature is disabled in config
- Players who disconnect while the Enchantment Limiter config GUI is open no longer leave stale session data server-side
- Removed leftover
PrepareAnvilEventhandler that was unused - Villager discounts from curing zombie villagers and from the Hero of the Village effect now apply correctly. The old code was rebuilding
MerchantRecipeobjects from scratch on every interaction, which dropped any price multiplier changes Minecraft had set. Recipes are now modified in-place instead
Changed
- Default enchantment limits raised closer to vanilla max levels:
- Sharpness and Power: 4 → 5
- Protection, Fire Protection, Blast Protection, Projectile Protection, Feather Falling: 3 → 4
- Unbreaking: 2 → 3
- Main command class renamed from
SmpCommandtoVanillaCommand
Added
- GitHub Actions workflow that publishes to Modrinth automatically when a GitHub release is published. It builds from source, pulls the changelog for that version, and uploads via
mc-publish - PR labeler config updated to
actions/labeler@v5syntax
1.3.0Релиз1.21.9, 1.21.10, 1.21.11 · 19 февраля 2026 г.
Fix a bug
Комментарии
Загружаем…