393 lines
14 KiB
Python
Executable File
393 lines
14 KiB
Python
Executable File
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
|
|
USING "cutscene_public.sch"
|
|
USING "RC_launcher_public.sch"
|
|
USING "RC_Setup_public.sch"
|
|
USING "initial_scenes_Josh.sch"
|
|
|
|
// *****************************************************************************************
|
|
// SCRIPT NAME : launcher_Josh.sc
|
|
//
|
|
// AUTHOR : David Roberts / Andrew Minghella
|
|
//
|
|
// DESCRIPTION : Launcher script that determines which RC mission scene to setup.
|
|
// This launcher script should be attached to appropriate world point.
|
|
//
|
|
// If multiple missions share same coord or are within close proximity,
|
|
// we should just add one world point, and adjust the tolerance float.
|
|
// *****************************************************************************************
|
|
// Enums
|
|
ENUM JOSH_CONV_STATE
|
|
JOSH_CONV_WAITING,
|
|
JOSH_CONV_DOLINE,
|
|
JOSH_CONV_SPEAKING
|
|
ENDENUM
|
|
|
|
// Constants
|
|
CONST_FLOAT WORLD_POINT_COORD_TOLERANCE 1.0
|
|
|
|
// Variables
|
|
INT iCutsceneLoadRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST // ID to register off-mission cutscene load request with cutscene_controller.
|
|
JOSH_CONV_STATE JoshConv = JOSH_CONV_WAITING
|
|
structPedsForConversation ConvStruct
|
|
|
|
INT iConvTimer
|
|
BOOL bJoshConvDone = FALSE
|
|
BLIP_INDEX biLeadIn
|
|
|
|
BOOL bVariationsSet = FALSE
|
|
|
|
|
|
// ----------Functions -------------------------
|
|
/// PURPOSE:
|
|
/// Does any necessary cleanup and terminates the launcher's thread.
|
|
/// PARAMS:
|
|
/// sData - launcher data struct
|
|
/// bCleanupEntities - do we want to cleanup the entities in the launcher struct
|
|
PROC Script_Cleanup(g_structRCScriptArgs& sData, BOOL bCleanupEntities = TRUE)
|
|
|
|
IF bCleanupEntities
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATING: Cleaning up entities in Launcher")
|
|
RC_CleanupSceneEntities(sData, FALSE)
|
|
ENDIF
|
|
|
|
// Remove lead-in blip
|
|
IF DOES_BLIP_EXIST(biLeadIn)
|
|
REMOVE_BLIP(biLeadIn)
|
|
ENDIF
|
|
|
|
// Unload launcher animation dictionary
|
|
REMOVE_LAUNCHER_ANIM_DICT(sData.sAnims)
|
|
|
|
// Clear any cutscene requests with controller.
|
|
IF iCutsceneLoadRequestID != NULL_OFFMISSION_CUTSCENE_REQUEST
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATING: Ending off-mission cutscene request")
|
|
END_OFFMISSION_CUTSCENE_REQUEST(iCutsceneLoadRequestID)
|
|
ENDIF
|
|
|
|
// Stop launcher conversation
|
|
STRING sConversationRoot
|
|
SWITCH sData.eMissionID
|
|
CASE RC_JOSH_4
|
|
sConversationRoot = "JOSH4_AMB"
|
|
BREAK
|
|
ENDSWITCH
|
|
RC_STOP_LAUNCHER_DIALOGUE(sConversationRoot)
|
|
|
|
// Josh 4 uses CREATE_FORCED_OBJECT for the right gate - this must be cleaned up if the launcher terminates
|
|
SWITCH sData.eMissionID
|
|
CASE RC_JOSH_4
|
|
REMOVE_FORCED_OBJECT(<<-1101.62, 290.36, 64.76>>, 5, prop_lrggate_01c_r)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//B*1574385 - Force update to blip in RandChar Controller if mission wasn't launched
|
|
IF bCleanupEntities
|
|
SET_RC_AWAITING_TRIGGER(sData.eMissionID)
|
|
ENDIF
|
|
|
|
RC_LAUNCHER_END()
|
|
|
|
// Kill the thread
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATED")
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Make player car stop and player get out if near to where Josh will walk using his synched scene anims - Same as Kev's function below for Josh 2
|
|
FUNC BOOL SPECIAL_JOSH2_LAUNCH(g_structRCScriptArgs& sData)
|
|
|
|
IF sData.eMissionID = RC_JOSH_2
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<566.74719, -1771.87500, 28.35786>>) < 9
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
PRINT_LAUNCHER_DEBUG("Special launching Josh 2")
|
|
RETURN TRUE
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE)
|
|
AND IS_ENTITY_ALIVE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 4)
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Make player car stop and player get out if near to where Josh will walk using his synched scene anims - see B*1391178
|
|
FUNC BOOL SPECIAL_JOSH3_LAUNCH(g_structRCScriptArgs& sData)
|
|
|
|
IF sData.eMissionID = RC_JOSH_3
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<566.74719, -1771.87500, 28.35786>>) < 6
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
PRINT_LAUNCHER_DEBUG("Special launching Josh 3")
|
|
RETURN TRUE
|
|
ELSE
|
|
IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE)
|
|
AND IS_ENTITY_ALIVE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 1)
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// If the Josh 4 conversation finishes, we make the mission launch prematurely even if the player is in a car
|
|
/// RETURNS:
|
|
/// TRUE if we should special launch Josh
|
|
FUNC BOOL SPECIAL_JOSH4_LAUNCH(g_structRCScriptArgs& sData)
|
|
|
|
IF sData.eMissionID = RC_JOSH_4
|
|
IF IS_ENTITY_ALIVE(sData.pedID[0])
|
|
IF bJoshConvDone
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sData.pedID[0]) <= 15
|
|
PRINT_LAUNCHER_DEBUG("Special launching Josh 4 (not in vehicle)")
|
|
RETURN TRUE // The conversation is done and the player is close enough for Josh to notice them
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sData.pedID[0]) <= 10
|
|
PRINT_LAUNCHER_DEBUG("Special launching Josh 4 (in vehicle)")
|
|
RETURN TRUE // The conversation is done and the player is close enough for Josh to notice them
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC DO_JOSH4_AMB()
|
|
SWITCH JoshConv
|
|
CASE JOSH_CONV_WAITING
|
|
IF (GET_GAME_TIMER() - iConvTimer) > 100
|
|
AND bJoshConvDone = FALSE
|
|
JoshConv = JOSH_CONV_DOLINE
|
|
ENDIF
|
|
BREAK
|
|
CASE JOSH_CONV_DOLINE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1103.44, 290.18, 63.28>>) <= 20.0
|
|
IF CREATE_CONVERSATION(ConvStruct, "JOSH4AU", "JOSH4_AMB", CONV_PRIORITY_HIGH)
|
|
JoshConv = JOSH_CONV_SPEAKING
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE JOSH_CONV_SPEAKING
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
iConvTimer = GET_GAME_TIMER()
|
|
JoshConv = JOSH_CONV_WAITING
|
|
bJoshConvDone = TRUE
|
|
PRINT_LAUNCHER_DEBUG("Josh 4 conversation finished and will not loop")
|
|
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1103.44, 290.18, 63.28>>) >= 25.0
|
|
KILL_ANY_CONVERSATION()
|
|
bJoshConvDone = TRUE
|
|
JoshConv = JOSH_CONV_WAITING
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates the initial scene
|
|
FUNC BOOL LOAD_INITIAL_SCENE(g_structRCScriptArgs& sData)
|
|
|
|
//Setup the correct initial scene
|
|
SWITCH sData.eMissionID
|
|
CASE RC_JOSH_1
|
|
IF NOT SetupScene_JOSH_1(sData)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE RC_JOSH_2
|
|
IF NOT SetupScene_JOSH_2(sData)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE RC_JOSH_3
|
|
IF NOT SetupScene_JOSH_3(sData)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE RC_JOSH_4
|
|
IF NOT SetupScene_JOSH_4(sData)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// Scene creation successful
|
|
PRINT_LAUNCHER_DEBUG("Created initial scene")
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Main script loops
|
|
/// PARAMS:
|
|
/// in_coords - world point co-ords
|
|
SCRIPT(coords_struct in_coords)
|
|
|
|
// Launcher priority for streaming requests
|
|
SET_THIS_IS_A_TRIGGER_SCRIPT(TRUE)
|
|
|
|
RC_LAUNCHER_START()
|
|
|
|
g_structRCScriptArgs sRCLauncherData // Scene information to pass to mission script
|
|
VECTOR vInCoords = <<0,0,0>> // Stores world point location
|
|
|
|
//Reset all basic values of the data, so each scene has to set them up correctly
|
|
RC_Reset_LauncherData(sRCLauncherData)
|
|
|
|
// Update world point
|
|
vInCoords = in_coords.vec_coord[0]
|
|
|
|
// Determine which RC mission we are attempting to launch (currently done on a launcher by launcher basis)
|
|
g_eRC_MissionIDs eRCMissions[4]
|
|
eRCMissions[0] = RC_JOSH_1
|
|
eRCMissions[1] = RC_JOSH_2
|
|
eRCMissions[2] = RC_JOSH_3
|
|
eRCMissions[3] = RC_JOSH_4
|
|
|
|
// Setup callback when player is killed, arrested or goes to multiplayer
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_REPEAT_PLAY))
|
|
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
|
|
|
|
// Ensure candidate id is released in the event that the player has died
|
|
// or been arrested prior to mission launch
|
|
IF sRCLauncherData.eMissionID <> NO_RC_MISSION
|
|
IF (g_RandomChars[sRCLauncherData.eMissionID].rcMissionCandidateID <> NO_CANDIDATE_ID)
|
|
PRINT_LAUNCHER_DEBUG("Relinquishing candidate id...")
|
|
Mission_Over(g_RandomChars[sRCLauncherData.eMissionID].rcMissionCandidateID)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Standard cleanup
|
|
Script_Cleanup(sRCLauncherData)
|
|
ENDIF
|
|
|
|
//Pick which mission activated us
|
|
IF NOT DETERMINE_RC_TO_LAUNCH(eRCMissions, sRCLauncherData, vInCoords, WORLD_POINT_COORD_TOLERANCE)
|
|
RC_LAUNCHER_END()
|
|
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATED")
|
|
TERMINATE_THIS_THREAD() // B* 1510945 - don't call cleanup if nothing has been setup yet
|
|
ENDIF
|
|
|
|
// Check with the Random Character Controller to see if this script is allowed to launch
|
|
IF NOT CAN_RC_LAUNCH(sRCLauncherData.eMissionID)
|
|
RC_LAUNCHER_END()
|
|
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATED")
|
|
TERMINATE_THIS_THREAD() // B* 1510945 - don't call cleanup if nothing has been setup yet
|
|
ENDIF
|
|
|
|
// Halt launcher as we are incorrect character
|
|
IF Random_Character_Blocked_Due_To_Character(sRCLauncherData.eMissionID)
|
|
RC_LAUNCHER_END()
|
|
|
|
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATED")
|
|
TERMINATE_THIS_THREAD() // B* 1510945 - don't call cleanup if nothing has been setup yet
|
|
ENDIF
|
|
|
|
// The script is allowed to launch so set up the initial scene
|
|
WHILE NOT LOAD_INITIAL_SCENE(sRCLauncherData)
|
|
WAIT(0)
|
|
IF NOT IS_WORLD_POINT_WITHIN_BRAIN_ACTIVATION_RANGE()
|
|
PRINT_LAUNCHER_DEBUG("Player out of range [TERMINATING]")
|
|
Script_Cleanup(sRCLauncherData)
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
// Clears area of non-mission entities and blood decals
|
|
CLEAR_AREA(vInCoords, sRCLauncherData.activationRange, TRUE)
|
|
|
|
IF sRCLauncherData.eMissionID = RC_JOSH_1
|
|
ADD_PED_FOR_DIALOGUE(ConvStruct, 5, sRCLauncherData.pedID[0], "JOSH")
|
|
ELIF sRCLauncherData.eMissionID = RC_JOSH_4
|
|
ADD_PED_FOR_DIALOGUE(ConvStruct, 4, sRCLauncherData.pedID[0], "JOSH")
|
|
ADD_PED_FOR_DIALOGUE(ConvStruct, 3, sRCLauncherData.pedID[1], "JOSHCOP")
|
|
iConvTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
// Loop to check conditions - should script terminate? or is player close enough to trigger mission?
|
|
WHILE (TRUE)
|
|
WAIT(0)
|
|
|
|
//Is the player still in activation range
|
|
IF NOT IS_RC_FINE_AND_IN_RANGE(sRCLauncherData)
|
|
IF sRCLauncherData.eMissionID = RC_JOSH_4 // For B*968838 Cops attack player and Josh runs off
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-1102.72412, 290.14630, 63.23002>>) < 200
|
|
SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(),1)
|
|
MAKE_ALL_INITIAL_SCENE_PEDS_ATTACK_PLAYER(sRCLauncherData)
|
|
PRINT_LAUNCHER_DEBUG("Making Josh cops attack")
|
|
ENDIF
|
|
ENDIF
|
|
Script_Cleanup(sRCLauncherData)
|
|
ENDIF
|
|
|
|
//Update launcher blip + preload intro
|
|
SET_RC_AWAITING_TRIGGER(sRCLauncherData.eMissionID)
|
|
MANAGE_PRELOADING_RC_CUTSCENE(iCutsceneLoadRequestID, sRCLauncherData.sIntroCutscene, vInCoords)
|
|
|
|
IF sRCLauncherData.eMissionID = RC_JOSH_1
|
|
PLAY_LAUNCHER_AMBIENT_DIALOGUE(sRCLauncherData, vInCoords, "JOSH1AU", "JOSH1_AMB1", 5, "JOSH", DEFAULT, 14)
|
|
ELIF sRCLauncherData.eMissionID = RC_JOSH_2
|
|
PLAY_LAUNCHER_AMBIENT_DIALOGUE(sRCLauncherData, vInCoords, "JOSH2AU", "JOSH2_AMB", 5, "JOSH")
|
|
ELIF sRCLauncherData.eMissionID = RC_JOSH_3
|
|
PLAY_LAUNCHER_AMBIENT_DIALOGUE(sRCLauncherData, vInCoords, "JOSH3AU", "JOSH3_AMB", 3, "JOSH")
|
|
ELIF sRCLauncherData.eMissionID = RC_JOSH_4
|
|
IF bVariationsSet = FALSE
|
|
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
|
|
IF IS_ENTITY_ALIVE(sRCLauncherData.pedID[1])
|
|
PRINT_LAUNCHER_DEBUG("Josh 4: Trying to set Cop 1 component variation")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_standing_idle", sRCLauncherData.pedID[1])
|
|
ENDIF
|
|
IF IS_ENTITY_ALIVE(sRCLauncherData.pedID[2])
|
|
PRINT_LAUNCHER_DEBUG("Josh 4: Trying to set Cop 2 component variation")
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Cop_with_notepad", sRCLauncherData.pedID[2])
|
|
ENDIF
|
|
bVariationsSet = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
DO_JOSH4_AMB()
|
|
ENDIF
|
|
|
|
//Is the player close enough to start the mission off
|
|
IF ARE_RC_TRIGGER_CONDITIONS_MET(sRCLauncherData)
|
|
OR SPECIAL_JOSH2_LAUNCH(sRCLauncherData)
|
|
OR SPECIAL_JOSH3_LAUNCH(sRCLauncherData)
|
|
OR SPECIAL_JOSH4_LAUNCH(sRCLauncherData)
|
|
|
|
// Create mission blip that persists for lead-in scene
|
|
// Original will be removed when RC controller shuts down
|
|
IF DOES_RC_MISSION_HAVE_LEAD_IN(sRCLauncherData.eMissionID)
|
|
CREATE_BLIP_FOR_LEAD_IN(sRCLauncherData.eMissionID, biLeadIn)
|
|
ENDIF
|
|
|
|
//Launch the mission script
|
|
IF NOT LAUNCH_RC_MISSION(sRCLauncherData)
|
|
Script_Cleanup(sRCLauncherData)
|
|
ENDIF
|
|
|
|
//Waits in a loop until we can terminate the launcher - flagged from mission at the moment
|
|
IF IS_RC_LAUNCHER_SAFE_TO_TERMINATE(sRCLauncherData.eMissionID)
|
|
Script_Cleanup(sRCLauncherData, FALSE) //No need to clean up entities, as we should have passed them over to the mission script
|
|
ENDIF
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
// Script should never reach here. Always terminate with cleanup function.
|
|
ENDSCRIPT
|
|
|