623 lines
28 KiB
XML
Executable File
623 lines
28 KiB
XML
Executable File
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// SCRIPT NAME : savegame_private.sch //
|
|
// AUTHOR : Kenneth Ross //
|
|
// DESCRIPTION : Contains a pre-savegame routine that should be called //
|
|
// before any savegame is made. //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "player_ped_public.sch"
|
|
USING "email_public.sch"
|
|
USING "snapshot_private.sch"
|
|
USING "commands_player.sch"
|
|
USING "flow_private_core.sch"
|
|
|
|
/// PURPOSE: Returns TRUE if it is safe to save the game
|
|
FUNC BOOL SAFE_TO_SAVE_GAME(BOOL bIsQuicksave = FALSE)
|
|
|
|
// Player death check
|
|
IF IS_PED_INJURED(PLAYER_PED_ID())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - player injured")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
// Player alive checks
|
|
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
OR NOT IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID())
|
|
OR IS_PED_SHOOTING(PLAYER_PED_ID())
|
|
OR IS_PED_IN_COMBAT(PLAYER_PED_ID())
|
|
OR IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
|
|
OR IS_PED_BEING_JACKED(PLAYER_PED_ID())
|
|
OR IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID())
|
|
OR IS_PED_GETTING_UP(PLAYER_PED_ID())
|
|
OR IS_ENTITY_IN_AIR(PLAYER_PED_ID())
|
|
//OR IS_PED_IN_COVER(PLAYER_PED_ID())
|
|
OR IS_PED_RAGDOLL(PLAYER_PED_ID())
|
|
OR IS_PLAYER_BEING_ARRESTED(PLAYER_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
IF (NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - player control is not on")
|
|
ELIF (NOT IS_PLAYER_READY_FOR_CUTSCENE(PLAYER_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - not ready for cutscene")
|
|
ELIF (IS_PED_SHOOTING(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - shooting")
|
|
ELIF (IS_PED_IN_COMBAT(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - in combat")
|
|
ELIF IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - in melee combat")
|
|
ELIF (IS_PED_BEING_JACKED(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - being jacked")
|
|
ELIF (IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - getting into vehicle")
|
|
ELIF (IS_PED_GETTING_UP(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - getting up")
|
|
ELIF (IS_ENTITY_IN_AIR(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - in air")
|
|
//ELIF (IS_PED_IN_COVER(PLAYER_PED_ID()))
|
|
// PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - in cover")
|
|
ELIF (IS_PED_RAGDOLL(PLAYER_PED_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - ragdolling")
|
|
ELIF (IS_PLAYER_BEING_ARRESTED(PLAYER_ID()))
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - arrested")
|
|
ELSE
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - some other player fail reason???")
|
|
ENDIF
|
|
// ENDIF
|
|
#ENDIF
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - A")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
// Game checks
|
|
IF IS_TRANSITION_ACTIVE()
|
|
OR g_sSelectorUI.bOnScreen
|
|
OR IS_PLAYER_PED_SWITCH_IN_PROGRESS()
|
|
OR IS_MEMORY_CARD_IN_USE()
|
|
OR IS_AUTO_SAVE_IN_PROGRESS()
|
|
OR Is_Player_Timetable_Scene_In_Progress()
|
|
OR IS_RESULT_SCREEN_DISPLAYING()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
IF (IS_TRANSITION_ACTIVE())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - transition active")
|
|
ELIF (g_sSelectorUI.bOnScreen)
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - switch ui on screen")
|
|
ELIF (IS_PLAYER_PED_SWITCH_IN_PROGRESS())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - switch in progress")
|
|
ELIF (IS_MEMORY_CARD_IN_USE())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - mem card in use")
|
|
ELIF (IS_AUTO_SAVE_IN_PROGRESS())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - auto saving")
|
|
ELIF (Is_Player_Timetable_Scene_In_Progress())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - timetable scene in progress")
|
|
ELIF (IS_RESULT_SCREEN_DISPLAYING())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - results screen displaying")
|
|
ELSE
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - some other game fail reason???")
|
|
ENDIF
|
|
// ENDIF
|
|
#ENDIF
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - B")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
//None quicksave checks.
|
|
IF NOT bIsQuicksave
|
|
IF GET_MISSION_FLAG()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
// OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL,INPUT_CONTEXT)
|
|
// OR g_bPlayerLockedInToTrigger
|
|
IF (GET_MISSION_FLAG())
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - on mission")
|
|
ELIF (g_bPlayerLockedInToTrigger)
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - locked into trigger")
|
|
ELSE
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - some other game fail reason???")
|
|
ENDIF
|
|
// ENDIF
|
|
#ENDIF
|
|
PRINTLN("SAFE_TO_SAVE_GAME() = FALSE - C")
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// No problems found
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Save current command details for each mission strand. When the game is reloaded
|
|
/// we will check that strand command pointers are pointing to matching commands. If not, the
|
|
/// flow must have been changed between save and load and we will have to fall back on failsafe
|
|
/// loading technique.
|
|
PROC Pre_Savegame_Store_Current_Strand_Command_Hash_IDs()
|
|
|
|
#if USE_CLF_DLC
|
|
INT iStrandIndex
|
|
REPEAT MAX_STRANDS_CLF iStrandIndex
|
|
g_savedGlobalsClifford.sFlow.strandSavedVars[iStrandIndex].thisCommandHashID = GET_FLOW_COMMAND_HASH_ID(g_savedGlobalsClifford.sFlow.strandSavedVars[iStrandIndex].thisCommandPos)
|
|
ENDREPEAT
|
|
#endif
|
|
#if USE_NRM_DLC
|
|
INT iStrandIndex
|
|
REPEAT MAX_STRANDS_NRM iStrandIndex
|
|
g_savedGlobalsnorman.sFlow.strandSavedVars[iStrandIndex].thisCommandHashID = GET_FLOW_COMMAND_HASH_ID(g_savedGlobalsnorman.sFlow.strandSavedVars[iStrandIndex].thisCommandPos)
|
|
ENDREPEAT
|
|
#endif
|
|
|
|
#if not USE_CLF_DLC
|
|
#if not USE_NRM_DLC
|
|
INT iStrandIndex
|
|
REPEAT MAX_STRANDS iStrandIndex
|
|
g_savedGlobals.sFlow.strandSavedVars[iStrandIndex].thisCommandHashID = GET_FLOW_COMMAND_HASH_ID(g_savedGlobals.sFlow.strandSavedVars[iStrandIndex].thisCommandPos)
|
|
ENDREPEAT
|
|
#endif
|
|
#endif
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Save all the currents player details such as ammo, health, armour etc.
|
|
PROC Pre_Savegame_Store_Current_Player_Data()
|
|
STORE_PLAYER_PED_INFO(PLAYER_PED_ID(), TRUE)
|
|
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID()) // Variations now have to be stored manually.
|
|
|
|
// Update spawn coords for player vehicle.
|
|
INT i
|
|
REPEAT NUM_PLAYER_VEHICLE_IDS i
|
|
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
|
|
|
|
BOOL bInGarage = FALSE
|
|
INT iGarage = 0
|
|
TEXT_LABEL_31 tlGarageName = ""
|
|
VECTOR vCoords = <<0,0,0>>
|
|
SAVEHOUSE_NAME_ENUM eSavehouse = GET_CLOSEST_SAVEHOUSE(GET_ENTITY_COORDS(PLAYER_PED_ID()), g_eCreatedPlayerVehiclePed[i], TRUE)
|
|
|
|
#if USE_CLF_DLC
|
|
IF eSavehouse != NUMBER_OF_CLF_SAVEHOUSE
|
|
AND eSavehouse != SAVEHOUSEclf_TREVOR_VB
|
|
AND eSavehouse != SAVEHOUSEclf_TREVOR_CS
|
|
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
|
|
AND IS_VEHICLE_ON_ALL_WHEELS(g_viCreatedPlayerVehicleIDs[i])
|
|
WHILE NOT bInGarage
|
|
AND GET_PLAYER_GARAGE_DATA(g_eCreatedPlayerVehiclePed[i], iGarage, tlGarageName, eSavehouse)
|
|
IF IS_VEHICLE_IN_GARAGE_AREA(tlGarageName, g_viCreatedPlayerVehicleIDs[i])
|
|
bInGarage = TRUE
|
|
|
|
// We need to force the z-coord so that the vehicle doesnt appear on the roof when we use
|
|
// the SET_VEHICLE_ON_GROUND_PROPERLY command.
|
|
vCoords = GET_ENTITY_COORDS(g_viCreatedPlayerVehicleIDs[i], FALSE)
|
|
UPDATE_VEHICLE_COORDS_FOR_PLAYERS_GARGE(g_eCreatedPlayerVehiclePed[i], iGarage, vCoords)
|
|
ENDIF
|
|
iGarage++
|
|
ENDWHILE
|
|
ENDIF
|
|
IF bInGarage
|
|
PRINTLN("VEHGEN - Updating default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ENDIF
|
|
ELSE
|
|
PRINTLN("VEHGEN - Resetting default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
// Reset
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for CAR")
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for BIKE")
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobalsClifford.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
#endif
|
|
#if USE_NRM_DLC
|
|
IF eSavehouse != NUMBER_OF_NRM_SAVEHOUSE
|
|
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
|
|
AND IS_VEHICLE_ON_ALL_WHEELS(g_viCreatedPlayerVehicleIDs[i])
|
|
WHILE NOT bInGarage
|
|
AND GET_PLAYER_GARAGE_DATA(g_eCreatedPlayerVehiclePed[i], iGarage, tlGarageName, eSavehouse)
|
|
IF IS_VEHICLE_IN_GARAGE_AREA(tlGarageName, g_viCreatedPlayerVehicleIDs[i])
|
|
bInGarage = TRUE
|
|
|
|
// We need to force the z-coord so that the vehicle doesnt appear on the roof when we use
|
|
// the SET_VEHICLE_ON_GROUND_PROPERLY command.
|
|
vCoords = GET_ENTITY_COORDS(g_viCreatedPlayerVehicleIDs[i], FALSE)
|
|
UPDATE_VEHICLE_COORDS_FOR_PLAYERS_GARGE(g_eCreatedPlayerVehiclePed[i], iGarage, vCoords)
|
|
ENDIF
|
|
iGarage++
|
|
ENDWHILE
|
|
ENDIF
|
|
IF bInGarage
|
|
PRINTLN("VEHGEN - Updating default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ENDIF
|
|
ELSE
|
|
PRINTLN("VEHGEN - Resetting default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
// Reset
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for CAR")
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for BIKE")
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobalsnorman.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
#endif
|
|
|
|
#if not USE_CLF_DLC
|
|
#if not USE_NRM_DLC
|
|
IF eSavehouse != NUMBER_OF_SAVEHOUSE_LOCATIONS
|
|
AND eSavehouse != SAVEHOUSE_TREVOR_VB
|
|
AND eSavehouse != SAVEHOUSE_TREVOR_CS
|
|
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
|
|
AND IS_VEHICLE_ON_ALL_WHEELS(g_viCreatedPlayerVehicleIDs[i])
|
|
WHILE NOT bInGarage
|
|
AND GET_PLAYER_GARAGE_DATA(g_eCreatedPlayerVehiclePed[i], iGarage, tlGarageName, eSavehouse)
|
|
IF IS_VEHICLE_IN_GARAGE_AREA(tlGarageName, g_viCreatedPlayerVehicleIDs[i])
|
|
bInGarage = TRUE
|
|
|
|
// We need to force the z-coord so that the vehicle doesnt appear on the roof when we use
|
|
// the SET_VEHICLE_ON_GROUND_PROPERLY command.
|
|
vCoords = GET_ENTITY_COORDS(g_viCreatedPlayerVehicleIDs[i], FALSE)
|
|
UPDATE_VEHICLE_COORDS_FOR_PLAYERS_GARGE(g_eCreatedPlayerVehiclePed[i], iGarage, vCoords)
|
|
ENDIF
|
|
iGarage++
|
|
ENDWHILE
|
|
ENDIF
|
|
IF bInGarage
|
|
PRINTLN("VEHGEN - Updating default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = vCoords
|
|
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
|
|
ENDIF
|
|
ELSE
|
|
PRINTLN("VEHGEN - Resetting default spawn coords for player vehicle ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i])))
|
|
// Reset
|
|
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for CAR")
|
|
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ELIF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
|
|
PRINTLN("VEHGEN: Resetting default spawn position for BIKE")
|
|
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
|
|
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = 0.0
|
|
ENDIF
|
|
ENDIF
|
|
#endif
|
|
#endif
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Run any procs before we save the game.
|
|
PROC PERFORM_PRE_SAVEGAME_ROUTINE(BOOL bIsAnAutosave, BOOL bOverrideSaveHouse, BOOL bSaveWillLoadIntoMission = FALSE)
|
|
//Store email data
|
|
SAVE_EMAIL_SYSTEM_STATE()
|
|
|
|
//Compute and store current mission flow command hash IDs.
|
|
//Used for error checking and flow state repairing on loading.
|
|
Pre_Savegame_Store_Current_Strand_Command_Hash_IDs()
|
|
|
|
//Store current players variations, ammo, health etc.
|
|
Pre_Savegame_Store_Current_Player_Data()
|
|
|
|
//Save out a bitflag to communicate to missions that they have been launched
|
|
//directly from loading a save.
|
|
|
|
#if USE_CLF_DLC
|
|
IF bSaveWillLoadIntoMission
|
|
SET_BIT(g_savedGlobalsClifford.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ELSE
|
|
CLEAR_BIT(g_savedGlobalsClifford.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ENDIF
|
|
g_savedGlobalsClifford.sCommsControlData.iCommsGameTime = GET_GAME_TIMER()
|
|
|
|
//Fix for 1640548: If this isn't an autosave make sure the was faded flags are cleared.
|
|
//These can lead to a savegame that will never fade in.
|
|
IF NOT bIsAnAutosave
|
|
PRINTLN("PERFORM_PRE_SAVEGAME_ROUTINE: Clearing was faded flags before making a none autosave save.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut_switch = FALSE
|
|
ENDIF
|
|
VECTOR vPos
|
|
FLOAT fHeading
|
|
OVERRIDE_SAVE_HOUSE(bOverrideSaveHouse, g_savedGlobalsClifford.sRepeatPlayData.mPlayerStruct.vPos, g_savedGlobalsClifford.sRepeatPlayData.mPlayerStruct.fHeading, bIsAnAutosave, vPos, fHeading)
|
|
#endif
|
|
|
|
#if USE_NRM_DLC
|
|
IF bSaveWillLoadIntoMission
|
|
SET_BIT(g_savedGlobalsnorman.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ELSE
|
|
CLEAR_BIT(g_savedGlobalsnorman.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ENDIF
|
|
g_savedGlobalsnorman.sCommsControlData.iCommsGameTime = GET_GAME_TIMER()
|
|
|
|
//Fix for 1640548: If this isn't an autosave make sure the was faded flags are cleared.
|
|
//These can lead to a savegame that will never fade in.
|
|
IF NOT bIsAnAutosave
|
|
PRINTLN("PERFORM_PRE_SAVEGAME_ROUTINE: Clearing was faded flags before making a none autosave save.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut_switch = FALSE
|
|
ENDIF
|
|
VECTOR vPos
|
|
FLOAT fHeading
|
|
OVERRIDE_SAVE_HOUSE(bOverrideSaveHouse, g_savedGlobalsnorman.sRepeatPlayData.mPlayerStruct.vPos, g_savedGlobalsnorman.sRepeatPlayData.mPlayerStruct.fHeading, bIsAnAutosave, vPos, fHeading)
|
|
#endif
|
|
|
|
#if not USE_CLF_DLC
|
|
#if not use_NRM_dlc
|
|
IF bSaveWillLoadIntoMission
|
|
SET_BIT(g_savedGlobals.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ELSE
|
|
CLEAR_BIT(g_savedGlobals.sFlowCustom.spInitBitset, SP_INIT_LOADED_DIRECTLY_INTO_MISSION)
|
|
ENDIF
|
|
g_savedGlobals.sCommsControlData.iCommsGameTime = GET_GAME_TIMER()
|
|
// if bOverrideSaveHouse is true this is a repeat play or save anywhere save.
|
|
// we then override the savehouse with the snapshot data
|
|
// if bOverrideSaveHouse is false, calling this command ensures the savehouse is not overridden
|
|
IF g_eRunningMission = SP_MISSION_TREVOR_1
|
|
OR g_eMissionRunningOnMPSwitchStart = SP_MISSION_TREVOR_1
|
|
//Trevor isn't given a savehouse until after Trevor1.
|
|
Set_Savehouse_Respawn_Available(SAVEHOUSE_TREVOR_CS, TRUE)
|
|
ENDIF
|
|
//Fix for 1640548: If this isn't an autosave make sure the was faded flags are cleared.
|
|
//These can lead to a savegame that will never fade in.
|
|
IF NOT bIsAnAutosave
|
|
PRINTLN("PERFORM_PRE_SAVEGAME_ROUTINE: Clearing was faded flags before making a none autosave save.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobals.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobals.sFlowCustom.wasFadedOut_switch = FALSE
|
|
ENDIF
|
|
VECTOR vPos
|
|
FLOAT fHeading
|
|
OVERRIDE_SAVE_HOUSE(bOverrideSaveHouse, g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos, g_savedGlobals.sRepeatPlayData.mPlayerStruct.fHeading, bIsAnAutosave, vPos, fHeading)
|
|
#endif
|
|
#endif
|
|
|
|
ENDPROC
|
|
#if USE_CLF_DLC
|
|
PROC DO_MP_TRANSITION_STARTING_SAVECLF()
|
|
|
|
IF GET_IS_AUTO_SAVE_OFF()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Autosaves are turned off.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_AUTO_SAVE_IN_PROGRESS()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The game is current saving.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_MEMORY_CARD_IN_USE()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The memory card is in use.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(g_savedGlobalsClifford.sFlow.strandSavedVars[STRAND_CLF].savedBitflags, SAVED_BITS_STRAND_ACTIVATED)
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Singleplayer gameflow not initialised.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Clearing was faded flags as a safety measure.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut_switch = FALSE
|
|
|
|
//Check to see if any strands are sitting on DO_MISSION_NOW flow commands.
|
|
//If they are we need to set the wasFadedOut flag to enure the screen doesn't fade in
|
|
//on loading until after the mission is running.
|
|
INT iStrandIndex
|
|
BOOL bMissionAutostartFound = FALSE
|
|
REPEAT MAX_STRANDS_CLF iStrandIndex
|
|
INT iCommandPos = g_savedGlobalsClifford.sFlow.strandSavedVars[iStrandIndex].thisCommandPos
|
|
IF iCommandPos != ILLEGAL_ARRAY_POSITION
|
|
IF g_flowUnsaved.flowCommands[iCommandPos].command = FLOW_DO_MISSION_NOW
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Considering setting SET_FADE_IN_AFTER_LOAD as strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " is on a DO_MISSION_NOW_COMMAND.")
|
|
|
|
//Only set this flag if this strand doesn't have a save command
|
|
//point override set.
|
|
BOOL bOverrideSetOnStrand = FALSE
|
|
INT iOverrideIndex
|
|
REPEAT g_savedGlobalsClifford.sFlowCustom.numberStoredOverrides iOverrideIndex
|
|
IF ENUM_TO_INT(g_savedGlobalsClifford.sFlowCustom.strandToOverride[iOverrideIndex]) = iStrandIndex
|
|
IF NOT g_savedGlobalsClifford.sFlowCustom.applyOnMPSwitchOnly[iOverrideIndex]
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " had a save override set. Backing out of setting SET_FADE_IN_AFTER_LOAD.")
|
|
bOverrideSetOnStrand = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bOverrideSetOnStrand
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] SET_FADE_IN_AFTER_LOAD set for strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), ".")
|
|
SET_FADE_IN_AFTER_LOAD(FALSE)
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut = TRUE
|
|
g_savedGlobalsClifford.sFlowCustom.wasFadedOut_switch = FALSE
|
|
bMissionAutostartFound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
|
|
PERFORM_PRE_SAVEGAME_ROUTINE(TRUE, FALSE, bMissionAutostartFound)
|
|
CLEAR_REPLAY_STATS()//these will have been processed at this point
|
|
DO_AUTO_SAVE()
|
|
ENDPROC
|
|
#endif
|
|
#if USE_NRM_DLC
|
|
PROC DO_MP_TRANSITION_STARTING_SAVENRM()
|
|
|
|
IF GET_IS_AUTO_SAVE_OFF()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Autosaves are turned off.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_AUTO_SAVE_IN_PROGRESS()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The game is current saving.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_MEMORY_CARD_IN_USE()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The memory card is in use.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(g_savedGlobalsnorman.sFlow.strandSavedVars[STRAND_NRM_SURVIVE].savedBitflags, SAVED_BITS_STRAND_ACTIVATED)
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Singleplayer gameflow not initialised.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Clearing was faded flags as a safety measure.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut_switch = FALSE
|
|
|
|
//Check to see if any strands are sitting on DO_MISSION_NOW flow commands.
|
|
//If they are we need to set the wasFadedOut flag to enure the screen doesn't fade in
|
|
//on loading until after the mission is running.
|
|
INT iStrandIndex
|
|
BOOL bMissionAutostartFound = FALSE
|
|
REPEAT MAX_STRANDS_NRM iStrandIndex
|
|
INT iCommandPos = g_savedGlobalsnorman.sFlow.strandSavedVars[iStrandIndex].thisCommandPos
|
|
IF iCommandPos != ILLEGAL_ARRAY_POSITION
|
|
IF g_flowUnsaved.flowCommands[iCommandPos].command = FLOW_DO_MISSION_NOW
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Considering setting SET_FADE_IN_AFTER_LOAD as strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " is on a DO_MISSION_NOW_COMMAND.")
|
|
|
|
//Only set this flag if this strand doesn't have a save command
|
|
//point override set.
|
|
BOOL bOverrideSetOnStrand = FALSE
|
|
INT iOverrideIndex
|
|
REPEAT g_savedGlobalsnorman.sFlowCustom.numberStoredOverrides iOverrideIndex
|
|
IF ENUM_TO_INT(g_savedGlobalsnorman.sFlowCustom.strandToOverride[iOverrideIndex]) = iStrandIndex
|
|
IF NOT g_savedGlobalsnorman.sFlowCustom.applyOnMPSwitchOnly[iOverrideIndex]
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " had a save override set. Backing out of setting SET_FADE_IN_AFTER_LOAD.")
|
|
bOverrideSetOnStrand = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bOverrideSetOnStrand
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] SET_FADE_IN_AFTER_LOAD set for strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), ".")
|
|
SET_FADE_IN_AFTER_LOAD(FALSE)
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut = TRUE
|
|
g_savedGlobalsnorman.sFlowCustom.wasFadedOut_switch = FALSE
|
|
bMissionAutostartFound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
|
|
PERFORM_PRE_SAVEGAME_ROUTINE(TRUE, FALSE, bMissionAutostartFound)
|
|
CLEAR_REPLAY_STATS()//these will have been processed at this point
|
|
DO_AUTO_SAVE()
|
|
ENDPROC
|
|
#endif
|
|
PROC DO_MP_TRANSITION_STARTING_SAVE()
|
|
#if USE_CLF_DLC
|
|
DO_MP_TRANSITION_STARTING_SAVECLF()
|
|
#endif
|
|
#if USE_NRM_DLC
|
|
DO_MP_TRANSITION_STARTING_SAVENRM()
|
|
#endif
|
|
|
|
#if not USE_CLF_DLC
|
|
#if not USE_NRM_DLC
|
|
IF GET_IS_AUTO_SAVE_OFF()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Autosaves are turned off.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_AUTO_SAVE_IN_PROGRESS()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The game is current saving.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_MEMORY_CARD_IN_USE()
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: The memory card is in use.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(g_savedGlobals.sFlow.strandSavedVars[STRAND_PROLOGUE].savedBitflags, SAVED_BITS_STRAND_ACTIVATED)
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Skipped: Singleplayer gameflow not initialised.")
|
|
EXIT
|
|
ENDIF
|
|
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Clearing was faded flags as a safety measure.")
|
|
g_sAutosaveData.bIgnoreScreenFade = FALSE
|
|
g_savedGlobals.sFlowCustom.wasFadedOut = FALSE
|
|
g_savedGlobals.sFlowCustom.wasFadedOut_switch = FALSE
|
|
|
|
//Check to see if any strands are sitting on DO_MISSION_NOW flow commands.
|
|
//If they are we need to set the wasFadedOut flag to enure the screen doesn't fade in
|
|
//on loading until after the mission is running.
|
|
INT iStrandIndex
|
|
BOOL bMissionAutostartFound = FALSE
|
|
REPEAT MAX_STRANDS iStrandIndex
|
|
INT iCommandPos = g_savedGlobals.sFlow.strandSavedVars[iStrandIndex].thisCommandPos
|
|
IF iCommandPos != ILLEGAL_ARRAY_POSITION
|
|
IF g_flowUnsaved.flowCommands[iCommandPos].command = FLOW_DO_MISSION_NOW
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Considering setting SET_FADE_IN_AFTER_LOAD as strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " is on a DO_MISSION_NOW_COMMAND.")
|
|
|
|
//Only set this flag if this strand doesn't have a save command
|
|
//point override set.
|
|
BOOL bOverrideSetOnStrand = FALSE
|
|
INT iOverrideIndex
|
|
REPEAT g_savedGlobals.sFlowCustom.numberStoredOverrides iOverrideIndex
|
|
IF ENUM_TO_INT(g_savedGlobals.sFlowCustom.strandToOverride[iOverrideIndex]) = iStrandIndex
|
|
IF NOT g_savedGlobals.sFlowCustom.applyOnMPSwitchOnly[iOverrideIndex]
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] Strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), " had a save override set. Backing out of setting SET_FADE_IN_AFTER_LOAD.")
|
|
bOverrideSetOnStrand = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bOverrideSetOnStrand
|
|
PRINTLN("[DO_MP_TRANSITION_STARTING_SAVE] SET_FADE_IN_AFTER_LOAD set for strand ", GET_STRAND_DISPLAY_STRING_FROM_STRAND_ID(INT_TO_ENUM(STRANDS, iStrandIndex)), ".")
|
|
SET_FADE_IN_AFTER_LOAD(FALSE)
|
|
g_savedGlobals.sFlowCustom.wasFadedOut = TRUE
|
|
g_savedGlobals.sFlowCustom.wasFadedOut_switch = FALSE
|
|
bMissionAutostartFound = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
|
|
|
|
PERFORM_PRE_SAVEGAME_ROUTINE(TRUE, FALSE, bMissionAutostartFound)
|
|
CLEAR_REPLAY_STATS()//these will have been processed at this point
|
|
DO_AUTO_SAVE()
|
|
#endif
|
|
#endif
|
|
ENDPROC
|
|
|
|
|