Modernize placeholder integration (PlaceholderAPI, component-native)#143
Merged
Conversation
- Delete 9 legacy handler/placeholder classes and TextPlaceholderTest
- Add ConfigMigrationV124: rewrites {usb_*} tokens to <usb:*> tags in
chat formats, drops `placeholder:` config section and placeholderCache key
- Update config.yml: remove placeholder section, bump version 123→124
- Remove RuntimeConfig.Placeholder record and Advanced.placeholderCacheSpec
- Swap Services.java PlaceholderModule→PlaceholderIntegrations
- Guard PlaceholderIntegrations.startup against bad service entries (try/catch)
- Remove MVdW compileOnly dep, catalog entries, and mvdw-software repo block
- Remove MVdWPlaceholderAPI from plugin.yml softdepend
- Fix positional record constructions in 5 test files + RuntimeConfigFactoryTest
- Fix alphabetical import order in SkyblockModule
uSkyBlock loads at STARTUP, so its onEnable runs before POSTWORLD plugins like PlaceholderAPI have enabled - the isPluginEnabled gate in PlaceholderIntegrations.startup could never pass when called from Services.startup. Move the call to delayedEnable, which runs via the Bukkit scheduler after the first tick, alongside the other third-party plugin hooks. Covered by a ServiceLoader-backed regression test.
Member
Author
|
Live in-game verification completed on the dev server (Paper 1.21.11, PlaceholderAPI 2.12.2): island chat with format |
Member
Author
|
Entity-count placeholders also verified live: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #134 (placeholder provider/consumer modernization; the chat-delivery follow-ups from that issue are tracked separately below).
Summary
Replaces the MVdW-era String placeholder pipeline with a component-native system, designed from scratch (spec-driven):
placeholderpackage:PlaceholderSource(the 26 island values as Adventure Components, any-thread contract),PlaceholderService(MiniMessage TagResolver composition — placeholders are tags now),PlaceholderIntegrationSPI discovered via ServiceLoader.<usb:KEY>tags in island/party chat formats, always available; unknown keys render literally without degrading the message. Legacy{usb_*}tokens in user configs migrate automatically (config v124).uSkyBlock-PAPImodule (FAWE-style, shaded,me.clipisolated): bundles theuskyblockPlaceholderAPI expansion — all 26 placeholders as%uskyblock_*%, registered automatically, superseding the dormant eCloud expansion — and contributes the<papi:PLACEHOLDER>tag so other plugins' placeholders render in our chat formats (legacy-deserialized, never MiniMessage-parsed: injection-safe).sendLegacycall site removed; legacy output stays byte-identical (pinned by test).be.maximvdwdependency and its dead repo (this makes the build cold-cache resolvable again — same rot that broke CI on Harden world loading against missing void generator #142), the{usb_*}regex engine, both flag-gated listeners (one was a no-op bug), theplaceholder.*config flags.Notes
<usb:...>/<papi:...>resolve. The e2e caught (and this branch fixes) a lifecycle bug: integrations now enable in delayed-enable, after POSTWORLD plugins exist./usb reloadre-registers the expansion; PAPI 2.12.2 replaces same-identifier internal expansions (verified against its bytecode), so no duplicate/stale registration.sendLegacycall sites and the bukkit-utils command framework's legacy surface.🤖 Generated with Claude Code