Repository navigation
v0.6.0-devbuild+7d5bd43
Pre-releaseChanges from v0.5.0 → devbuild
Features
-
status command
- Displays connection status to WS/MongoDB
-
MythicMobs NPC adapter + registry
-
NearbyNPC broadcaster + follow tracker
-
perception system — speech, combat, death, weather
-
bridge intelligence + BridgeDTO expansion
-
squad system
-
puppet system
-
recognition broadcaster + character commands + appearance
-
affordance system, position broadcaster, migrations, perception broadcaster, debug command, proximity-gated NPC respawn/despawn
-
gaze broadcaster, NPC perception popup, self-perception logging, addressee resolution, bridge wiring
-
add Decision DTOs and event type constants
-
DecisionRelay — Go decision events relayed to Fabric clients
-
combat perception listener and perception broadcaster wiring
-
wire DecisionRelay into Story plugin lifecycle
-
add NpcSpawnQuery, NpcSpawnQueryResponse, FrontendReady event types
-
add NPC reconciliation config keys
-
add ReconciliationService for spawn-query request/reply
-
wire ReconciliationService
-
request reconciliation sweep on player join
-
debounced chunk-load reconciliation sweep
-
delayed reconciliation sweep on NPC death
-
emit FrontendReadyEvent once handshake conditions met
-
add /story sim pause and resume operator commands
- Adds FrontendPauseEvent wire event and /story sim {pause,resume}
- subcommands under story.admin. Pause emits FrontendPauseEvent; resume
- re-emits FrontendReadyEvent, bypassing the readiness handshake.
-
tighten attemptHit melee range, add StoryNPC.setTarget, sundry sim/bridge tweaks
-
directional combat system implementation
- Adds combat/ package with state machine, brain AI, hit detection, stamina,
- damage resolver, packet bridge, and tests. Includes directional combat plan.
-
intent outcome event channel
- Plugin-side: IntentExecutor emits IntentCompletedEvent or IntentRejectedEvent
- (with typed RejectionReason) on every code path through executeFrontendIntent,
- echoing the sim-minted intentId. WebSocketTransport serializes outcomes for
- forwarding to story-go. StoryEventBus dispatch now walks the type hierarchy so
- sealed-marker listeners (IntentOutcomeEvent) receive every concrete subtype.
- Closes the fire-and-forget gap from the May 11 design: sim can now learn that
- its intents were applied, rejected, or fell through (NPC missing, target out of
- range, NPC dead, unsupported backend, etc.). Story-go forwards the outcomes to
- NATS in a follow-up change. Sim consumes them via stream_handlers/intent_outcome
- and stores the last outcome on Blackboard for behaviors to poll on next tick.
-
add session start/end/add-player domain events
-
add SessionIntentListener for bridge intents
-
observer-side gaze dedup with 30s TTL
-
add epithet/partialName to descriptor DTO; tolerate unknown bridge keys
- Add optional epithet (stable per-perceiver fantasy handle from
- story-recognition) and partialName fields to the perception descriptor
- DTO. Make the bridge JSON parser ignore unknown keys so new fields added
- on the story-go/story-recognition side no longer throw and drop the whole
- payload to a raw fallback.
-
in-game sim authoring commands (/story location tag|radius, /story npc need|give|trait|stat|know|offer); character_data store + authoring intents
-
ItemMapService + items.yml for sim-item -> material mapping
-
load items.yml in ConfigService.reload, expose plugin.itemMapService
-
NpcItemTransferIntent DTO + npc.item_transfer decode; NpcStateIntent action fields
-
ItemTransferPacketBridge encode + story:item_transfer send
-
handle npc.item_transfer -> story:item_transfer packet to nearby players
-
action-label change-diff -> PerceptionBroadcaster.sendActionPopup (ACTION)
-
eat/drink/rest/socialize animation pipeline + action-label diffing
- Adds behaviorId-driven animations (MythicMobStoryNPC.playActionAnimation),
- animation/action-label change-diff helpers in IntentExecutor, and supporting
- location authoring changes. Includes AnimationDiffTest and NavReissueTest.
-
go_to handler with outcome round-trip; remove npc.move + navigate_to paths
-
supersede prior go_to with SUPERSEDED reject (no leaked pending intent)
-
add DMControlToggleEvent (plugin -> go)
-
supersedeAndStopForGrab reuses SUPERSEDED path on grab
-
puppet opcode 0x07 toggles DM control (grab/release)
-
StoryNPC.characterId accessor reading CHARACTER_ID PDC
-
getByStoryNPC resolves by characterId PDC first; name fallback warns
-
hard-fail non-UUID/unregistered characterId, remove randomUUID fork
-
warn on name-based fallback resolution (no longer silent)
-
add WebSocketTransport.sendProto for typed proto-JSON wire emit using descriptor FQN as type
-
use MythicMobs lookAt mechanic for look_at intent; add clear_look_at
-
NPCEmoteIconIntent event + WS serialize/deserialize registration
-
executeEmoteIconIntent broadcasts story:npc_emote_icon plugin message
-
include clientFacingUuid in npc_emote_icon plugin message
-
decode sim→plugin events as typed SimEvent proto (proto SoT)
-
sim-authoritative damage listener + round-trip wire test
- Add SimAuthoritativeDamageListener that consumes combat.attack_resolved as
- the authoritative kill signal (replaces Bukkit-event-driven death inference)
- Wire StoryEvent.kt and PerceptionListener.kt to surface attack_resolved
- Add CombatRoundTripWireTest covering sim->go->plugin attack_resolved flow
- Guard PerceptionListener entity-hurt against cancelled swing events (stops
- ghost NPCDamagedEvent emissions from cancelled MythicMobs attacks)
-
decode SimEvent from binary WebSocket frames
- WebSocketTransport: add onBinary listener with ByteBuffer accumulator
- and SimEvent.parseFrom dispatch through adaptSimEvent
- Delete tryParseSimEvent and its proto-JSON parsing branch in
- handleInboundMessage; legacy BridgeMessage path on onText unchanged
- SimEventAdapter: wire new proto fields NpcState.world,
- EntitySpawned.world, EntitySpawned.mob_template — drop the defaults
- Bump proto submodule to 48d1495d
-
map SimEvent.FrontendIntent to FrontendIntentEvent/NPCSpeakIntent/NPCEmoteIconIntent
- SimEventAdapter: handle FRONTEND_INTENT EventCase, dispatching the
- inner oneof to the existing event types (Speak -> NPCSpeakIntent,
- EmoteIcon -> NPCEmoteIconIntent, everything else -> FrontendIntentEvent
- with the matching primitive string)
- Bump proto submodule to 6b22e93f
- Exclude legacy story/v1/intents.proto from protoc generation: its
- LookAtIntent/SetTargetIntent/ClearTargetIntent names collide with the
- new FrontendIntent surface in events.proto; plugin code only consumes
- events.proto types, so dropping intents.proto from codegen is the
- minimal local workaround
- Port GoToWireTest from the (now-excluded) intents.proto GoToIntent to
- events.proto GoTo (same wire shape, same camelCase JSON contract)
-
sim-authoritative EntityDiedEvent + SimDeathListener force-kills MC entity
- Covers non-combat sim deaths (starvation, dehydration, hediff cascade) that
- the combat.attack_resolved path never sees. Decodes SimEvent.ENTITY_DIED into
- the new EntityDiedEvent; SimDeathListener resolves the backing MythicMob entity
- and sets health=0 to run the vanilla death sequence and existing cleanup.
Fixes
-
memory generation
-
memory generation not using bridge
-
get active character for player
-
player character retrieval
-
schedule DecisionRelay event emit on main thread
-
register DMControlToggleEvent in serializeEvent (was dropping payload to story-go)
-
don't clear listeners on shutdown, only transports
- ConfigService.reload() calls eventBus.shutdown() to rebuild transports
- against possibly-new config. The previous shutdown() also cleared
- listeners/classListeners, which stranded every onType/on<> handler that
- domain bridges (LocationBridge, DecisionRelay, PermissionRelay, ...)
- registered once in their init blocks at plugin enable. Symptom:
- /story location create timed out because location.create.response had
- zero listeners by the time the reply arrived.
-
bump proto to renamed Fi* FrontendIntent inner messages
- The previous FrontendIntent proto commit (6b22e93) clashed with legacy
- LookAtIntent/SetTargetIntent/ClearTargetIntent in intents.proto. Story-proto
- 3ba94648 renames the new inner messages with Fi* prefix so both proto files
- coexist; remove the gradle workaround that excluded intents.proto from
- codegen.
-
run generateProto before compileKotlin and ktlint
- Clean builds (every CI run) failed with ~20 'Unresolved reference
- storyproto/SimEvent' errors in SimEventAdapter.kt. The protobuf plugin's
- generated source dir is registered as a main srcDir but that is not a task
- dependency, so on a clean tree compileKotlin (and ktlint, which also reads
- the generated dir) ran before generateProto. Incremental local builds hid
- it because the generated dir was already populated. Wire generateProto as
- an explicit dependency of every main-source-set consumer.
Refactors
-
abstract storage (#28)
-
remove quest giver and npc intent
-
wire all systems into Story.kt + command registration
-
remove local NPC respawn loop and position cache from StoryMC
-
SessionManager becomes thin proxy over Go-side handler
-
remove conversation dependency from /g flow + puppet characterId migration
-
decouple speech from conversation creation; add perception log streaming
-
real-names visibility becomes permission-only on server
-
generalize NPCFollowTracker into NPCTaskTracker; make look_at sticky
CI / Build
- checkout private story-proto submodule with PAT
Misc
- bump version to 0.6.0-SNAPSHOT
- DecisionDTO round-trip serialization tests
- decision system spec and bridge implementation plan
- event ledger design spec
- NPC reconciliation design spec
- directional combat system design spec
- permission relay scaffolding
- gitignore Claude Code local runtime files
- in-game sim authoring commands design spec
- snapshot (absolute) semantics for character_data; flag set_need/set_stat new sim path
- implementation plan for in-game sim authoring commands
- healthbar listener + watchtower spec (pre-authoring snapshot)
- spec + plan for sim action & item-transfer visualization
- use imports instead of inline FQNs in visualization code
- intent vocabulary redesign design spec
- switch proving slice to go_to (movement) with full unify + supersede
- correct spec to codebase reality (gRPC live, codegen state) + 3 phases
- go_to slice implementation plan (3 phases)
- add protobuf gradle codegen + go_to canonical-json round-trip test
- go_to golden decode
- full pipeline map + NPC identity canonicalization design spec
- NPC identity canonicalization implementation plan
- roadmap + perception-sightings plan + intent-vocab spec edits
- convert src/main/proto to story-proto submodule; restore LocationCreateRequest DTO
- design spec for sim→go→MC→client emote icon pipeline
- implementation plan for sim→go→MC→client emote icon pipeline
- design spec for client NPC event pacing queue
- implementation plan for NPC event pacing queue
- location-aware broadcaster + PluginPerceptionContext + test harness
- design for binary protobuf SimEvent wire on both hops
- implementation plan for binary protobuf SimEvent wire