You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Doors and other contextual interactions work intermittently.
Reading main (84cbb97), the district has no interaction RPC surface at all — no handler, no field index, no decoder branch. Whatever the client currently does with a door is unacknowledged local prediction. The intermittency is separately explained by the decoder aborting a bunch on any unknown field (#20).
There is no interaction handling
A repo-wide search for ServerUse, cDoor, Usable, InteractableActor, ServerInteract, UseKey, ClientDoor returns zero matches across the whole tree. A search for any field constant matching kField*(Use|Door|Interact|Trigger)* likewise returns none.
The complete handled-field vocabulary is declared in one block, DistrictServer/DistrictServer.cpp:2600-2674, and it is worth reading as a whole because it shows precisely where the boundary sits:
player state and pawn: PRI 21, Pawn 22, GivePawn 39, ClientRestart 74, ClientSetViewTarget 76, ControllerDead 185
inventory containers: HoldableItemManager 164, Inventory 165, and the storage ranges under kStorageInventoryFieldMax = 3594
Nothing in that list concerns world interaction. So a ServerUse-equivalent arriving from the client is not mishandled — it is unmeasurable (its parameter width is not in the decoder's table) and therefore aborts the rest of its bunch.
What "intermittently" most likely means
Because the decoder's unknown-field path stops parsing and returns success (ApbUdp.cpp:3478-3494, see #20), an interaction RPC batched ahead of, say, a movement or streaming RPC will silently take that RPC with it. Nothing is logged. The resulting behaviour is frame-dependent and would present as flaky rather than absent — consistent with the README wording, and with the README already listing "Doors and contextual interactions" under Experimental rather than Working.
This is a hypothesis about the symptom, not a measurement: no live-client session was run for this report.
Suggested direction
The decoder fix is the prerequisite, not an optional first step — without it there is no way to learn the field index.
Confirm the index against the client's FClassNetCache for the controller (kPlayerControllerFieldMax = 634 is already the established bound for this build, :2600), so the number can be named rather than guessed.
Measure the parameter width from the capture and add a decoder branch in the established style. If the parameter is an object reference, the ServerSelectSpawnZone branch (ApbUdp.cpp:3305-3350) is the pattern to copy — it already handles the presence bit plus the by-channel/by-NetIndex selector split.
Only then decide what the server does with it. Doors are likely to need a replicated actor state and a client-side confirmation RPC, which is a larger piece of work than the parse.
Steps 1-3 are cheap and produce durable protocol knowledge regardless of when step 4 is tackled.
Line numbers are from 84cbb97. The absence of interaction handling is a clean, repo-wide negative; the causal link to the reported intermittency is reasoned from the decoder's control flow rather than observed.
The README lists this under known issues:
Reading
main(84cbb97), the district has no interaction RPC surface at all — no handler, no field index, no decoder branch. Whatever the client currently does with a door is unacknowledged local prediction. The intermittency is separately explained by the decoder aborting a bunch on any unknown field (#20).There is no interaction handling
A repo-wide search for
ServerUse,cDoor,Usable,InteractableActor,ServerInteract,UseKey,ClientDoorreturns zero matches across the whole tree. A search for any field constant matchingkField*(Use|Door|Interact|Trigger)*likewise returns none.The complete handled-field vocabulary is declared in one block,
DistrictServer/DistrictServer.cpp:2600-2674, and it is worth reading as a whole because it shows precisely where the boundary sits:kStorageInventoryFieldMax = 3594Nothing in that list concerns world interaction. So a
ServerUse-equivalent arriving from the client is not mishandled — it is unmeasurable (its parameter width is not in the decoder's table) and therefore aborts the rest of its bunch.What "intermittently" most likely means
Because the decoder's unknown-field path stops parsing and returns success (
ApbUdp.cpp:3478-3494, see #20), an interaction RPC batched ahead of, say, a movement or streaming RPC will silently take that RPC with it. Nothing is logged. The resulting behaviour is frame-dependent and would present as flaky rather than absent — consistent with the README wording, and with the README already listing "Doors and contextual interactions" under Experimental rather than Working.This is a hypothesis about the symptom, not a measurement: no live-client session was run for this report.
Suggested direction
The decoder fix is the prerequisite, not an optional first step — without it there is no way to learn the field index.
FClassNetCachefor the controller (kPlayerControllerFieldMax = 634is already the established bound for this build,:2600), so the number can be named rather than guessed.ServerSelectSpawnZonebranch (ApbUdp.cpp:3305-3350) is the pattern to copy — it already handles the presence bit plus the by-channel/by-NetIndex selector split.Steps 1-3 are cheap and produce durable protocol knowledge regardless of when step 4 is tackled.
Line numbers are from
84cbb97. The absence of interaction handling is a clean, repo-wide negative; the causal link to the reported intermittency is reasoned from the decoder's control flow rather than observed.