diff --git a/projects/Games/docs/BLACKJACK.md b/projects/Games/docs/BLACKJACK.md index c4a0c82..b180b66 100644 --- a/projects/Games/docs/BLACKJACK.md +++ b/projects/Games/docs/BLACKJACK.md @@ -126,8 +126,10 @@ Shoe TextDisplay (gold title, aqua dealer, gray limits, green Open, gold countdo **Card totals** sit on the **dealer** cards only (upcard or `6 + ?` while the hole is down; full / soft / bust after). Players read their own hands. No holo on box or split piles. Turn, box stakes, and claimed dealer use the online player's shared character -display name, including masks and aliases. An unavailable provider or blank -display falls back to the account name; see [displayed names](SYSTEM.md#displayed-names). +display name, including masks and aliases. A player with no active character +shows RPCharacters' no-character label (`Unknown` by default). An unavailable +provider or blank display falls back to the account name; see +[displayed names](SYSTEM.md#displayed-names). No em dash in any of these strings. diff --git a/projects/Games/docs/SYSTEM.md b/projects/Games/docs/SYSTEM.md index b8554de..f58d5b7 100644 --- a/projects/Games/docs/SYSTEM.md +++ b/projects/Games/docs/SYSTEM.md @@ -120,9 +120,11 @@ reads the provider again, so switching characters or changing an alias is visibl on the next label/message update. Games does not substitute a canonical character name or query offline character records. -Without a provider, online names fall back to the account name. A null or blank -display, an incompatible identity API, or a failing provider also falls back to -the account name; integration failures log one warning per server start. Offline -players use their last known account name, or `-` when unavailable. Names are -presentation only: player UUIDs, wagers, payouts and table ownership keep their -existing behavior. +An online player with no active character shows RPCharacters' no-character +label, `no-character-fallback` in its `persona.yml` (`Unknown` by default), the +same label chat uses. Without a provider, online names fall back to the account +name. A null or blank display, an incompatible identity API, or a failing +provider also falls back to the account name; only integration failures log a +warning, once per server start. Offline players use their last known account +name, or `-` when unavailable. Names are presentation only: player UUIDs, wagers, +payouts and table ownership do not depend on them. diff --git a/projects/Games/docs/TEST_MATRIX.md b/projects/Games/docs/TEST_MATRIX.md index 66266e7..16f0231 100644 --- a/projects/Games/docs/TEST_MATRIX.md +++ b/projects/Games/docs/TEST_MATRIX.md @@ -111,6 +111,7 @@ See [BLACKJACK.md](BLACKJACK.md). - [ ] Auto: 10s after first min bet, spawn pays - [ ] Voice via RPCharacters `dispatch`, not `/rp` command - [ ] With TLibs 2.3.0 and RPCharacters 2.16.0, table labels and game messages show the current mask/alias; changing it or switching characters updates the next rendered name without revealing a canonical name +- [ ] An online player with no active character shows the RPCharacters no-character label (`Unknown` by default), matching chat - [ ] Without the character provider, online labels use account names; offline names use the last known account name or `-`; gameplay and wagers still work --- diff --git a/projects/Gathering/README.md b/projects/Gathering/README.md index 3e67d8f..8ec107b 100644 --- a/projects/Gathering/README.md +++ b/projects/Gathering/README.md @@ -15,9 +15,10 @@ installer. The build also prepares checksum-verified MMOCore `1.13.1-SNAPSHOT` a MythicLib `1.7.1-SNAPSHOT` inputs from the private ServerAssets repository. At runtime, `plugin.yml` requires TLibs and RPCharacters. Character identity comes -from the [shared TLibs session API](../TLibs/character-identity.md). The direct -RPCharacters dependency remains for creation-layer wisdom and intelligence; -MMOCore totals would change discovery odds. MMOCore is optional; +from the [shared TLibs session API](../TLibs/character-identity.md). Discovery +odds use wisdom and intelligence from the RPCharacters character sheet, so +Gathering depends on RPCharacters directly; MMOCore attribute totals include +extra allocations and equipment and would give different odds. MMOCore is optional; the profession bonus to discovery chance is only applied when that plugin is enabled. MythicLib is a compile input only and is not declared in `plugin.yml`. diff --git a/projects/GunsAndGadgets/operations.md b/projects/GunsAndGadgets/operations.md index 2a69e67..83b8b03 100644 --- a/projects/GunsAndGadgets/operations.md +++ b/projects/GunsAndGadgets/operations.md @@ -37,14 +37,14 @@ The action bar confirms the selection and carried amount, or reports that no compatible ammunition is available. Selection is blocked while the gun is reloading. - ## Character sessions and reload cleanup -The build pins TLibs 2.3.0. GunsAndGadgets listens directly for shared -`CharacterSessionEndEvent` events and no longer has a compile dependency or -`softdepend` on RPCharacters. RPCharacters 2.16.0 supplies these events when -installed; ordinary gun use remains available without a character provider. With -a provider present, gun use waits until the character has a ready session. +The build pins TLibs 2.3.0. With an older TLibs that lacks the character API, +GunsAndGadgets logs an update message and disables itself at startup. +RPCharacters is neither a build dependency nor a `softdepend`: GunsAndGadgets +listens for the shared `CharacterSessionEndEvent`, which RPCharacters 2.16.0 +fires when installed. Without a character provider guns work normally; with one, +gun use waits until the character has a ready session. A reload reserves the exact ammunition stacks it consumes and captures the current session. Its timer checks that session before progressing; a stale session or a @@ -62,9 +62,9 @@ session ends, even when the player switches away and back to the same character. It also stops on disconnect, pending character readiness, or a provider appearing between scheduling and completion. -For runtime validation, start a reload and exercise each session-end reason. -Confirm ammunition returns to the outgoing inventory before its save, the next -character receives no old reload completion, and clean shutdown preserves exact -item metadata and quantities. Repeat without RPCharacters to check quit cleanup. -See the [shared identity API](../TLibs/character-identity.md) and +To check on a server, start a reload and end the session by switching, permanent +death, quitting and shutdown. Each time the ammunition must return to the outgoing +character's inventory and the next character must not finish the old reload. +Repeat without RPCharacters to check quit cleanup. See the +[shared identity API](../TLibs/character-identity.md) and [RPCharacters provider](../RPCharacters/docs/character-identity.md). diff --git a/projects/Thievery/docs/SYSTEM.md b/projects/Thievery/docs/SYSTEM.md index 9883eec..db8f5ab 100644 --- a/projects/Thievery/docs/SYSTEM.md +++ b/projects/Thievery/docs/SYSTEM.md @@ -7,24 +7,36 @@ See [TEST_MATRIX.md](TEST_MATRIX.md) for the manual checklist. ## Character traits Trait restrictions use TLibs' ready character session and the matching character -snapshot. A configured list allows any one matching trait ID; IDs in configuration -are compared exactly against the lower-case IDs in the snapshot. A null or empty -list is unrestricted. Nonempty lists deny access while the character is loading, -the identity provider is unavailable, or its character information is unknown. -Each check reads the current session and traits; switching characters does not -reuse the previous character's training. +snapshot. A configured list allows any one matching trait ID. Trait IDs in +`traits`, `robbery.traits` and `pickpocket.traits` are lower-cased on load, so +`Thief` matches the snapshot's `thief`. A null or empty list is unrestricted. +Nonempty lists deny access while the character is loading, the identity provider +is unavailable, or its character information is unknown. Each check reads the +current session and traits; switching characters does not reuse the previous +character's training. Commands, container lockpicking and display lockpicking use the same checker. Containers and displays silently refuse unavailable character information, and -show the existing training message when a ready character lacks the required -traits. Command messages retain their existing behavior. The pickpocket loader -still defaults an empty configured list to `thief`; robbery permits an empty list. - -The build pins TLibs **2.3.0** and RPCharacters **2.16.0**. Install these providers -with Thievery before restarting. An older TLibs without the identity API disables -Thievery with an update message before initialization. RPCharacters remains a -required dependency for clues, graves and evil-RP rewards. Account-owned locks, -risk, cooldowns and saved data keep their existing format and ownership. +show the training message when a ready character lacks the required traits. +Commands show their own training messages. The pickpocket loader defaults an +empty configured list to `thief`; robbery permits an empty list. + +A player robbery request belongs to the character sessions both players are in +when the robber clicks the victim. Accepting checks that both sessions are still +current and that the robber still has a robbery trait; otherwise the request +expires. Switching away and back to the same character starts a new session, so +it also expires the request. When either player's session ends by switching, +death, quitting or shutdown, the robber stops targeting and pending requests +expire, with a message to the other player. An accepted robbery is not tied to +sessions and ends through the robbery's own quit handling. + +The build pins TLibs **2.3.0** and RPCharacters **2.16.0**. With an older TLibs +that lacks the character API, Thievery still starts and logs a warning. Lock, +door and container protection keeps working; every action with a nonempty trait +list is denied, and pending robbery requests are checked only on acceptance. +RPCharacters remains a required dependency for clues, graves and evil-RP +rewards. Account-owned locks, risk, cooldowns and saved data keep their format +and ownership. ## Responsibilities diff --git a/projects/Thievery/docs/TEST_MATRIX.md b/projects/Thievery/docs/TEST_MATRIX.md index b0cf417..d2209a4 100644 --- a/projects/Thievery/docs/TEST_MATRIX.md +++ b/projects/Thievery/docs/TEST_MATRIX.md @@ -12,7 +12,12 @@ loading a character with the required trait, and after switching to one without it. Only the matching ready character should pass the trait restriction. Switch back and repeat after changing that character's traits; the next check must use the current traits. Confirm unrestricted lists still permit access (the -pickpocket loader defaults its empty list to `thief`). Record these results in +pickpocket loader defaults its empty list to `thief`). Configure a trait in +mixed case (`Thief`) and confirm it matches. For player robbery, send a request, +switch the robber to another character and back, then accept: the request must +have expired. Repeat with the victim switching. On a server with TLibs older +than 2.3.0, Thievery must stay enabled, locked chests and doors must stay +protected, and trait-restricted actions must be refused. Record these results in addition to the checks below. | # | Check | diff --git a/projects/Thievery/docs/testing.md b/projects/Thievery/docs/testing.md index 20e0141..ae56df1 100644 --- a/projects/Thievery/docs/testing.md +++ b/projects/Thievery/docs/testing.md @@ -18,9 +18,12 @@ model servers with and without that API. Trait tests register the shared character service and cover absent providers, pending sessions, unknown character information, character switching, and current -trait changes. Container and display tests exercise the shared checker before -clue checks or lockpick start; plugin lifecycle tests cover the old-TLibs startup -failure. +trait changes, and mixed-case configured traits. Container and display tests +exercise the shared checker before clue checks or lockpick start. Plugin lifecycle +tests start Thievery without the character API and check that its protection +listeners register while trait checks deny. Robbery tests cover requests made as +one character and accepted after switching away and back, and pending requests +expiring when either session ends. Surefire writes test results to `target/surefire-reports/`. JaCoCo includes every production class and writes `target/site/jacoco/index.html` and