Installation
1. Requirements
AstralEssentials is a Paper plugin (main class com.astralrealms.essentials.AstralEssentials, extending AstralPaperPlugin) targeting api-version: '1.21'. Its plugin.yml declares four hard dependencies and one soft dependency:
Plugin | Required | Notes |
|---|---|---|
AstralCore | Yes | Must load first. Provides the plugin base class, menus, actions, cooldown service, and configuration loading. |
AstralItems | Yes | Hard dependency in |
AstralSync | Yes |
|
CraftEngine | Yes | Hard dependency in |
PacketEvents | Soft | Declared as a soft dependency, but |
Because depend forces load order, AstralCore, AstralItems, AstralSync, and CraftEngine are guaranteed to be enabled before AstralEssentials. PacketEvents is not guaranteed by softdepend alone — only load order is guaranteed, not presence — so treat it as required in practice.
2. Drop-in installation
Place AstralEssentials-<version>.jar in plugins/ alongside AstralCore, AstralItems, AstralSync, CraftEngine, and the PacketEvents plugin. Because of the depend/softdepend order above, no particular drop-in order is required beyond "all of them present before the server starts" — Paper resolves load order from plugin.yml automatically.
3. First start
On first enable the plugin generates, under plugins/AstralEssentials/:
config.yml, cooldowns.yml, containers.yml, and messages.yml are copied from the plugin's shipped defaults the first time each is loaded (they are left untouched on subsequent starts if already present). See Configuration and Messages.
Custom recipe authoring lives in the standalone AstralRecipes plugin, not here — see its own installation/data-folder layout in that product's docs.
PacketEvents integration
AstralEssentials uses PacketEvents for two independent things:
EnderDragonPacketListener— registered directly againstPacketEvents.getAPI().getEventManager()duringonEnable(), unconditionally (not gated by the hook system below). It listens atMONITORpriority for outgoingPlay.Server.EFFECTpackets and cancels the one with effect ID1028(the vanilla ender-dragon-death effect), suppressing the vanilla death animation/sound broadcast.PacketEventsHook— registered through AstralCore's hook manager (this.hooks().register("packetevents", PacketEventsHook::new)) and activated bythis.hooks().check(), which only instantiates and enables the hook if a plugin namedpacketeventsis actually enabled on the server. Once active, it registers a PacketEvents listener that rewrites the outgoingminecraft:brandplugin-message payload (both the configuration-phase and play-phase variants) toAstralServer, replacing whatever brand PacketEvents would otherwise report to the client.
AstralSync integration
On enable, AstralEssentials calls SyncAPI.registerAdapter(new PlayerTimeSnapshotAdapter()), registering a snapshot adapter keyed astralessentials:player_time. This adapter backs per-player time and weather (PlayerTimeCommand, PlayerWeatherCommand): the player's personal time/weather override is stored and restored through AstralSync rather than in a plugin-local file, so it follows the player across servers that share the same AstralSync backend. AstralSync must therefore be functioning (not just present) for per-player time/weather to persist and sync correctly.
4. Reloading configuration
/essentials reload (permission essentials.command) calls the same loadConfiguration() routine the plugin runs on enable:
Reloads
messages.ymlintoEssentialsMessages.Reloads
config.yml,cooldowns.yml, andcontainers.ymlinto their respective configuration records.Reloads recipes (
RecipeService.load()) — existing Bukkit recipes registered by the plugin are removed and re-registered from whatever is currently on disk underrecipes/. This does not re-seedshaped.yml/shapeless.ymlif you deleted them, since seeding only happens when therecipes/directory itself is missing.Reloads menus (
MenuContainer.load()).Re-applies
unregistered-commandsfromconfig.yml, unregistering each named command from the server's command map.
Reloading does not re-run the one-time enable logic — the locator-bar game rule, beehive-regeneration tasks, disabled-craft recipe removal, the EntityLimitTask timer, the PacketEvents listeners, and the AstralSync adapter registration are all set up once at onEnable() and are unaffected by /essentials reload. Restart the server to pick up changes to those.
Server-group-scoped behavior
Several config.yml sections are keyed by server group and only take effect on servers whose AstralPaperAPI.serverInformation().group() matches a key in the map — installing the plugin does not by itself activate these on every server:
entity-limits(per-chunk entity caps, viaentityLimitsForGroup())spawn-protection.enabled-groups(per-world spawn protection, viaSpawnProtection#isProtected)beehive-regeneration-times(per-world beehive regen tasks — scheduled once, one tick after enable, for each world already loaded at that point; worlds loaded later are not picked up until a restart)disabled-spawners-groups(fully blocks placing spawners on matching groups, independent of the per-chunkspawners-limitscap — both checks live inSpawnerListener, which is only registered at all ifspawners-limits.enabledistrue)disabled-mob-spawning-groups(per-group mob spawn suppression)groups-blocked-commands(per-group, per-world blocked commands)
See World & Server Management and Configuration for the per-key details.
Permissions
Node | Default | Description |
|---|---|---|
| op | Required for every |
Individual features (gamemode, fly speed, sudo, etc.) are gated by their own per-command permissions — see Commands.