What was the issue?
The SimAntics Exception we were seeing:

Object reference not set to an instance of an object.VMScheduler.cs:line 36
was occurring because ent.Thread was null when ScheduleTick() was called.

The Beach Blanket (“Tranquility Picnic Basket”) is a Multitile Master object. While executing the Init logic, it most likely interacted with its child parts (or itself) and attempted to yield or schedule a tick (using the Wait for Notify primitive, which defers execution). However, the target entity didn’t have an active thread assigned at that moment (it might not have been started yet, or it had already terminated), causing the crash when the engine tried to record its ScheduleIdleEnd.

What fixed it?

We modified TSOClient\tso.simantics\Engine\VMScheduler.cs to add a null check for ent.Thread before modifying its properties.

This safely allows entities that don’t have an active thread to still be queued for tick execution without throwing a NullReferenceException. I made similar safety patches to ScheduleCurrentTick as well, to prevent similar crashes down the line.

    public void ScheduleTick(VMEntity ent, uint tick)
    {
        if (ent.Dead) return;
        List<VMEntity> targEnts;
        if (!TickSchedule.TryGetValue(tick, out targEnts))
        {
            targEnts = new List<VMEntity>();
            TickSchedule[tick] = targEnts;
        }
        if (ent.Thread != null) ent.Thread.ScheduleIdleEnd = tick;
        VM.AddToObjList(targEnts, ent);
    }

    public void ScheduleCurrentTick(VMEntity ent)
    {
        if (ent.Thread != null) ent.Thread.ScheduleIdleEnd = CurrentTickID;
        VM.AddToObjList(TickThisFrame, ent);
    }