/c local keep_spamming = true local function reached(event) game.print(event.tick.." reached "..event.waypoint_index) local waypoint_index = event.waypoint_index local player = game.get_player(event.player_index) --[[are we still in the cutscene controller when event is raised? probably, but double-checking]] if player.controller_type == defines.controllers.cutscene then --[[note: this could break another cutscene e.g. a new cutscene could have valid index N+1]] --[[cancelling a cutscene would raise event, any way to detect a new cutscene being assigned?]] local succeeded, message = pcall( function(index) return player.jump_to_cutscene_waypoint(index) end, waypoint_index + 1 ) if not succeeded then --[[next waypoint does not exist]] game.print(event.tick.." next waypoint did not exist: "..tostring(message)) end else game.print(event.tick.." controller was not defines.controllers.cutscene") end end local function cancelled(event) game.print(event.tick.." cancelled") end script.on_event(defines.events.on_cutscene_waypoint_reached, reached) script.on_event(defines.events.on_cutscene_cancelled, cancelled) local waypoints = {} for _=1,5 do table.insert(waypoints, { position = {10*math.random(), 10*math.random()}, transition_time = 1 * 60, time_to_wait = 0 * 60, }) end local args = { type = defines.controllers.cutscene, waypoints = waypoints, start_position = {0,0}, } if not keep_spamming then args.final_transition_time = 2*60 end game.player.set_controller(args)