Multiplayer
Multiplayer copied to clipboard
Patch for UndercaveMapComponent (pit gate)
Info on UndercaveMapComponent:MapComponentTick
and why it needs patching:
- RNG calls after current map/visible camera area checks
- Majority of the RNG calls are visual/audio effects only
-
TriggerCollapseFX
does have an effect on simulation by spawning collapsed mountain roof- The collapsing rocks have minimal impact on the game, as they avoid player pawns
Fixing RNG is easy by just pushing/popping the state.
Fixing the collapsed mountain roof is more complex. Possible solutions:
- Disable rock collapse completely
- Disable current map checks (suboptimal for performance)
- Disable the existing calls to
TriggerCollapseFX
and call it in a deterministic way (used in this PR)
Information about the patch:
- The transpiler will make the call to
Rand.MTBEventOccurs
always fail, making soTriggerCollapseFX
is never called- This could be further improved by removing the RNG call and the current map check altogether to improve performance, but would be more complex
- The prefix and postfix push/pop RNG state, making sure the ticking code doesn't mess with the RNG state
- The postfix re-implements the call to
TriggerCollapseFX
in a deterministic way- If the current player is not looking at the current map, it will be called with
0
as both arguments to prevent additional effects from triggering - The call to the method is surrounded by RNG push/pop state, as the amount of RNG calls will differ if the player is not looking at the map
- It's safe as the simulation-affecting RNG calls happen first, followed by RNG calls that don't affect simulation and may be called a different amount of times
- The call is currently unseeded, but could be easily seeded with
Gen.HashCombineInt(Find.TickManager.TicksGame, __instance.map.uniqueID)
if we care about having a seed here
- If the current player is not looking at the current map, it will be called with
Remaining issues with UndercaveMapComponent
/Pit Gate:
- The rock collapse has additional check to not drop rocks on player faction pawns. However, I assume this won't work properly with Multifaction, which could end up crushing pawns of some players.