Modern open-source C# .NET 10 Asheron's Call client. Faithful port of retail client behaviour to Silk.NET with a plugin API.
Find a file
Erik 7375f7ad32 feat(app+core): Phase 6.6+6.7 — wire UpdateMotion/UpdatePosition into GameWindow
Makes NPCs and other server-spawned entities actually move and
transition animations based on the live server feed. Before this,
Phase 6.6/6.7 only parsed the messages and fired events that nothing
consumed, so NPCs stayed frozen at their CreateObject spawn point
playing one idle cycle forever.

Changes:
 - GameWindow now keeps a parallel _entitiesByServerGuid dictionary
   built at CreateObject hydration time so motion / position updates
   can find the target entity by its server guid.
 - WorldEntity.Position and Rotation become get/set (like MeshRefs did
   in Phase 6.4) so the position-update handler can reseat an existing
   entity in place without reallocating MeshRefs.
 - OnLiveMotionUpdated re-resolves the cycle via MotionResolver using
   the server's new (stance, forward-command) override and either
   swaps the AnimatedEntity's current cycle or removes it from the
   animated set if the new pose is static.
 - OnLivePositionUpdated translates the new landblock-local position
   into acdream world space (same math as CreateObject hydration) and
   writes it back onto the entity.

Subscriptions are added alongside the existing EntitySpawned hook so
the three handlers run synchronously on the UDP pump thread, matching
the existing pattern.

194 tests green (98 Core + 96 Core.Net).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 20:40:17 +02:00
docs/plans docs(plan): roadmap with every observed defect mapped to a phase 2026-04-11 18:30:55 +02:00
src feat(app+core): Phase 6.6+6.7 — wire UpdateMotion/UpdatePosition into GameWindow 2026-04-11 20:40:17 +02:00
tests feat(net): Phase 6.7 — parse UpdatePosition (0xF748) into PositionUpdated event 2026-04-11 20:37:32 +02:00
.gitignore chore: phase 0 — skeleton + dat asset inventory 2026-04-10 09:02:56 +02:00
AcDream.slnx feat(net): AcDream.Core.Net scaffold + ISAAC keystream (Phase 4.1) 2026-04-11 14:14:28 +02:00
CLAUDE.md feat(net+app): SubPalette overlays applied to palette-indexed textures (Phase 5b) 2026-04-11 16:30:08 +02:00
README.md chore: phase 0 — skeleton + dat asset inventory 2026-04-10 09:02:56 +02:00

acdream

Experimental modern open-source Asheron's Call client in C# / .NET 10.

Status: pre-alpha, not playable. Phase 0 only — dat file asset inventory.

Stack: .NET 10, Chorizite.DatReaderWriter for dat parsing. Silk.NET + Avalonia planned for rendering/UI (not yet wired up).

Requires: A retail Asheron's Call install (Turbine/Microsoft property — supply your own). Set ACDREAM_DAT_DIR environment variable to the directory containing client_portal.dat, client_cell_1.dat, client_highres.dat, and client_local_English.dat, or pass it as the first CLI argument.

Layout

  • src/AcDream.Cli/ — console app that dumps asset counts from a dat directory
  • references/ — local read-only reference material (ACE, ACViewer, WorldBuilder, DatReaderWriter, holtburger, retail AC install). Gitignored.

Run

dotnet run --project src/AcDream.Cli -- "C:\path\to\Asheron's Call"

Or set ACDREAM_DAT_DIR and run without args.