Files
gtav-src/script/dev_ng/singleplayer/scripts/Ambient/Rampages/launcher_rampage.sc
T
2025-09-29 00:52:08 +02:00

746 lines
24 KiB
Python
Executable File

// *****************************************************************************************
//
// MISSION NAME : launcher_Rampage.sc
// AUTHOR : Aaron Gandaa
// DESCRIPTION : Launcher script that determines which rampage mission to setup.
// This launcher script should be attached to world points for each
// of the rampage locations
//
// *****************************************************************************************
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//----------------------
// INCLUDES
//----------------------
USING "cutscene_public.sch"
USING "RC_launcher_public.sch"
USING "RC_Setup_public.sch"
USING "RC_Helper_Functions.sch"
USING "initial_scenes_rampage.sch"
USING "rgeneral_include.sch"
//----------------------
// CONSTANTS
//----------------------
CONST_INT SCRIPT_VERSION 006
CONST_INT RAMPAGE_WANTED_LEVEL_BARRIER 0
CONST_FLOAT RAMPAGE_ACTIVATE_RANGE 5.0
CONST_FLOAT HELP_TEXT_RESET_DISTANCE 25.0
CONST_FLOAT WORLD_POINT_COORD_TOLERANCE 5.0
//----------------------
// VARIABLES
//----------------------
INT iFirstRBlipIndex = ENUM_TO_INT(STATIC_BLIP_MINIGAME_RAMPAGE1)
INT iCutsceneLoadRequestID = NULL_OFFMISSION_CUTSCENE_REQUEST // ID to register off-mission cutscene load request with cutscene_controller.
INT iCurrentRampage = -1
BOOL bDisplayHelp = TRUE
BOOL bDisplayPoliceHelp = TRUE
BOOL bDisplayTriggerHelp = TRUE
STRING sSceneHandles[3]
VECTOR vPlayerPos
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID m_WidgetGroup
BOOL bQuitScript = FALSE
#ENDIF
SCENARIO_BLOCKING_INDEX mScenarioBlocker = NULL
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Initializes Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
// SET_PROFILING_OF_THIS_SCRIPT(TRUE)
m_WidgetGroup = START_WIDGET_GROUP("Launcher Rampage")
ADD_WIDGET_BOOL("Quit Script", bQuitScript)
//Uncomment these to edit hint focus camera for rampages
// ADD_WIDGET_VECTOR_SLIDER( "HINT ENTITY OFFSET", vEntityHint, -1.0, 1.0, 0.01 )
// ADD_WIDGET_FLOAT_SLIDER( "HINT SCALAR", fHintScalar, 0, 1.0, 0.01 )
// ADD_WIDGET_FLOAT_SLIDER( "HINT VERTICAL", fHintVOffset, -1.0, 1.0, 0.01 )
// ADD_WIDGET_FLOAT_SLIDER( "HINT HORIZONTAL", fHintHOffset, -1.0, 1.0, 0.01 )
// ADD_WIDGET_FLOAT_SLIDER( "HINT PITCH", fHintPitch, -90.0, 90.0, 1.0 )
// ADD_WIDGET_FLOAT_SLIDER( "HINT FOV", fHintFOV, 0, 50.0, 1.0 )
// ADD_WIDGET_BOOL( "RESET HINT", bResetFocusCam )
// ADD_WIDGET_BOOL( "START RAMPAGE", bStartRampage )
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Removes Debug Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup)
DELETE_WIDGET_GROUP(m_WidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// FUNCTIONS
//----------------------
/// PURPOSE:
/// Gets The First Rampage Index within x meters from the player
/// PARAMS:
/// dist - range check
/// RETURNS:
/// Rampage Index
FUNC INT GET_RAMPAGE_IN_RANGE_OF_PLAYER(FLOAT dist)
INT i
VECTOR v
VECTOR plyrPos
IF NOT IS_ENTITY_OK(PLAYER_PED_ID())
RETURN -1
ENDIF
plyrPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
REPEAT NUM_OF_RAMPAGES i
v = g_GameBlips[iFirstRBlipIndex + i].vCoords[0]
IF (GET_DISTANCE_BETWEEN_COORDS(plyrPos, v) <= dist) AND (ABSF(plyrPos.z - v.z) < 1.5)
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
/// PURPOSE:
/// Checks to see if the player is x dist away from any rampage
/// PARAMS:
/// dist - range to check
/// RETURNS:
/// True if so
FUNC BOOL IS_IN_RANGE_OF_RAMPAGE(INT i, FLOAT dist)
VECTOR v
IF NOT IS_ENTITY_OK(PLAYER_PED_ID())
RETURN FALSE
ENDIF
v = g_GameBlips[iFirstRBlipIndex + i].vCoords[0]
IF (GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), v) <= dist)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Check if there are any script-specific reasons that would prevent this rampage from running now.
/// Also checks if it is unlocked or not
/// PARAMS:
/// ind - index to check
/// RETURNS:
/// TRUE if there is a restriction, FALSE if the script is okay to continue.
FUNC BOOL IS_THERE_A_SPECIFIC_RAMPAGE_RESTRICTION()
BOOL restrict = FALSE
// Player is ok
IF NOT IS_ENTITY_OK(PLAYER_PED_ID())
RETURN restrict
ENDIF
IF g_RandomChars[RC_RAMPAGE_5].rcLeaveAreaCheck
RETURN restrict
ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), RAMPAGE_WANTED_LEVEL_BARRIER)
IF bDisplayPoliceHelp
CLEAR_HELP()
PRINT_HELP("RAMP_HELP_CRIM")
bDisplayPoliceHelp = FALSE
ENDIF
restrict = TRUE
ELIF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
// "Player must be on-foot to trigger this rampage"
IF bDisplayHelp
CLEAR_HELP()
PRINT_HELP("RAMP_HELP_FOOT")
bDisplayHelp = FALSE
ENDIF
restrict = TRUE
ELIF IS_SELECTOR_ONSCREEN( FALSE )
OR IS_PLAYER_SWITCH_IN_PROGRESS()
OR IS_PLAYER_PED_SWITCH_IN_PROGRESS()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("RAMP_HELP_TRIG")
IF IS_SELECTOR_ONSCREEN( FALSE )
CPRINTLN( DEBUG_RANDOM_CHAR, "Launcher Rampage - Clearing RAMP_HELP_TRIG help as selector on screen." )
ELIF IS_PLAYER_SWITCH_IN_PROGRESS()
CPRINTLN( DEBUG_RANDOM_CHAR, "Launcher Rampage - Clearing RAMP_HELP_TRIG help as player switch in progress." )
ELIF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
CPRINTLN( DEBUG_RANDOM_CHAR, "Launcher Rampage - Clearing RAMP_HELP_TRIG help as player ped switch in progress." )
ENDIF
CLEAR_HELP()
bDisplayTriggerHelp = FALSE
ENDIF
restrict = TRUE
ELIF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ALL_RAMPAGES_UNLOCKED)
IF NOT bDisplayTriggerHelp
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("RAMP_HELP_TRIG")
CLEAR_HELP()
PRINT_HELP_FOREVER("RAMP_HELP_TRIG")
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher Rampage - Rampage display help")
ENDIF
bDisplayTriggerHelp = TRUE
ENDIF
restrict = NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
ENDIF
RETURN restrict
ENDFUNC
PROC FORCE_FREEZE_AND_RELEASE_RAMPAGE1_CHAIRS(g_structRCScriptArgs& sData)
// Force Freeze the chairs and release them ourselves
IF (sData.eMissionID = RC_RAMPAGE_1)
PRINT_LAUNCHER_DEBUG(" RAMPAGE 1 - FORCE FREEZE CHAIRS AND PRE-RELEASE FOR B*2124538")
IF DOES_ENTITY_EXIST( sData.objID[3] )
FREEZE_ENTITY_POSITION( sData.objID[3], TRUE )
SET_OBJECT_AS_NO_LONGER_NEEDED( sData.objID[3] )
sData.objID[3] = NULL
ENDIF
IF DOES_ENTITY_EXIST( sData.objID[4] )
FREEZE_ENTITY_POSITION( sData.objID[4], TRUE )
SET_OBJECT_AS_NO_LONGER_NEEDED( sData.objID[4] )
sData.objID[4] = NULL
ENDIF
ENDIF
ENDPROC
/// 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 IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
FORCE_FREEZE_AND_RELEASE_RAMPAGE1_CHAIRS(sData)
IF bCleanupEntities
PRINT_LAUNCHER_DEBUG(" SCRIPT TERMINATING: Cleaning up entities in Launcher")
RC_CleanupSceneEntities(sData, FALSE)
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
IF (mScenarioBlocker != NULL)
IF (sData.eMissionID = RC_RAMPAGE_4) OR (sData.eMissionID = RC_RAMPAGE_2)
REMOVE_SCENARIO_BLOCKING_AREA(mScenarioBlocker)
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Unblocking Scenario Area")
ENDIF
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
IF bDisplayTriggerHelp
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("RAMP_HELP_TRIG")
CPRINTLN( DEBUG_RANDOM_CHAR, "Launcher RCRampage - CLEAR_HELP - RAMP_HELP_TRIG" )
CLEAR_HELP()
bDisplayTriggerHelp = FALSE
ELSE
CDEBUG1LN( DEBUG_RANDOM_CHAR, "IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(RAMP_HELP_TRIG) = FALSE")
ENDIF
ELSE
CDEBUG1LN( DEBUG_RANDOM_CHAR, "bDisplayTriggerHelp = FALSE")
ENDIF
RC_LAUNCHER_END()
// Kill the thread
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Terminating .")
PRINT_LAUNCHER_DEBUG("SCRIPT TERMINATED")
bIsRampLauncherRunning = FALSE
TERMINATE_THIS_THREAD()
ENDPROC
//------------------------------------------------------------------------------
// FUNCTION: LOAD_INITAL_SCENE()
// PURPOSE: Sets up initial scene
//------------------------------------------------------------------------------
PROC LOAD_INITIAL_SCENE(g_structRCScriptArgs& sData)
SWITCH (sData.eMissionID)
CASE RC_RAMPAGE_1
SetupScene_RAMPAGE_1(sData)
mScenarioBlocker = Rampage1_Scenario_Blocker()
BREAK
CASE RC_RAMPAGE_2
SetupScene_RAMPAGE_2(sData)
mScenarioBlocker = Rampage2_Scenario_Blocker()
BREAK
CASE RC_RAMPAGE_3
SetupScene_RAMPAGE_3(sData)
BREAK
CASE RC_RAMPAGE_4
SetupScene_RAMPAGE_4(sData)
mScenarioBlocker = Rampage4_Scenario_Blocker()
BREAK
CASE RC_RAMPAGE_5
SetupScene_RAMPAGE_5(sData)
BREAK
DEFAULT
CPRINTLN(DEBUG_RANDOM_CHAR, "Rampage does not have an initial scene")
SCRIPT_ASSERT("Rampage does not have an intial scene")
BREAK
ENDSWITCH
IF (mScenarioBlocker <> NULL)
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Blocking Scenario Area")
ENDIF
sData.triggerType = RC_TRIG_CHAR
IF sData.eMissionID = RC_RAMPAGE_2
sData.activationRange = 15.0
ELSE
sData.activationRange = 12.0
ENDIF
sData.bPedsCritical = TRUE
ENDPROC
/// PURPOSE:
/// Returns the Script name given a rampage index
/// PARAMS:
/// i - index number
/// RETURNS:
/// Script Name
FUNC STRING GET_SCRIPT_NAME_FROM_RAMPAGE_INDEX(INT i)
SWITCH (i)
CASE 0
RETURN "Rampage1"
CASE 1
RETURN "Rampage3"
CASE 2
RETURN "Rampage4"
CASE 3
RETURN "Rampage5"
CASE 4
RETURN "Rampage2"
ENDSWITCH
SCRIPT_ASSERT("[ERROR]:Script Name hasn't been defined")
RETURN ""
ENDFUNC
/// PURPOSE:
/// Returns the Script name given a rampage index
/// PARAMS:
/// i - index number
/// RETURNS:
/// Script Name
FUNC g_eRC_MissionIDs GET_MISSION_ID_FROM_RAMPAGE_INDEX(INT i)
SWITCH (i)
CASE 0
RETURN RC_RAMPAGE_1
CASE 1
RETURN RC_RAMPAGE_3
CASE 2
RETURN RC_RAMPAGE_4
CASE 3
RETURN RC_RAMPAGE_5
CASE 4
RETURN RC_RAMPAGE_2
ENDSWITCH
SCRIPT_ASSERT("[ERROR]:Script Name hasn't been defined")
RETURN NO_RC_MISSION
ENDFUNC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Updates Debug Widgets and draw debug stuff
PROC UPDATE_DEBUG_WIDGETS(g_structRCScriptArgs& sData)
IF (bQuitScript)
SCRIPT_CLEANUP(sData, TRUE)
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Updates the Ambient Version of the Launcher
/// PARAMS:
/// sData - Script Arg Data
/// vInCoords - Position We're Checking For
PROC UPDATE_AMBIENT_LAUNCHER(g_structRCScriptArgs& sData, VECTOR vInCoords)
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Running Ambient Launcher - Pos", vInCoords)
// Clears area of non-mission entities and blood decals
//
WHILE (TRUE)
IF NOT IS_WORLD_POINT_WITHIN_BRAIN_ACTIVATION_RANGE()
PRINT_LAUNCHER_DEBUG(" Ambient - Player isn't within World Point Range")
SCRIPT_CLEANUP(sData)
ENDIF
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS(sData)
#ENDIF
// Rampages are only available for Trevor (#331111) - RyanP
IF (GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR)
PRINT_LAUNCHER_DEBUG(" Ambient - Player is not Trevor")
SCRIPT_CLEANUP(sData)
ENDIF
// find the closest rampage
iCurrentRampage = GET_RAMPAGE_IN_RANGE_OF_PLAYER(RAMPAGE_ACTIVATE_RANGE)
IF (iCurrentRampage <> -1)
//CPRINTLN(DEBUG_RAMPAGE, "Launcher RCRampage - Rampage ", iCurrentRampage + 1, " is within ", RAMPAGE_ACTIVATE_RANGE, " meters - checking restrictions")
IF NOT IS_THERE_A_SPECIFIC_RAMPAGE_RESTRICTION()
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Rampage Ambient ", iCurrentRampage + 1, " is ready to launch")
// activate rampage, mark it as ready to play and uncomplete it
sData.eMissionID = GET_MISSION_ID_FROM_RAMPAGE_INDEX(iCurrentRampage)
sData.sScriptName = GET_SCRIPT_NAME_FROM_RAMPAGE_INDEX(iCurrentRampage)
sData.triggerType = RC_TRIG_LOCATE_POINT
sData.activationRange = RAMPAGE_ACTIVATE_RANGE
IF (sData.eMissionID = NO_RC_MISSION)
PRINT_LAUNCHER_DEBUG(" - Ambient Rampage Mission ID is invalid")
SCRIPT_CLEANUP(sData)
ENDIF
IF (IS_STRING_NULL_OR_EMPTY(sData.sScriptName))
PRINT_LAUNCHER_DEBUG(" - Ambient Rampage Mission ID is invalid")
SCRIPT_CLEANUP(sData)
ENDIF
// activate rampage, mark it as ready to play and uncomplete it
SET_BIT(g_savedGlobals.sRandomChars.savedRC[sData.eMissionID].rcFlags, ENUM_TO_INT(RC_FLAG_ACTIVATED))
SET_BIT(g_savedGlobals.sRandomChars.savedRC[sData.eMissionID].rcFlags, ENUM_TO_INT(RC_FLAG_READY_TO_PLAY))
CLEAR_BIT(g_savedGlobals.sRandomChars.savedRC[sData.eMissionID].rcFlags, ENUM_TO_INT(RC_FLAG_COMPLETED))
g_RandomChars[sData.eMissionID].rcIsAwaitingTrigger = FALSE
//We can't clear the leave area flag for repeat plays. We can't allow the launcher
//to trigger before the repeat has been setup.
IF NOT IS_REPEAT_PLAY_ACTIVE()
//Clear the leave area flag to allow instant restarts after completing a Rampage.
g_RandomChars[sData.eMissionID].rcLeaveAreaCheck = FALSE
ENDIF
IF NOT CAN_RC_LAUNCH(sData.eMissionID)
PRINT_LAUNCHER_DEBUG(" RC Ambient Can't Launch - Can_RC_Launch Faled")
SCRIPT_CLEANUP(sData)
ELIF NOT LAUNCH_RC_MISSION(sData)
PRINT_LAUNCHER_DEBUG(" RC Ambient Can't Launch - Launch_RC_Mission Failed")
Script_Cleanup(sData)
ELSE
//Waits in a loop until we can terminate the launcher - flagged from mission at the moment
SAFE_FADE_SCREEN_OUT_TO_BLACK()
CLEAR_AREA(vInCoords, sData.activationRange, TRUE)
PRINT_LAUNCHER_DEBUG(" RC Ambient Launcher Waiting To Terminate")
g_RandomChars[sData.eMissionID].rcIsAwaitingTrigger = FALSE
IF IS_RC_LAUNCHER_SAFE_TO_TERMINATE(sData.eMissionID)
PRINT_LAUNCHER_DEBUG(" Ambient - Ready To Terminate")
Script_Cleanup(sData, FALSE) //No need to clean up entities, as we should have passed them over to the mission script
ENDIF
ENDIF
ENDIF
ELSE
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("RAMP_HELP_TRIG")
CLEAR_HELP()
ENDIF
bDisplayTriggerHelp = FALSE
ENDIF
WAIT(0)
ENDWHILE
ENDPROC
//Check to see if any peds are attacking the player
FUNC BOOL CHECK_PEDS_ATTACKING_PLAYER(g_structRCScriptArgs& sData)
IF sData.eMissionID = RC_RAMPAGE_3
OR sData.eMissionID = RC_RAMPAGE_4
OR sData.eMissionID = RC_RAMPAGE_5
IF COUNT_PEDS_IN_COMBAT_WITH_TARGET( PLAYER_PED_ID() ) > 0
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates the Random Character Version of the Launcher
/// PARAMS:
/// sData - Script Arg Data
/// vInCoords - Position We're Checking For
PROC UPDATE_RC_LAUNCHER(g_structRCScriptArgs& sData, VECTOR vInCoords)
BOOL bHasCutsceneLoaded = FALSE
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Running RC Launcher - Pos", vInCoords)
// Determine which RC mission we are attempting to launch (currently done on a launcher by launcher basis)
g_eRC_MissionIDs eRCMissions[5]
eRCMissions[0] = RC_RAMPAGE_1
eRCMissions[1] = RC_RAMPAGE_2
eRCMissions[2] = RC_RAMPAGE_3
eRCMissions[3] = RC_RAMPAGE_4
eRCMissions[4] = RC_RAMPAGE_5
//Pick which mission activated us
IF NOT (DETERMINE_RC_TO_LAUNCH(eRCMissions, sData, vInCoords, WORLD_POINT_COORD_TOLERANCE))
PRINT_LAUNCHER_DEBUG(" Didn't know which RC To Launch")
SCRIPT_CLEANUP(sData)
ENDIF
// Check with the Random Character Controller to see if this script is allowed to launch
IF NOT CAN_RC_LAUNCH(sData.eMissionID)
PRINT_LAUNCHER_DEBUG(" RC Can't Launch")
SCRIPT_CLEANUP(sData)
ENDIF
// Halt launcher as we are incorrect character
IF Random_Character_Blocked_Due_To_Character(sData.eMissionID)
WHILE(TRUE)
WAIT(0)
IF SHOULD_RC_TERMINATE_WHEN_INCORRECT_CHAR(sData.eMissionID)
Script_Cleanup(sData)
ENDIF
ENDWHILE
ENDIF
// The script is allowed to launch so set up the initial scene
LOAD_INITIAL_SCENE(sData)
// Clears area of non-mission entities and blood decals
CLEAR_AREA(vInCoords, sData.activationRange, TRUE)
// Loop to check conditions - should script terminate? or is player close enough to trigger mission?
WHILE (TRUE)
WAIT(0)
INT iObjLoop
IF sData.eMissionID = RC_RAMPAGE_1
OR sData.eMissionID = RC_RAMPAGE_2
IF IS_ENTITY_ALIVE( sData.pedID[0] )
IF IS_EXPLOSION_IN_SPHERE( EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sData.pedID[0]), 5.1 )
// In rampage 1, Delete bottles in peds hands before deleting them
IF sData.eMissionID = RC_RAMPAGE_1
REPEAT COUNT_OF(sData.objID) iObjLoop
IF DOES_ENTITY_EXIST(sData.objID[iObjLoop])
IF (IS_ENTITY_ALIVE(sData.pedID[0]) AND IS_ENTITY_ATTACHED_TO_ENTITY(sData.objID[iObjLoop], sData.pedID[0]))
OR (IS_ENTITY_ALIVE(sData.pedID[1]) AND IS_ENTITY_ATTACHED_TO_ENTITY(sData.objID[iObjLoop], sData.pedID[1]))
DELETE_OBJECT(sData.objID[iObjLoop])
ENDIF
ENDIF
ENDREPEAT
ENDIF
SET_PED_TO_RAGDOLL(sData.pedID[0], 100, 500, TASK_RELAX)
APPLY_DAMAGE_TO_PED(sData.pedID[0], 1000, TRUE)
IF IS_ENTITY_ALIVE( sData.pedID[1] )
SET_PED_TO_RAGDOLL(sData.pedID[1], 100, 500, TASK_RELAX)
APPLY_DAMAGE_TO_PED(sData.pedID[1], 1000, TRUE)
ENDIF
PRINT_LAUNCHER_DEBUG("Sitting Rampage attacked with explosives, cleaning up")
Script_Cleanup(sData)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE( sData.pedID[1] )
IF IS_EXPLOSION_IN_SPHERE( EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sData.pedID[1]), 5.1 )
// In rampage 1, Delete bottles in peds hands before deleting them
IF sData.eMissionID = RC_RAMPAGE_1
REPEAT COUNT_OF(sData.objID) iObjLoop
IF DOES_ENTITY_EXIST(sData.objID[iObjLoop])
IF (IS_ENTITY_ALIVE(sData.pedID[0]) AND IS_ENTITY_ATTACHED_TO_ENTITY(sData.objID[iObjLoop], sData.pedID[0]))
OR (IS_ENTITY_ALIVE(sData.pedID[1]) AND IS_ENTITY_ATTACHED_TO_ENTITY(sData.objID[iObjLoop], sData.pedID[1]))
DELETE_OBJECT(sData.objID[iObjLoop])
ENDIF
ENDIF
ENDREPEAT
ENDIF
SET_PED_TO_RAGDOLL(sData.pedID[1], 100, 500, TASK_RELAX)
APPLY_DAMAGE_TO_PED(sData.pedID[1], 1000, TRUE)
IF IS_ENTITY_ALIVE( sData.pedID[0] )
SET_PED_TO_RAGDOLL(sData.pedID[0], 100, 500, TASK_RELAX)
APPLY_DAMAGE_TO_PED(sData.pedID[0], 1000, TRUE)
ENDIF
PRINT_LAUNCHER_DEBUG("Sitting Rampage attacked with explosives, cleaning up")
Script_Cleanup(sData)
ENDIF
ENDIF
ENDIF
//If any peds are attacking the player, cause rampage peds to flee for bug 1409012
IF CHECK_PEDS_ATTACKING_PLAYER(sData)
FORCE_FREEZE_AND_RELEASE_RAMPAGE1_CHAIRS(sData)
PRINT_LAUNCHER_DEBUG(" RC combat happening in area, tell peds to flee")
MAKE_ALL_INITIAL_SCENE_PEDS_FLEE(sData)
Script_Cleanup(sData)
ENDIF
//Is the player still in activation range
IF NOT IS_RC_FINE_AND_IN_RANGE(sData)
PRINT_LAUNCHER_DEBUG(" RC Is Not Fine And In Range")
Script_Cleanup(sData)
ENDIF
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS(sData)
#ENDIF
IF IS_RC_MISSION_AVAILABLE(RC_RAMPAGE_1)
IF IS_SCENARIO_GROUP_ENABLED("Rampage1")
PRINT_LAUNCHER_DEBUG(" Turning Off Scenario Group For Rampage 1")
SET_SCENARIO_GROUP_ENABLED("Rampage1", FALSE)
ENDIF
ENDIF
//PRINT_LAUNCHER_DEBUG(" Is Fine And In Range")
// Update launcher blip + preload intro
SET_RC_AWAITING_TRIGGER(sData.eMissionID)
MANAGE_PRELOADING_RC_CUTSCENE(iCutsceneLoadRequestID, sData.sIntroCutscene, vInCoords)
IF (bHasCutsceneLoaded = FALSE) AND (iCutsceneLoadRequestID <> NULL_OFFMISSION_CUTSCENE_REQUEST)
PRESTREAM_RAMPAGE_INTRO_CUTSCENE_PED_VARIATIONS(sData, sSceneHandles)
IF HAS_CUTSCENE_LOADED()
PRINT_LAUNCHER_DEBUG(" Cutscene Loaded")
bHasCutsceneLoaded = TRUE
ENDIF
ENDIF
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF NOT ((sData.eMissionID = RC_RAMPAGE_1) AND (vPlayerPos.z > 34.0))
AND NOT ((sData.eMissionID = RC_RAMPAGE_2) AND (vPlayerPos.z > 71.0))
AND NOT ((sData.eMissionID = RC_RAMPAGE_3) AND (vPlayerPos.z > 30.0))
//Is the player close enough to start the mission off
IF ARE_RC_TRIGGER_CONDITIONS_MET(sData)
IF (sData.eMissionID = RC_RAMPAGE_2)
IF LEADIN_RAMPAGE_2(sData)
PRINT_LAUNCHER_DEBUG(" Trigger Conditions Met")
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
//Launch the mission script
IF NOT LAUNCH_RC_MISSION(sData)
PRINT_LAUNCHER_DEBUG(" RC Can't Launch")
Script_Cleanup(sData)
ENDIF
// force terminate for ambient missions
PRINT_LAUNCHER_DEBUG(" RC Launcher Waiting To Terminate")
IF IS_RC_LAUNCHER_SAFE_TO_TERMINATE(sData.eMissionID)
PRINT_LAUNCHER_DEBUG(" Ready To Terminate")
Script_Cleanup(sData, FALSE) //No need to clean up entities, as we should have passed them over to the mission script
ENDIF
ENDIF
ELSE
IF FOCUS_PUSH_LEADIN(sData)
PRINT_LAUNCHER_DEBUG(" Trigger Conditions Met")
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
//Launch the mission script
IF NOT LAUNCH_RC_MISSION(sData)
PRINT_LAUNCHER_DEBUG(" RC Can't Launch")
Script_Cleanup(sData)
ENDIF
// force terminate for ambient missions
PRINT_LAUNCHER_DEBUG(" RC Launcher Waiting To Terminate")
IF IS_RC_LAUNCHER_SAFE_TO_TERMINATE(sData.eMissionID)
PRINT_LAUNCHER_DEBUG(" Ready To Terminate")
Script_Cleanup(sData, FALSE) //No need to clean up entities, as we should have passed them over to the mission script
ENDIF
ENDIF
ENDIF
ELSE
IF (sData.eMissionID = RC_RAMPAGE_2)
preleadin_RAMPAGE_2( sData )
ENDIF
IF IS_GAMEPLAY_HINT_ACTIVE()
iFocusPushTimer = -1
STOP_GAMEPLAY_HINT()
TASK_CLEAR_LOOK_AT( PLAYER_PED_ID() )
ENDIF
ENDIF
ENDIF
ENDWHILE
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT(coords_struct in_coords)
#IF IS_DEBUG_BUILD
SETUP_DEBUG_WIDGETS()
#ENDIF
// 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 = in_coords.vec_coord[0] // Update world point
CPRINTLN(DEBUG_RANDOM_CHAR, "Launcher RCRampage - Version:", SCRIPT_VERSION, " Initializing.")
//BREAK_ON_NATIVE_COMMAND("CLEAR_AREA_OF_VEHICLES", FALSE)
//Reset all basic values of the data, so each scene has to set them up correctly
bIsRampLauncherRunning = TRUE
RC_Reset_LauncherData(sRCLauncherData)
// 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]")
SCRIPT_CLEANUP(sRCLauncherData)
ENDIF
// Moved the main loop to this function as we have two different methods dependant on whether we have done all rampages or not
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_ALL_RAMPAGES_UNLOCKED)
UPDATE_RC_LAUNCHER(sRCLauncherData, vInCoords)
ELSE
UPDATE_AMBIENT_LAUNCHER(sRCLauncherData, vInCoords)
ENDIF
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT