Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions projects/Games/docs/BLACKJACK.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
14 changes: 8 additions & 6 deletions projects/Games/docs/SYSTEM.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
1 change: 1 addition & 0 deletions projects/Games/docs/TEST_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

---
Expand Down
7 changes: 4 additions & 3 deletions projects/Gathering/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

Expand Down
22 changes: 11 additions & 11 deletions projects/GunsAndGadgets/operations.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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).
42 changes: 27 additions & 15 deletions projects/Thievery/docs/SYSTEM.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
7 changes: 6 additions & 1 deletion projects/Thievery/docs/TEST_MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
9 changes: 6 additions & 3 deletions projects/Thievery/docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down