Skip to content
This repository was archived by the owner on Aug 10, 2026. It is now read-only.

v0.6.0-devbuild+7d5bd43

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 31 May 15:16
· 1 commit to main since this release

Changes 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