Table of Contents

Method WaitForStableGroundAt

Namespace
GrindFest
Assembly
GrindFest.dll

WaitForStableGroundAt(Vector3, int, float)

Wait until the terrain at this position has STOPPED MOVING - not merely until it exists.

protected IEnumerator WaitForStableGroundAt(Vector3 worldPos, int stableSamples = 3, float timeout = 3)

Parameters

worldPos Vector3
stableSamples int
timeout float

Returns

IEnumerator

Remarks

MapMagic switches a tile's LOD asynchronously and its own IsGenerating() deliberately does not report that: TerrainTile.cs:71 carries the author's note that switchLodCoroutine "shouldn't be added to coroutines list (otherwise IsGenerating return true)". So the collider under a spot can still be replaced after every "terrain is ready" gate has passed, and whatever is resting on it falls through the gap.

Measured 2026-09-20 in a WebGL player: a planter pot placed on ground y=11.37 was 27 m lower 0.8 s later, and at the suite's 3x timeScale 0.8 s is 2.4 game-seconds - i.e. exactly free fall, nothing stopped it. The same build passed the test on other runs, which is the signature of a swap that happens only sometimes.

Best-effort, deliberately short: the gate cannot prevent the swap, only avoid placing INTO one, and the real protection is PlaceItemOnGround(ItemBehaviour, Vector3, string) parking the item kinematic. Measured 2026-09-20 in a full WebGL run: it timed out twice in four farming placements (the ground under that spot genuinely keeps moving), and 10 s each was 20 s of a run whose budget is already tight - hence the 3 s.