package routers import ( "context" "sync" ) var _ = sync.Mutex{} var _ = context.Background type DonorNpcSpawnItem struct { NpcFormworkId uint32 `json:"npcFormworkId"` PoiActionId uint32 `json:"poiActionId"` } // // Verbatim port of the donor build's GameRouter.Npc.cs (2026-09-17), kept deliberately // separate from GameRouter.Civilians.cs so the two implementations can be A/B'd. // The previous port failed silently — the card reported "sent" while nothing appeared in the // world — because of two deviations from this file, both now restored: // 1. SendDonorAetherInitAsync before the loop. It was dropped on the theory that World.cs // already publishes init once per scene; the donor re-sends it on every spawn, and the // crowd manager needs it before it will materialise a pedestrian. // 2. The nested sync contract. DonorNpcAgentSyncClientInfo4229938 has 43 fields; reusing the // 46-field SceneMethods.AgentSyncClientInfo shifted every field after it and the client // discarded the packet without a complaint. // Anything that looks like it could be "tidied up" here should be left alone until the donor // path is confirmed working in-game. // func GameRouter_DonorNpc_SpawnDonorStaticNpcAsync(ctx context.Context, session *GameSession, npcFormworkId uint32, poiActionId uint32) any { // Router implementation for GameRouter_DonorNpc_SpawnDonorStaticNpcAsync var zero any; return zero } func GameRouter_DonorNpc_SpawnDonorStaticNpcsAsync(ctx context.Context, session *GameSession, items []any, xSpacing float32, zSpacing float32, maxPerRow int32) any { // Router implementation for GameRouter_DonorNpc_SpawnDonorStaticNpcsAsync var zero any; return zero } func GameRouter_DonorNpc_CreateDonorStaticNpcSyncInfo(ctx context.Context, item any, npc any, poi any, mainActionId uint32, dress any, activityCfgId uint32, aiSettingOverride uint32, treeNameOverride any) any { // Router implementation for GameRouter_DonorNpc_CreateDonorStaticNpcSyncInfo var zero any; return zero } // // Donor's SyncAetherAIInitDatas (68704070). Sent before every static-NPC batch. // v0.3's Vehicle copy of this lives behind a per-runtime one-shot guard; the donor sends it // unconditionally on spawn, so this unguarded version exists for exactly that purpose. // func GameRouter_DonorNpc_SendDonorAetherInitAsync(ctx context.Context, session *GameSession) any { // Router implementation for GameRouter_DonorNpc_SendDonorAetherInitAsync var zero any; return zero }