Repository navigation
v0.19.0
What's Changed
Deferred evaluation (#83, #84, #86)
Handlers no longer call evaluateTransports(), tryAssignWorkers(), or evaluateDanglingItems() synchronously inline. Instead, dirty flags are set and evaluations are batched at the end of handle() via processDeferredEvaluations().
This prevents cascading hook dispatch where a single game call (e.g., storeCompleted) could trigger multiple hooks before returning — most notably the bug where a worker was immediately reassigned to transport from the same EOS it just stored to.
Priority order is preserved: dangling items > worker assignment > transports.
Suppress transport_cancelled on entity destruction (#85, #87)
cancelWorkerTransport now accepts a skip_hooks parameter. When called from handleWorkerRemoved, hooks are suppressed since the entity is being destroyed and game-side listeners cannot safely mutate it. All state cleanup (reservations, transport tracking) still occurs.