Files
gtav-src/script/dev_ng/singleplayer/include/public/savegame_public.sch
T
2025-09-29 00:52:08 +02:00

315 lines
8.8 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : savegame_public.sch //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Includes various savegame related procs. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_script.sch"
USING "commands_streaming.sch" // For IS_IPL_ACTIVE - must have been getting access to it indirectly
USING "script_player.sch"
USING "mission_repeat_public.sch"
/// PURPOSE: Returns TRUE if an autosave request is currently in progress
FUNC BOOL IS_AUTOSAVE_REQUEST_IN_PROGRESS()
RETURN (g_sAutosaveData.bRequest)
ENDFUNC
/// PURPOSE: Make an autosave request
FUNC BOOL MAKE_AUTOSAVE_REQUEST()
IF IS_REPEAT_PLAY_ACTIVE()
PRINTSTRING("\n[AUTOSAVE] Failed: Repeat Play is in progress.")PRINTNL()
RETURN FALSE
ENDIF
IF g_sAutosaveData.bIgnoreScreenFade
IF g_sAutosaveData.iQueuedRequests > 0
PRINTSTRING("\n[AUTOSAVE] Failed: Too many requests already queued while ignoring fades.")PRINTNL()
RETURN FALSE
ENDIF
ELSE
IF g_sAutosaveData.iQueuedRequests > 1
PRINTSTRING("\n[AUTOSAVE] Failed: Too many requests already queued.")PRINTNL()
RETURN FALSE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
DEBUG_PRINTCALLSTACK()
#ENDIF
PRINTLN("[AUTOSAVE] Autosave request made by ", GET_THIS_SCRIPT_NAME())
g_sAutosaveData.iQueuedRequests++
RETURN TRUE
ENDFUNC
/// PURPOSE: Cancels any currently queued autosave requests. Use very carefully.
PROC CLEAR_AUTOSAVE_REQUESTS()
PRINTLN("[AUTOSAVE] CLEAR_AUTOSAVE_REQUESTS called by ", GET_THIS_SCRIPT_NAME())
#IF IS_DEBUG_BUILD
IF NOT g_flowUnsaved.bUpdatingGameflow
#ENDIF
g_sAutosaveData.bFlushAutosaves = TRUE
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("[AUTOSAVE] CLEAR_AUTOSAVE_REQUEST ignored as a debug gameflow launch is in progress.")
ENDIF
#ENDIF
ENDPROC
PROC SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(BOOL bIgnoreOnMissionFlag, BOOL bIgnoreScreenFade = FALSE)
#IF IS_DEBUG_BUILD
IF bIgnoreOnMissionFlag
PRINTSTRING("\n SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(TRUE) called by '")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING("'")PRINTNL()
ELSE
PRINTSTRING("\n SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(FALSE) called by '")PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING("'")PRINTNL()
ENDIF
#ENDIF
g_sAutosaveData.bIgnoreOnMissionFlag = bIgnoreOnMissionFlag
g_sAutosaveData.bIgnoreScreenFade = bIgnoreScreenFade
ENDPROC
#if USE_CLF_DLC
FUNC BOOL GET_SAVEGAME_ROOM_TYPEclf(SAVEHOUSE_NAME_ENUM eSavehouse, TEXT_LABEL_31 &tlRoomType)
tlRoomType = ""
SWITCH eSavehouse
CASE SAVEHOUSEclf_MICHAEL_BH
tlRoomType = "v_michael"
BREAK
CASE SAVEHOUSEclf_FRANKLIN_SC
tlRoomType = "v_franklins"
BREAK
CASE SAVEHOUSEclf_FRANKLIN_VH
tlRoomType = "v_franklinshouse"
BREAK
CASE SAVEHOUSEclf_TREVOR_CS
CASE SAVEHOUSEclf_MICHAEL_CS
// We need to do a check on the loaded IPL here as the room name can change
IF IS_IPL_ACTIVE("TrevorsTrailer")
tlRoomType = "v_trailer"
ELIF IS_IPL_ACTIVE("TrevorsTrailerTidy")
tlRoomType = "V_TrailerTIDY"
ELIF IS_IPL_ACTIVE("TrevorsTrailerTrash")
tlRoomType = "V_TrailerTRASH"
ENDIF
BREAK
CASE SAVEHOUSEclf_TREVOR_VB
tlRoomType = "v_trevors"
BREAK
CASE SAVEHOUSEclf_TREVOR_SC
tlRoomType = "v_strip3"
BREAK
CASE SAVEHOUSEclf_FRANKLIN_PRO
CASE SAVEHOUSEclf_MICHAEL_PRO
CASE SAVEHOUSEclf_TREVOR_PRO
tlRoomType = "v_psycheoffice"
BREAK
ENDSWITCH
RETURN (NOT ARE_STRINGS_EQUAL(tlRoomType, ""))
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL GET_SAVEGAME_ROOM_TYPENRM(SAVEHOUSE_NAME_ENUM eSavehouse, TEXT_LABEL_31 &tlRoomType)
tlRoomType = ""
SWITCH eSavehouse
CASE SAVEHOUSENRM_BH
tlRoomType = "v_michael"
BREAK
CASE SAVEHOUSENRM_CHATEAU
tlRoomType = "v_franklins"//temp name
BREAK
ENDSWITCH
RETURN (NOT ARE_STRINGS_EQUAL(tlRoomType, ""))
ENDFUNC
#endif
FUNC BOOL GET_SAVEGAME_ROOM_TYPE(SAVEHOUSE_NAME_ENUM eSavehouse, TEXT_LABEL_31 &tlRoomType)
#if USE_CLF_DLC
return GET_SAVEGAME_ROOM_TYPEclf(eSavehouse,tlRoomType)
#endif
#if USE_NRM_DLC
return GET_SAVEGAME_ROOM_TYPENRM(eSavehouse,tlRoomType)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
tlRoomType = ""
SWITCH eSavehouse
CASE SAVEHOUSE_MICHAEL_BH
tlRoomType = "v_michael"
BREAK
CASE SAVEHOUSE_FRANKLIN_SC
tlRoomType = "v_franklins"
BREAK
CASE SAVEHOUSE_FRANKLIN_VH
tlRoomType = "v_franklinshouse"
BREAK
CASE SAVEHOUSE_TREVOR_CS
CASE SAVEHOUSE_MICHAEL_CS
// We need to do a check on the loaded IPL here as the room name can change
IF IS_IPL_ACTIVE("TrevorsTrailer")
tlRoomType = "v_trailer"
ELIF IS_IPL_ACTIVE("TrevorsTrailerTidy")
tlRoomType = "V_TrailerTIDY"
ELIF IS_IPL_ACTIVE("TrevorsTrailerTrash")
tlRoomType = "V_TrailerTRASH"
ENDIF
BREAK
CASE SAVEHOUSE_TREVOR_VB
tlRoomType = "v_trevors"
BREAK
CASE SAVEHOUSE_TREVOR_SC
tlRoomType = "v_strip3"
BREAK
CASE SAVEHOUSE_FRANKLIN_PRO
CASE SAVEHOUSE_MICHAEL_PRO
CASE SAVEHOUSE_TREVOR_PRO
tlRoomType = "v_psycheoffice"
BREAK
ENDSWITCH
#endif
#endif
RETURN (NOT ARE_STRINGS_EQUAL(tlRoomType, ""))
ENDFUNC
/// PURPOSE: Returns TRUE if the player is in their savehouse.
/// NOTE: Set eSavehouse to NUMBER_OF_SAVEHOUSE_LOCATIONS to check all savehouses
#if USE_CLF_DLC
FUNC BOOL IS_PLAYER_IN_SAVEHOUSE(SAVEHOUSE_NAME_ENUM eSavehouse = NUMBER_OF_CLF_SAVEHOUSE)
IF g_sShopSettings.playerInterior = NULL
RETURN FALSE
ENDIF
IF eSavehouse = NUMBER_OF_CLF_SAVEHOUSE
INT iSavehouse
REPEAT ENUM_TO_INT(NUMBER_OF_CLF_SAVEHOUSE) iSavehouse
IF IS_PLAYER_IN_SAVEHOUSE(INT_TO_ENUM(SAVEHOUSE_NAME_ENUM, iSavehouse))
RETURN TRUE
ENDIF
ENDREPEAT
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TEXT_LABEL_31 tlRoomType
GET_SAVEGAME_ROOM_TYPE(eSavehouse, tlRoomType)
INTERIOR_INSTANCE_INDEX savehouseInterior = GET_INTERIOR_AT_COORDS_WITH_TYPE(g_sSavehouses[eSavehouse].vSpawnCoords, tlRoomType)
IF savehouseInterior != NULL
AND g_sShopSettings.playerInterior = savehouseInterior
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL IS_PLAYER_IN_SAVEHOUSE(SAVEHOUSE_NAME_ENUM eSavehouse = NUMBER_OF_NRM_SAVEHOUSE)
IF g_sShopSettings.playerInterior = NULL
RETURN FALSE
ENDIF
IF eSavehouse = NUMBER_OF_NRM_SAVEHOUSE
INT iSavehouse
REPEAT ENUM_TO_INT(NUMBER_OF_NRM_SAVEHOUSE) iSavehouse
IF IS_PLAYER_IN_SAVEHOUSE(INT_TO_ENUM(SAVEHOUSE_NAME_ENUM, iSavehouse))
RETURN TRUE
ENDIF
ENDREPEAT
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TEXT_LABEL_31 tlRoomType
GET_SAVEGAME_ROOM_TYPE(eSavehouse, tlRoomType)
INTERIOR_INSTANCE_INDEX savehouseInterior = GET_INTERIOR_AT_COORDS_WITH_TYPE(g_sSavehouses[eSavehouse].vSpawnCoords, tlRoomType)
IF savehouseInterior != NULL
AND g_sShopSettings.playerInterior = savehouseInterior
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
FUNC BOOL IS_PLAYER_IN_SAVEHOUSE(SAVEHOUSE_NAME_ENUM eSavehouse = NUMBER_OF_SAVEHOUSE_LOCATIONS)
IF g_sShopSettings.playerInterior = NULL
RETURN FALSE
ENDIF
IF eSavehouse = NUMBER_OF_SAVEHOUSE_LOCATIONS
INT iSavehouse
REPEAT ENUM_TO_INT(NUMBER_OF_SAVEHOUSE_LOCATIONS) iSavehouse
IF IS_PLAYER_IN_SAVEHOUSE(INT_TO_ENUM(SAVEHOUSE_NAME_ENUM, iSavehouse))
RETURN TRUE
ENDIF
ENDREPEAT
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
TEXT_LABEL_31 tlRoomType
GET_SAVEGAME_ROOM_TYPE(eSavehouse, tlRoomType)
INTERIOR_INSTANCE_INDEX savehouseInterior = GET_INTERIOR_AT_COORDS_WITH_TYPE(g_sSavehouses[eSavehouse].vSpawnCoords, tlRoomType)
IF savehouseInterior != NULL
AND g_sShopSettings.playerInterior = savehouseInterior
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
#endif
/// PURPOSE: Returns TRUE if the savehouse interior is ready
FUNC BOOL IS_SAVEHOUSE_INTERIOR_READY(SAVEHOUSE_NAME_ENUM eSavehouse)
TEXT_LABEL_31 tlRoomType
IF GET_SAVEGAME_ROOM_TYPE(eSavehouse, tlRoomType)
INTERIOR_INSTANCE_INDEX savehouseInterior = GET_INTERIOR_AT_COORDS_WITH_TYPE(g_sSavehouses[eSavehouse].vSpawnCoords, tlRoomType)
IF (savehouseInterior != NULL)
IF IS_INTERIOR_READY(savehouseInterior)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC