Перейти к содержимому
Mineforgian

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 better alternative to SMP core for free

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

  1. Drop in plugins folder
  2. Restart server
  3. Run /vanilla to open settings
  4. 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


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 г.
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 in blocked-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)
  • 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)
  • 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 /smp including 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 9 so new defaults and migrations are applied automatically.
  • Registered standalone social commands /msg, /reply, and /socialspy while keeping /smp msg, /smp reply, and /smp socialspy available.
  • Updated permission defaults so smp.msg and smp.reply now default to true (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 /smp only and removed the /vanilla alias.
  • Removed legacy vanillacore.* permission mapping and standardized permission checks on smp.* nodes.
  • Upgraded /smp reload to support module-scoped hot reload targets: all, config, messages, menus, and features, with elapsed-time feedback and per-module failure reporting.
  • Added /smp version with smp.version permission 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 start to support runtime overrides: /ritual start [time] [color] with durations like 30s, 1m, 1h, 1d, and 1h30m, 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-tier2 keys 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.yml codebase-string-catalog section so messages.yml now contains only proper runtime message keys.
  • Centralized feature card/menu text into messages.yml under feature-menus.* and moved Infinite Restock/Netherite GUI title and control labels to message keys.
  • Updated docs to reflect runtime-only messages.yml keys and Ender Chest Item Limiter message keys.

Fixed

  • MiniMessage Crash: Fixed an IllegalArgumentException crash by renaming camelCase tags ({configPath}, {maxLevel}, {customModelData}, etc.) to snake_case in 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.md to 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 correctly
  • ConfigManager: corrected default config key features.mace-limiter.mace-craftedfeatures.mace-limiter.maces-crafted so config migration properly seeds the mace craft counter
  • ConfigManager: added explicit migration step to remove the old boolean mace-crafted key and convert its value to the new integer maces-crafted key in existing configs
  • ConfigManager: fixed migration log message reporting total defaults instead of actually-added entry count; also removed dead empty features array
  • ConfigManager: bumped CURRENT_CONFIG_VERSION to 3 to reflect the new features.stop-item-despawn config section
  • DimensionLockFeature.toggle(): CDN-sourced messages are now escaped with MiniMessage.escapeTags() before being passed to MessageManager.parse() to prevent MiniMessage tag injection from remote payloads; also added null checks on CDN message getters
  • DimensionLockFeature: made sharedListener and registration flag static so NetherLockFeature and EndLockFeature share one DimensionLockListener instance instead of each registering their own, preventing every PlayerPortalEvent from firing twice
  • DimensionLockFeature.toggle(): added remote-disable and maintenance-mode checks (matching BaseFeature.toggleDefault()) before processing the toggle
  • FeatureManager.getClasses(): removed // Skip classes that can't be loaded comments from both catch blocks (production code no-comment rule); also added null check for directory.listFiles() return value
  • OnePlayerSleepListener: player name and display name are now escaped with MiniMessage.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 loop
  • OnePlayerSleepListener: sleep and skip messages now parsed through MessageManager.parse() so MiniMessage tags (e.g. <yellow>{player}) render correctly instead of showing literally
  • MaceLimiterListener: shift-click mace crafting now validates cursor is empty and inventory has space before consuming ingredients; result is added via addItem() instead of setItemOnCursor() to properly handle shift-click semantics
  • MaceLimiterListener: shift-click mace crafting now sets matrix slots to null instead of setAmount(0) when an ingredient stack reaches zero, preventing ghost items in the crafting grid
  • ServerRestartFeature: setScheduledRestartsEnabled(false) now cancels the running checker task, preventing it from continuing after scheduled restarts are disabled
  • ServerRestartFeature: startScheduledRestartChecker() now stores its task ID; reload() and onDisable() cancel the old checker task before starting a new one, preventing accumulated duplicate restart-checker tasks across reloads
  • StopItemDespawnListener: 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 one
  • StopItemDespawnListener: stale UUID accumulation fixed — onItemDespawn now always removes item UUID from deathDrops even when feature is disabled, preventing unbounded set growth for items destroyed by lava/void/explosions
  • StopItemDespawnListener: proximity radius check changed from < 16 to <= 16 so items spawning exactly 4 blocks from the death location are included
  • StopItemDespawnListener: onItemMerge now checks isEnabled() to avoid silently transferring tags when feature is toggled off mid-session
  • MenuClickListener: 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 navigation
  • FeatureManager.getClasses(): added null check for directory.listFiles() return value to prevent NullPointerException when an I/O error occurs in dev/directory mode
  • InvisibleKillsFeature: standardised default death-message fallback tag from <obfuscated> to <obf> to match the default in InvisibleKillsListener
  • MinimapControlFeature.sendTellraw(): switched from player name to UUID when targeting the tellraw command to be future-proof against edge cases
  • NetheriteDisablerListener: event.getView().getPlayer() guarded with instanceof Player pattern-match to prevent a ClassCastException if 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: scheduled CooldownManager.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 unused CachedData inner class

  • ChatInputListener: migrated from deprecated AsyncPlayerChatEvent (Bukkit) to AsyncChatEvent (Paper) and PlainTextComponentSerializer for 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

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 UpdateNotificationListener from BungeeCord chat API to Adventure API (ClickEvent, HoverEvent, Component builder)
  • Fixed InfiniteRestockFeature blacklist GUI: statusText/statusColor now use MiniMessage tags (<red>, <green>) instead of §-codes so they render correctly when passed to MessageManager.parse()
  • Item Limiter: findMatchingItemKey no longer scans all configured limits linearly. A Material → key index 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: getPlayerItemCount no longer re-runs findMatchingItemKey for each inventory slot — the target limit is resolved once and ItemLimit.matches() is used directly
  • Item Limiter: potion material detection replaced toString().contains("POTION") with a proper EnumSet<Material> covering POTION, SPLASH_POTION, and LINGERING_POTION
  • Completed Adventure API migration: replaced all remaining legacy § color codes in ServerRestartFeature, ShieldMechanicsFeature, MinimapControlFeature, ItemLimiterListener, MaceLimiterListener, InvisibleKillsFeature, and MainMenu with MiniMessage format; GUI title constants in MaceLimiterFeature, ShieldMechanicsFeature, MobManagerFeature, and ServerRestartFeature converted from §-coded strings to Component constants; corresponding listeners updated to use InventoryView.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 deprecated getLore() + §-detection with lore() + PlainTextComponentSerializer for lore inspection
  • config.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-safe HashMap with ConcurrentHashMap for awaitingInput; async chat handler now uses atomic remove-and-null-check pattern to eliminate TOCTOU race
  • UpdateNotificationListener: CDN-provided title and message text is now escaped with MiniMessage.escapeTags() before parsing to prevent tag injection
  • MinimapControlFeature: world name, environment, and minimap mode values are escaped with MiniMessage.escapeTags() before being embedded in MiniMessage strings
  • MessageManager.get(String, Object...): now throws IllegalArgumentException immediately when an odd number of replacement arguments is supplied or a key is null, instead of silently ignoring the trailing argument
  • ShieldMechanicsFeature: extracted shared stun-lore assembly into buildStunLore(boolean, int) helper to eliminate duplication between buildMaceStunItem and buildAxeStunItem
  • ServerRestartFeature.getRestartMessage: consolidated {time} and {player} substitution into a single overloaded method; callers no longer chain .replace("{player}", ...) at the call site
  • MobManagerFeature.onRightClick: disabled warning now uses the centralized mob-manager.feature-disabled messages.yml key instead of a hardcoded literal
  • InfiniteRestockFeature, ItemLimiterFeature: fillBorder now uses meta.displayName(Component.empty()) instead of the deprecated meta.setDisplayName(" ")
  • messages.yml: removed UTF-8 BOM from file header

Fixed

  • VanillaCommand reload: each feature's reload() is now wrapped in its own try/catch; a failure in one feature no longer aborts the reload loop for all subsequent features
  • MainMenu: removed unreachable duplicate slot-50 handler that could never be reached after the earlier slot-50 Wiki handler returned
  • MainMenu: removed duplicate import net.kyori.adventure.text.Component import

Added

  • Fixed DimensionLockConfig default lockedMessage values to use MiniMessage (<red>The End/Nether is currently locked!)
  • Fixed InvisibleKillsConfig default deathMessage to use MiniMessage ({victim} was killed by <obfuscated>?????????)
  • Documentation: updated all §-coded examples in docs/docs/configuration.md to 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 PrepareAnvilEvent handler 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 MerchantRecipe objects 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 SmpCommand to VanillaCommand

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@v5 syntax
1.3.0Релиз1.21.9, 1.21.10, 1.21.11 · 19 февраля 2026 г.

Fix a bug

Комментарии

Загружаем…