SpawnKit
[ALPHA] Runtime enemy spawner for Outward: spawn any donor-scene creature beside the player as a real vanilla hostile, with full AI, aggro, combat, and vanilla death/loot. Co-op supported. Early software — see README for known issues.SpawnKit changelog
0.5.0 — 2026-08-22
- Room-wide warm mirror: host-side WantBook ledger, PeerOwned mirror of every peer's mintable species, host gate on party-wide mintability (Phase A observe + Phase B enforce)
- Wire-protocol bump:
sk helloannounces 0.5.0; the compare is exact-ordinal, so a mixed-build room refuses co-op loudly (same-bundle rule) - Version reconciliation: Plugin.cs already announced 0.5.0 since the warm-mirror wire bump; manifest.json / thunderstore.toml / csproj now agree
0.4.4 — 2026-08-19
- SpawnKit: casters attack — BUG-CASTERNOSKILL skill-knowledge repair (live-verified)
- Merge branch 'fix/sa-0815-mpnet' into feature/pet-self-feed
- Review fixes for the SA lane-F3 MP/net wave (H1, M1, M2, L1-L3)
- SpawnKit: review fixes — refusal memo must not shadow a later-valid template
- SA 2026-08-15 lane F3: MP/net teardown, mirror-race + hello-warn fixes
- SpawnKit: TemplateAiGate cluster fixes (SA-0815 F2b, A4-1/2/3/5/6/7/8 + A9-4)
- SpawnKit: refuse brainless templates — BUG-PREBUILTADOPT structural AI-graph gate
- SpawnKit: fix Character.Start never running on far-mint spawns
- spawn <TAB> completes the species roster — SpawnKit annotates spawn/spawnex/spawnprep; explicit choices win in the engine
- Forge shell fixes: SSH commands via bash -c (fish login shell); set/cfgdump on every channel mod
- Forge shell: catalog dump + response protocol + set/cfgdump in ForgeKit; forge CLI/REPL + completion packs; wiki-enriched name db
0.4.3 — 2026-08-11
- Merge phantom view-ID work: root-cause writeup (donor-stray duplicate registration evicts scene-baked views via PUN's destroy-old resolution), DuplicateViewPolicy veto in DonorPhotonGuard, unknown-view runaway telemetry + hb top= attribution, corpse-mute window accepted as bounded (NK-PHANTOM1/2 + V-PARKLEAK A/B retests owed)
- Phantom view-ID root cause + fixes: NetKit hb per-id attribution (top=[id×n]) + unknown-view RUNAWAY detector, DonorPhotonGuard duplicate-registration veto over live scene-baked views (DuplicateViewPolicy, unit-tested), V-PARKLEAK bounded-window acceptance + pt-stamped mute line; analysis doc + NK-PHANTOM1/2 retest rows — built, retest owed
- Merge BUG-CONTROLLERCLOSE fix: controller B via vanilla ControlsInput.MenuCancelSystem() ORed into the same two-stage Esc gate (CI-safe, no Rewired_Core ref; retest owed)
- Merge Ghost root-scale fix (GV-SCALE1): donor's authored (0.02,1,0.02) root localScale rode Instantiate into every mint; RootScaleFix restores degenerate axes at mint time, SK_-uid + UseLegacyVisual=false scoped; retest GV-SCALE1b owed
- BUG-CONTROLLERCLOSE: controller B closes the SpawnKit menu via the same two-stage gate as Esc
- Invisible-Ghost fix: un-crush the donor's root localScale at mint (GV-SCALE1b)
- DangerousRoads relay whitelist gap + ghostdiag DEGENERATE threshold widen
- Fable-review fixes: viewID watermark reads outstanding ids (latched), corpse-release fallback never parks a neutralized view, FarCache InFlight can't leak, visual-pass retries count as busy, Notify header placement
- SpawnKit perf wave: hot-loop allocs removed, adaptive replica enforce, prune throttle, viewID watermark + opt-in corpse release, AI sleep radius, caps 8->12
- SpawnMenu search bar: pure SpeciesFilter (key + resolved donor name), per-frame latched row set, two-stage Esc
- Slope-tilt review wave: pure smoother + hysteresis deadband + per-species axis
- SA-0808 Wave C code half: spawn recovery — census, ghost fix-at-cause, quest-gate clear, TerrainManager guard, abandon quarantine
- Static-analysis 2026-08-08 wave 0: nine P1/P2 fixes
- Merge branch 'feat/pet-health-orb'
- Fix BUG-RAGDOLLJOINTLOSS: the rig re-init pass ate healthy ragdoll joints
- Pet health orb: replace the IMGUI bar with a green Outward-style vitals circle
- Fix BUG-GHOSTINERTSPAWN: re-run the init chain Character.Start already spent
- Merge Lane B: SpawnKit view lifecycle migrated into NetKit.ViewLease (phase 2)
- Phase-2 view-lease migration: SpawnKit's view lifecycle moves into NetKit
- Review fixes: strip the whole VFXPlayed rebind family; pin only when it defends something
- … and 8 more (see git history)
Unreleased
-
Refactor (behavior-preserving; built, NOT live-verified): the PhotonView LIFECYCLE (mint/bind/deferred release/age-out sweep/corpse mute) migrated into
NetKit.ViewLease(phase 2 of the view-hygiene migration).MintNormalizeandEnemySpawnerare thin delegations now; every[SPAWN]log line is byte-stable — though the lease-mechanics lines (deferred/released/aged-out) now carry theNetKitBepInEx source label and follow NetKit's[Diag] LogLevelrather than SpawnKit's (defaults identical; warnings un-gated on both) — and SpawnKit keeps its policy — the master-warn vs mirror-throw no-view asymmetry, the Vanilla-corpse may-persist declaration, and the corpse-worded once-per-entry aged-out notices (supplied to the lease as callbacks). The parked-release ledger + the 300s age-out rule gained their first unit tests (NetKit.Tests/ViewLeaseTests). Template normalization deliberately keeps its bareviewID=0(a dormant template must stay mintable — see the new warning note inSpawnTemplates.Normalize). -
DangerousRoads 0.1.1 + SpawnKit 0.4.2: re-pin off CompanionKit 0.4.2
-
DonorKit/SpawnKit: name the two silent paths
-
DonorKit/SpawnKit: five static-analysis fixes
-
DonorKit/SpawnKit cleanup: one rig gate, one Safe() reader
-
Docs sweep: archive, condense, and validate the whole documentation tree
0.4.1 — 2026-08-02
- Hyena/Pearlbird tuning wave: HAO taunt, gifts, bone relic, feed rule
