feat: island trophies and titles (foundation for #31) - #36
Merged
Conversation
- recordActivity instead of record: 'record' is a restricted identifier - pin LocalDate.now to the system zone explicitly - static imports and an unused import in the new tests Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W8GghDu6oXiUf6eCoimJqD
The reward layer over the activity counters: config-defined trophies an island earns once and keeps, and the titles they carry. One system for the ring milestones (#3), relay scores (#9) and competition placements (#10) to emit into, instead of three unrelated ones. A trophy in trophies.yml is a name, an icon, a condition and what it grants. Conditions read the ring state (RING) or the activity counters (COUNTER, island total or any single member, lifetime or windowed). Earned trophies persist on the island and only an island create or reset clears them — the highestRingRewarded lesson: re-locking a ring on level loss and claiming it back never re-awards. TrophyAwardEvent mirrors RingCompleteEvent: cancellable, and the trophy stays earned either way, so another plugin can take the reward over entirely without the addon also acting. trophies.yml carries the warning against paying out island levels — levels buy chunks, so a level-granting trophy makes each milestone buy the next one. Titles are the display half: one active title per island chosen from earned trophies with /ch title, surfaced as the %chunkblock_island_title% placeholder (plus %chunkblock_island_trophies%). Foundation for #31; builds on the #30 counters. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W8GghDu6oXiUf6eCoimJqD
- guard execute() against a null island instead of trusting canExecute - constants for the repeated '[title]' and "Trophy '" literals - make the COUNTER criteria's non-null counter explicit for analysis - never map a nullable trophy title into the active-title text - suppress S9149 on getHandlerList: Bukkit's event bus requires the exact static method name on every event class Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W8GghDu6oXiUf6eCoimJqD
tastybento
force-pushed
the
feature/island-trophies
branch
from
August 15, 2026 02:56
a98ba25 to
20a714f
Compare
|
Member
Author
|
All 7 SonarCloud findings on this PR are fixed and the analysis is now green (0 open issues, all checks pass). Note on the stack: #35 merged just before its own SonarCloud fix commit landed, so develop currently carries 4 minor findings from the counters PR (the |
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 #31. Stacked on #35 — based on
feature/activity-countersand containing only the trophy layer as its own commit; when #35 merges this retargets todevelopautomatically.The reward layer the ring milestones (#3), relay (#9) and leagues (#10) all asked for independently: one persistent, visible trophy system instead of three. It earns its place over the existing
chunkblock.rings.commandsby being persistent and visible — the island keeps the trophy and can show the title — rather than running a command once and forgetting.Shape, as specified in the issue
trophies.ymlis a name, an icon, a condition and what it grants. Conditions read the ring state (RING: ring N complete) or the [foundation] Per-member island activity counters #30 counters (COUNTERwith counter/scope/threshold/window-days, where scope is the island total or any single member).OneBlockIslands; only an island create or reset clears them. Re-locking a ring on level loss and claiming it back never re-awards — thehighestRingRewardedlesson applied.TrophyAwardEventmirrorsRingCompleteEvent: the trophy is persisted whether or not the event is cancelled (so it can never fire twice), and cancelling suppresses only the addon's own handling — messages, sound, title grant and reward commands — so another plugin can take the reward over entirely./ch titlecommand (list, set,noneto clear, tab-complete), surfaced as%chunkblock_island_title%plus a%chunkblock_island_trophies%count. The first titled trophy auto-becomes the title until the island picks another. Titles are purely cosmetic for now; showing them next to the island name in listings is left open, as the issue suggests.trophies.ymlopens with the prominent warning: never reward island levels from trophy commands — levels buy chunks, so a level-granting trophy makes each milestone buy the next one. Economy/console-command payouts are fine.What earns a trophy
Deliberately not decided here, per the issue's "not in scope". The shipped defaults are three benign examples (ring 1, ten distinct chunks, ten thousand magic blocks); ring milestones (#3), relay streaks (#9) and competition placements (#10) become condition sources in their own issues.
Tests
22 new tests:
TrophyManagerTest(parsing/validation, criteria over rings and counters incl. member scope, award-once, cancellation semantics, titles),IslandTitleCommandTest, plus the ActivityManager→TrophyManager hook test. Full suite: 723 tests, 0 failures.🤖 Generated with Claude Code
https://claude.ai/code/session_01W8GghDu6oXiUf6eCoimJqD