diff --git a/src/assets/delete-project-asset.ts b/src/assets/delete-project-asset.ts index 69f6cbe1..1936aeab 100644 --- a/src/assets/delete-project-asset.ts +++ b/src/assets/delete-project-asset.ts @@ -22,6 +22,7 @@ function removeInvalidatedInteractionLinks( return silencedSoundEmitterIds.has(link.action.targetSoundEmitterId); case "control": switch (link.action.effect.type) { + case "setProjectTimePaused": case "setActorPresence": case "playActorAnimation": case "followActorPath": diff --git a/src/runtime-three/runtime-project-scheduler.ts b/src/runtime-three/runtime-project-scheduler.ts index c044fb04..8f911c39 100644 --- a/src/runtime-three/runtime-project-scheduler.ts +++ b/src/runtime-three/runtime-project-scheduler.ts @@ -613,6 +613,10 @@ function cloneDiscreteStateAsEffect( state: RuntimeResolvedControlState["discrete"][number] ): ControlEffect { switch (state.type) { + case "projectTimePaused": + throw new Error( + "Project time pause is intentionally not cloned into scheduler routine effects because pausing the scheduler clock would deadlock time progression." + ); case "actorPresence": return createSetActorPresenceControlEffect({ target: state.target, diff --git a/src/scheduler/project-schedule-control-options.ts b/src/scheduler/project-schedule-control-options.ts index 73e94467..20a08f2f 100644 --- a/src/scheduler/project-schedule-control-options.ts +++ b/src/scheduler/project-schedule-control-options.ts @@ -534,6 +534,10 @@ export function getProjectScheduleEffectOptionId( effect: ControlEffect ): ProjectScheduleEffectOptionId { switch (effect.type) { + case "setProjectTimePaused": + throw new Error( + "Project time pause is intentionally not exposed in the schedule editor because a scheduler routine cannot safely pause its own project clock." + ); case "setActorPresence": return effect.active ? "actor.present" : "actor.hidden"; case "playActorAnimation":