Skip to content

[Bug] Spawning a CapturePointPrefab poisons the server: every subsequent client join dies #393

Description

@Powback

Reproduced twice on live-ebx. Severity is higher than it first looks: one bad spawn breaks the session for everyone who joins afterwards, and it presents as an unrelated join failure long after the spawn.

Repro

  1. Join, enter the editor.
  2. Spawn Gameplay/Level_Setups/Components/CapturePointPrefab_HQ (from the blueprint list). The spawn itself appears to succeed; the server stays up.
  3. The spawning client dies shortly after.
  4. Restart/relaunch the client and join again — it connects, then dies ~23 s later, before reaching the editor. It never gets far enough to spawn anything.
  5. Restart the server → clients join fine again and the full e2e suite is 8/8.

So the object persists in the server's state and takes down every client that subsequently receives it.

Notes

  • No crash dump is written, and there is no Lua traceback — the client just goes away.
  • The server is unaffected throughout.
  • Other spawns tested do NOT do this: nongroupable_autogen prefabs, a destruction/nongroupable prefab (×3), a banger blueprint (×2), and SoldierWeaponBlueprint.
  • CapturePointPrefab is a SpatialPrefabBlueprint with NeedNetworkId True and InterfaceHasConnections True, referencing a graph of other blueprints — unlike the simple props above.

Hypothesis (initialisation ordering)

The live-spawn path and the join-sync path are not equivalent:

  • Live spawn — the level is loaded and InstanceParser has populated its blueprint / variation / mesh-variation databases, so CreateEntitiesFromBlueprint runs against fully-initialised state.
  • Join sync — the server replays its objects to a newly connected client, and those spawns can arrive before the client has finished initialising what those blueprints depend on (variations, referenced sub-blueprints, registries). A prefab that references a graph of other blueprints is exactly what would fault under that.

This is the same class of problem the project-load path already handles with completion-gated batching (ME_CONFIG.LOAD_BATCH_SIZE, ServerTransactionManager waiting for BatchDone), but the join-sync path for objects spawned during a session has no equivalent gate.

Worth checking: ServerTransactionManager sync-to-new-client, ClientTransactionManager:OnSyncClientContext, and whether that replay waits for Level:Loaded / InstanceParser readiness on the joining client.

Related

Very likely the same family as #296 / #364 / #2 ("spawning certain prefabs crashes the client"). Note parentRepresentative (#202) is implemented on this branch and does not prevent it.

Warning while debugging

Any such spawn persists server-side, so the next join fails and looks like an unrelated regression. Restart the server between attempts.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions