diff --git a/projects/RPCharacters/docs/character-bodies.md b/projects/RPCharacters/docs/character-bodies.md index a158152..1982943 100644 --- a/projects/RPCharacters/docs/character-bodies.md +++ b/projects/RPCharacters/docs/character-bodies.md @@ -13,8 +13,9 @@ dialog focuses one living character at a time, showing a skin portrait, race, class, age, last location and playtime. Character tabs and arrows change the preview; **Play** enters the selected character. **New character** starts creation when slots and the switch cooldown allow it. **Memorials** opens the records of -dead and missing characters. Guild membership and pouch/bank balances are labelled -as shared by all characters; this feature does not migrate money or factions. +dead and missing characters. The focused character's card shows its own pouch and +bank from the DenarEconomy ledger and its own guild from SimpleFactions 4.0.0. +The guild line stays hidden while factions are unavailable. Portraits load asynchronously through ProvinceSystem's authenticated, read-only `GET /characters/plugin/wardrobe/{player_uuid}/{character_id}/worn` route. It diff --git a/projects/RPCharacters/docs/character-controls.md b/projects/RPCharacters/docs/character-controls.md index 7e05c82..6d6d6bb 100644 --- a/projects/RPCharacters/docs/character-controls.md +++ b/projects/RPCharacters/docs/character-controls.md @@ -25,6 +25,8 @@ Focus is a shared, regenerating per-character resource used by Research and Magi A character's first class and first subclass are free. Other picks are priced like the class creation stage: free during its lock-time (5 days), then the `paid-changes` class rule (100, 1000, 3000 denars). `class-selection.change-cost` is used only when there is no class rule. `infinite-points: true` makes every pick free, for the tutorial server. A class picked above a skill-slot level still gets the slots its exp table unlocks. +Paid picks, and paid changes to a locked creation stage, are charged to the character being changed: the whole price comes from its own pouch or bank, tried in the configured `accounts` order. This needs DenarEconomy 0.3.0. RPCharacters saves the payment on the character, with its debit and refund operation IDs, and forces the file and its folder to disk before it posts the debit. If the server stops part way, the next join asks the ledger whether the debit went through. A debit that never applied is dropped without a refund. An applied one is kept when the change stuck and refunded otherwise, always with the stored refund ID, so a retry never pays twice. A paid class pick whose class could not be applied is marked for refund, so reaching that class later never counts as using it. While a payment is held, the character cannot open a stage edit or pick a class until it settles. A payment held from before the character ledger is treated as already taken from the account's money. It is always refunded to the account's legacy heir, whatever the character has changed since, and waits until heirs are known. + Staff with `class-selection.reset-permission` (`rpchar.class.reset`) can run `/rpcharacter admin resetclasses confirm` to give every character a fresh class window: class and subclass changes are free for the lock-time again, paid prices start over and the first subclass is free again. Online characters start now, offline ones when they next join. The reset count is kept in `data/class-resets.yml`. With separate bodies disabled, the class level is shared by every character and @@ -62,3 +64,7 @@ Putting armour on takes a while (by default 1 second for a helmet, 20 for a ches - [PvP and armour configuration](https://github.com/TF-Minecraft/RPCharacters/blob/main/src/main/resources/pvp.yml) - [Focus configuration](https://github.com/TF-Minecraft/RPCharacters/blob/main/src/main/resources/focus.yml) - [Codex population service](https://github.com/TF-Minecraft/RPCharacters/blob/main/src/main/java/net/tfminecraft/rpcharacters/placeholder/CodexPopulationService.java) + +Realm OOC chat follows the active character's top-overlord realm. Online accounts +receive it only while playing a character in that realm. It waits for +SimpleFactions readiness; another character on the account grants no access. diff --git a/projects/RPCharacters/docs/character-identity.md b/projects/RPCharacters/docs/character-identity.md index c336582..e5e7adc 100644 --- a/projects/RPCharacters/docs/character-identity.md +++ b/projects/RPCharacters/docs/character-identity.md @@ -3,7 +3,7 @@ [RPCharacters](../README.md) ยท [TLibs API](../../TLibs/character-identity.md) RPCharacters provides TLibs' `CharacterIdentity` service through Bukkit's -`ServicesManager`. The build pins TLibs 2.3.0; install that release or a compatible +`ServicesManager`. The build pins TLibs 2.4.1; install that release or a compatible newer one before RPCharacters. Consumers use the `Characters` facade rather than reading RPCharacters files or waiting a fixed number of ticks after login. @@ -108,6 +108,14 @@ Once the death is saved, a replacement character that cannot be activated disconnects the player, and the death's own follow-up, such as the roster push and the caller's result, still runs. +`Characters.deathId(characterId)` returns the latest saved death ID, including +for offline characters. Revival retains it; another death replaces it. A legacy +DEAD record without a death ID uses a deterministic UUID derived from +`rpcharacters:legacy-death:`, stable across restarts without +rewriting the original record. Quarantined or unknown records return empty. +Consumers recover their incomplete journals first, then reconcile DEAD records; +they must not replay an old death just because a living character retains its ID. + Event delivery is not durable. A crash after saving but before dispatch can lose the event; consumers must use `deathId` for idempotency. Account saves still write individual character files and then the account file, rather than one transaction