315 lines
8.8 KiB
Scheme
Executable File
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
|
|
|