Check out our latest project ✨ OpenChapter.io: free ebooks the way its meant to be 📖

Klotho — Deterministic multiplayer for Godot(.NET)

An asset by xpTURN
The page banner background of a mountain and forest
Klotho — Deterministic multiplayer for Godot(.NET) hero image

Quick Information

0 ratings
Klotho — Deterministic multiplayer for Godot(.NET) icon image
xpTURN
Klotho — Deterministic multiplayer for Godot(.NET)

Klotho — Deterministic multiplayer netcode for Godot (.NET)Engine-agnostic, pure C# deterministic simulation for rollback, lockstep, andserver-authoritative multiplayer. Determinism is built on 32.32 fixed-point math(FP64) and a seeded RNG: given the same inputs, every peer computes identicalstate — so the network sends inputs only and verifies with a hash. Frame-perfectand cross-platform reproducible.REQUIRES- Godot 4.4+ with .NET (mono) support- A C# (.NET 8) game projectFEATURES- Netcode: P2P lockstep, rollback + client prediction, server-driven (authoritative), dedicated server, spectator, late join, reconnect- Deterministic core: FP64 fixed-point math, vectors / quaternions / matrices, seeded RNG (Xorshift128+)- ECS: sparse-set components, zero-GC frame, snapshot + rollback ring buffer- Deterministic physics: rigid bodies, collisions, CCD, joints, triggers, static BVH- Deterministic navigation: navmesh + A* + funnel + ORCA avoidance- Replay: record / playback / seek / variable speed (LZ4 compressed)- Source generator: serialization + component / command registration- Godot adapter: Node session driver + view nodes, Resource config assets, Task-based join helpers, console + rolling-file loggingINSTALL & SETUP1. Install from the Asset Library (or copy the folder) so that the addon sits at res://addons/klotho/.2. Add one line to your game .csproj: <Import Project="addons/klotho/Klotho.props" />3. Build the C# solution (dotnet build, or the Godot editor's Build button). - NuGet deps (Newtonsoft.Json, K4os.Compression.LZ4, LiteNetLib) restore automatically via Klotho.props.4. (Optional) Project > Project Settings > Plugins: enable "Klotho" for the DataAsset JSON -> bytes editor tool. Build the project once before enabling.DEDICATED SERVER (optional)The server is a plain .NET 8 console app with no Godot dependency, running thesame core. In a separate server .csproj add: <Import Project="addons/klotho/Klotho.Server.props" />LINKS- Source & docs: https://github.com/xpTURN/Klotho- Quick start (Godot): Docs/QuickStart.Godot.md- Install guide (Godot): Docs/Installation.Godot.md

Supported Engine Version
4.4
Version String
0.2.11
License Version
Apache-2.0
Support Level
community
Modified Date
10 hours ago
Git URL
Issue URL

xpTURN.Klotho

README Unity 2022.3+ README Godot 4.4+ (.NET) README License: Apache License Version 2.0

Deterministic Multiplayer Simulation Framework for Unity and Godot

⚠️ Experimental Release This project is under active development and has not yet reached a stable stage. Public APIs, serialization formats, and network protocols may change without notice. Production use is not recommended.

A deterministic-simulation framework supporting Client-Side Prediction (CSP), Rollback, Frame Synchronization, Server-Driven mode, and Replay. The simulation core is engine-agnostic pure C# with Unity and Godot (.NET) adapters on top. By excluding floating-point and building the simulation solely on 32.32 fixed-point (FP64) and a deterministic RNG (Xorshift128+), it guarantees full reproducibility across platforms and compilers.

Klotho weaves the simulation, one frame at a time.

How synchronization works, in one paragraph: determinism is the keystone — given the same ordered inputs, every peer computes byte-identical state, so the network carries inputs only and verification reduces to comparing a hash. On that foundation each peer keeps two timelines over the same tick axis: a Verified chain (ticks where every player's real input is known — immutable) and a Predicted chain (ticks run ahead using guessed remote input — provisional). Like CPU branch prediction, the simulation advances immediately on predicted input instead of waiting; when a real input contradicts a guess, the engine restores a snapshot and re-simulates (rollback), which is cheap precisely because state is a pure function of inputs. Input delay and adaptive timing buffers minimize how often that happens, and when determinism genuinely breaks, a graded recovery ladder (hash check → rollback → full-state resync → corrective reset) restores agreement. The same machinery serves both P2P lockstep (peers hold equal authority) and Server-Driven (the server owns the verified chain). Full rationale: Docs/SynchronizationDesign.md.


Key Features

Area Contents
Network Models P2P Lockstep · Rollback + Client Prediction · Server-Driven (Authoritative) · Dedicated Server · Spectator · Late Join · Reconnect
Deterministic Math FP64 (32.32 fixed-point) · FPVector2/3/4 · FPQuaternion · FPMatrix · LUT/CORDIC-based trigonometry · DeterministicRandom (Xorshift128+)
Physics FPPhysicsWorld · Broadphase (SpatialGrid) · Narrowphase · CCD (Sweep) · Constraint Solver · Joints · Triggers · Static BVH
Navigation FPNavMesh · A* (triangle graph) · Funnel (SSFA) · ORCA avoidance · ECS-integrated NavAgentComponent
ECS Sparse-set ComponentStorage<T> · Frame (single byte[] heap) · FilterWithout/Filter<T1..T5> · FrameRingBuffer · SystemRunner
Serialization / Source Generator SpanWriter/Reader (ref struct, GC-free) · automatic code generation via [KlothoComponent] / [KlothoSerializable] / [KlothoDataAsset]
Data Assets IDataAsset · DataAssetRegistry · DataAssetRef · JSON serialization (xpTURN.Klotho.DataAsset.Json)
Replay Record / playback / seek / variable speed · LZ4 compression (K4os.Compression.LZ4)
Verification Tools SyncTestRunner (GGPO-style determinism verification) · DeterminismVerificationRunner · benchmark suite
Unity Integration USimulationConfig · USessionConfig · View layer (EntityViewFactory / EntityViewUpdater / EntityView, BindBehaviour / ViewFlags, VerifiedFrameInterpolator) · KlothoSessionDriver (MonoBehaviour) · KlothoConnectionAsync (UniTask)
Godot Integration GodotSimulationConfig · GodotSessionConfig (Resource) · View layer (EntityViewFactory / EntityViewUpdaterNode / EntityViewNode, VerifiedFrameInterpolator) · GodotSessionDriver (Node) · GodotConnectionAsync (Task) · GodotDebugSink / GodotLogSink

Suitable Genres

Genres that benefit most from Klotho's deterministic simulation features.

Best Fit (core targets)

  • Fighting games — frame-perfect inputs + rollback netcode
  • Platform fighters / arena brawlers
  • 2–4 player PvP action — optimal for small-roster P2P rollback
  • Tactics / turn-based SRPG — determinism + replay + sync verification
  • Real-time strategy (RTS) — lockstep frame sync
  • MOBA / top-down arena — ECS, physics, and navigation all included
  • Twin-stick shooters / co-op shooters — deterministic physics + ORCA avoidance
  • Auto-battlers — deterministic simulation + shareable replays

Good Fit (structurally well-suited)

  • Roguelike / roguelite (PvE co-op) — deterministic RNG (Xorshift128+) for shared seeds and replays
  • Card / board / deckbuilder PvP — low input volume, strong verification and replay
  • Puzzle PvP / falling-block versus
  • Racing (small scale) — fixed-point physics guarantees determinism for small grids
  • Top-down survival action

Architecture Overview

┌─────────────────────────────────────────────────────────────┐
│                    Game Application                         │
│   (ISimulation impl: EcsSimulation or custom Simulation)    │
└───────────────────────────┬─────────────────────────────────┘
                            │
         ┌──────────────────┼──────────────────┐
         ▼                  ▼                  ▼
  ┌───────────────┐   ┌──────────────┐   ┌────────────────────┐
  │ KlothoEngine  │   │ ReplaySystem │   │KlothoNetworkService│
  │ (orchestrator)│◄  │ (record/play)│   │                    │
  └──────┬────────┘   └──────────────┘   └─────────┬──────────┘
         │                                         │
    ┌────┴────┐                              ┌─────┴──────┐
    ▼         ▼                              ▼            ▼
 ISimulation  InputBuffer               INetworkTransport  NetworkMessages
    │
    ├── (ECS) Frame — EntityManager + ComponentStorage[]
    ├── SystemRunner — ISystem[]
    ├── FrameRingBuffer (snapshots / rollback)
    └── DataAssetRegistry

Three-layer separation:

  • Klotho engine layer — Pure C#, engine-independent (no UnityEngine / Godot references). The same binary runs under the Unity and Godot (.NET) adapters and on the server side (.NET console / ASP.NET).
  • Simulation transport layer — UDP transport over the INetworkTransport abstraction (Input / InputAck / SyncCheck / Handshake). LiteNetLib is provided as the default reference implementation; replaceable with any other library.
  • Game service layer — Lobby / matchmaking / authentication (external gRPC, etc.; integrated outside this project).

Tech Stack

  • Unity 2022.3+ — scripting backends: Mono / IL2CPP (AOT-safe; serialization via source generation, no runtime codegen/reflection)
  • Godot 4.4+ (mono / .NET, net8.0) — the Godot adapter ships as addons/klotho/ (prebuilt core DLL + adapter source). See Installation — Godot.
  • C# language level — Unity targets C# 8.0 with the xpTURN.Polyfill package supplying the runtime-attribute shims required by C# 11; the Godot adapter is net8.0 / LangVersion latest and needs no polyfill (native init / required).
  • UniTask — async on Unity only (Cysharp). The Godot adapter uses the standard library Task — no UniTask dependency.
  • xpTURN.Klotho.Logging (IKLogger) — in-house structured logging (no external logging dependency). Optional MEL interop via the Plugins~/Logging.Mel sample adapter (Microsoft.Extensions.Logging.Abstractions DLL is consumer-provided).
  • LiteNetLib — default reference implementation for UDP transport (MIT, pure C#). On Unity it is vendored as source under Runtime/ThirdParty/LiteNetLib.v2.1.4; on Godot it arrives as the NuGet package LiteNetLib 2.1.4. The transport layer is abstracted via INetworkTransport and is replaceable.
  • Newtonsoft.Json — DataAsset JSON serialization (Unity: com.unity.nuget.newtonsoft-json · Godot: NuGet Newtonsoft.Json 13.0.3)
  • K4os.Compression.LZ4 — replay compression (Unity: vendored under Runtime/ThirdParty/ · Godot: NuGet K4os.Compression.LZ4 1.3.8)

Details: Docs/BaseLibraries.md


Installation

Klotho installs differently per engine — follow the matching guide. Each covers the client first, then the optional dedicated server (a plain .NET host on the shared engine-agnostic core):

  • Installation — Unity — UPM git URLs + Polyfill activation, then Server~ project references for a dedicated server.
  • Installation — Godot (.NET) — the addons/klotho/ folder + a one-line Klotho.props import, then the (engine-agnostic) dedicated server.

The in-repo projects under Samples/ double as install references — see the Documentation Map for per-sample walkthroughs.


Repository Layout

Klotho lives at the repository top level under com.xpturn.klotho/. Unity consumers install the package via UPM; Godot consumers use the Godot~/ adapter packaged as an addons/klotho/ folder (see Installation). The in-repo Unity samples consume the package through a file: manifest reference to the same top-level package.

<repo root>/
├── README.md  ·  CHANGELOG.md  ·  LICENSE
├── com.xpturn.klotho/             ← ★ framework package
│   ├── package.json
│   ├── Runtime/                   engine-agnostic core + Unity adapter
│   │   ├── Core/                  engine · session · network
│   │   ├── Logging/               IKLogger (in-house)
│   │   ├── Gameplay/              built-in components / systems
│   │   ├── Diagnostics/           fault injection · metrics
│   │   ├── Input/                 input buffer / predictor
│   │   ├── Network/               transport · server · spectator
│   │   ├── State/                 snapshot manager
│   │   ├── Serialization/         SpanWriter/Reader
│   │   ├── Replay/                record / playback (LZ4)
│   │   ├── ECS/                   Frame · components · systems
│   │   ├── Deterministic/         FP64 · physics · navigation
│   │   ├── Unity/                 Unity adapter
│   │   ├── LiteNetLib/            UDP transport
│   │   └── ThirdParty/            vendored deps
│   ├── Godot~/                    Godot (.NET) adapter
│   ├── Editor/                    Unity-only editor tools
│   ├── Plugins/Analyzers/         source generator
│   ├── Prefabs/                   debug prefabs (Unity)
│   ├── Plugins~/Logging.Mel/      MEL interop sample
│   └── Server~/                   dedicated-server projects
│
├── Samples/                       ← standalone samples
│   ├── Brawler/                   4-player fighter (Unity)
│   ├── P2pSample/                 minimal P2P (Unity)
│   ├── SdSample/                  minimal Server-Driven (Unity)
│   ├── GodotP2pSample/            minimal P2P (Godot)
│   ├── GodotSdSample/             minimal Server-Driven (Godot)
│   └── LoggingMelConsole/         .NET logging sample
│
├── Docs/                          ← documentation
└── Tools/                         ← .NET tooling (internal)
    ├── KlothoGenerator/           source generator
    ├── KlothoGenerator.Tests/     generator tests
    ├── DeterminismVerification/   determinism verifier
    ├── PhysicsDeterminismProbe/   FP determinism probe
    └── gen.sh                     generator build script

Quick Start

The four-step path — define a component → implement a system → wire callbacks → create & drive a session — is the same shape on both engines, but the session-driving and view layers are engine-specific. Pick the matching walkthrough (each is self-contained, with full code):

  • Quick Start — UnityMonoBehaviour controller, KlothoSessionDriver, ScriptableObject configs, UniTask joins, EntityViewFactory / EntityViewUpdater / EntityView.
  • Quick Start — Godot (.NET)Node controller, GodotSessionDriver (_Process), Resource configs, standard Task joins, EntityViewNode / EntityViewUpdaterNode (.tscn).

Steps 1–3 (component / system / callbacks) are engine-agnostic core; KlothoSessionFlow exposes the same entry points (StartHostAndListen / JoinP2PAsync / JoinServerDrivenAsync / ReconnectAsync / SpectateAsync / StartReplayFromFile) on both — Unity wraps the async ones in UniTask, Godot in standard Task. Session creation is observed through the single IKlothoSessionObserver.OnSessionCreated(session, SessionEntryKind kind) — branch on kind, not simCfg.Mode.

Detailed guides: Docs/GameDevWorkflow.md, Docs/GameDevAPI.md


Sample

Samples/Brawler — a 4-player fighting-game sample

  • ECS-based combat / movement / skills / cooldowns / knockback / items / traps
  • HFSM-based bot AI (BotHFSMRoot / BotActions / BotDecisions)
  • Camera integration with Unity Cinemachine
  • Supports both P2P and ServerDriven modes
  • LZ4-compressed replay record / playback

Docs: Docs/Samples/Brawler.md


Documentation Map

Document Contents
Docs/Installation.Unity.md · Docs/Installation.Godot.md Engine-specific install (client + dedicated server)
Docs/QuickStart.Unity.md · Docs/QuickStart.Godot.md Engine-specific 5-step quick starts (component → system → callbacks → session → view)
Docs/FEATURES.md Full feature list
Docs/Specification.md Engine specification (state machines · configuration · events · message protocol · formats)
Docs/SynchronizationDesign.md Synchronization design direction (determinism · two-chain model · prediction/rollback · timing · authority models · recovery ladder)
Docs/GameDevWorkflow.md Game-developer workflow (step-by-step)
Docs/GameDevAPI.md Game-developer API status
Docs/SimulationConfigGuide.md SimulationConfig recommended-value guide (per genre / platform)
Docs/BaseLibraries.md List of base libraries used
Docs/Navigation.md Deterministic navigation (FPNavMesh · A* · Funnel · ORCA)
Docs/Samples/ Sample walkthroughs — Brawler, P2pSample, SdSample
Docs/Samples/GodotSdSample.md · Docs/Samples/GodotP2pSample.md Godot (.NET) sample walkthroughs (architecture + Godot-specific gotchas)

Design Principles

  • Determinism first — no float; all simulation state is FP64 / integer / bool
  • Zero-GC oriented — ref struct, object pools, cached fields, no LINQ
  • Engine independence — the core is pure C# (no UnityEngine / Godot references); engine integration (Unity / Godot) lives in adapter layers on top of the shared core
  • Minimal bandwidth — only inputs (commands) are sent; no state synchronization (only hash verification)
  • Layer separation — strict separation between simulation callbacks (deterministic) and view callbacks (non-deterministic)

Klotho — Deterministic multiplayer netcode for Godot (.NET)

Engine-agnostic, pure C# deterministic simulation for rollback, lockstep, and
server-authoritative multiplayer. Determinism is built on 32.32 fixed-point math
(FP64) and a seeded RNG: given the same inputs, every peer computes identical
state — so the network sends inputs only and verifies with a hash. Frame-perfect
and cross-platform reproducible.


REQUIRES

- Godot 4.4+ with .NET (mono) support
- A C# (.NET 8) game project


FEATURES

- Netcode: P2P lockstep, rollback + client prediction, server-driven
(authoritative), dedicated server, spectator, late join, reconnect
- Deterministic core: FP64 fixed-point math, vectors / quaternions / matrices,
seeded RNG (Xorshift128+)
- ECS: sparse-set components, zero-GC frame, snapshot + rollback ring buffer
- Deterministic physics: rigid bodies, collisions, CCD, joints, triggers, static BVH
- Deterministic navigation: navmesh + A* + funnel + ORCA avoidance
- Replay: record / playback / seek / variable speed (LZ4 compressed)
- Source generator: serialization + component / command registration
- Godot adapter: Node session driver + view nodes, Resource config assets,
Task-based join helpers, console + rolling-file logging


INSTALL & SETUP

1. Install from the Asset Library (or copy the folder) so that the addon sits at
res://addons/klotho/.

2. Add one line to your game .csproj:



3. Build the C# solution (dotnet build, or the Godot editor's Build button).
- NuGet deps (Newtonsoft.Json, K4os.Compression.LZ4, LiteNetLib) restore
automatically via Klotho.props.

4. (Optional) Project > Project Settings > Plugins: enable "Klotho" for the
DataAsset JSON -> bytes editor tool. Build the project once before enabling.


DEDICATED SERVER (optional)

The server is a plain .NET 8 console app with no Godot dependency, running the
same core. In a separate server .csproj add:




LINKS

- Source & docs: https://github.com/xpTURN/Klotho
- Quick start (Godot): Docs/QuickStart.Godot.md
- Install guide (Godot): Docs/Installation.Godot.md

Reviews

0 ratings

Your Rating

Headline must be at least 3 characters but not more than 50
Review must be at least 5 characters but not more than 500
Please sign in to add a review

Quick Information

0 ratings
Klotho — Deterministic multiplayer for Godot(.NET) icon image
xpTURN
Klotho — Deterministic multiplayer for Godot(.NET)

Klotho — Deterministic multiplayer netcode for Godot (.NET)Engine-agnostic, pure C# deterministic simulation for rollback, lockstep, andserver-authoritative multiplayer. Determinism is built on 32.32 fixed-point math(FP64) and a seeded RNG: given the same inputs, every peer computes identicalstate — so the network sends inputs only and verifies with a hash. Frame-perfectand cross-platform reproducible.REQUIRES- Godot 4.4+ with .NET (mono) support- A C# (.NET 8) game projectFEATURES- Netcode: P2P lockstep, rollback + client prediction, server-driven (authoritative), dedicated server, spectator, late join, reconnect- Deterministic core: FP64 fixed-point math, vectors / quaternions / matrices, seeded RNG (Xorshift128+)- ECS: sparse-set components, zero-GC frame, snapshot + rollback ring buffer- Deterministic physics: rigid bodies, collisions, CCD, joints, triggers, static BVH- Deterministic navigation: navmesh + A* + funnel + ORCA avoidance- Replay: record / playback / seek / variable speed (LZ4 compressed)- Source generator: serialization + component / command registration- Godot adapter: Node session driver + view nodes, Resource config assets, Task-based join helpers, console + rolling-file loggingINSTALL & SETUP1. Install from the Asset Library (or copy the folder) so that the addon sits at res://addons/klotho/.2. Add one line to your game .csproj: <Import Project="addons/klotho/Klotho.props" />3. Build the C# solution (dotnet build, or the Godot editor's Build button). - NuGet deps (Newtonsoft.Json, K4os.Compression.LZ4, LiteNetLib) restore automatically via Klotho.props.4. (Optional) Project > Project Settings > Plugins: enable "Klotho" for the DataAsset JSON -> bytes editor tool. Build the project once before enabling.DEDICATED SERVER (optional)The server is a plain .NET 8 console app with no Godot dependency, running thesame core. In a separate server .csproj add: <Import Project="addons/klotho/Klotho.Server.props" />LINKS- Source & docs: https://github.com/xpTURN/Klotho- Quick start (Godot): Docs/QuickStart.Godot.md- Install guide (Godot): Docs/Installation.Godot.md

Supported Engine Version
4.4
Version String
0.2.11
License Version
Apache-2.0
Support Level
community
Modified Date
10 hours ago
Git URL
Issue URL

Open Source

Released under the AGPLv3 license

Plug and Play

Browse assets directly from Godot

Community Driven

Created by developers for developers