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

756 lines
24 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 1 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_cutscene.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "CompletionPercentage_public.sch"
USING "cutscene_public.sch"
USING "randomChar_public.sch"
USING "RC_helper_functions.sch"
USING "script_player.sch"
USING "commands_recording.sch"
USING "initial_scenes_Omega.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Omega1.sc
// AUTHOR : Joanna Wright
// DESCRIPTION : Franklin meets Omega and is asked to collect spaceship scraps
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
g_structRCScriptArgs sRCLauncherDataLocal
// Constants
CONST_INT OMEGA 0
CONST_INT FOCUS_STAGE_TIME 3500
// Enums
ENUM eRC_MainState
RC_INIT = 0,
RC_FOCUS_PUSH,
RC_MEET_OMEGA,
RC_LEADOUT,
RC_LEAVE_AREA,
RC_FAILED
ENDENUM
ENUM eRC_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_CLEANUP
ENDENUM
ENUM eRC_FailReason
FAILED_GENERIC,
FAILED_OMEGA_DIED,
FAILED_OMEGA_HURT,
FAILED_OMEGA_SCARED
ENDENUM
// Mission state
eRC_MainState m_eState = RC_INIT
eRC_SubState m_eSubState = SS_SETUP
eRC_FailReason m_eFailReason= FAILED_GENERIC
BOOL bPostCutsceneConv = FALSE
BOOL bHangAroundConv = FALSE
BOOL bConvStopped = FALSE
BOOL bCalledOmegaAFreak = FALSE
FLOAT leaveAreaDistance = 100.0
FLOAT hearTalkingDistance = 20.0
structPedsForConversation sDialogue
STRING sSceneHandleOmega = "Omega"
MODEL_NAMES digiModel = GET_WEAPONTYPE_MODEL(WEAPONTYPE_DIGISCANNER)
MODEL_NAMES radioModel = PROP_CS_WALKIE_TALKIE
OBJECT_INDEX oiRadio
VECTOR vecRadioOffset = << 0.1, 0.08, 0.0 >>
VECTOR vecRadioAngles = << 162.72, 5.4, 1.8 >>
SEQUENCE_INDEX seqLeadOut
INT iFocusTimeOut
INT iLeadOutTimer
REL_GROUP_HASH relGroupPlayer
INT iObjectiveTimer = 0
VECTOR vClearArea[2]
FLOAT fClearArea
#IF IS_DEBUG_BUILD
BOOL bDebugReattach
WIDGET_GROUP_ID widgetGroup
#ENDIF
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
PROC Script_Cleanup()
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
#IF IS_DEBUG_BUILD
// Widgets
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
#ENDIF
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
CPRINTLN(DEBUG_MISSION, "...Random Character Script was triggered so additional cleanup required")
ENDIF
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
REMOVE_PED_FOR_DIALOGUE(sDialogue, 1)
REMOVE_PED_FOR_DIALOGUE(sDialogue, 3)
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[OMEGA])
// Cleanup the scene created by the launcher
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0])
SET_OBJECT_AS_NO_LONGER_NEEDED(sRCLauncherDataLocal.objID[0])
ENDIF
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[1])
SET_OBJECT_AS_NO_LONGER_NEEDED(sRCLauncherDataLocal.objID[1])
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(digiModel)
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
/// PARAMS:
/// None.
/// RETURNS:
/// N/A
PROC Script_Passed()
ADD_HELP_TO_FLOW_QUEUE("SSHIP_HELP1", FHP_MEDIUM)
Random_Character_Passed(CP_RAND_C_OMG1)
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// Sets the new mission state and initialises the substate.
/// PARAMS:
/// eRC_MainState in = new main state
/// RETURNS:
/// N/A
PROC SetState(eRC_MainState in)
m_eState = in
m_eSubState = SS_SETUP
ENDPROC
// ===========================================================================================================
// DEBUG FUNCTIONS
// ===========================================================================================================
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Check debug skip functionality
/// PARAMS:
/// None.
/// RETURNS:
/// N/A
PROC DEBUG_Check_Debug_Keys()
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
WAIT_FOR_CUTSCENE_TO_STOP()
Script_Passed()
ENDIF
// IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
// WAIT_FOR_CUTSCENE_TO_STOP()
// KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
// SetState(RC_INIT)
// ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
WAIT_FOR_CUTSCENE_TO_STOP()
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
Random_Character_Failed()
Script_Cleanup()
ENDIF
// Widget handling
IF bDebugReattach
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND DOES_ENTITY_EXIST(oiRadio)
CPRINTLN(DEBUG_MISSION, "attach radio")
DETACH_ENTITY(oiRadio, FALSE)
ATTACH_ENTITY_TO_ENTITY(oiRadio, sRCLauncherDataLocal.pedID[OMEGA], GET_PED_BONE_INDEX(sRCLauncherDataLocal.pedID[0], BONETAG_L_CLAVICLE), vecRadioOffset, vecRadioAngles)
bDebugReattach = FALSE
ENDIF
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// MISSION FUNCTIONS & PROCEDURES
// ===========================================================================================================
/// PURPOSE:
/// Sets the required state and sets it to SS_SETUP
PROC SET_STAGE(eRC_MainState TheState)
m_eState = TheState
m_eSubState = SS_SETUP
ENDPROC
/// PURPOSE:
/// Checks for Omega being killed - returns FALSE when mission has failed
FUNC BOOL HANDLE_FAIL_CHECKS()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
// Omega killed
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "HANDLE_FAIL_CHECKS - Omega died")
m_eFailReason = FAILED_OMEGA_DIED
SetState(RC_FAILED)
RETURN FALSE
// Omega injured
ELIF IS_PED_INJURED(sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "HANDLE_FAIL_CHECKS - Omega injured")
m_eFailReason = FAILED_OMEGA_HURT
SetState(RC_FAILED)
RETURN FALSE
// Threatened
ELIF HAS_PLAYER_THREATENED_PED(sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "HANDLE_FAIL_CHECKS - Omega threatened")
TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[OMEGA], PLAYER_PED_ID(), 500, -1)
m_eFailReason = FAILED_OMEGA_SCARED
SetState(RC_FAILED)
RETURN FALSE
// Vehicle grief checks
ELIF HAS_PED_BUMPED_PED_WITH_VEHICLE(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA], TRUE)
CPRINTLN(DEBUG_MISSION, "HANDLE_FAIL_CHECKS - Vehicle grief")
TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[OMEGA], PLAYER_PED_ID(), 500, -1)
m_eFailReason = FAILED_OMEGA_SCARED
SetState(RC_FAILED)
RETURN FALSE
// Omega ragdoll - will be from ped-ped bump if we get here
ELIF IS_PED_RAGDOLL(sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "HANDLE_FAIL_CHECKS - Omega spooked by ped bump")
m_eFailReason = FAILED_OMEGA_SCARED
SetState(RC_FAILED)
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// If the player has an oversized vehicle in the cutscene clear area, move it to a safe location nearby
PROC REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA(VEHICLE_INDEX vehMS = NULL)
IF NOT IS_ENTITY_ALIVE(vehMS)
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA not passed a vehicle, trying to grab mission start vehicle")
vehMS = GET_MISSION_START_VEHICLE_INDEX()
ELSE
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA was passed a valid vehicle")
ENDIF
VECTOR vVehDim[3]
VECTOR vVehAllowedDim
BOOL bNeedToReposition = FALSE
MODEL_NAMES eModel
IF IS_ENTITY_ALIVE(vehMS)
IF IS_ENTITY_IN_ANGLED_AREA(vehMS, vClearArea[0], vClearArea[1], fClearArea)
eModel = GET_ENTITY_MODEL(vehMS)
IF IS_MODEL_VALID(eModel)
GET_MODEL_DIMENSIONS(eModel, vVehDim[1], vVehDim[2])
vVehDim[0] = << vVehDim[2].x-vVehDim[1].x, vVehDim[2].y-vVehDim[1].y, vVehDim[2].z-vVehDim[1].z >>
vVehAllowedDim = GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()
IF ENUM_TO_INT(eModel) = HASH("zentorno") //#1696370
OR ENUM_TO_INT(eModel) = HASH("btype") //#1738925
OR ENUM_TO_INT(eModel) = HASH("dubsta3") //#1846988
OR ENUM_TO_INT(eModel) = HASH("Monster") //#1891164
vVehAllowedDim *= 1.1
ELIF ENUM_TO_INT(eModel) = HASH("t20") //#2333237 & 2335303
OR ENUM_TO_INT(eModel) = HASH("virgo") //#2345087
vVehAllowedDim *= 1.2
ENDIF
// Check if vehicle is too big on any axis
IF vVehDim[0].x > vVehAllowedDim.x
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA found a vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehMS), " too big in x, will set as vehicle gen a ways away")
bNeedToReposition = TRUE
ELIF vVehDim[0].y > vVehAllowedDim.y
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA found a vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehMS), " too big in y, will set as vehicle gen a ways away")
bNeedToReposition = TRUE
ELIF vVehDim[0].z > vVehAllowedDim.z
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA found a vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehMS), " too big in z, will set as vehicle gen a ways away")
bNeedToReposition = TRUE
ELSE
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA checked vehicle ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehMS), " but it didn't appear to be too big")
ENDIF
// Set the vehicle out of the way if needed
IF bNeedToReposition
SET_ENTITY_HEADING(vehMS, 248.4908)
SET_ENTITY_COORDS(vehMS, <<2531.0803, 3357.1709, 50.9746>>)
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA has a vehicle but couldn't get a valid model for it")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA has a vehicle but it does not appear to be in the restricted area")
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA vehicle entity does not exist?")
ENDIF
ENDPROC
PROC DATA_INIT()
vClearArea[0] = <<2453.513428,3424.646484,48.442322>>
vClearArea[1] = <<2490.059570,3434.194824,58.261032>>
fClearArea = 32.75
ENDPROC
/// PURPOSE:
/// If a taxi is found near the player, move it down the road
PROC REMOVE_TAXIS()
INT iVehCount
VEHICLE_INDEX vehTemp[16]
GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), vehTemp)
REPEAT 16 iVehCount
IF IS_ENTITY_ALIVE(vehTemp[iVehCount])
AND IS_ENTITY_IN_ANGLED_AREA(vehTemp[iVehCount], vClearArea[0], vClearArea[1], fClearArea)
IF GET_ENTITY_MODEL(vehTemp[iVehCount]) = TAXI
IF DOES_ENTITY_EXIST(GET_PED_IN_VEHICLE_SEAT(vehTemp[iVehCount], VS_DRIVER))
CPRINTLN(DEBUG_MISSION, "REMOVE_TAXIS found occupied taxi inside area at array index ", iVehCount)
SET_ENTITY_HEADING(vehTemp[iVehCount], 217.6790)
SET_ENTITY_COORDS(vehTemp[iVehCount], <<2479.2490, 3401.2341, 48.9551>>)
EXIT
ENDIF
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MISSION, "REMOVE_TAXIS found no driven taxis near the player")
ENDPROC
/// PURPOSE:
/// Sets up variables etc
PROC STATE_Init()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
REQUEST_ANIM_DICT("rcmrc_omega_1leadinoutscrap_1_rcm")
REQUEST_ANIM_DICT("rcmrc_omega_1")
REQUEST_ADDITIONAL_TEXT("OMEGA1", MISSION_TEXT_SLOT)
REQUEST_MODEL(digiModel)
REQUEST_MODEL(radioModel)
IF HANDLE_FAIL_CHECKS()
IF HAS_ANIM_DICT_LOADED("rcmrc_omega_1leadinoutscrap_1_rcm")
AND HAS_ANIM_DICT_LOADED("rcmrc_omega_1")
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
AND HAS_MODEL_LOADED(digiModel)
AND HAS_MODEL_LOADED(radioModel)
OPEN_SEQUENCE_TASK(seqLeadOut)
TASK_PLAY_ANIM(NULL, "rcmrc_omega_1leadinoutscrap_1_rcm", "leadout_scrap_1_rcm_omega", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
TASK_PLAY_ANIM(NULL, "rcmrc_omega_1", "omega_idle_geiger_counter", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING|AF_USE_KINEMATIC_PHYSICS)
CLOSE_SEQUENCE_TASK(seqLeadOut)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[OMEGA], TRUE)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[OMEGA], TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sRCLauncherDataLocal.pedID[OMEGA], FALSE)
SET_PED_CONFIG_FLAG(sRCLauncherDataLocal.pedID[OMEGA], PCF_UseKinematicModeWhenStationary, TRUE)
ENDIF
// Get the PLAYER relationship group, turn Franklin to face him
IF IS_PED_UNINJURED(PLAYER_PED_ID())
AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[OMEGA])
relGroupPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(sRCLauncherDataLocal.pedID[OMEGA], relGroupPlayer)
SET_PED_CONFIG_FLAG(sRCLauncherDataLocal.pedID[OMEGA], PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
ADD_PED_FOR_DIALOGUE(sDialogue, 3, sRCLauncherDataLocal.pedID[OMEGA], "OMEGA")
ADD_PED_FOR_DIALOGUE(sDialogue, 1, PLAYER_PED_ID(), "FRANKLIN")
// TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA])
ENDIF
// Set the focus push timer
iFocusTimeOut = GET_GAME_TIMER() + FOCUS_STAGE_TIME
#IF IS_DEBUG_BUILD
IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup)
widgetGroup = START_WIDGET_GROUP("Omega 1")
ADD_WIDGET_BOOL("Reattach radio", bDebugReattach)
ADD_WIDGET_VECTOR_SLIDER("Radio attachment offset", vecRadioOffset, -1, 1, 0.01)
ADD_WIDGET_VECTOR_SLIDER("Radio attachment rotation", vecRadioAngles, -180, 180, 0.1)
STOP_WIDGET_GROUP()
ENDIF
#ENDIF
SET_STAGE(RC_FOCUS_PUSH)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Watch Omega for a few seconds
PROC STATE_FocusPush()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
IF HANDLE_FAIL_CHECKS()
IF GET_GAME_TIMER() < iFocusTimeOut
AND NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA], 4.0)
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[OMEGA], (<<0, 0, 0>>), TRUE, -1, 2500, DEFAULT_INTERP_OUT_TIME)
SET_GAMEPLAY_HINT_FOV(35.0)
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(0.0)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.30)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.02)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0.05)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA], 2000)
ELSE
SET_STAGE(RC_MEET_OMEGA)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Sort and play intro cutscene state
PROC STATE_MeetOmega()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Init: RC_MEET_OMEGA")
RC_REQUEST_CUTSCENE("SCRAP_1_RCM")
IF RC_IS_CUTSCENE_OK_TO_START()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[OMEGA], sSceneHandleOmega, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
// Start mocap scene
RC_CLEANUP_LAUNCHER()
SET_MULTIHEAD_SAFE(TRUE)
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
WAIT(0)
REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA()
REMOVE_TAXIS()
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(vClearArea[0], vClearArea[1], fClearArea, <<2455.8860, 3432.4453, 49.2697>>, 189.77)
RC_START_CUTSCENE_MODE(<<2468.51, 3437.39, 49.90>>)
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0])
DELETE_OBJECT(sRCLauncherDataLocal.objID[0])
ENDIF
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[1])
DELETE_OBJECT(sRCLauncherDataLocal.objID[1])
ENDIF
m_eSubState = SS_UPDATE
ENDIF
BREAK
CASE SS_UPDATE
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT(TRUE)
ENDIF
IF HAS_CUTSCENE_FINISHED()
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
IF NOT DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0])
CPRINTLN(DEBUG_MISSION, "Creating digiscanner again")
sRCLauncherDataLocal.objID[0] = CREATE_OBJECT(digiModel, <<2468.51, 3437.39, 55.0>>)
ENDIF
oiRadio = CREATE_OBJECT(radioModel, <<2472.3, 3437.3, 49.3>>)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0])
CPRINTLN(DEBUG_MISSION, "reattach digiscanner")
ATTACH_ENTITY_TO_ENTITY(sRCLauncherDataLocal.objID[0], sRCLauncherDataLocal.pedID[OMEGA], GET_PED_BONE_INDEX(sRCLauncherDataLocal.pedID[0], BONETAG_L_HAND), <<0.09, 0.072, -0.006>>, <<298.000, 194.000, 178.000>>)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND DOES_ENTITY_EXIST(oiRadio)
CPRINTLN(DEBUG_MISSION, "attach radio")
ATTACH_ENTITY_TO_ENTITY(oiRadio, sRCLauncherDataLocal.pedID[OMEGA], GET_PED_BONE_INDEX(sRCLauncherDataLocal.pedID[0], BONETAG_L_CLAVICLE), vecRadioOffset, vecRadioAngles)
ENDIF
REPLAY_STOP_EVENT()
m_eSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_MEET_OMEGA")
SET_MULTIHEAD_SAFE(FALSE)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND DOES_ENTITY_EXIST(sRCLauncherDataLocal.objID[0])
IF IS_ENTITY_ATTACHED_TO_ENTITY(sRCLauncherDataLocal.objID[0], sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "entity attached, lead out")
SET_STAGE(RC_LEADOUT)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC STATE_Leadout()
// Check for Omega
IF HANDLE_FAIL_CHECKS()
// State update
SWITCH m_eSubState
CASE SS_SETUP
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
CPRINTLN(DEBUG_MISSION, "Omega - TASK_PERFORM_SEQUENCE()")
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[OMEGA], seqLeadOut)
ENDIF
PRINT_NOW("O1_LEAVEAREA", DEFAULT_GOD_TEXT_TIME, 1)
iObjectiveTimer = GET_GAME_TIMER()
iLeadOutTimer = GET_GAME_TIMER()
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
IF GET_GAME_TIMER() - iLeadOutTimer > 3000
m_eSubState = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
SET_STAGE(RC_LEAVE_AREA)
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC STATE_Leave_Area()
// Check for Omega
IF HANDLE_FAIL_CHECKS()
// State update
SWITCH m_eSubState
CASE SS_SETUP
bPostCutsceneConv = FALSE
bHangAroundConv = FALSE
bConvStopped = FALSE
bCalledOmegaAFreak = FALSE
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[OMEGA])
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF NOT bConvStopped
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA]) > hearTalkingDistance
KILL_FACE_TO_FACE_CONVERSATION()
bConvStopped = TRUE
ELSE
IF (GET_GAME_TIMER() - iObjectiveTimer) > DEFAULT_GOD_TEXT_TIME
IF NOT bPostCutsceneConv
bPostCutsceneConv = CREATE_CONVERSATION(sDialogue, "SCRAPAU", "SCRAP_1_AMB2", CONV_PRIORITY_MEDIUM)
ELIF NOT bHangAroundConv
bHangAroundConv = CREATE_CONVERSATION(sDialogue, "SCRAPAU", "SCRAP_1_HANG", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bCalledOmegaAFreak
AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA]) > 50.0
bCalledOmegaAFreak = CREATE_CONVERSATION(sDialogue, "SCRAPAU", "SCRAP_WALK", CONV_PRIORITY_MEDIUM)
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[OMEGA]) > leaveAreaDistance
m_eSubState = SS_CLEANUP
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
Script_Passed()
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Main mission failed fade state
PROC STATE_Failed()
SWITCH m_eSubState
CASE SS_SETUP
CLEAR_PRINTS()
STRING sFailReason
SWITCH m_eFailReason
CASE FAILED_GENERIC
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED: Reason=FAILED_GENERIC")
BREAK
CASE FAILED_OMEGA_DIED
sFailReason = "O1_FAILKILL" // Omega died.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED: Reason=FAILED_OMEGA_DIED")
BREAK
CASE FAILED_OMEGA_HURT
sFailReason = "O1_FAILHURT" // Omega was hurt.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED: Reason=FAILED_OMEGA_HURT")
BREAK
CASE FAILED_OMEGA_SCARED
sFailReason = "O1_FAILSCARE" // Omega was scared.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED: Reason=FAILED_WOMAN_SCARED")
BREAK
ENDSWITCH
IF m_eFailReason = FAILED_GENERIC
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(sFailReason)
ENDIF
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
Script_Cleanup()
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
// Take ownership of initial scene entities
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
// Now on mission
SET_MISSION_FLAG(TRUE)
// 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))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ENDIF
DATA_INIT()
IF Is_Replay_In_Progress() // Set up the initial scene for replays
CPRINTLN(DEBUG_MISSION, "Replay in progress...")
g_bSceneAutoTrigger = TRUE
eInitialSceneStage = IS_REQUEST_SCENE
VEHICLE_INDEX vTmp
CREATE_VEHICLE_FOR_REPLAY(vTmp, <<2455.8860, 3432.4453, 49.2697>>, 189.77, FALSE, FALSE, FALSE, FALSE, FALSE)
REPOSITION_OVERSIZED_START_VEHICLE_IN_AREA(vTmp)
WHILE NOT SetupScene_OMEGA_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
g_bSceneAutoTrigger = FALSE
ENDIF
RC_END_CUTSCENE_MODE()
WHILE (TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_Omega1")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
SWITCH(m_eState)
CASE RC_INIT
STATE_Init()
BREAK
CASE RC_FOCUS_PUSH
STATE_FocusPush()
BREAK
CASE RC_MEET_OMEGA
STATE_MeetOmega()
BREAK
CASE RC_LEADOUT
STATE_Leadout()
BREAK
CASE RC_LEAVE_AREA
STATE_Leave_Area()
BREAK
CASE RC_FAILED
STATE_Failed()
BREAK
ENDSWITCH
// Check debug completion/failure
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT