feat(tamer): capture and relocate mobs
Release / release (push) Successful in 2m24s
CI / build (push) Successful in 1m16s

This commit is contained in:
dmg
2026-08-14 23:18:26 -04:00
parent cd38e87487
commit 777cbc6b4b
11 changed files with 471 additions and 11 deletions
+12
View File
@@ -6,6 +6,18 @@ description: Chronological record of material decisions affecting the Spigot Tyr
# Spigot Tyrant Design Log
## 2026-08-14 — Tamer completed
- Completed US-007 with the no-cooldown owner-bound Tamer's Lead, server-generated entity snapshots, durable capture IDs, and one bound Captured Mob item per entity.
- Capture checks inventory capacity before atomically storing state and removing the entity; placement consumes state and item only after safe validated spawning.
- Dropping or dying with a captured mob spawns it immediately, while container and dispenser transfer paths are blocked and invalid placement retains custody.
- Ender Dragons are always forbidden; configured bosses, named mobs, and tamed or owned mobs are denied, and snapshot type is validated before creation.
- Verified snapshot custody state, exact release, Ender Dragon rejection, YAML persistence, configuration, and the full Gradle build.
## 2026-08-14 — Tamer implementation started
- US-007 begins with test-first snapshot custody, no-cooldown capture items, safe placement/drop/death spawning, and duplication-resistant state transitions.
## 2026-08-14 — Tyrant abilities completed
- Completed US-009 with configurable permanent Strength and Resistance purchases continuously restored for the active Tyrant throughout the running reign.
@@ -2,7 +2,7 @@
type: User Story
title: "US-007: Capture and place mobs as a Tamer"
description: Let the Tamer move supported mobs without losing or duplicating them.
status: backlog
status: done
---
# US-007: Capture and place mobs as a Tamer
@@ -11,16 +11,16 @@ As the **Tamer**, I want to capture a mob and release it elsewhere so that I can
## Acceptance criteria
- [ ] The Tamer can use a named fishing rod on a supported targeted mob to capture it with no cooldown.
- [ ] A successful capture atomically removes the original mob and creates one bound captured-mob item.
- [ ] If inventory space is unavailable, capture fails, the mob remains in place, and the Tamer is told how to make room and retry.
- [ ] Using the captured-mob item places the stored mob at a safe valid location and consumes the item only after a successful spawn.
- [ ] Dropping a captured-mob item safely spawns its mob instead of deleting it.
- [ ] Every captured mob carried by a player spawns safely when that player dies.
- [ ] Ender Dragons, boss entities, named mobs, and mobs tamed or owned by another player are denied by default.
- [ ] Capture restrictions are configurable without permitting Ender Dragons.
- [ ] Invalid placement, full inventory, death, logout, restart, plugin disable, containers, and concurrent interaction cannot lose or duplicate a mob.
- [ ] Stored mob data is validated defensively before spawning and cannot execute untrusted serialized behavior.
- [x] The Tamer can use a named fishing rod on a supported targeted mob to capture it with no cooldown.
- [x] A successful capture atomically removes the original mob and creates one bound captured-mob item.
- [x] If inventory space is unavailable, capture fails, the mob remains in place, and the Tamer is told how to make room and retry.
- [x] Using the captured-mob item places the stored mob at a safe valid location and consumes the item only after a successful spawn.
- [x] Dropping a captured-mob item safely spawns its mob instead of deleting it.
- [x] Every captured mob carried by a player spawns safely when that player dies.
- [x] Ender Dragons, boss entities, named mobs, and mobs tamed or owned by another player are denied by default.
- [x] Capture restrictions are configurable without permitting Ender Dragons.
- [x] Invalid placement, full inventory, death, logout, restart, plugin disable, containers, and concurrent interaction cannot lose or duplicate a mob.
- [x] Stored mob data is validated defensively before spawning and cannot execute untrusted serialized behavior.
## Related