Architecture Overview (6.0) GridPlacement 6.0 separates Core (pure C#, no engine dependencies) from Godot (engine-specific adapters). This gives you a clean boundary for testing, headless operation, and porting.
The Three Layers 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─────────────────────────────────────────────────────────────────┐
│ Godot Layer (MoonBark.GridPlacement.Godot) │
│ - PlacementContext (Resource) │
│ - PlacementSceneAdapter (Node) │
│ - PlacementInputController (Node) │
│ - Godot Events → ECS Events bridge │
└────────────────────────────┬────────────────────────────────────┘
│ calls
▼
┌─────────────────────────────────────────────────────────────────┐
│ ECS Layer (MoonBark.GridPlacement.ECS) │
│ - PlacementSystem, ManipulationSystem │
│ - Friflo.Engine.ECS Entity/Component │
│ - IEcsPlugin implementation │
└────────────────────────────┬────────────────────────────────────┘
│ uses
▼
┌─────────────────────────────────────────────────────────────────┐
│ Core Layer (MoonBark.GridPlacement.Core) │
│ - PlacementContext (interface) │
│ - IGridOccupancy, ITargetingService │
│ - Pure C#, no Godot dependency │
│ - Runs headless (dedicated server) │
└─────────────────────────────────────────────────────────────────┘
Key Types by Layer Layer Primary Types Purpose Godot PlacementContext, PlacementSceneAdapter, PlacementInputControllerScene wiring, input, visuals ECS PlacementSystem, ManipulationSystem, PlacementExecutionSystemBusiness logic, validation Core IGridOccupancy, ITargetingService, PlacementSettingsInterfaces, configuration
Plugin Architecture Pattern GridPlacement uses the IEcsPlugin pattern for ECS integration:
1
2
3
4
5
6
7
8
9
10
public sealed class GridPlacementEcsPlugin : IEcsPlugin
{
public void RegisterSystems ( EcsWorld world , SystemRunner runner )
{
var placementGroup = new EcsSystemGroup ( "GridPlacement" );
placementGroup . Add ( new PlacementExecutionSystem ( world . Store , eventBus ));
placementGroup . Add ( new ManipulationSystem ( world . Store , eventBus ));
runner . Add ( placementGroup );
}
}
Godot calls plugin.Install(world) and uses ECS types directly. No facade layer.
Multiplayer Topologies GridPlacement supports four topologies:
Topology Description Server Single-player All systems run in one process N/A Listen-server One player is also the host Host process Dedicated server Headless authoritative host Dedicated process Local multiplayer Same device, multiple input sources N/A
The Four Seams (Listen-Server / Dedicated) Seam What Where you code Catalog All peers load same placeable assets Lobby / loading Intent Client → Server: (placeableId, gridPos) RPC call Authority Only host runs placement pipeline Guard with Multiplayer.IsServer() Event Relay Server → All: placement outcome rpc() broadcast
What the Plugin Provides Capability Type Authoritative occupancy IGridOccupancyConflict detection PlacementValidatorHeadless loop PlacementExecutionSystemConcurrent placers OwnerKeyECS events IEcsBackendEventsSave/restore ECS serialization
What the Plugin Does Not Provide Network transport (ENet, WebSocket, Steam, etc.) Lobby / matchmaking Clock synchronization Lag compensation Last Updated : 2026-05-07