Files
2025-09-29 00:52:08 +02:00

471 lines
15 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : spaceshipScraps.sc //
// AUTHOR : Joanna Wright //
// DESCRIPTION : Sets up 50 spaceship scraps around the map for the //
// player to collect //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//----------------------
// INCLUDES
//----------------------
USING "email_public.sch"
USING "rgeneral_include.sch"
USING "RC_Helper_Functions.sch"
USING "CompletionPercentage_public.sch"
USING "savegame_public.sch"
USING "scrap_common.sch"
USING "pickups_spaceship.sch"
USING "achievement_public.sch"
USING "net_system_activity_feed.sch"
//----------------------
// CONSTS
//----------------------
CONST_INT XVERSION_NUMBER 102
//---------------------
// VARIABLES
//----------------------
SCRAP_MISSION_DATA sMissionData
SCRAP_PICKUP_DATA sPickupData[NUMBER_OF_SPACESHIP_PARTS]
INT scrapInInterior = 15
INT iMessageStage = 0
BOOL bFinalTextRegistered = FALSE
SCALEFORM_INDEX siMessage
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID mWidgetGroup
BOOL bMapAllScraps
BOOL bCollectAllScraps
BOOL bResetScrapCollection
BOOL bDebugAllowWarping
BOOL bWarpToScrap[NUMBER_OF_SPACESHIP_PARTS]
BOOL bDebugQuitScript = FALSE
BOOL bSimulateScrapCollect
INT iSimulateScrapCollect = 1
#ENDIF
//----------------------
// FUNCTIONS
//----------------------
PROC INITIALIZE_SPACESHIP_PARTS()
iMessageStage = 0
// Mission is running
g_savedGlobals.sAmbient.sSpaceshipPartData.bMissionActive = TRUE
// Initialise spaceship parts
INT i
REPEAT NUMBER_OF_SPACESHIP_PARTS i
sPickupData[i].vCoords = GET_UFOSCRAP_PICKUP_COORDS(i)
sPickupData[i].bActive = FALSE
ENDREPEAT
sPickupData[0].fHeading = 179.4746
sPickupData[1].fHeading = 198.0000
sPickupData[2].fHeading = 104.0000
sPickupData[3].fHeading = 321.5000
sPickupData[4].fHeading = 256.2500
sPickupData[5].fHeading = 286.5000
sPickupData[6].fHeading = 0.00
sPickupData[6].vRot = << 0.0, 0.0, 1.0 >>
sPickupData[7].fHeading = -165.6051
sPickupData[8].fHeading = 91.5000
sPickupData[9].fHeading = 116.0000
sPickupData[10].fHeading = 15.0000
sPickupData[11].fHeading = 305.5000
sPickupData[12].fHeading = 0.0000
sPickupData[13].fHeading = 95.0000
sPickupData[14].fHeading = 40.0000
sPickupData[15].fHeading = 40.0000
sPickupData[16].fHeading = 40.0000
sPickupData[17].fHeading = 40.0000
sPickupData[18].fHeading = 40.0000
sPickupData[19].fHeading = 40.0000
sPickupData[20].fHeading = 40.0000
sPickupData[21].vRot = << 90.00, 0.00, 57.00 >>
sPickupData[22].fHeading = 40.0000
sPickupData[23].fHeading = 40.0000
sPickupData[24].fHeading = 40.0000
sPickupData[25].fHeading = 40.0000
sPickupData[26].fHeading = 40.0000
sPickupData[27].fHeading = 40.0000
sPickupData[28].fHeading = 40.0000
sPickupData[29].fHeading = 40.0000
sPickupData[29].vRot = << -24.35, 15.74, 14.31 >>
sPickupData[30].fHeading = 40.0000
sPickupData[31].fHeading = 40.0000
sPickupData[32].fHeading = 40.0000
sPickupData[33].fHeading = 40.0000
sPickupData[34].vRot = << 0.00, 0.00, -15.00 >>
sPickupData[35].fHeading = 40.0000
sPickupData[36].fHeading = 40.0000
sPickupData[37].fHeading = 40.0000
sPickupData[38].fHeading = 40.0000
sPickupData[38].vRot = << 20.18, -0.87, 20.46 >>
sPickupData[39].vRot = << 0.0, 0.0, -4.39 >>
sPickupData[40].fHeading = 40.0000
sPickupData[41].fHeading = 80.0000
sPickupData[42].fHeading = 198.0000
sPickupData[43].fHeading = 198.0000
sPickupData[44].fHeading = 198.0000
sPickupData[45].fHeading = 198.0000
sPickupData[46].fHeading = 198.0000
sPickupData[47].fHeading = 198.0000
sPickupData[48].fHeading = 198.0000
sPickupData[49].fHeading = 198.0000
ENDPROC
/// PURPOSE:
/// Updates the spaceship part array
FUNC BOOL UPDATE_SPACESHIP_PARTS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
AND NOT IS_SCREEN_FADED_OUT()
INT i
BOOL bScrapCollected
VECTOR vPlayerPos
// cache the player position and do is injured check to stop asserts
IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
// Check through spaceship parts...
REPEAT SCRAPS_TO_CHECK_PER_FRAME i
bScrapCollected = HAS_SCRAP_BEEN_COLLECTED(missionData.scrapData, missionData.iCurrentCheckIndex)
// If scrap isn't active...
IF (NOT pickupData[missionData.iCurrentCheckIndex].bActive)
// And hasn't been collected..
IF NOT bScrapCollected
// Interior check
IF missionData.iCurrentCheckIndex = scrapInInterior
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl, PICKUP_CUSTOM_SCRIPT, TRUE)
IF DOES_PICKUP_EXIST(pickupData[missionData.iCurrentCheckIndex].pickup)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(pickupData[missionData.iCurrentCheckIndex].pickup, "GtaMloRoomTun5")
ENDIF
// Need to force rotation
ELIF missionData.iCurrentCheckIndex = 6
OR missionData.iCurrentCheckIndex = 14
OR missionData.iCurrentCheckIndex = 21
OR missionData.iCurrentCheckIndex = 34
OR missionData.iCurrentCheckIndex = 39
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl, PICKUP_CUSTOM_SCRIPT, FALSE, TRUE)
ELSE
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl)
ENDIF
ENDIF
ELSE
// Check for collection...
IF (NOT bScrapCollected)
UPDATE_SCRAP_PICKUP(missionData, pickupData, vPlayerPos)
ENDIF
ENDIF
// Increase the current index - make sure it doesn't over run
missionData.iCurrentCheckIndex++
IF (missionData.iCurrentCheckIndex >= COUNT_OF(pickupData))
missionData.iCurrentCheckIndex = 0
ENDIF
ENDREPEAT
IF NOT g_bResultScreenDisplaying
UPDATE_DISPLAY_MESSAGE(missionData.bDisplayMessage, missionData.bMessageOnDisplay, missionData.iMessageTimer, SCRAP_SHIP, iMessageStage, siMessage, "SSHIP_TITLE", "SSHIP_COLLECT")
ELSE
CDEBUG1LN(debug_ambient,"Can't display spaceship parts message, results screen is currently active")
ENDIF
IF NOT bFinalTextRegistered
IF missionData.scrapData.iScrapsCollected >= missionData.scrapData.iMaxScraps
bFinalTextRegistered = REGISTER_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(TEXT_UFOPARTS_DONE, CT_FLOW, BIT_FRANKLIN, CHAR_OMEGA, 5000, 10000, VID_BLANK, CID_OMEGA1_COMPLETE_SPACESHIP_PARTS, FLOW_CHECK_NONE, COMM_FLAG_ADD_CONTACT)
ENDIF
ENDIF
// Send the complete flag once everything is collected and messsage has stopped
IF NOT missionData.bMessageOnDisplay
AND NOT missionData.bDisplayMessage
RETURN (missionData.scrapData.iScrapsCollected >= missionData.scrapData.iMaxScraps)
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Setups Debug Widgets
PROC SETUP_DEBUG_WIDGETS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
INT iScrap
TEXT_LABEL_63 tlTemp
mWidgetGroup = START_WIDGET_GROUP("Spaceship Parts")
ADD_WIDGET_BOOL("Show all scraps on map", bMapAllScraps)
ADD_WIDGET_BOOL("Force Quit Script", bDebugQuitScript)
ADD_WIDGET_BOOL("Allow debug warp", bDebugAllowWarping)
ADD_WIDGET_BOOL("Allow debug tty", bShowScrapDebugTTY)
START_WIDGET_GROUP("Collection")
ADD_WIDGET_BOOL("Collect all scraps", bCollectAllScraps)
ADD_WIDGET_BOOL("Reset scraps collection", bResetScrapCollection)
ADD_WIDGET_BOOL("Simulate Scrap Collect", bSimulateScrapCollect)
ADD_WIDGET_INT_SLIDER("Sim Scraps to Collect", iSimulateScrapCollect, 1, COUNT_OF(pickupData), 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Stats")
ADD_WIDGET_INT_READ_ONLY("Scraps Collected", missionData.scrapData.iScrapsCollected)
ADD_WIDGET_INT_READ_ONLY("Total Scraps", missionData.scrapData.iMaxScraps)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Positions")
REPEAT COUNT_OF(pickupData) iScrap
tlTemp = "Scrap "
tlTemp += iScrap
START_WIDGET_GROUP(tlTemp)
ADD_WIDGET_BOOL("bWarp", bWarpToScrap[iScrap])
ADD_WIDGET_FLOAT_READ_ONLY("X Position", pickupData[iScrap].vCoords.x)
ADD_WIDGET_FLOAT_READ_ONLY("Y Position", pickupData[iScrap].vCoords.y)
ADD_WIDGET_FLOAT_READ_ONLY("Z Position", pickupData[iScrap].vCoords.z)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Updates all The Widgets
PROC UPDATE_DEBUG_WIDGETS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
INT i
INT cnt = 0
IF (bResetScrapCollection)
CPRINTLN(DEBUG_AMBIENT, "Resetting Scrap Collection")
STAT_SET_INT(missionData.packageStat, 0)
REPEAT COUNT_OF(pickupData) i
SAFE_REMOVE_PICKUP(pickupData[i].pickup)
SAFE_REMOVE_BLIP(pickupData[i].blip)
SET_SCRAP_AS_COLLECTED(missionData.scrapData, i, FALSE)
UPDATE_GLOBAL_SCRAP_DATA(missionData.missionType, i, FALSE)
pickupData[i].bActive = FALSE
ENDREPEAT
SET_PACKED_STATS_FROM_SCRAP_COLLECT_DATA(missionData.scrapData)
bResetScrapCollection = FALSE
bMapAllScraps = TRUE
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (bSimulateScrapCollect)
CPRINTLN(DEBUG_AMBIENT, "Simulating Collecting ", iSimulateScrapCollect, "Scraps")
REPEAT COUNT_OF(pickupData) i
IF NOT HAS_SCRAP_BEEN_COLLECTED(missionData.scrapData, i)
COLLECT_SCRAP(missionData, pickupData, i)
cnt ++
ENDIF
IF (cnt >= iSimulateScrapCollect)
i = COUNT_OF(pickupData) + 1 // so we break out of array
ENDIF
ENDREPEAT
bMapAllScraps = TRUE
MAKE_AUTOSAVE_REQUEST()
bSimulateScrapCollect = FALSE
ENDIF
IF (bCollectAllScraps)
CPRINTLN(DEBUG_AMBIENT, "Collecting All Scraps")
STAT_SET_INT(missionData.packageStat, 0)
REPEAT COUNT_OF(pickupData) i
COLLECT_SCRAP(missionData, pickupData, i)
ENDREPEAT
bCollectAllScraps = FALSE
bMapAllScraps = TRUE
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (bMapAllScraps)
BLIP_SCRAP_POSITIONS(missionData, pickupData)
bMapAllScraps = FALSE
ENDIF
// handle warping
IF (bDebugAllowWarping = FALSE)
EXIT
ENDIF
REPEAT COUNT_OF(pickupData) i
IF (bWarpToScrap[i])
CPRINTLN(DEBUG_AMBIENT, "Warping To Scrap:", i)
IF i = scrapInInterior
INTERIOR_INSTANCE_INDEX intScrap = GET_INTERIOR_AT_COORDS(pickupData[i].vCoords)
PIN_INTERIOR_IN_MEMORY(intScrap)
WHILE NOT IS_INTERIOR_READY(intScrap)
WAIT(0)
ENDWHILE
CHECK_WARP_TO_PACKAGE(bWarpToScrap[i], pickupData[i].vCoords)
WAIT(0)
UNPIN_INTERIOR(intScrap)
bWarpToScrap[i] = FALSE
ELSE //normal warp
IF i = 22
CHECK_WARP_TO_PACKAGE(bWarpToScrap[i], <<28.3896, 646.5005, 189.6085>>)
ELIF i = 1 //underwater warps not behaving
OR i = 20
OR i = 22
OR i = 40
CHECK_WARP_TO_PACKAGE(bWarpToScrap[i], (pickupData[i].vCoords+ <<0.0, -4.5, 0.0>>))
ELSE
CHECK_WARP_TO_PACKAGE(bWarpToScrap[i], pickupData[i].vCoords)
ENDIF
ENDIF
bWarpToScrap[i] = FALSE
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Cleans up All The Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(mWidgetGroup)
DELETE_WIDGET_GROUP(mWidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// SCRIPT FUNCTIONS
//----------------------
/// PURPOSE:
/// Script Cleanup
PROC SCRIPT_CLEANUP()
INT i
CPRINTLN(DEBUG_AMBIENT, "Cleanup Spaceship Part Collection")
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
// Mission script is no longer active
g_savedGlobals.sAmbient.sSpaceshipPartData.bMissionActive = FALSE
REPEAT COUNT_OF(sPickupData) i
SAFE_REMOVE_BLIP(sPickupData[i].blip)
SAFE_REMOVE_PICKUP(sPickupData[i].pickup)
ENDREPEAT
IF HAVE_ALL_SCRAPS_BEEN_COLLECTED(sMissionData.scrapData)
OR GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SPACESHIP_PARTS_DONE) = TRUE
// Set the flow flag to allow Omega 2 to proceed
Set_Mission_Flow_Flag_State(FLOWFLAG_SPACESHIP_PARTS_DONE, TRUE)
// Push a message to the PS4 activity feed.
REQUEST_SYSTEM_ACTIVITY_TYPE_COLLECTED_SPACESHIP()
// No longer require the script to be relaunched when loading from a savegame.
Remove_Script_From_Relaunch_List(LAUNCH_BIT_RC_AMB_SPACESHIP_PARTS)
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(sMissionData.packageMdl)
TERMINATE_THIS_THREAD()
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
// Setup callbacks
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_REPEAT_PLAY|FORCE_CLEANUP_FLAG_DIRECTOR)
SCRIPT_CLEANUP()
ENDIF
// Close down in the event that this script is already running
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("spaceshipParts")) > 1
CPRINTLN(DEBUG_AMBIENT, "Spaceship Parts is attempting to launch with an instance already active.")
TERMINATE_THIS_THREAD()
ENDIF
// Register the script so that it can be relaunched when loading from a savegame.
Register_Script_To_Relaunch_List(LAUNCH_BIT_RC_AMB_SPACESHIP_PARTS)
// Setup arrays and everything else
CPRINTLN(DEBUG_AMBIENT, "Initializing Spaceship Part Collection - Version:", XVERSION_NUMBER)
INITIALIZE_SPACESHIP_PARTS()
SETUP_SCRAP_MISSION(sMissionData, SCRAP_SHIP, PROP_POWER_CELL, "SSHIP_COLLECT")
SETUP_SCRAP_MISSION_STATS(sMissionData, NUM_HIDDEN_PACKAGES_1, PACKSTAT_UFO_START, NUMBER_OF_SPACESHIP_PARTS)
#IF IS_DEBUG_BUILD
//SET_PROFILING_OF_THIS_SCRIPT(TRUE)
SETUP_DEBUG_WIDGETS(sMissionData, sPickupData)
#ENDIF
// main loop
WHILE (TRUE)
WAIT(0)
IS_ENTITY_OK(PLAYER_PED_ID())
// Clean up when all items are collected
IF UPDATE_SPACESHIP_PARTS(sMissionData, sPickupData)
OR (GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SPACESHIP_PARTS_DONE) = TRUE)
CPRINTLN(DEBUG_AMBIENT, "Spaceship Parts: All scraps have been collected")
IF NOT bFinalTextRegistered
bFinalTextRegistered = REGISTER_TEXT_MESSAGE_FROM_CHARACTER_TO_PLAYER(TEXT_UFOPARTS_DONE, CT_FLOW, BIT_FRANKLIN, CHAR_OMEGA, 5000, 10000, VID_BLANK, CID_OMEGA1_COMPLETE_SPACESHIP_PARTS, FLOW_CHECK_NONE, COMM_FLAG_ADD_CONTACT)
ENDIF
IF bFinalTextRegistered
IF NOT (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN)
ADD_HELP_TO_FLOW_QUEUE("SSHIP_SWITCH", FHP_MEDIUM, 0, 20000, DEFAULT_HELP_TEXT_TIME, BIT_MICHAEL|BIT_FRANKLIN)
ENDIF
SCRIPT_CLEANUP()
ENDIF
ENDIF
// Update debug
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS(sMissionData, sPickupData)
#ENDIF
ENDWHILE
ENDSCRIPT