feat: ankh resurrection replacing the timed auto-respawn (#112) #129
No reviewers
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo!129
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/ankh-resurrection"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Closes the death loop for the arena (#112). I didn't want a magic timer respawning you at a fixed point — I want the UO feel: you die, you're a ghost, and you walk back to an ankh and use it to return to life. So this replaces the timed auto-respawn entirely with a diegetic, player-driven, fully server-validated resurrection.
IUsablecapability on the auto-discoveredBaseItemlayer (mirrorsIEquippable),Ankh : BaseItem, IUsable. Double-clicking a world item sends a newUse(itemId)intent; the server routes it to the item'sOnUsein oneSimulation.InvokeAsyncand validates everything (item exists, is a placed ankh, you're a ghost, you're in range). A modified client can't resurrect a live player, from range, someone else, or via a non-ankh item.PlayerMobile.Die()/Resurrect()), acting on the instance — no more_resurrectionsscheduling dict,ProcessResurrections, orResurrectDelayTicks. GM/resurrectstays as the manual override; new GM/place <kind>places the ankh.PlayerStatenow carriesPlayerAppearance(ghost),PlayerJoinedcarries it (this fixes a latent bug: entering AoI of an existing ghost used to render them alive), and a newPlayerAppearanceChangedis reconciled to observers —PlayerDied/PlayerResurrectedand their per-tick buffers are gone. This is deliberately the shared foundation for worn gear on other players (#18, next).ItemPlace.Placed+ a world-save section mirroring creatures) and ghost state now persists across relog (no free resurrection by logging out).critical-design-reviewskill).Screenshots / recording
Captured by piloting the client via the debug harness (
docs/debug-harness.md), driven as admindebug:The ankh renders as a placeholder diamond (its tint is derived from the kind name) and the resurrect sparkle FX is silent for now — both need the UO static/effect art extracted into the pack, a follow-up (the art id
item_ankh = 0x1D98is already registered in the extractor manifest). The gameplay is complete and server-authoritative regardless.How it was tested
World(new): a creature-killed ghost resurrects in place by using an ankh (not at the map spawn); using the ankh while alive →NotDeadand no state change; out of range →OutOfRange; a placed ankh survives a serialize/restore round-trip. Updated the interest-diff, protocol round-trip, persistence and GM-command tests for the new appearance model and the placed-items save section.just test— all suites green (189 GameServer, 72 Client.Core, 54 Shared, 12 Auth, 14 AssetExtractor, 4 Assets).just lint— build succeeds, 0 warnings.Checklist
just lintpasses (CSharpier + analyzers, zero warnings)just testis green/placepersists across restart; server-validated)