plugin-resourcepacks alongside plugin-config in Velocity. The configuration plugin owns authenticated snapshots, reconciliation, and change notifications. plugin-resourcepacks owns the background PackSet client and ordered Adventure delivery.
Configuration scope
SetGROUNDS_ENVIRONMENT to the deployment environment, such as stage. It is required, nonblank, and cannot contain whitespace, /, or backslash. It selects:
Defaults seed an absent operator document. A genuinely
NOT_READY manager snapshot is not an absent document: the plugin must not invent defaults, start a CDN client, or send packs until configuration is ready.
Player transitions
Login/connection delivery reads memory only; it performs no synchronous Config Service or CDN request. OnePlayer.sendResourcePacks request preserves UUID, URI, SHA-1, pack order, prompt, and required flag.
A new snapshot or delivery setting is adopted at the next safe backend connection. An unchanged fingerprint/settings target is suppressed per player. Disconnect clears that player’s delivery record. Updating Config does not broadcast to players, disconnect them, or restart game/proxy processes.
Fallback and cache
Deliver only a source-matchedREADY snapshot or a source-matched DEGRADED fallback. Source changes reconfigure the same client and must not offer old-source retained state. Without usable state, no guessed stack is sent.
Validated metadata is cached under packset-cache in the plugin data directory, normally plugins/plugin-resourcepacks/packset-cache. Persist and make that directory writable according to the deployment’s storage ownership. A cached release pin can survive temporary CDN unavailability; changing selection still requires resolution of the selected source.
Diagnostics and acceptance
Runtime status exposes client state, current/fallback fingerprints, and requested/accepted/downloaded/failed/declined counters. Status attribution uses pack UUIDs; Velocity does not identify the originating request. If overlapping requests reuse the same UUID, attribution isunknown rather than assuming the event belongs to the latest publication. That ambiguity can persist until disconnect/state clear.
Logs use bounded allowlisted reason codes for untrusted diagnostic text. Do not paste credentials, arbitrary upstream errors, or full private configuration into operator messages.
A successful selection write proves Config acceptance. Verify each proxy’s source/target convergence and then test actual player transitions and acceptance. See the operator checklist.
