USING "script_clock.sch" USING "cutscene_public.sch" USING "commands_recording.sch" USING "script_misc.sch" ///PURPOSE: Configure a timelapse settings struct with custom settings for a custom timelapse cutscene. /// PROC SETUP_TIMELAPSE_DATA(structTimelapseSettings &sSettings, INT iStartHour, INT iEndHour, VECTOR vCamPos1, VECTOR vCamRot1, VECTOR vCamPos2, VECTOR vCamRot2, FLOAT fCamFOV, INT iCamTransitionTime, STRING strWeather, STRING strCloudHat, BOOL bSkipToNight = FALSE, INT iCustomBehaviour = -1) sSettings.iLapseStartHour = iStartHour sSettings.iLapseEndHour = iEndHour sSettings.vCamPos1 = vCamPos1 sSettings.vCamRot1 = vCamRot1 sSettings.vCamPos2 = vCamPos2 sSettings.vCamRot2 = vCamRot2 sSettings.fCamFOV = fCamFOV sSettings.iCamTime = iCamTransitionTime sSettings.tWeatherType = strWeather sSettings.tCloudHat = strCloudHat sSettings.bSkipToNight = bSkipToNight sSettings.iCustomBehaviour = iCustomBehaviour ENDPROC //PURPOSE: Starts or stops a cutscene. If TRUE is passed timera() is set to Zero PROC SET_TODS_CUTSCENE_RUNNING(structTimelapse &sTimelapse, BOOL isRunning, BOOL doGameCamInterp = FALSE, INT durationFromInterp = 2000, BOOL turnOffGadgets = TRUE, BOOL bResetTime = TRUE, BOOL bResetCatchTime = FALSE, BOOL bRemovePlayersHelmet = TRUE) DEBUG_PRINTCALLSTACK() IF turnOffGadgets = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), IS_PLAYER_CONTROL_ON(PLAYER_ID()), SPC_DEACTIVATE_GADGETS) ENDIF IF NOT IS_CUTSCENE_PLAYING() SET_PLAYER_CONTROL(PLAYER_ID(), (NOT isRunning)) ENDIF //Clear ped helmets #1528518 IF bRemovePlayersHelmet IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE) ENDIF ENDIF IF (NOT isRunning) AND (bResetCatchTime) STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP() ELSE RENDER_SCRIPT_CAMS(isRunning, doGameCamInterp, durationFromInterp) ENDIF IF isRunning CPRINTLN(DEBUG_SYSTEM, " Timelapse set running by script [", GET_THIS_SCRIPT_NAME(), "]. Start:", sTimelapse.iTimeWindowStart, " End:", sTimelapse.iTimeWindowEnd) CLEAR_HELP() ELSE CPRINTLN(DEBUG_SYSTEM, " Timelapse cleanup triggered by script [", GET_THIS_SCRIPT_NAME(), "].") IF DOES_CAM_EXIST(sTimelapse.splineCamera) IF IS_CAM_ACTIVE(sTimelapse.splineCamera) SET_CAM_ACTIVE(sTimelapse.splineCamera, FALSE) CPRINTLN(DEBUG_SYSTEM, " Camera deactivated as timelapse cleans up.") ENDIF DESTROY_CAM(sTimelapse.splineCamera, TRUE) CPRINTLN(DEBUG_SYSTEM, " Camera destroyed as timelapse cleans up.") ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CPRINTLN(DEBUG_SYSTEM, " Unhiding player as TOD camera deactivates.") SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) ENDIF VEHICLE_INDEX vehPlayerLast = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(vehPlayerLast) CPRINTLN(DEBUG_SYSTEM, " Unhiding player's last vehicle as TOD camera deactivates.") SET_ENTITY_VISIBLE(vehPlayerLast, TRUE) ENDIF RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") IF IS_AUDIO_SCENE_ACTIVE("TOD_SHIFT_SCENE") STOP_SOUND(sTimelapse.iSplineStageSound) RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") STOP_AUDIO_SCENE("TOD_SHIFT_SCENE") CPRINTLN(DEBUG_SYSTEM, " Audio scene \"TOD_SHIFT_SCENE\" active in ", GET_THIS_SCRIPT_NAME(), ".") ENDIF ENDIF //CLEAR_HELP(TRUE) SET_SCRIPTS_SAFE_FOR_CUTSCENE(isRunning,DEFAULT,FALSE) FLUSH_TEXT_MESSAGE_FEED_ENTRIES() IF NOT isRunning AND bResetTime IF sTimelapse.bSkipToNightTime CPRINTLN(DEBUG_SYSTEM, " Resetting to start time ", sTimelapse.iTimeWindowStart, ":00 as timelapse cleans up.") SET_CLOCK_TIME(sTimelapse.iTimeWindowStart, 00, 00) ELSE CPRINTLN(DEBUG_SYSTEM, " Resetting to end time ", sTimelapse.iTimeWindowEnd, ":00 as timelapse cleans up.") SET_CLOCK_TIME(sTimelapse.iTimeWindowEnd, 00, 00) ENDIF ENDIF IF NOT isRunning IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME_SHORT) ENDIF ENDIF // Kenneth R. // Doing a timelapse causes the mission vehgen impound timer to get hit almost instantly // so we need to reset the timestamp. IF NOT isRunning IF g_savedGlobals.sVehicleGenData.eMissionVehTimeStamp != INVALID_TIMEOFDAY g_savedGlobals.sVehicleGenData.eMissionVehTimeStamp = GET_CURRENT_TIMEOFDAY() ENDIF ENDIF ENDPROC FUNC BOOL IS_DAYLIGHT_HOURS() IF IS_TIME_BETWEEN_THESE_HOURS(TODS_SUNSET, TODS_SUNRISE) RETURN FALSE ENDIF RETURN TRUE ENDFUNC FUNC BOOL SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE() IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) RETURN FALSE ENDIF IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN FALSE ENDIF VEHICLE_INDEX VehicleIndex = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF NOT IS_ENTITY_DEAD(VehicleIndex) RETURN FALSE ENDIF SET_VEH_RADIO_STATION(VehicleIndex, "OFF") RETURN TRUE ENDFUNC FUNC BOOL SKIP_TO_TIME_DURING_SPLINE_CAMERA(INT iDestHour, INT iDestMinute, STRING tWeatherType, STRING tCloudHat, structTimelapse &sTimelapse, FLOAT fForceCameraPhase = -1.0, INT iAdditionalHours = 0, BOOL bDoCascadeShadows = TRUE, FLOAT time = 1.0) FLOAT fCameraPhase = -1 INT iSecondsDiff INT iMinutesDiff INT iHoursDiff INT iSecondsToSkipThisFrame TIMEOFDAY sTempTimeOfDay #IF IS_DEBUG_BUILD CONST_INT iDrawLiteralSceneStringRow 3 TEXT_LABEL_63 str DrawLiteralSceneStringInt("iTimeSkipStage:", sTimelapse.iTimeSkipStage, iDrawLiteralSceneStringRow+0) DrawLiteralSceneStringInt("iDestHour:", iDestHour, iDrawLiteralSceneStringRow+1) DrawLiteralSceneStringInt("iDestMinute:", iDestMinute, iDrawLiteralSceneStringRow+2) #ENDIF SWITCH sTimelapse.iTimeSkipStage CASE 0 //Save the starting time of day. sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY() //Work out the ending time of day. sTempTimeOfDay = GET_CURRENT_TIMEOFDAY() SET_TIMEOFDAY_HOUR(sTempTimeOfDay, iDestHour) SET_TIMEOFDAY_MINUTE(sTempTimeOfDay, iDestMinute) SET_TIMEOFDAY_SECOND(sTempTimeOfDay, 0) //Is start time currently after end time? IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(sTimelapse.sStartTimeOfDay, sTempTimeOfDay) //If so we need to add 1 day to end time. ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, 0, 0, 0, 1) ENDIF //Calculate difference between start and end time in seconds. INT iDaysDiff, iWeeksDiff, iMonthsDiff GET_DIFFERENCE_BETWEEN_TIMEOFDAYS(sTimelapse.sStartTimeOfDay, sTempTimeOfDay, iSecondsDiff, iMinutesDiff, iHoursDiff, iDaysDiff, iWeeksDiff, iMonthsDiff) sTimelapse.iSecondsToSkipTotal = iSecondsDiff + (iMinutesDiff*60) + ((iHoursDiff+iAdditionalHours)*3600) ADVANCE_FRIEND_TIMERS(TO_FLOAT(sTimelapse.iSecondsToSkipTotal) / 3600.0) IF bDoCascadeShadows CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6) CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE) CASCADE_SHADOWS_ENABLE_FREEZER(FALSE) //#1439834 ENDIF SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE() sTimelapse.iSplineStageSound = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sTimelapse.iSplineStageSound, "TIME_LAPSE_MASTER") START_AUDIO_SCENE("TOD_SHIFT_SCENE") FLUSH_TEXT_MESSAGE_FEED_ENTRIES() //1296499 sTimelapse.iTimeSkipStage++ BREAK CASE 1 FALLTHRU //BEFORE setting weather and cloud hat CASE 2 //AFTER setting weather and cloud hat IF (DOES_CAM_EXIST(sTimelapse.splineCamera) AND IS_CAM_INTERPOLATING(sTimelapse.splineCamera)) OR NOT (fForceCameraPhase >= 0.99 OR fForceCameraPhase = -1) IF (DOES_CAM_EXIST(sTimelapse.splineCamera) AND IS_CAM_INTERPOLATING(sTimelapse.splineCamera)) fCameraPhase = GET_CAM_SPLINE_PHASE(sTimelapse.splineCamera) ELIF NOT (fForceCameraPhase >= 0.99 OR fForceCameraPhase = -1) fCameraPhase = fForceCameraPhase ELSE fCameraPhase = -1 ENDIF IF fCameraPhase >= 0.5 IF (sTimelapse.iTimeSkipStage = 1) // Set any weather types or cloud hats IF GET_HASH_KEY(tWeatherType) != 0 //#218020 SET_WEATHER_TYPE_OVERTIME_PERSIST(tWeatherType, time) CPRINTLN(DEBUG_SYSTEM, " Setting weather to ", tWeatherType, ".") ENDIF IF GET_HASH_KEY(tCloudHat) != 0 UNLOAD_ALL_CLOUD_HATS() LOAD_CLOUD_HAT(tCloudHat) CPRINTLN(DEBUG_SYSTEM, " Setting cloud hat ", tCloudHat, ".") ENDIF sTimelapse.iTimeSkipStage = 2 ENDIF ENDIF ENDIF // Finished spline so set final time and bail out IF fCameraPhase >= 0.99 OR fCameraPhase = -1 //Work out the time of day we need to jump to this frame. sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, sTimelapse.iSecondsToSkipTotal) #IF IS_DEBUG_BUILD PRINT_TIMEOFDAY(sTempTimeOfDay) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) IF bDoCascadeShadows CASCADE_SHADOWS_INIT_SESSION() ENDIF STOP_SOUND(sTimelapse.iSplineStageSound) RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") // STOP_AUDIO_SCENE("TOD_SHIFT_SCENE") IF bDoCascadeShadows CASCADE_SHADOWS_ENABLE_FREEZER(TRUE) CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) ENDIF RETURN TRUE ENDIF // To make things smoother, dont change time in the first and last 10% of the camera phase // [x-A/B-A] (clamp 0-1) FLOAT fA, fB, fX, fMappedPhase fX = fCameraPhase fA = 0.1 fB = 0.9 fMappedPhase = CLAMP(((fX - fA) / (fB - fA)), 0, 1) //Work out the time of day we need to jump to this frame. iSecondsToSkipThisFrame = ROUND(sTimelapse.iSecondsToSkipTotal * fMappedPhase) sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, iSecondsToSkipThisFrame) #IF IS_DEBUG_BUILD FLOAT fMinutesToSkip fMinutesToSkip = (TO_FLOAT(iSecondsToSkipThisFrame) / 60.0) HUD_COLOURS eColour eColour = HUD_COLOUR_PURE_WHITE DrawLiteralSceneStringFloat("fMinutesToSkip:", fMinutesToSkip, iDrawLiteralSceneStringRow+3, eColour) str = TIMEOFDAY_TO_TEXT_LABEL(sTempTimeOfDay) DrawLiteralSceneString(str, iDrawLiteralSceneStringRow+4) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) IF GET_TIMEOFDAY_DAY(sTempTimeOfDay) <> GET_CLOCK_DAY_OF_MONTH() //SCRIPT_ASSERT("need to call SET_CLOCK_DATE()") PRINTLN("need to call SET_CLOCK_DATE()") SET_CLOCK_DATE(GET_TIMEOFDAY_DAY(sTempTimeOfDay), GET_TIMEOFDAY_MONTH(sTempTimeOfDay), GET_TIMEOFDAY_YEAR(sTempTimeOfDay)) ENDIF REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() RESET_ADAPTATION() //#1358413 BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL SKIP_TO_TIME_DURING_PHASE(INT iDestHour, INT iDestMinute, STRING tWeatherType, STRING tCloudHat, structTimelapse &sTimelapse, FLOAT fCameraPhase, INT iAdditionalHours = 0) INT iSecondsDiff INT iMinutesDiff INT iHoursDiff INT iSecondsToSkipThisFrame TIMEOFDAY sTempTimeOfDay #IF IS_DEBUG_BUILD CONST_INT iDrawLiteralSceneStringRow 3 TEXT_LABEL_63 str DrawLiteralSceneStringInt("iTimeSkipStage:", sTimelapse.iTimeSkipStage, iDrawLiteralSceneStringRow+0) DrawLiteralSceneStringInt("iDestHour:", iDestHour, iDrawLiteralSceneStringRow+1) DrawLiteralSceneStringInt("iDestMinute:", iDestMinute, iDrawLiteralSceneStringRow+2) #ENDIF SWITCH sTimelapse.iTimeSkipStage CASE 0 //Save the starting time of day. sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY() //Work out the ending time of day. sTempTimeOfDay = GET_CURRENT_TIMEOFDAY() SET_TIMEOFDAY_HOUR(sTempTimeOfDay, iDestHour) SET_TIMEOFDAY_MINUTE(sTempTimeOfDay, iDestMinute) SET_TIMEOFDAY_SECOND(sTempTimeOfDay, 0) //Is start time currently after end time? IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(sTimelapse.sStartTimeOfDay, sTempTimeOfDay) //If so we need to add 1 day to end time. ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, 0, 0, 0, 1) ENDIF //Calculate difference between start and end time in seconds. INT iDaysDiff, iWeeksDiff, iMonthsDiff GET_DIFFERENCE_BETWEEN_TIMEOFDAYS(sTimelapse.sStartTimeOfDay, sTempTimeOfDay, iSecondsDiff, iMinutesDiff, iHoursDiff, iDaysDiff, iWeeksDiff, iMonthsDiff) sTimelapse.iSecondsToSkipTotal = iSecondsDiff + (iMinutesDiff*60) + ((iHoursDiff+iAdditionalHours)*3600) ADVANCE_FRIEND_TIMERS(TO_FLOAT(sTimelapse.iSecondsToSkipTotal) / 3600.0) sTimelapse.iTimeSkipStage++ BREAK CASE 1 FALLTHRU //BEFORE setting weather and cloud hat CASE 2 //AFTER setting weather and cloud hat IF fCameraPhase >= 0.5 IF (sTimelapse.iTimeSkipStage = 1) // Set any weather types or cloud hats IF GET_HASH_KEY(tWeatherType) != 0 //#218020 CONST_FLOAT time 1.0 //5.0 SET_WEATHER_TYPE_OVERTIME_PERSIST(tWeatherType, time) CPRINTLN(DEBUG_SYSTEM, " Setting weather to ", tWeatherType, ".") ENDIF IF GET_HASH_KEY(tCloudHat) != 0 UNLOAD_ALL_CLOUD_HATS() LOAD_CLOUD_HAT(tCloudHat) CPRINTLN(DEBUG_SYSTEM, " Setting cloud hat ", tCloudHat, ".") ENDIF sTimelapse.iTimeSkipStage = 2 ENDIF ENDIF // Finished spline so set final time and bail out IF fCameraPhase >= 0.99 OR fCameraPhase = -1 //Work out the time of day we need to jump to this frame. sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, sTimelapse.iSecondsToSkipTotal) #IF IS_DEBUG_BUILD PRINT_TIMEOFDAY(sTempTimeOfDay) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) RETURN TRUE ENDIF // To make things smoother, dont change time in the first and last 10% of the camera phase // [x-A/B-A] (clamp 0-1) FLOAT fA, fB, fX, fMappedPhase fX = fCameraPhase fA = 0.1 fB = 0.9 fMappedPhase = CLAMP(((fX - fA) / (fB - fA)), 0, 1) //Work out the time of day we need to jump to this frame. iSecondsToSkipThisFrame = ROUND(sTimelapse.iSecondsToSkipTotal * fMappedPhase) sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, iSecondsToSkipThisFrame) #IF IS_DEBUG_BUILD DrawLiteralSceneStringInt("fSecondsToSkip:", iSecondsToSkipThisFrame, iDrawLiteralSceneStringRow+3) str = TIMEOFDAY_TO_TEXT_LABEL(sTempTimeOfDay) DrawLiteralSceneString(str, iDrawLiteralSceneStringRow+4) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) IF GET_TIMEOFDAY_DAY(sTempTimeOfDay) <> GET_CLOCK_DAY_OF_MONTH() //SCRIPT_ASSERT("need to call SET_CLOCK_DATE()") PRINTLN("need to call SET_CLOCK_DATE()") SET_CLOCK_DATE(GET_TIMEOFDAY_DAY(sTempTimeOfDay), GET_TIMEOFDAY_MONTH(sTempTimeOfDay), GET_TIMEOFDAY_YEAR(sTempTimeOfDay)) ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL SKIP_TO_TIME_DURING_PHASE_WITH_SOUND(INT iDestHour, INT iDestMinute, STRING tWeatherType, STRING tCloudHat, structTimelapse &sTimelapse, FLOAT fCameraPhase, INT iAdditionalHours = 0) INT iSecondsDiff INT iMinutesDiff INT iHoursDiff INT iSecondsToSkipThisFrame TIMEOFDAY sTempTimeOfDay #IF IS_DEBUG_BUILD CONST_INT iDrawLiteralSceneStringRow 3 TEXT_LABEL_63 str DrawLiteralSceneStringInt("iTimeSkipStage:", sTimelapse.iTimeSkipStage, iDrawLiteralSceneStringRow+0) DrawLiteralSceneStringInt("iDestHour:", iDestHour, iDrawLiteralSceneStringRow+1) DrawLiteralSceneStringInt("iDestMinute:", iDestMinute, iDrawLiteralSceneStringRow+2) #ENDIF SWITCH sTimelapse.iTimeSkipStage CASE 0 //Save the starting time of day. sTimelapse.sStartTimeOfDay = GET_CURRENT_TIMEOFDAY() //Work out the ending time of day. sTempTimeOfDay = GET_CURRENT_TIMEOFDAY() SET_TIMEOFDAY_HOUR(sTempTimeOfDay, iDestHour) SET_TIMEOFDAY_MINUTE(sTempTimeOfDay, iDestMinute) SET_TIMEOFDAY_SECOND(sTempTimeOfDay, 0) //Is start time currently after end time? IF IS_TIMEOFDAY_AFTER_TIMEOFDAY(sTimelapse.sStartTimeOfDay, sTempTimeOfDay) //If so we need to add 1 day to end time. ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, 0, 0, 0, 1) ENDIF //Calculate difference between start and end time in seconds. INT iDaysDiff, iWeeksDiff, iMonthsDiff GET_DIFFERENCE_BETWEEN_TIMEOFDAYS(sTimelapse.sStartTimeOfDay, sTempTimeOfDay, iSecondsDiff, iMinutesDiff, iHoursDiff, iDaysDiff, iWeeksDiff, iMonthsDiff) sTimelapse.iSecondsToSkipTotal = iSecondsDiff + (iMinutesDiff*60) + ((iHoursDiff+iAdditionalHours)*3600) ADVANCE_FRIEND_TIMERS(TO_FLOAT(sTimelapse.iSecondsToSkipTotal) / 3600.0) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6) CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE) CASCADE_SHADOWS_ENABLE_FREEZER(FALSE) //#1439834 SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE() sTimelapse.iSplineStageSound = GET_SOUND_ID() PLAY_SOUND_FRONTEND(sTimelapse.iSplineStageSound, "TIME_LAPSE_MASTER") START_AUDIO_SCENE("TOD_SHIFT_SCENE") FLUSH_TEXT_MESSAGE_FEED_ENTRIES() //1296499 sTimelapse.iTimeSkipStage++ BREAK CASE 1 FALLTHRU //BEFORE setting weather and cloud hat CASE 2 //AFTER setting weather and cloud hat IF fCameraPhase >= 0.5 IF (sTimelapse.iTimeSkipStage = 1) // Set any weather types or cloud hats IF GET_HASH_KEY(tWeatherType) != 0 //#218020 CONST_FLOAT time 1.0 //5.0 SET_WEATHER_TYPE_OVERTIME_PERSIST(tWeatherType, time) CPRINTLN(DEBUG_SYSTEM, " Setting weather to ", tWeatherType, ".") ENDIF IF GET_HASH_KEY(tCloudHat) != 0 UNLOAD_ALL_CLOUD_HATS() LOAD_CLOUD_HAT(tCloudHat) CPRINTLN(DEBUG_SYSTEM, " Setting cloud hat ", tCloudHat, ".") ENDIF sTimelapse.iTimeSkipStage = 2 ENDIF ENDIF // Finished spline so set final time and bail out IF fCameraPhase >= 0.99 OR fCameraPhase = -1 //Work out the time of day we need to jump to this frame. sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, sTimelapse.iSecondsToSkipTotal) #IF IS_DEBUG_BUILD PRINT_TIMEOFDAY(sTempTimeOfDay) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) // CASCADE_SHADOWS_INIT_SESSION() STOP_SOUND(sTimelapse.iSplineStageSound) RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") // STOP_AUDIO_SCENE("TOD_SHIFT_SCENE") // CASCADE_SHADOWS_ENABLE_FREEZER(TRUE) // CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) RETURN TRUE ENDIF // To make things smoother, dont change time in the first and last 10% of the camera phase // [x-A/B-A] (clamp 0-1) FLOAT fA, fB, fX, fMappedPhase fX = fCameraPhase fA = 0.1 fB = 0.9 fMappedPhase = CLAMP(((fX - fA) / (fB - fA)), 0, 1) //Work out the time of day we need to jump to this frame. iSecondsToSkipThisFrame = ROUND(sTimelapse.iSecondsToSkipTotal * fMappedPhase) sTempTimeOfDay = sTimelapse.sStartTimeOfDay ADD_TIME_TO_TIMEOFDAY(sTempTimeOfDay, iSecondsToSkipThisFrame) #IF IS_DEBUG_BUILD DrawLiteralSceneStringInt("fSecondsToSkip:", iSecondsToSkipThisFrame, iDrawLiteralSceneStringRow+3) str = TIMEOFDAY_TO_TEXT_LABEL(sTempTimeOfDay) DrawLiteralSceneString(str, iDrawLiteralSceneStringRow+4) #ENDIF //Update the game clock with the new time. SET_CLOCK_TIME(GET_TIMEOFDAY_HOUR(sTempTimeOfDay), GET_TIMEOFDAY_MINUTE(sTempTimeOfDay), GET_TIMEOFDAY_SECOND(sTempTimeOfDay)) IF GET_TIMEOFDAY_DAY(sTempTimeOfDay) <> GET_CLOCK_DAY_OF_MONTH() //SCRIPT_ASSERT("need to call SET_CLOCK_DATE()") PRINTLN("need to call SET_CLOCK_DATE()") SET_CLOCK_DATE(GET_TIMEOFDAY_DAY(sTempTimeOfDay), GET_TIMEOFDAY_MONTH(sTempTimeOfDay), GET_TIMEOFDAY_YEAR(sTempTimeOfDay)) ENDIF REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() RESET_ADAPTATION() //#1358413 BREAK ENDSWITCH RETURN FALSE ENDFUNC #if USE_CLF_DLC PROC GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTESCLF(SP_MISSIONS missionEnum, structTimelapseSettings &sSettings) sSettings.iCustomBehaviour = -1 SWITCH missionEnum CASE SP_MISSION_CLF_RUS_CAR sSettings.vCamPos1 = <<2578.0093, 416.3414, 113.9145>> sSettings.vCamRot1 = <<-7.7501, -0.0000, 127.7156>> sSettings.vCamPos2 = <<2600.8674, 395.9536, 113.9145>> sSettings.vCamRot2 = <<-7.7501, -0.0000, 138.2687>> sSettings.fCamFOV = 35.0000 sSettings.iCamTime = 7000 sSettings.bSkipToNight = FALSE sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" BREAK CASE SP_MISSION_CLF_RUS_SAT sSettings.vCamPos1 = <<-3241.7224, 1249.5206, 17.0910>> sSettings.vCamRot1 = <<8.9279, -0.0000, -122.2623>> sSettings.vCamPos2 = <<-3245.4387, 1241.9141, 17.1640>> sSettings.vCamRot2 = <<8.9279, -0.0000, -119.5630>> sSettings.fCamFOV = 50.0000 sSettings.iCamTime = 7000 sSettings.bSkipToNight = FALSE sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" BREAK CASE SP_MISSION_CLF_ASS_VIN sSettings.vCamPos1 = <<24.9604, 674.5290, 211.8357>> sSettings.vCamRot1 = <<-3.2910, 0.0000, -58.4796>> sSettings.vCamPos2 = <<25.2208, 674.6888, 217.1480>> sSettings.vCamRot2 = <<-3.2910, 0.0000, -58.4796>> sSettings.fCamFOV = 45.0000 sSettings.iCamTime = 7000 sSettings.bSkipToNight = FALSE sSettings.tWeatherType = "FOGGY" sSettings.tCloudHat = "cirrocumulus" BREAK DEFAULT SCRIPT_ASSERT("DO_TIMELAPSE: Mission enum passed does not have a TOD defined. Aborting TOD skip.") sSettings.vCamPos1 = <<0,0,0>> sSettings.vCamRot1 = <<0,0,0>> sSettings.vCamPos2 = <<0,0,0>> sSettings.vCamRot2 = <<0,0,0>> sSettings.fCamFOV = -1 sSettings.iCamTime = -1 sSettings.bSkipToNight = FALSE BREAK ENDSWITCH //Set all TODS to be sunny. IF GET_HASH_KEY("RAIN") = GET_PREV_WEATHER_TYPE_HASH_NAME() IF IS_STRING_NULL_OR_EMPTY(sSettings.tWeatherType) sSettings.tWeatherType = "EXTRASUNNY" ENDIF IF IS_STRING_NULL_OR_EMPTY(sSettings.tCloudHat) sSettings.tCloudHat = "cirrocumulus" ENDIF ENDIF ENDPROC #ENDIF #if USE_NRM_DLC PROC GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTESNRM(SP_MISSIONS missionEnum, structTimelapseSettings &sSettings) sSettings.iCustomBehaviour = -1 SWITCH missionEnum case SP_MISSION_NRM_SUR_START break DEFAULT SCRIPT_ASSERT("DO_TIMELAPSE: Mission enum passed does not have a TOD defined. Aborting TOD skip.") sSettings.vCamPos1 = <<0,0,0>> sSettings.vCamRot1 = <<0,0,0>> sSettings.vCamPos2 = <<0,0,0>> sSettings.vCamRot2 = <<0,0,0>> sSettings.fCamFOV = -1 sSettings.iCamTime = -1 sSettings.bSkipToNight = FALSE BREAK ENDSWITCH //Set all TODS to be sunny. IF GET_HASH_KEY("RAIN") = GET_PREV_WEATHER_TYPE_HASH_NAME() IF IS_STRING_NULL_OR_EMPTY(sSettings.tWeatherType) sSettings.tWeatherType = "EXTRASUNNY" ENDIF IF IS_STRING_NULL_OR_EMPTY(sSettings.tCloudHat) sSettings.tCloudHat = "cirrocumulus" ENDIF ENDIF ENDPROC #ENDIF PROC GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(SP_MISSIONS missionEnum, structTimelapseSettings &sSettings) #if USE_CLF_DLC GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTESCLF(missionEnum,sSettings) exit #endif #if USE_NRM_DLC GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTESNRM(missionEnum,sSettings) exit #endif #IF NOT USE_CLF_DLC #IF NOT USE_NRM_DLC sSettings.iCustomBehaviour = -1 SWITCH missionEnum //PLEASE ADD ANY NEW CASES TO THEIR RESPECTIVE #IF #ENDIF BLOCKS CASE SP_MISSION_ARMENIAN_2 //#1317728 CASE SP_MISSION_ARMENIAN_3 //#1317729 sSettings.vCamPos1 = <<-58.1338, -1115.6534, 25.8856>> sSettings.vCamRot1 = <<18.4907, 0.0000, 3.5660>> sSettings.vCamPos2 = <<-58.3857, -1115.0834, 26.0824>> sSettings.vCamRot2 = <<18.4907, 0.0000, 2.0628>> sSettings.fCamFOV = 40.0256 sSettings.iCamTime = 4000 //3250 sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_FAMILY_1 //LH CASE SP_MISSION_FAMILY_2 //#1221096 // sSettings.vCamPos1 = <<-835.5538, 179.5871, 71.5406>> // sSettings.vCamRot1 = <<12.5999, 0.0000, -99.8206>> // sSettings.vCamPos2 = <<-835.1459, 179.5165, 71.6331>> // sSettings.vCamRot2 = <<12.5999, 0.0000, -99.8206>> // sSettings.fCamFOV = 47.9931 sSettings.vCamPos1 = <<-830.1,171.4,71.5>> sSettings.vCamRot1 = <<17.5,-0.0,-76.0>> sSettings.vCamPos2 = <<-829.5,171.6,71.7>> sSettings.vCamRot2 = <<17.9,-0.0,-75.4>> sSettings.fCamFOV = 47.9931 sSettings.iCamTime = 6600 //5500 //5000 sSettings.bSkipToNight = FALSE sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" BREAK CASE SP_MISSION_FAMILY_5 //LH CASE SP_MISSION_FAMILY_6 //LH sSettings.vCamPos1 = <<-776.5807, 181.1033, 72.2059>> sSettings.vCamRot1 = <<11.8135, -0.0000, 95.7275>> sSettings.vCamPos2 = <<-776.8288, 181.0926, 72.2551>> sSettings.vCamRot2 = <<11.8134, -0.0000, 95.7284>> sSettings.fCamFOV = 46.7255 sSettings.iCamTime = 5500 //5000 sSettings.bSkipToNight = FALSE //#218020 sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" BREAK CASE SP_MISSION_FAMILY_4 //(sw) SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL //on mission/ on estab switch sSettings.vCamPos1 = <<-846.3013, 186.7770, 72.0316>> sSettings.vCamRot1 = <<4.202026,0.000000,-111.288170>> sSettings.vCamPos2 = <<-846.1907, 186.7339, 72.0403>> sSettings.vCamRot2 = <<4.2020, 0.0000, -111.2882>> sSettings.fCamFOV = 47.00 sSettings.iCamTime = 5500 //5000 sSettings.bSkipToNight = FALSE BREAK CASE CHAR_TREVOR //family2 - move blip sSettings.vCamPos1 = <<-846.3013, 186.7770, 72.0316>> sSettings.vCamRot1 = <<4.202026,0.000000,-111.288170>> sSettings.vCamPos2 = <<-846.1907, 186.7339, 72.0403>> sSettings.vCamRot2 = <<4.2020, 0.0000, -111.2882>> sSettings.fCamFOV = 47.00 sSettings.iCamTime = 5500 //5000 sSettings.bSkipToNight = FALSE BREAK ENDSWITCH BREAK CASE SP_MISSION_FRANKLIN_0 //LH // sSettings.vCamPos1 = <<-1.834550,-1480.022095,31.896914>> //<<-10.327773,-1451.917603,30.769310>> // sSettings.vCamRot1 = <<12.213200,1.174389,32.771057>> //<<8.013208,-0.000000,27.059366>> // // sSettings.vCamPos2 = <<-1.655947,-1480.240356,33.439064>> //<<-10.810732,-1450.972168,30.918766>> // sSettings.vCamRot2 = <<7.906299,1.174390,32.771049>> //<<8.013208,-0.000000,27.059366>> // // sSettings.fCamFOV = 45.000000 //55.096817 //franklin0 sSettings.vCamPos1 = <<-8.0845, -1450.3672, 36.8585>> sSettings.vCamRot1 = <<13.3776, -0.0000, 4.5130>> sSettings.vCamPos2 = <<-9.0519, -1450.4437, 36.8585>> sSettings.vCamRot2 = <<13.3776, -0.0000, 4.5130>> sSettings.fCamFOV = 39.9659 sSettings.iCamTime = 7200 //6000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_FINALE_C2 //LH // sSettings.vCamPos1 = <<-1.834550,-1480.022095,31.896914>> //<<-10.327773,-1451.917603,30.769310>> // sSettings.vCamRot1 = <<12.213200,1.174389,32.771057>> //<<8.013208,-0.000000,27.059366>> // // sSettings.vCamPos2 = <<-1.655947,-1480.240356,33.439064>> //<<-10.810732,-1450.972168,30.918766>> // sSettings.vCamRot2 = <<7.906299,1.174390,32.771049>> //<<8.013208,-0.000000,27.059366>> // // sSettings.fCamFOV = 45.000000 //55.096817 //franklin0 sSettings.vCamPos1 = <<-1576.1322, 5160.8877, 24.1175>> sSettings.vCamRot1 = <<4.8389, -0.0110, 92.1057>> sSettings.vCamPos2 = <<-1576.1322, 5160.8877, 24.1175>> sSettings.vCamRot2 = <<4.8389, -0.0110, 92.1057>> sSettings.fCamFOV = 40.0 sSettings.iCamTime = 7200 //6000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_LAMAR //LH // sSettings.vCamPos1 = <<-1.834550,-1480.022095,31.896914>> //<<-10.327773,-1451.917603,30.769310>> // sSettings.vCamRot1 = <<12.213200,1.174389,32.771057>> //<<8.013208,-0.000000,27.059366>> // // sSettings.vCamPos2 = <<-1.655947,-1480.240356,33.439064>> //<<-10.810732,-1450.972168,30.918766>> // sSettings.vCamRot2 = <<7.906299,1.174390,32.771049>> //<<8.013208,-0.000000,27.059366>> // // sSettings.fCamFOV = 45.000000 //55.096817 //lamar sSettings.vCamPos1 = <<-7.2050, -1471.6555, 31.1614>> sSettings.vCamRot1 = <<9.3776, -0.0000, 11.4737>> sSettings.vCamPos2 = <<-7.2909, -1471.2322, 31.2546>> sSettings.vCamRot2 = <<9.3776, -0.0000, 11.4737>> sSettings.fCamFOV = 38.5265 sSettings.iCamTime = 5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_SOLOMON_3 sSettings.vCamPos1 = <<-1060.6584, -464.0052, 44.9940>> sSettings.vCamRot1 = <<5.6441, 0.0000, -138.7474>> sSettings.vCamPos2 = <<-1060.6584, -464.0052, 44.9940>> sSettings.vCamRot2 = <<4.8242, -0.0000, -118.3167>> sSettings.fCamFOV = 37.00000 sSettings.iCamTime = 5000 sSettings.bSkipToNight = FALSE BREAK // CASE SP_MISSION_LAMAR // sSettings.vCamPos1 = <<-661.343811,-1648.603394,27.200146>> // sSettings.vCamRot1 = <<9.130991,-0.000000,-58.545334>> // // sSettings.vCamPos2 = <<-661.268860,-1648.556763,26.650558>> // sSettings.vCamRot2 = <<9.130991,-0.000000,-58.545334>> // // sSettings.fCamFOV = 37.316353 // // sSettings.iCamTime = 5000 // sSettings.bSkipToNight = FALSE // BREAK CASE SP_HEIST_RURAL_1 //LH CASE SP_HEIST_RURAL_2 //LH // sSettings.vCamPos1 = <<1376.323364,3583.774170,34.899723>> // sSettings.vCamRot1 = <<13.630786,-0.972987,-34.807240>> // // sSettings.vCamPos2 = <<1374.807251,3581.478516,34.899723>> // sSettings.vCamRot2 = <<13.630786,-0.972987,-34.807240>> // sSettings.fCamFOV = 43.494564 sSettings.vCamPos1 = <<1406.1116, 3590.2307, 34.4113>> sSettings.vCamRot1 = <<17.5005, -0.0000, 55.9579>> sSettings.vCamPos2 = <<1405.6732, 3590.5247, 34.4113>> sSettings.vCamRot2 = <<18.4979, -0.0000, 55.9579>> sSettings.fCamFOV = 56.3199 sSettings.iCamTime = 6000 sSettings.bSkipToNight = FALSE BREAK CASE SP_HEIST_AGENCY_3A //LH CASE SP_HEIST_JEWELRY_1 //LH CASE SP_HEIST_JEWELRY_2 //LH sSettings.vCamPos1 = <<739.149292,-990.396118,29.851938>> sSettings.vCamRot1 = <<17.199169,0.000000,44.211842>> sSettings.vCamPos2 = <<738.419678,-989.646240,30.175814>> sSettings.vCamRot2 = <<17.199169,0.000000,44.211842>> sSettings.fCamFOV = 47.563618 sSettings.iCamTime = 6000 //5000 //4100 sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" sSettings.bSkipToNight = FALSE BREAK CASE SP_HEIST_AGENCY_3B //MW on LH instruction (bug 1317828) sSettings.vCamPos1 = <<2503.9, -288.8, 112.8>> sSettings.vCamRot1 = <<-0.2,0.0,-169.6>> sSettings.vCamPos2 = <<2503.9, -288.8, 112.8>> sSettings.vCamRot2 = <<-0.2,0.0,-169.6>> sSettings.fCamFOV = 47.6 sSettings.iCamTime = 5000 //4100 sSettings.tWeatherType = "EXTRASUNNY" sSettings.tCloudHat = "cirrocumulus" sSettings.bSkipToNight = TRUE BREAK CASE SP_MISSION_MARTIN_1 sSettings.vCamPos1 = <<-458.566620,1010.097168,316.373596>> sSettings.vCamRot1 = <<14.471864,0.000000,-18.288841>> sSettings.vCamPos2 = <<-457.3, 1011.6, 316.9>> sSettings.vCamRot2 = <<14.5, 0.0, -18.5>> sSettings.fCamFOV = 50 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_MICHAEL_4 //LH // sSettings.vCamPos1 = <<357.621002,133.342468,105.362190>> //<<357.706573,118.935471,103.824699>> // sSettings.vCamRot1 = <<26.801767,-3.256729,-33.103321>> //<<6.959806,-1.022222,-4.665223>> // // sSettings.vCamPos2 = <<359.024170,135.494644,106.660057>> //<<357.444031,117.900902,113.730827>> // sSettings.vCamRot2 = <<26.801767,-3.256729,-33.103321>> //<<6.959806,-1.022222,-4.665223>> // sSettings.fCamFOV = 45.000000 //23.228098 // sSettings.vCamPos1 = <<293.4596, 179.2712, 105.2319>> // sSettings.vCamRot1 = <<27.1734, 0.0000, -18.6357>> // // sSettings.vCamPos2 = <<293.6478, 179.8293, 105.2319>> // sSettings.vCamRot2 = <<27.0933, 0.0000, -18.5078>> // // sSettings.fCamFOV = 56.3255 sSettings.vCamPos1 =<<-723.998230,-155.718445,38.123623>> sSettings.vCamRot1 = <<30.120478,0.000000,-99.112427>> sSettings.vCamPos2 = <<-722.4385, -155.7817, 37.4443>> //fix for 1792905//<<-722.475098,-156.011337,37.444321>> sSettings.vCamRot2 = <<2.0429, -0.0000, -101.5132>>//<<1.551403,0.000000,-99.049629>> sSettings.fCamFOV = 45.000000 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK // CASE SP_MISSION_CARSTEAL_1 // sSettings.vCamPos1 = <<499.482605,-1317.125488,28.500771>> // sSettings.vCamRot1 = <<16.330931,-0.000000,87.672691>> // // sSettings.vCamPos2 = <<497.894165,-1317.125488,28.500771>> // sSettings.vCamRot2 = <<16.330931,-0.000000,87.672691>> // sSettings.fCamFOV = 53.444447 // sSettings.iCamTime = 5000 // sSettings.bSkipToNight = FALSE // BREAK CASE SP_MISSION_CARSTEAL_2 SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_TREVOR //LH sSettings.vCamPos1 = <<416.3221, -960.2586, 30.6696>> sSettings.vCamRot1 = <<21.5747, -0.0000, -135.2969>> sSettings.vCamPos2 = <<416.8894, -960.8320, 30.9887>> sSettings.vCamRot2 = <<21.9916, 0.0000, -135.2969>> sSettings.fCamFOV = 47.1057 sSettings.iCamTime = 6000 sSettings.bSkipToNight = FALSE BREAK CASE CHAR_FRANKLIN //LH sSettings.vCamPos1 = <<1393.3628, -2052.5813, 65.4054>> sSettings.vCamRot1 = <<2.5107, -0.0000, 51.1167>> sSettings.vCamPos2 = <<1393.4564, -2052.6563, 68.1460>> sSettings.vCamRot2 = <<2.5107, -0.0000, 51.1167>> sSettings.fCamFOV = 35.9859 sSettings.iCamTime = 6000 sSettings.bSkipToNight = FALSE BREAK ENDSWITCH BREAK CASE SP_MISSION_FBI_2 sSettings.vCamPos1 = <<59.3, -751.7, 46.8>> sSettings.vCamRot1 = <<61.9, 0.0, -63.8>> sSettings.vCamPos2 = <<59.3, -751.7, 46.8>> sSettings.vCamRot2 = <<61.9, 0.0, -63.8>> sSettings.fCamFOV = 46.6 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_FBI_5 //LH sSettings.vCamPos1 = <<3841.9304, 4464.6582, 2.6587>> sSettings.vCamRot1 = <<8.4859, 0.0024, 143.0775>> sSettings.vCamPos2 = <<3842.5398, 4464.1841, 2.6587>> sSettings.vCamRot2 = <<8.4859, 0.0024, 142.0089>> sSettings.fCamFOV = 34.1544 sSettings.iCamTime = 3000 sSettings.bSkipToNight = FALSE BREAK CASE SP_HEIST_DOCKS_1 //LH // // // // // change for bug #1497796 // // // // // // // // // // sSettings.vCamPos1 = <<-1215.8743, -1510.9213, 13.9245>> // sSettings.vCamRot1 = <<4.7026, 0.0000, 67.0013>> // // sSettings.vCamPos2 = <<-1215.8634, -1510.9259, 14.0682>> // sSettings.vCamRot2 = <<4.7026, 0.0000, 67.0013>> // sSettings.fCamFOV = 38.0302 // // // // // // // // // // // // // // // // // // // // // // sSettings.vCamPos1 = <<-1193.1,-1525.3,4.4>> sSettings.vCamRot1 = <<9.4,-0.0,-78.8>> sSettings.vCamPos2 = <<-1192.2,-1525.1,4.4>> sSettings.vCamRot2 = <<9.4,-0.0,-78.5>> sSettings.fCamFOV = 30.4 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_HEIST_DOCKS_2A //LH sSettings.vCamPos1 = <<-24.2, -2417.6, 7.8>> sSettings.vCamRot1 = <<10.4, 0.0000, 80.4>> sSettings.vCamPos2 = <<-23.8, -2414.8, 7.8>> sSettings.vCamRot2 = <<10.4, 0.0000, 81.4>> sSettings.fCamFOV = 48.1095 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK // CASE SP_HEIST_FINALE_1 //LH CASE SP_HEIST_FINALE_2A //LH CASE SP_HEIST_FINALE_2B //LH CASE SP_MISSION_TREVOR_4 // 1281688 sSettings.vCamPos1 = <<146.973328,-1310.644409,30.851767>> sSettings.vCamRot1 = <<16.268848,-0.000021,45.004749>> sSettings.vCamPos2 = <<146.973328,-1310.644409,30.851767>> sSettings.vCamRot2 = <<16.268848,-0.000021,45.004749>> sSettings.fCamFOV = 39.402699 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_TREVOR_1 //1317795 & 1317794 CASE SP_MISSION_EXILE_2 //LH CASE SP_MISSION_EXILE_3 //rob sSettings.vCamPos1 = <<1998.2150, 3816.9827, 33.0117>> sSettings.vCamRot1 = <<5.9088, -0.0000, 89.1989>> sSettings.vCamPos2 = <<1997.1537, 3817.0042, 33.1215>> sSettings.vCamRot2 = <<5.9088, -0.0000, 89.1989>> sSettings.fCamFOV = 36.8186 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE IF (missionEnum = SP_MISSION_TREVOR_1) IF (GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR) SCRIPT_ASSERT("DO_TIMELAPSE: Mission enum passed does not have a TOD defined. Aborting TOD skip.") sSettings.vCamPos1 = <<0,0,0>> sSettings.vCamRot1 = <<0,0,0>> sSettings.vCamPos2 = <<0,0,0>> sSettings.vCamRot2 = <<0,0,0>> sSettings.fCamFOV = -1 sSettings.iCamTime = -1 sSettings.bSkipToNight = FALSE ENDIF ENDIF BREAK CASE SP_MISSION_TREVOR_2 //1317801 sSettings.vCamPos1 = <<1576.0, 3363.9, 55.5>> sSettings.vCamRot1 = <<0.5, 0.0000, -123.8>> sSettings.vCamPos2 = <<1575.2, 3364.4, 49.2>> sSettings.vCamRot2 = <<-4.3, -0.0000, -124.1>> sSettings.fCamFOV = 50.0 sSettings.iCamTime = 8000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_TREVOR_3 //LH - on mission (1323493 and 1323495) sSettings.vCamPos1 = <<1566.0,3378.8,42.8>> sSettings.vCamRot1 = <<-2.4,0,-126.3>> sSettings.vCamPos2 = <<1567.6,3376.9,45.0>> sSettings.vCamRot2 = <<1.6,0.0,-124.6>> sSettings.fCamFOV = 34.7 sSettings.iCamTime = 8000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_FINALE_A //LH sSettings.vCamPos1 = <<1339.572876,-2550.872803,56.282543>> sSettings.vCamRot1 = <<-2.348373,-0.000021,159.735992>> sSettings.vCamPos2 = <<1334.490845,-2549.345459,47.691090>> sSettings.vCamRot2 = <<2.789334,-0.000021,-156.439682>> sSettings.fCamFOV = 25.660002 sSettings.iCamTime = 8000 sSettings.bSkipToNight = FALSE // sSettings.iCustomBehaviour = 1 BREAK CASE SP_MISSION_FINALE_B //LH sSettings.vCamPos1 = <<2383.6511, 2624.7871, 46.9527>> sSettings.vCamRot1 = <<14.6191, -0.0000, 64.3660>> sSettings.vCamPos2 = <<2383.929199,2622.801514,47.270699>>//<<2383.922607,2622.794189,47.270649>>//<<2383.923096,2622.793945,47.270905>> sSettings.vCamRot2 = <<33.177135,-0.130730,12.314363>>//<<33.613609,-0.000955,11.752253>>//<<33.639381,-3.159677,11.397706>> sSettings.fCamFOV = 35.318432//35.231113//35.234501 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_FINALE_C1 sSettings.vCamPos1 = << 1755.5189, -1474.9811, 126.1743 >> sSettings.vCamRot1 = << 4.5341, -0.0000, 89.6405 >> sSettings.vCamPos2 = << 1772.2605, -1475.0853, 125.9465 >> sSettings.vCamRot2 = << 5.8327, -0.0000, 89.6405 >> sSettings.fCamFOV = 32.7 sSettings.iCamTime = 6500 //4500 sSettings.bSkipToNight = FALSE BREAK // CASE SP_MISSION_FINALE_3B // sSettings.vCamPos1 = <<1070.737915,-1952.050781,32.787224>> // sSettings.vCamRot1 = <<32.277859,0.000000,-169.175262>> // // sSettings.vCamPos2 = <<1070.737915,-1957.651001,32.787224>> // sSettings.vCamRot2 = <<32.277859,0.000000,-169.175262>> // sSettings.fCamFOV = 55.000000 // sSettings.iCamTime = 6000 //5000 // sSettings.bSkipToNight = FALSE // BREAK CASE SP_MISSION_ASSASSIN_1 //Assassin_Valet sSettings.vCamPos1 = <<-1514.2566, -947.7281, 15.0253>> sSettings.vCamRot1 = <<-3.5807, -0.0001, -46.3209>> sSettings.vCamPos2 = <<-1512.6014, -949.2796, 14.8827>> sSettings.vCamRot2 = <<-4.7682, -0.0001, -34.1393>> sSettings.fCamFOV = 29.9555 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_ASSASSIN_2 //assassin_multi sSettings.vCamPos1 = <<-698.2578, -934.4238, 31.6909>> sSettings.vCamRot1 = <<-22.0467, -0.0000, 32.1888>> sSettings.vCamPos2 = <<-697.8695, -935.0406, 31.9861>> sSettings.vCamRot2 = <<-20.6093, 0.0000, 32.1888>> sSettings.fCamFOV = 30.0000 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_ASSASSIN_3 //assassin_hooker sSettings.vCamPos1 = <<221.8613, -830.6434, 45.3154>> sSettings.vCamRot1 = <<-13.9263, -0.0000, 140.7092>> sSettings.vCamPos2 = <<227.5233, -832.8285, 45.3154>> sSettings.vCamRot2 = <<-13.9263, -0.0000, 140.7092>> sSettings.fCamFOV = 35.0000 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_ASSASSIN_4 //Assassin_Bus sSettings.vCamPos1 = <<-23.3747, -120.3161, 64.1390>> sSettings.vCamRot1 = <<-5.7232, 0.0000, 5.1015>> sSettings.vCamPos2 = <<-22.5824, -122.5200, 64.1390>> sSettings.vCamRot2 = <<-5.7232, 0.0000, 6.6362>> sSettings.fCamFOV = 35.0000 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK CASE SP_MISSION_ASSASSIN_5 //assassin_construction sSettings.vCamPos1 = <<803.5977, -1075.8688, 37.1981>> sSettings.vCamRot1 = <<-10.7685, 0.0000, -38.1705>> sSettings.vCamPos2 = <<803.5977, -1075.8688, 32.7981>> sSettings.vCamRot2 = <<-10.7685, 0.0000, -38.1705>> sSettings.fCamFOV = 35.0000 sSettings.iCamTime = 6000 //5000 sSettings.bSkipToNight = FALSE BREAK DEFAULT SCRIPT_ASSERT("DO_TIMELAPSE: Mission enum passed does not have a TOD defined. Aborting TOD skip.") sSettings.vCamPos1 = <<0,0,0>> sSettings.vCamRot1 = <<0,0,0>> sSettings.vCamPos2 = <<0,0,0>> sSettings.vCamRot2 = <<0,0,0>> sSettings.fCamFOV = -1 sSettings.iCamTime = -1 sSettings.bSkipToNight = FALSE BREAK ENDSWITCH //Set all TODS to be sunny. IF GET_HASH_KEY("RAIN") = GET_PREV_WEATHER_TYPE_HASH_NAME() IF IS_STRING_NULL_OR_EMPTY(sSettings.tWeatherType) sSettings.tWeatherType = "EXTRASUNNY" ENDIF IF IS_STRING_NULL_OR_EMPTY(sSettings.tCloudHat) sSettings.tCloudHat = "cirrocumulus" ENDIF ENDIF #endif #endif ENDPROC PROC GET_SP_MISSION_TOD_WINDOW_TIME(SP_MISSIONS missionEnum, INT &iStartHour, INT &iEndHour) SWITCH missionEnum #if USE_CLF_DLC CASE SP_MISSION_CLF_TRAIN iStartHour = g_sMissionStaticData[missionEnum].endHour // TOD skip start time is the end of the mission trigger's available hours. iEndHour = g_sMissionStaticData[missionEnum].startHour // TOD skip end time is the beginning of the mission trigger's legal hours. BREAK #endif #if USE_NRM_DLC CASE SP_MISSION_NRM_SUR_START iStartHour = g_sMissionStaticData[missionEnum].endHour // TOD skip start time is the end of the mission trigger's available hours. iEndHour = g_sMissionStaticData[missionEnum].startHour // TOD skip end time is the beginning of the mission trigger's legal hours. BREAK #endif #if not USE_CLF_DLC #if not USE_NRM_DLC CASE SP_MISSION_TREVOR_4 iStartHour = 20 iEndHour = 22 BREAK CASE SP_MISSION_FINALE_C2 iStartHour = 20 iEndHour = 20 BREAK #endif #endif DEFAULT // Time window data moved to flow so the mission trigger can use it. // X:/gta5/script/dev/singleplayer/include/private/Mission_Flow/Flow_Mission_Data_GTA5.sch iStartHour = g_sMissionStaticData[missionEnum].endHour // TOD skip start time is the end of the mission trigger's available hours. iEndHour = g_sMissionStaticData[missionEnum].startHour // TOD skip end time is the beginning of the mission trigger's legal hours. BREAK ENDSWITCH ENDPROC /// PURPOSE: Runs a short cutscene timelapse based on settings configured in a timelapse setting stuct. /// RETURNS: TRUE when Timelapse is complete or time is already within the valid window. /// FUNC BOOL DO_TIMELAPSE_WITH_SETTINGS(structTimelapse &sTimelapse, structTimelapseSettings &sSettings, BOOL bTriggerTODRegardlessOfTimeForClothes = FALSE, BOOL bClearTheArea = TRUE, BOOL bMidMissionToD = FALSE, BOOL bIgnoreButtonPressSkip = FALSE, BOOL bKeepPlayerVisibleForTOD = FALSE) CONST_FLOAT fCONST_TIMELAPSE_CLEAR_AREA_RADIUS 5000.0 //300.0 //#1448970 sTimelapse.iTimeWindowStart = sSettings.iLapseStartHour sTimelapse.iTimeWindowEnd = sSettings.iLapseEndHour IF IS_REPEAT_PLAY_ACTIVE() AND NOT bTriggerTODRegardlessOfTimeForClothes AND NOT bMidMissionToD // Playing mission via repeat play (Skip the timelapse) IF sTimelapse.bSkipToNightTime CPRINTLN(DEBUG_REPEAT, "Repeat play active: Skipping timelapse. To: ", sTimelapse.iTimeWindowStart) SET_CLOCK_TIME(sTimelapse.iTimeWindowStart, 00, 00) ELSE CPRINTLN(DEBUG_REPEAT, "Repeat play active: Skipping timelapse. To: ", sTimelapse.iTimeWindowEnd) SET_CLOCK_TIME(sTimelapse.iTimeWindowEnd, 00, 00) ENDIF RETURN TRUE ELSE CONST_INT iTIMELAPSE_0_request 0 CONST_INT iTIMELAPSE_1_create 1 CONST_INT iTIMELAPSE_22_run 22 //custom CONST_INT iTIMELAPSE_2_run 2 CONST_INT iTIMELAPSE_3_hold 3 CONST_INT iTIMELAPSE_4_end 4 CONST_INT iTIMELAPSE_null -1 #IF IS_DEBUG_BUILD CONST_INT iDrawLiteralSceneStringRow 0 // TEXT_LABEL_63 str DrawLiteralSceneStringInt("iTimelapseCut:", sTimelapse.iTimelapseCut, iDrawLiteralSceneStringRow+0) #ENDIF // Playing mission normally IF (sTimelapse.iTimelapseCut = iTIMELAPSE_0_request) IF sTimelapse.iTimeWindowStart != NULL_HOUR AND sTimelapse.iTimeWindowEnd != NULL_HOUR IF bTriggerTODRegardlessOfTimeForClothes OR NOT IS_TIME_BETWEEN_THESE_HOURS(sTimelapse.iTimeWindowEnd, sTimelapse.iTimeWindowStart) CPRINTLN(DEBUG_SYSTEM, " waiting on request AUDIO BANK \"TIME_LAPSE\".") IF REQUEST_AMBIENT_AUDIO_BANK("TIME_LAPSE") sTimelapse.bCutsceneSkipped = FALSE sTimelapse.iTimelapseCut = iTIMELAPSE_1_create ENDIF ELSE CPRINTLN(DEBUG_SYSTEM, " Time within valid window. Start hour:", sTimelapse.iTimeWindowEnd, " End hour:", sTimelapse.iTimeWindowStart, " Current hour:", GET_CLOCK_HOURS()) sTimelapse.iTimelapseCut = iTIMELAPSE_null RETURN TRUE ENDIF ELSE SCRIPT_ASSERT("DO_TIMELAPSE: Tried to run a timelapse for a mission that didn't have start/end hours set.") sTimelapse.iTimelapseCut = iTIMELAPSE_null RETURN TRUE ENDIF ENDIF HIDE_HUD_AND_RADAR_THIS_FRAME() HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0) IF (sTimelapse.iTimelapseCut = iTIMELAPSE_1_create) IF bTriggerTODRegardlessOfTimeForClothes #IF IS_DEBUG_BUILD IF sTimelapse.bSkipToNightTime CPRINTLN(DEBUG_SYSTEM, " Creating FORCED NIGHT timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window end hour ", sTimelapse.iTimeWindowEnd, ".") ELSE CPRINTLN(DEBUG_SYSTEM, " Creating FORCED DAY timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window start hour ", sTimelapse.iTimeWindowStart, ".") ENDIF #ENDIF DESTROY_CAM(sTimelapse.splineCamera) sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) IF (sSettings.iCustomBehaviour < 0) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos2, sSettings.vCamRot2, sSettings.iCamTime) ELSE ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) ENDIF SET_CAM_FOV(sTimelapse.splineCamera, sSettings.fCamFOV) SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE) IF NOT bKeepPlayerVisibleForTOD IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CPRINTLN(DEBUG_SYSTEM, " Hiding player as TOD camera activates.") SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF VEHICLE_INDEX vehPlayerLast vehPlayerLast = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(vehPlayerLast) CPRINTLN(DEBUG_SYSTEM, " Hiding player's last vehicle as TOD camera activates.") IF NOT IS_ENTITY_A_MISSION_ENTITY(vehPlayerLast) SET_ENTITY_AS_MISSION_ENTITY(vehPlayerLast) ENDIF SET_ENTITY_VISIBLE(vehPlayerLast, FALSE) ENDIF ENDIF FLOAT fGet_cam_far_clip = GET_CAM_FAR_CLIP(sTimelapse.splineCamera) CLEAR_ROOM_FOR_GAME_VIEWPORT() CLEAR_AREA_OF_COPS(sSettings.vCamPos1, fGet_cam_far_clip) //#1012871 REMOVE_PARTICLE_FX_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) REMOVE_DECALS_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, TRUE, TRUE) ENDIF SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 0, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR()) SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE) sTimelapse.iTimelapseCut = iTIMELAPSE_2_run CPRINTLN(DEBUG_SYSTEM, " Timelapse running...") ELIF NOT IS_TIME_BETWEEN_THESE_HOURS(sTimelapse.iTimeWindowStart, sTimelapse.iTimeWindowEnd) //IS_DAYLIGHT_HOURS() IF sTimelapse.bSkipToNightTime CPRINTLN(DEBUG_SYSTEM, " Creating NIGHT timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window end hour ", sTimelapse.iTimeWindowEnd, ".") DESTROY_CAM(sTimelapse.splineCamera) sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) IF (sSettings.iCustomBehaviour < 0) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos2, sSettings.vCamRot2, sSettings.iCamTime) ELSE ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) ENDIF SET_CAM_FOV(sTimelapse.splineCamera, sSettings.fCamFOV) SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE) IF NOT bKeepPlayerVisibleForTOD IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CPRINTLN(DEBUG_SYSTEM, " Hiding player as TOD camera activates.") SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF VEHICLE_INDEX vehPlayerLast vehPlayerLast = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(vehPlayerLast) CPRINTLN(DEBUG_SYSTEM, " Hiding player's last vehicle as TOD camera activates.") IF NOT IS_ENTITY_A_MISSION_ENTITY(vehPlayerLast) SET_ENTITY_AS_MISSION_ENTITY(vehPlayerLast) ENDIF SET_ENTITY_VISIBLE(vehPlayerLast, FALSE) ENDIF ENDIF FLOAT fGet_cam_far_clip = GET_CAM_FAR_CLIP(sTimelapse.splineCamera) CLEAR_ROOM_FOR_GAME_VIEWPORT() CLEAR_AREA_OF_COPS(sSettings.vCamPos1, fGet_cam_far_clip) //#1012871 REMOVE_PARTICLE_FX_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) REMOVE_DECALS_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, TRUE, TRUE) ENDIF SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 8, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR()) SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE) sTimelapse.iTimelapseCut = iTIMELAPSE_2_run CPRINTLN(DEBUG_SYSTEM, " Timelapse running...") ELSE CPRINTLN(DEBUG_SYSTEM, " Night timelapse not running as current hour ", GET_CLOCK_HOURS(), " is already in valid window [", sTimelapse.iTimeWindowEnd, "->", sTimelapse.iTimeWindowStart, "].") RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") sTimelapse.iTimelapseCut = iTIMELAPSE_null RETURN TRUE ENDIF ELSE IF NOT sTimelapse.bSkipToNightTime CPRINTLN(DEBUG_SYSTEM, " Creating DAY timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window start hour ", sTimelapse.iTimeWindowStart, ".") DESTROY_CAM(sTimelapse.splineCamera) sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) IF (sSettings.iCustomBehaviour < 0) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos2, sSettings.vCamRot2, sSettings.iCamTime) ELSE ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) ENDIF SET_CAM_FOV(sTimelapse.splineCamera, sSettings.fCamFOV) SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH) SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE) IF NOT bKeepPlayerVisibleForTOD IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CPRINTLN(DEBUG_SYSTEM, " Hiding player as TOD camera activates.") SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) ENDIF VEHICLE_INDEX vehPlayerLast vehPlayerLast = GET_PLAYERS_LAST_VEHICLE() IF DOES_ENTITY_EXIST(vehPlayerLast) CPRINTLN(DEBUG_SYSTEM, " Hiding player's last vehicle as TOD camera activates.") IF NOT IS_ENTITY_A_MISSION_ENTITY(vehPlayerLast) SET_ENTITY_AS_MISSION_ENTITY(vehPlayerLast) ENDIF SET_ENTITY_VISIBLE(vehPlayerLast, FALSE) ENDIF ENDIF FLOAT fGet_cam_far_clip = GET_CAM_FAR_CLIP(sTimelapse.splineCamera) CLEAR_ROOM_FOR_GAME_VIEWPORT() CLEAR_AREA_OF_COPS(sSettings.vCamPos1, fGet_cam_far_clip) //#1012871 REMOVE_PARTICLE_FX_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) REMOVE_DECALS_IN_RANGE(sSettings.vCamPos1, fGet_cam_far_clip) IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, FALSE, TRUE) ENDIF SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 0, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR()) SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE) sTimelapse.iTimelapseCut = iTIMELAPSE_2_run CPRINTLN(DEBUG_SYSTEM, " Timelapse running...") ELSE CPRINTLN(DEBUG_SYSTEM, " Day timelapse not running as current hour ", GET_CLOCK_HOURS(), " is already in valid window [", sTimelapse.iTimeWindowStart, "->", sTimelapse.iTimeWindowEnd, "].") RELEASE_NAMED_SCRIPT_AUDIO_BANK("TIME_LAPSE") sTimelapse.iTimelapseCut = iTIMELAPSE_null RETURN TRUE ENDIF ENDIF ENDIF IF (sTimelapse.iTimelapseCut = iTIMELAPSE_2_run) IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, FALSE, TRUE) ENDIF IF NOT sTimelapse.bSkipToNightTime IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(sTimelapse.iTimeWindowEnd, 0, sSettings.tWeatherType, sSettings.tCloudHat, sTimelapse) IF (sSettings.iCustomBehaviour < 0) sTimelapse.iGameTimeHold = GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold CPRINTLN(DEBUG_SYSTEM, " Timelapse holding...") ELSE sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos2, sSettings.vCamRot2, sSettings.iCamTime) SET_CAM_FOV(sTimelapse.splineCamera, sSettings.fCamFOV) SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH) SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE) sTimelapse.iGameTimeHold = GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_22_run CPRINTLN(DEBUG_SYSTEM, " Custom timelapse running...") ENDIF ENDIF ELSE IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(sTimelapse.iTimeWindowStart, 0, sSettings.tWeatherType, sSettings.tCloudHat, sTimelapse) IF (sSettings.iCustomBehaviour < 0) sTimelapse.iGameTimeHold = GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold CPRINTLN(DEBUG_SYSTEM, " Timelapse holding...") ELSE sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA") ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos1, sSettings.vCamRot1, sSettings.iCamTime) ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sSettings.vCamPos2, sSettings.vCamRot2, sSettings.iCamTime) SET_CAM_FOV(sTimelapse.splineCamera, sSettings.fCamFOV) SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH) SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE) sTimelapse.iGameTimeHold = GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_22_run CPRINTLN(DEBUG_SYSTEM, " Custom timelapse running...") ENDIF ENDIF ENDIF IF NOT bIgnoreButtonPressSkip IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() OR sTimelapse.bCutsceneSkipped sTimelapse.bCutsceneSkipped = TRUE CPRINTLN(DEBUG_SYSTEM, " Timelapse skipped by user input.") IF NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT) ENDIF IF NOT IS_SCREEN_FADED_OUT() HIDE_HUD_AND_RADAR_THIS_FRAME() HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) RETURN FALSE ENDIF IF (sTimelapse.iTimeSkipStage <> 0) SKIP_TO_TIME_DURING_SPLINE_CAMERA(sTimelapse.iTimeWindowStart, 0, sSettings.tWeatherType, sSettings.tCloudHat, sTimelapse, 1.0) ENDIF //SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE) sTimelapse.iTimelapseCut = iTIMELAPSE_4_end ENDIF ENDIF ENDIF IF (sTimelapse.iTimelapseCut = iTIMELAPSE_22_run) IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, FALSE, TRUE) ENDIF IF (DOES_CAM_EXIST(sTimelapse.splineCamera) AND IS_CAM_INTERPOLATING(sTimelapse.splineCamera)) // ELSE sTimelapse.iGameTimeHold = GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold CPRINTLN(DEBUG_SYSTEM, " Timelapse holding...") ENDIF IF NOT bIgnoreButtonPressSkip IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() OR sTimelapse.bCutsceneSkipped sTimelapse.bCutsceneSkipped = TRUE CPRINTLN(DEBUG_SYSTEM, " Timelapse skipped by user input.") IF NOT IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT) ENDIF IF NOT IS_SCREEN_FADED_OUT() HIDE_HUD_AND_RADAR_THIS_FRAME() HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) RETURN FALSE ENDIF //SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE) sTimelapse.iTimelapseCut = iTIMELAPSE_4_end ENDIF ENDIF ENDIF IF (sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold) #IF IS_DEBUG_BUILD DrawLiteralSceneStringInt("iTimelapseCut:", GET_GAME_TIMER()-sTimelapse.iTimelapseCut, iDrawLiteralSceneStringRow+1) #ENDIF IF bClearTheArea CLEAR_AREA(sSettings.vCamPos1, fCONST_TIMELAPSE_CLEAR_AREA_RADIUS, FALSE, TRUE) ENDIF IF (sTimelapse.iGameTimeHold+1000) > GET_GAME_TIMER() sTimelapse.iTimelapseCut = iTIMELAPSE_4_end CPRINTLN(DEBUG_SYSTEM, " Timelapse ending...") ENDIF ENDIF IF (sTimelapse.iTimelapseCut = iTIMELAPSE_4_end) sTimelapse.bCutsceneSkipped = FALSE sTimelapse.iTimelapseCut = iTIMELAPSE_null CPRINTLN(DEBUG_SYSTEM, " Timelapse ended. Waiting for script to trigger cleanup.") RETURN TRUE ENDIF IF (sTimelapse.iTimelapseCut = iTIMELAPSE_null) RETURN TRUE ENDIF RETURN FALSE ENDIF ENDFUNC /// PURPOSE: Runs a short cutscene timelapse based on data bound to a specific story mission. /// Fastforwards to the appropriate time for mission start. /// RETURNS: TRUE when Timelapse is complete or mission is within acceptable time window. /// FUNC BOOL DO_TIMELAPSE(SP_MISSIONS missionEnum, structTimelapse &sTimelapse, BOOL bTriggerTODRegardlessOfTimeForClothes = FALSE, BOOL bClearTheArea = TRUE, BOOL bMidMissionToD = FALSE, BOOL bIgnoreButtonPressSkip = FALSE, BOOL bKeepPlayerVisibleForTOD = FALSE) structTimelapseSettings sTimelapseSettings GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(missionEnum, sTimelapseSettings) GET_SP_MISSION_TOD_WINDOW_TIME(missionEnum, sTimelapseSettings.iLapseStartHour, sTimelapseSettings.iLapseEndHour) RETURN DO_TIMELAPSE_WITH_SETTINGS(sTimelapse, sTimelapseSettings, bTriggerTODRegardlessOfTimeForClothes, bClearTheArea, bMidMissionToD, bIgnoreButtonPressSkip, bKeepPlayerVisibleForTOD) ENDFUNC