746 lines
24 KiB
Python
Executable File
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
|
|
|
|
|