acdream/src/AcDream.App
Erik 80a3a25594 fix(world): rotate the DAT-scenery root too — the flyers actually orbit now
0c552eec wired the SetOmega hook and I called it done. The birds kept flapping
in place, and the user's report — "flapping and moving up and down, not
orbiting" — is what identified the miss: part animation working, root frozen.

BindLiveOwner THROWS on a zero ServerGuid, so owner.Body is only ever assigned
for server-spawned entities. Ambient flyers are DAT scenery with no ServerGuid
and therefore no PhysicsBody at all. The whole

    if (owner.Body is { } body) { ... Frame::grotate ... }

block — and the omega application I added inside it — silently skipped every
object the fix was written for. It applied the mechanism to a branch these
objects never take.

So the omega now lives on the scheduler's own Owner record rather than on the
PhysicsBody, because most of this workset has no body, and the same grotate is
applied to entity.Rotation when there is none. That is not a shortcut around
the physics owner: for a DAT static the WorldEntity IS the only root retail
would be rotating.

Verified rather than assumed this time, both halves:
  - StaticRenderProjectionJournal.SynchronizeActiveAnimatedSources re-projects
    from the live entity every frame through
    RenderTransform.FromRoot(entity.Position, entity.Rotation, entity.Scale),
    so a rotated root reaches the renderer.
  - Compose builds LOCAL part transforms, so the renderer composes root x part
    and the offset mesh is carried around its circle.

Why it shipped broken: no test exercised a root rotation on the ServerGuid==0
branch, so applying omega body-only passed everything. The new test asserts the
rotation on the branch these objects actually take, and fails with the exact
production symptom (rotation stays identity) when the branch is disabled. Its
sibling pins the other direction — scenery without a SetOmega hook must never
acquire a spin.

Solution builds clean; 14,475 tests pass on the standard hermetic lane filter,
0 failures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 05:52:44 +02:00
..
Audio fix #417: world ambience kept playing at character select after the in-world logoff 2026-08-17 18:46:04 +02:00
Combat fix(ui,runtime): OP4 review fixes — live re-seed, enable-gating, Combat panel re-point, universal timestamps 2026-08-11 05:30:26 +02:00
Composition fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
Configuration feat(runtime): share chat commands and run login sequence 2026-08-14 20:27:45 +02:00
Credentials fix(launcher): close Campaign LA LA1 review findings 2026-08-14 17:00:09 +02:00
Diagnostics fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
Input fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
Interaction chore: secure-trade closeout - strip [trade] gate probes, roadmap ledger 2026-08-14 12:48:31 +02:00
Net fix #417: world ambience kept playing at character select after the in-world logoff 2026-08-17 18:46:04 +02:00
Physics refactor(physics): hoist the live-entity collision builder to Runtime (#330 groundwork) 2026-08-07 01:49:13 +02:00
Platform docs: Campaign LA — pinned launch-contract schema COMMITTED into plan LA1 2026-08-14 16:04:32 +02:00
Plugins feat(mosstank): banes, protections and weapon auras 2026-08-20 19:49:51 +02:00
Rendering fix(world): rotate the DAT-scenery root too — the flyers actually orbit now 2026-08-21 05:52:44 +02:00
Runtime feat(chargen): Campaign CC slice CC5 — Summary page, Finish flow, RandomizeCharacter port 2026-08-16 00:01:07 +02:00
Settings fix(ui): restore retail vitals and window interactions 2026-08-20 13:26:35 +02:00
Spells Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
Streaming fix: make locale-independence real, not assumed — parsing, casing, comparison 2026-08-19 20:11:32 +02:00
UI fix(ui): effects list stayed pinned at its authored height in a taller window 2026-08-20 21:00:16 +02:00
Update feat(audio): Campaign A slice A5 — retail's region ambient soundscape 2026-08-08 22:53:41 +02:00
World fix: retail text and golden-string tests must not follow the machine's locale 2026-08-19 19:56:09 +02:00
AcDream.App.csproj feat(mosstank): cast back-to-back, and a settings view for the thresholds 2026-08-20 18:51:15 +02:00
GlobalUsings.cs feat(runtime): share chat commands and run login sequence 2026-08-14 20:27:45 +02:00
packages.linux-x64.lock.json build: make release restore reproducible 2026-08-18 10:29:00 +02:00
packages.neutral.lock.json build: make release restore reproducible 2026-08-18 10:29:00 +02:00
packages.win-x64.lock.json build: make release restore reproducible 2026-08-18 10:29:00 +02:00
Program.cs feat(plugins): MossTank — a self-buffing plugin, and the automation surface it needed 2026-08-20 16:22:28 +02:00
RuntimeOptions.cs feat(app): Campaign CC slice CC4 — chargen screen shell + Heritage/Profession/Skills/Town pages 2026-08-15 17:45:51 +02:00