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

1539 lines
59 KiB
Python
Executable File

//CONST_INT LAUNCHER_POINT_ENTER 1 -- When Imran comes back and says he wants to be able to launch on foot,
//just uncomment and delete the line below.
//CONST_INT LAUNCHER_POINT_ENTER_IN_VEHICLE 1
CONST_INT LAUNCHER_CUSTOM_SCRIPT_LAUNCH 1
CONST_INT LAUNCHER_SNAP_CHECKPOINT_TO_GROUND 1
#IF IS_DEBUG_BUILD
CONST_INT LAUNCHER_DONT_CHECK_RELOAD_RANGE 1
#ENDIF
CONST_INT LAUNCHER_IGNORE_VEHICLE_HEALTH 1
CONST_INT LAUNCHER_HAS_SCENE 1
CONST_INT LAUNCHER_DONT_FADE_DOWN 1
CONST_INT LAUNCHER_TIME_RESTRICTED 1
CONST_INT LAUNCHER_HAS_TRIGGER_SCENE 1
CONST_INT LAUNCHER_VARIED_VEHICLE_ENTER 1
CONST_INT OR_LAUNCHER_DEBUG_WARP_FORCE_SPAWN_MS_OFFSET 15000
CONST_INT OR_NUM_RACERS 5
USING "flow_public_core.sch"
USING "generic_launcher_header.sch"
//USING "z_volumes.sch"
VECTOR vRaceLoc
OFFROAD_RACE_INDEX CurrentRaceIndex = OFFROAD_RACE_NONE
structTimer racerOpdateTimers[5], loanerUpdateTimer, greetTimer, racerDialogueTimer
FLOAT racerUpdateWaitTime[5], loanerUpdateWaitTime
PED_INDEX dialogueSpeaker = NULL
BOOL bAllowScene = TRUE
BOOL bHintCam = TRUE
BOOL bSceneSpawned = FALSE
BOOL bSaidSecondSpeech = FALSE
BOOL bSaidThirdSpeech = FALSE
structPedsForConversation dialoguePedsStruct
#IF IS_DEBUG_BUILD
BOOL bOffroadDebugWarp = FALSE
#ENDIF
ENUM LOANER_GREETING_STATE
LGS_INIT = 0,
LGS_FACING_PLAYER,
LGS_FACING_PLAYER_WAIT,
LGS_CHALLENGING_PLAYER,
LGS_GREETING_PLAYER,
LGS_GREETING_PLAYER_WAIT
ENDENUM
LOANER_GREETING_STATE eLoanerState = LGS_INIT
STRUCT OR_LAUNCHER_RACER
PED_INDEX PedIdx
VEHICLE_INDEX VehIdx
VECTOR StartPosition
FLOAT StartHeading
VECTOR PedStandingPosition
FLOAT PedStandingHeading
BOOL bJustRagdolled = FALSE
BOOL bJustWalkedInto = FALSE
STRING sIdleDict
STRING sIdleClip
ENDSTRUCT
STRUCT OR_LAUNCHER_DATA
OR_LAUNCHER_RACER Racers[5]
STREAMED_MODEL VehicleModels[5]
STREAMED_MODEL AdditionalAssets[5]
OR_LAUNCHER_RACER Loaner
STREAMED_MODEL LoanerModel[1]
STREAMED_MODEL LoanerAsset[1]
INT iRagdollCount = 0
ENDSTRUCT
OR_LAUNCHER_DATA orArgs
FUNC STATIC_BLIP_NAME_ENUM GET_OFFROAD_STATIC_BLIP(OFFROAD_RACE_INDEX thisRace)
SWITCH thisRace
CASE OFFROAD_RACE_CANYON_CLIFFS
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE5
CASE OFFROAD_RACE_RIDGE_RUN
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE8
CASE OFFROAD_RACE_VALLEY_TRAIL
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE9
CASE OFFROAD_RACE_LAKESIDE_SPLASH
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE10
CASE OFFROAD_RACE_ECO_FRIENDLY
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE11
CASE OFFROAD_RACE_MINEWARD_SPIRAL
RETURN STATIC_BLIP_MINIGAME_OFFROAD_RACE12
ENDSWITCH
// SCRIPT_ASSERT("Can't get a valid static blip for offroad racing. If you bug this assert please assign it to Asa Dang.")
RETURN STATIC_BLIP_NAME_DUMMY_FINAL
ENDFUNC
PROC LAUNCHER_CUSTOM_SCRIPT_INIT()
scriptName = "Offroad_Races"
SET_THIS_IS_A_TRIGGER_SCRIPT(TRUE)
// Make the launch size bigger, as we're trying to hit it in a vehicle.
fLaunchScriptDist = LOCATE_SIZE_ANY_MEANS + 4.0
eMinigame = MINIGAME_OFFROAD_RACES
SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_SHUTDOWN_ALLOW_MULTIPLE_COPIES)
// The offroad races use a huge stack, and apparently need the mission stack size.
// # 100994
iStackSize = MISSION_STACK_SIZE
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() < g_ORR_DebugLaunchWarpTime + OR_LAUNCHER_DEBUG_WARP_FORCE_SPAWN_MS_OFFSET
bOffroadDebugWarp = TRUE
ENDIF
#ENDIF
vehicleLaunch = NULL
iAvailableAfterHour = 0 //always available
iAvailableBeforeHour = 25
// Can approach on foot, or in vehicle.
eTransMode = TM_ANY
//Removed death check for B*:1749611
// Get and store which race we are.
//IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
// We don't really care if he's dead. Gen launcher handles it.
CurrentRaceIndex = GET_RACE_INDEX_BY_POSITION(vLaunchLocation, vRaceLoc)
//ENDIF
eLauncherStaticBlip = GET_OFFROAD_STATIC_BLIP(CurrentRaceIndex)
fLauncherShutdownDist = TO_FLOAT(GENERIC_LAUNCHER_GET_BLIP_STREAMING_RANGE(eLauncherStaticBlip)) + 5.0
//use the current race index to figure out if we should keep the blip active
IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))
// CPRINTLN(DEBUG_OR_RACES, "Static blip is not active when it should be. Turning it on now!")
// SET_STATIC_BLIP_ACTIVE_STATE(GET_OFFROAD_STATIC_BLIP(CurrentRaceIndex), TRUE)
bAllowScene = TRUE
ELSE
CPRINTLN(DEBUG_OR_RACES, "Offroad races not available in flow. Terminating.")
GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
bAllowScene = FALSE
ENDIF
CPRINTLN(DEBUG_OR_RACES, "Checking current race against unlocked race")
CPRINTLN(DEBUG_OR_RACES, "Current race index is... ", CurrentRaceIndex)
CPRINTLN(DEBUG_OR_RACES, "g_savedGlobals.sOffroadData.eCurrentRace is... ", g_savedGlobals.sOffroadData.eCurrentRace)
// CurrentRaceIndex > g_savedGlobals.sOffroadData.eCurrentRace
IF CurrentRaceIndex > g_savedGlobals.sOffroadData.eCurrentRace
//we're at a race we havent unlocked yet.
CPRINTLN(DEBUG_OR_RACES, "we're at a race we havent unlocked yet.")
IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(GET_OFFROAD_STATIC_BLIP(CurrentRaceIndex))
CPRINTLN(DEBUG_OR_RACES, "but somehow the blip is currently visible !!")
ENDIF
eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL
GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
ENDIF
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(GET_OFFROAD_STATIC_BLIP(CurrentRaceIndex)) AND IS_SCREEN_FADED_IN()
CPRINTLN(DEBUG_OR_RACES, "Static blip isn't visible. We shouldn't be starting up !!")
//Don't clear static blip if it should be visible (we're on mission, for example)
IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL
IF GET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip,TRUE)
eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL
ENDIF
ENDIF
GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
ENDIF
IF CurrentRaceIndex = OFFROAD_RACE_MINEWARD_SPIRAL
CPRINTLN(DEBUG_OR_RACES, "OFFROAD_RACE_MINEWARD_SPIRAL detected! Setting available hours!")
iAvailableAfterHour = 20 // after 8pm
iAvailableBeforeHour = 3 // before 4am
ENDIF
// Prompt is based off the type of race we are: 8 & 11 are full sized, all else are motorcycle.
IF (CurrentRaceIndex = OFFROAD_RACE_RIDGE_RUN) OR (CurrentRaceIndex = OFFROAD_RACE_ECO_FRIENDLY)
helpButtonPress = "PLAY_OFFROAD_V"
ELSE
helpButtonPress = "PLAY_OFFROAD_M"
ENDIF
ENDPROC
FUNC THREADID LAUNCHER_CUSTOM_RUN_SCRIPT()
// Clear all previously printed helps.
CLEAR_HELP()
// DO_SCREEN_FADE_OUT(1000)
// WHILE IS_SCREEN_FADING_OUT()
// WAIT(0)
// ENDWHILE
RACE_LAUNCH_DATA launchData
launchData.raceToLaunch = CurrentRaceIndex
launchData.raceStartLoc = vRaceLoc
INT i = 0
REPEAT COUNT_OF(launchData.Racer) i
launchData.Racer[i] = orArgs.Racers[i].PedIdx
launchData.RaceVehicle[i] = orArgs.Racers[i].VehIdx
ENDREPEAT
launchData.Loaner = orArgs.Loaner.PedIdx
launchData.LoanerVehicle = orArgs.Loaner.VehIdx
DEBUG_MESSAGE("******************** Launching OffroadRacing.sc ********************")
ANIMPOSTFX_PLAY("SwitchSceneNeutral", 0, TRUE)
WAIT(400)
THREADID threadTemp = START_NEW_SCRIPT_WITH_ARGS(scriptName, launchData, SIZE_OF(RACE_LAUNCH_DATA), iStackSize)
SET_SCRIPT_AS_NO_LONGER_NEEDED(scriptName)
RETURN threadTemp
ENDFUNC
PROC OR_LAUNCHER_RESTORE_RACE_PATH()
REMOVE_SCENARIO_BLOCKING_AREAS()
RESET_SCENARIO_TYPES_ENABLED()
// clear end roads of vehicles until end of race
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS//CanyonCliffs
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-223.42, 3948.36, 36.52>>, <<-212.37, 3818.97, 37.53>>, 50.0)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN//RidgeRun
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-509.125366,1987.582031,205.330505>>, <<-948.521484,2752.741455,25.351442>>, 300)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL//ValleyTrail
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<-1943.822021, 4462.285645, 0>>, <<-229.078339, 4227.071777, 50>>, 250)
//SET_ROADS_IN_AREA( <<-199.6227, 4215.4731, 43.7534>>,
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH//LakesideSplash
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY//EcoFriendly
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA(<<2242.488, 2568.146, -10>>, <<2242.488, 1568.146, 200>>, 1000.000)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL//MinewardSpiral
SET_ROADS_BACK_TO_ORIGINAL_IN_ANGLED_AREA( <<2809.9475, 2993.6440, -9.3564>>, <<2952.9688, 2530.6360, 177.1921>>, 500.0 )
BREAK
ENDSWITCH
ENDPROC
//CALLED TO ACTIVATE THE NEXT RACE AND ITS BLIP
PROC LAUNCHER_ACTIVATE_NEXT_RACE()
// Store the best palce we've earned for this race.
IF (g_savedGlobals.sOffroadData.iRacePlaceEarned < g_savedGlobals.sOffroadData.iRaceBestPlaces[CurrentRaceIndex]) OR
(g_savedGlobals.sOffroadData.iRaceBestPlaces[CurrentRaceIndex] = 0)
// Awesome! Store this place, and update the blip's name!
g_savedGlobals.sOffroadData.iRaceBestPlaces[CurrentRaceIndex] = g_savedGlobals.sOffroadData.iRacePlaceEarned
g_savedGlobals.sOffroadData.iRacePlaceEarned = 999
ENDIF
// If we just played the highest rank race available to us, set us to be allowed to play the next.
IF (CurrentRaceIndex = g_savedGlobals.sOffroadData.eCurrentRace) OR (g_savedGlobals.sOffroadData.eCurrentRace = OFFROAD_RACE_NONE)//we havent initialized it yet
IF (g_savedGlobals.sOffroadData.eCurrentRace != OFFROAD_RACE_ECO_FRIENDLY)
g_savedGlobals.sOffroadData.eCurrentRace =
INT_TO_ENUM(OFFROAD_RACE_INDEX, ENUM_TO_INT(g_savedGlobals.sOffroadData.eCurrentRace) + 1)
// Set the next race blip open.
SWITCH (g_savedGlobals.sOffroadData.eCurrentRace)
CASE OFFROAD_RACE_RIDGE_RUN
CPRINTLN(DEBUG_OR_RACES, "unlocking blip active canyon")
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
CPRINTLN(DEBUG_OR_RACES, "unlocking blip active mineward")
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
CPRINTLN(DEBUG_OR_RACES, "unlocking blip active valley")
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
CPRINTLN(DEBUG_OR_RACES, "unlocking blip active lakeside")
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE10, TRUE)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
CPRINTLN(DEBUG_OR_RACES, "unlocking blip active eco")
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE10, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE10, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE11, TRUE)
BREAK
ENDSWITCH
CPRINTLN( DEBUG_OR_RACES, "Printing help about unlock." )
ADD_HELP_TO_FLOW_QUEUE("OFFR_NEW")
ELSE
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE5, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE8, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE9, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE10, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE10, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE11, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE11, TRUE)
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
SET_STATIC_BLIP_HAS_CHECKMARK(STATIC_BLIP_MINIGAME_OFFROAD_RACE12, TRUE)
ENDIF
// We just passed this race, set our blip to be short range.
// set the blip name to the place we just got.
SWITCH (g_savedGlobals.sOffroadData.eCurrentRace)
CASE OFFROAD_RACE_CANYON_CLIFFS
CPRINTLN(DEBUG_OR_RACES, "Making blip active canyon")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE5)
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
CPRINTLN(DEBUG_OR_RACES, "Making blip active ridge")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE8)
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
CPRINTLN( DEBUG_OR_RACES, "Making blip active mineward")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE12)
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
CPRINTLN(DEBUG_OR_RACES, "Making blip active Valley")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE9)
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE10)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
CPRINTLN(DEBUG_OR_RACES, "Making blip active Lakeside")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE10)
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE11)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
CPRINTLN(DEBUG_OR_RACES, "Making blip active ECO")
SET_STATIC_BLIP_SHORT_RANGE(STATIC_BLIP_MINIGAME_OFFROAD_RACE11)
BREAK
ENDSWITCH
ENDIF
ENDPROC
// CALLED WHEN THE LAUNCHED SCRIPT ENDS.
PROC LAUNCHER_CUSTOM_SCRIPT_END()
// If we won, always unlock the next race.
// Handle a win flag here.
IF IS_BITMASK_AS_ENUM_SET(g_savedGlobals.sOffroadData.iBitFlags, OFFROAD_F_WonCurrentRace)
CLEAR_BITMASK_AS_ENUM(g_savedGlobals.sOffroadData.iBitFlags, OFFROAD_F_WonCurrentRace)
OR_LAUNCHER_RESTORE_RACE_PATH()
LAUNCHER_ACTIVATE_NEXT_RACE()
MAKE_AUTOSAVE_REQUEST()
ENDIF
ENDPROC
FUNC STRING OR_LAUNCHER_GET_RESPONSE_ANIM()
INT iRandom = GET_RANDOM_INT_IN_RANGE() % 2
STRING sRetVal
SWITCH iRandom
CASE 0
sRetVal = "gesture_what_hard"
BREAK
CASE 1
DEFAULT
sRetVal = "gesture_what_soft"
BREAK
ENDSWITCH
RETURN sRetVal
ENDFUNC
PROC OR_LAUNCHER_HANDLE_HINT_CAM()
IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_ENTITY_DEAD(orArgs.Loaner.PedIdx)
INT iCurHour
iCurHour = GET_CLOCK_HOURS()
IF (iCurHour <= iAvailableAfterHour) AND (iCurHour >= iAvailableBeforeHour)
bHintCam = FALSE
EXIT
ENDIF
SET_GAMEPLAY_ENTITY_HINT(orArgs.Loaner.PedIdx, <<0,0,0.75>>)
ENDIF
ENDPROC
//SPECIAL FUNCTION TO PERFORM A TASK ONLY ONCE
//USED IN THIS CASE TO ACTIVATE THE NEXT RACE BLIP
FUNC BOOL PERFORM_ONE_TIME_TASK()
CPRINTLN(DEBUG_OR_RACES,"Activating next OR race via 1-time action")
LAUNCHER_ACTIVATE_NEXT_RACE()
RETURN TRUE
ENDFUNC
PROC OR_LAUNCHER_HANDLE_LOANER_GREETING()
INT iCurHour
iCurHour = GET_CLOCK_HOURS()
IF (iCurHour <= iAvailableAfterHour) AND (iCurHour >= iAvailableBeforeHour)
eLoanerState = LGS_INIT
EXIT
ENDIF
IF NOT IS_ENTITY_DEAD( dialogueSpeaker ) AND NOT IS_ENTITY_DEAD( PLAYER_PED_ID() )
SWITCH eLoanerState
CASE LGS_INIT
IF VDIST2( GET_ENTITY_COORDS( dialogueSpeaker ), GET_ENTITY_COORDS( PLAYER_PED_ID() ) ) < 8*8
AND NOT IS_PED_IN_ANY_VEHICLE( PLAYER_PED_ID() )
bSaidSecondSpeech = FALSE
bSaidThirdSpeech = FALSE
CPRINTLN( DEBUG_OR_RACES, "Moving from LGS_INIT to LGS_FACING_PLAYER" )
eLoanerState = LGS_FACING_PLAYER
ENDIF
BREAK
CASE LGS_FACING_PLAYER
SEQUENCE_INDEX siChallenge
OPEN_SEQUENCE_TASK(siChallenge)
TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
// TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1)
// TASK_PLAY_ANIM(NULL, "random@street_race", "_streetracer_challenge")
// TASK_PLAY_ANIM(NULL, "random@street_race", "_streetracer_wait_loop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_DEFAULT | AF_LOOPING | AF_NOT_INTERRUPTABLE)
CLOSE_SEQUENCE_TASK(siChallenge)
TASK_PERFORM_SEQUENCE(dialogueSpeaker, siChallenge)
CLEAR_SEQUENCE_TASK(siChallenge)
CPRINTLN( DEBUG_OR_RACES, "Moving from LGS_FACING_PLAYER to LGS_FACING_PLAYER_WAIT" )
eLoanerState = LGS_FACING_PLAYER_WAIT
BREAK
CASE LGS_FACING_PLAYER_WAIT
IF (GET_SCRIPT_TASK_STATUS(dialogueSpeaker, SCRIPT_TASK_PERFORM_SEQUENCE) <> PERFORMING_TASK
OR IS_PED_FACING_PED(dialogueSpeaker, PLAYER_PED_ID(), 20.0))
AND NOT IS_SCRIPTED_CONVERSATION_ONGOING()
TASK_TURN_PED_TO_FACE_ENTITY(dialogueSpeaker, PLAYER_PED_ID(), -1)
IF NOT bSaidThirdSpeech
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(dialogueSpeaker, "PRERACE_CHAT", "A_M_Y_RACER_01_WHITE_MINI_01", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL)
ELSE
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(dialogueSpeaker, "PRERACE_TAUNT", "A_M_Y_RACER_01_WHITE_MINI_01", SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL)
ENDIF
//PLAY_SINGLE_LINE_FROM_CONVERSATION( dialoguePedsStruct, "SPR_OR", "OR_LAUNCH", "OR_LAUNCH_2", CONV_PRIORITY_LOW )
CPRINTLN( DEBUG_OR_RACES, "Moving from LGS_FACING_PLAYER_WAIT to LGS_GREETING_PLAYER" )
eLoanerState = LGS_CHALLENGING_PLAYER
ENDIF
BREAK
CASE LGS_CHALLENGING_PLAYER
IF NOT IS_AMBIENT_SPEECH_PLAYING(dialogueSpeaker)
RESTART_TIMER_NOW( greetTimer )
TASK_PLAY_ANIM(dialogueSpeaker, "random@street_race", "_streetracer_wait_loop", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_DEFAULT | AF_LOOPING | AF_NOT_INTERRUPTABLE)
eLoanerState = LGS_GREETING_PLAYER
ENDIF
BREAK
CASE LGS_GREETING_PLAYER
IF VDIST2( GET_ENTITY_COORDS( dialogueSpeaker ), GET_ENTITY_COORDS( PLAYER_PED_ID() ) ) > 15*15
CPRINTLN( DEBUG_OR_RACES, "Player is out of range, moving to LGS_INIT" )
SEQUENCE_INDEX seq
OPEN_SEQUENCE_TASK( seq )
TASK_ACHIEVE_HEADING( NULL, orArgs.Loaner.PedStandingHeading, 1000 )
TASK_PLAY_ANIM( NULL, orArgs.Loaner.sIdleDict, orArgs.Loaner.sIdleClip, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING )
CLOSE_SEQUENCE_TASK( seq )
TASK_PERFORM_SEQUENCE( dialogueSpeaker, seq )
CLEAR_SEQUENCE_TASK( seq )
eLoanerState = LGS_INIT
ENDIF
IF IS_TIMER_STARTED(greetTimer)
IF GET_TIMER_IN_SECONDS(greetTimer) >= 5.0
AND NOT bSaidSecondSpeech
bSaidSecondSpeech = TRUE
eLoanerState = LGS_FACING_PLAYER
ELIF GET_TIMER_IN_SECONDS(greetTimer) >= 10.0
AND NOT bSaidThirdSpeech
bSaidThirdSpeech = TRUE
eLoanerState = LGS_FACING_PLAYER
ENDIF
ENDIF
BREAK
CASE LGS_GREETING_PLAYER_WAIT
BREAK
ENDSWITCH
ENDIF
ENDPROC
PROC OR_LAUNCHER_CLEAR_RACE_PATH()
// clear end roads of vehicles until end of race
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS//CanyonCliffs
SET_ROADS_IN_ANGLED_AREA(<<-223.42, 3948.36, 36.52>>, <<-212.37, 3818.97, 37.53>>, 50.0, TRUE, FALSE)
CLEAR_AREA_OF_VEHICLES(<<-227.43, 3888.90, 36.41>>, 50.0, TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_HIKER", FALSE)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN//RidgeRun
SET_ROADS_IN_ANGLED_AREA(<<-509.125366,1987.582031,205.330505>>, <<-948.521484,2752.741455,25.351442>>, 300, FALSE, FALSE)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL//ValleyTrail
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
SET_ROADS_IN_ANGLED_AREA(<<-1943.822021, 4462.285645, 0>>, <<-229.078339, 4227.071777, 50>>, 250, TRUE, FALSE)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<-1943.822021, 4462.285645, 0>>, <<-229.078339, 4227.071777, 50>>, 250)
SET_ROADS_IN_ANGLED_AREA( <<-196.580, 4217.640, 50.0830>>, <<-202.574, 4210.926, 40.0262>>, 10.0, TRUE, FALSE )
SET_SCENARIO_TYPE_ENABLED("WORLD_HUMAN_HIKER", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_EMPTY", FALSE )
SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER", FALSE)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH//LakesideSplash
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_EMPTY", TRUE)
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_BIKE_OFF_ROAD_RACE", TRUE)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY//EcoFriendly
SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_BICYCLE_MOUNTAIN", FALSE)
SET_ROADS_IN_ANGLED_AREA(<<2242.488, 2568.146, -10>>, <<2242.488, 1568.146, 200>>, 100.000, TRUE, FALSE)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<2242.488, 2568.146, -10>>, <<2242.488, 1568.146, 200>>, 1000.000)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL//MinewardSpiral
SET_SCENARIO_GROUP_ENABLED("QUARRY", FALSE)
SET_ROADS_IN_ANGLED_AREA(<<2809.9475, 2993.6440, -9.3564>>, <<2952.9688, 2530.6360, 177.1921>>, 500.0, TRUE, FALSE)
CLEAR_ANGLED_AREA_OF_VEHICLES(<<2809.9475, 2993.6440, -9.3564>>, <<2952.9688, 2530.6360, 177.1921>>, 500.0)
BREAK
ENDSWITCH
ENDPROC
PROC LAUNCHER_CUSTOM_UNLOAD_ASSETS()
SET_ALL_MODELS_AS_NO_LONGER_NEEDED(orArgs.AdditionalAssets)
SET_ALL_MODELS_AS_NO_LONGER_NEEDED(orArgs.VehicleModels)
ENDPROC
PROC LAUNCHER_CUSTOM_REQUEST_ASSETS()
ADD_STREAMED_MODEL(orArgs.AdditionalAssets, A_M_Y_MOTOX_01) //add ped model
ADD_STREAMED_MODEL(orArgs.LoanerAsset, A_M_Y_MOTOX_01) // Add the loaner model
//add vehicle models:
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS
ADD_STREAMED_MODEL(orArgs.VehicleModels, SANCHEZ)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BLAZER)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
ADD_STREAMED_MODEL(orArgs.VehicleModels, MESA)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BJXL)
ADD_STREAMED_MODEL(orArgs.VehicleModels, Patriot)
ADD_STREAMED_MODEL(orArgs.VehicleModels, dubsta2)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BFINJECTION)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
ADD_STREAMED_MODEL(orArgs.VehicleModels, SANCHEZ)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BLAZER)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
ADD_STREAMED_MODEL(orArgs.VehicleModels, SANCHEZ)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BLAZER)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
ADD_STREAMED_MODEL(orArgs.VehicleModels, MESA)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BFINJECTION)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BJXL)
ADD_STREAMED_MODEL(orArgs.VehicleModels, SADLER)
ADD_STREAMED_MODEL(orArgs.VehicleModels, rebel)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
ADD_STREAMED_MODEL(orArgs.VehicleModels, SANCHEZ)
ADD_STREAMED_MODEL(orArgs.VehicleModels, BLAZER)
BREAK
ENDSWITCH
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@male_a@idle_a")
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@male_b@idle_a")
REQUEST_ANIM_DICT("amb@world_human_hang_out_street@male_c@idle_a")
REQUEST_ANIM_DICT("amb@world_human_aa_smoke@male@idle_a")
REQUEST_ANIM_DICT("random@street_race")
REQUEST_ANIM_DICT("gestures@m@standing@casual")
IF CurrentRaceIndex = OFFROAD_RACE_CANYON_CLIFFS
REQUEST_MODEL(prop_fncwood_14c)
REQUEST_MODEL(prop_fncwood_14e)
ENDIF
// LOAD_STREAM("INTRO_STREAM", "DIRT_RACES_SOUNDSET")
TEXT_LABEL_63 recName
recName = "offroadrace"
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS
recName += 1
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
recName += 2
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
recName += 6
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
recName += 3
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
recName += 4
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
recName += 5
BREAK
ENDSWITCH
recName += "car"
REQUEST_VEHICLE_RECORDING(1, recName)
REQUEST_ALL_MODELS(orArgs.AdditionalAssets)
REQUEST_ALL_MODELS(orArgs.VehicleModels)
REQUEST_ALL_MODELS(orArgs.LoanerAsset)
ENDPROC
FUNC BOOL LAUNCHER_CUSTOM_ASSETS_LOADED()
RETURN ARE_MODELS_STREAMED(orArgs.VehicleModels) AND
ARE_MODELS_STREAMED(orArgs.AdditionalAssets) AND
ARE_MODELS_STREAMED(orArgs.LoanerAsset) AND
HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@male_a@idle_a") AND
HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@male_b@idle_a") AND
HAS_ANIM_DICT_LOADED("amb@world_human_hang_out_street@male_c@idle_a") AND
HAS_ANIM_DICT_LOADED("amb@world_human_aa_smoke@male@idle_a") AND
HAS_ANIM_DICT_LOADED("random@street_race") AND
HAS_ANIM_DICT_LOADED("gestures@m@standing@casual")
ENDFUNC
PROC LAUNCHER_CUSTOM_RELEASE_ASSETS()
SET_ALL_MODELS_AS_NO_LONGER_NEEDED(orArgs.VehicleModels)
SET_ALL_MODELS_AS_NO_LONGER_NEEDED(orArgs.AdditionalAssets)
SET_ALL_MODELS_AS_NO_LONGER_NEEDED(orArgs.LoanerAsset)
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@male_a@idle_a")
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@male_b@idle_a")
REMOVE_ANIM_DICT("amb@world_human_hang_out_street@male_c@idle_a")
REMOVE_ANIM_DICT("amb@world_human_aa_smoke@male@idle_a")
REMOVE_ANIM_DICT("random@street_race")
REMOVE_ANIM_DICT("gestures@m@standing@casual")
STRING scenarioName
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS
scenarioName = "CanyonCliffs_Start"
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
scenarioName = "RidgeRun_Start"
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
scenarioName = "ValleyTrail_Start"
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
scenarioName = "LakesideSplash_Start"
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
scenarioName = "EcoFriendly_Start"
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
scenarioName = "MinewardSpiral_Start"
BREAK
ENDSWITCH
// REQUEST_ANIM_DICT("amb@world_human_aa_smoke@male@idle_a")
// REQUEST_ALL_MODELS(orArgs.AdditionalAssets)
// REQUEST_ALL_MODELS(orArgs.VehicleModels)
// REQUEST_ALL_MODELS(orArgs.LoanerAsset)
IF NOT IS_STRING_NULL_OR_EMPTY(scenarioName)
IF DOES_SCENARIO_GROUP_EXIST(scenarioName)
IF IS_SCENARIO_GROUP_ENABLED(scenarioName)
SET_SCENARIO_GROUP_ENABLED(scenarioName, FALSE)
ENDIF
ELSE
CPRINTLN(DEBUG_OR_RACES, scenarioName, " scenario group does not exist!")
ENDIF
ELSE
CPRINTLN(DEBUG_OR_RACES, ">>>>>> WARNING! Do we know what race we're in? We didn't get an attached scenario group")
ENDIF
ENDPROC
PROC OR_LAUNCHER_RESET_DATA()
INT i = 0
REPEAT COUNT_OF(orArgs.Racers) i
orArgs.Racers[i].StartPosition = <<0,0,0>>
orArgs.Racers[i].StartHeading = 0
ENDREPEAT
orArgs.Loaner.StartPosition = <<0,0,0>>
orArgs.Loaner.StartHeading = 0
ENDPROC
PROC OR_LAUNCHER_ADD_RACER(VECTOR thisStartPos, FLOAT thisStartHead, VECTOR thisStandingPos, FLOAT thisStandingHead)
INT i = 0
BOOL bFoundSpot = FALSE
REPEAT COUNT_OF(orArgs.Racers) i
IF NOT bFoundSpot AND IS_VECTOR_ZERO(orArgs.Racers[i].StartPosition)
//add racer to this one
orArgs.Racers[i].StartPosition = thisStartPos
orArgs.Racers[i].StartHeading = thisStartHead
orArgs.Racers[i].PedStandingPosition = thisStandingPos
orArgs.Racers[i].PedStandingHeading = thisStandingHead
bFoundSpot = TRUE
ENDIF
ENDREPEAT
IF bFoundSpot
CPRINTLN(DEBUG_OR_RACES, "[OR_LAUNCHER] successfully add a racer to the array. Position:", thisStartPos, " Heading:", thisStartHead)
ELSE
CPRINTLN(DEBUG_OR_RACES, "[OR_LAUNCHER] couldn't add a racer to the array!")
ENDIF
ENDPROC
PROC OR_LAUNCHER_ADD_LOANER(VECTOR thisStartPos, FLOAT thisStartHead, VECTOR thisStandingPos, FLOAT thisStandingHead)
IF IS_VECTOR_ZERO(orArgs.Loaner.StartPosition)
orArgs.Loaner.StartPosition = thisStartPos
orArgs.Loaner.StartHeading = thisStartHead
orArgs.Loaner.PedStandingPosition = thisStandingPos
orArgs.Loaner.PedStandingHeading = thisStandingHead
ENDIF
ENDPROC
FUNC MODEL_NAMES OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL(BOOL bIsPlayer = FALSE)
INT k = 0, i = 0
REPEAT COUNT_OF(orArgs.VehicleModels) i
IF IS_MODEL_A_VEHICLE(orArgs.VehicleModels[i].thisModel)
k++
ENDIF
ENDREPEAT
//For whatever reason, in this race, only the player is ELIGIBLE for receiving the car in index 5 of the vehicle model array
IF CurrentRaceIndex = OFFROAD_RACE_RIDGE_RUN
IF NOT bIsPlayer
k--
ENDIF
ENDIF
k = GET_RANDOM_INT_IN_RANGE(0, k)
CPRINTLN(DEBUG_OR_RACES, "OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL [random model] k = ", k)
IF orArgs.VehicleModels[k].thisModel = DUMMY_MODEL_FOR_SCRIPT
IF orArgs.VehicleModels[0].thisModel = DUMMY_MODEL_FOR_SCRIPT
//add vehicle models:
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS RETURN SANCHEZ BREAK
CASE OFFROAD_RACE_RIDGE_RUN RETURN MESA BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL RETURN SANCHEZ BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH RETURN SANCHEZ BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY RETURN MESA BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL RETURN SANCHEZ BREAK
ENDSWITCH
CPRINTLN(DEBUG_OR_RACES, "OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL failed, forcing model to const")
ELSE
CPRINTLN(DEBUG_OR_RACES, "OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL failed, forcing model to index 0")
RETURN orArgs.VehicleModels[0].thisModel
ENDIF
ENDIF
RETURN orArgs.VehicleModels[k].thisModel
ENDFUNC
FUNC MODEL_NAMES OR_LAUNCHER_GET_RANDOM_DRIVER_MODEL()
//don't have any other models yet
RETURN A_M_Y_MOTOX_01
ENDFUNC
PROC OR_LAUNCHER_POPULATE_RACERS()
//15*15
IF (fFlatSquaredPlayerDistanceToLauncher > 3*3) #IF IS_DEBUG_BUILD OR bOffroadDebugWarp #ENDIF
#IF IS_DEBUG_BUILD
bOffroadDebugWarp = FALSE //only use this flag once.
#ENDIF
//take data and populate racers
// need: vectors, headings, vehicle models
// might want: animations, tasks...
SEQUENCE_INDEX seq
INT idleToPlay
INT idleDictToPlay
STRING idleDictName
STRING idleName
INT i = 0
REPEAT COUNT_OF(orArgs.Racers) i
IF NOT IS_VECTOR_ZERO(orArgs.Racers[i].StartPosition)
// WHILE IS_SPHERE_VISIBLE(orArgs.Racers[i].StartPosition, 5.0)
// WAIT(1)
// ENDWHILE
CPRINTLN(DEBUG_OR_RACES, "Creating racer with ID ", i)
orArgs.Racers[i].VehIdx = CREATE_VEHICLE(OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL(), orArgs.Racers[i].StartPosition, orArgs.Racers[i].StartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(orArgs.Racers[i].VehIdx)
SET_VEHICLE_HAS_STRONG_AXLES(orArgs.Racers[i].VehIdx, TRUE)
IF IS_VECTOR_ZERO(orArgs.Racers[i].PedStandingPosition)
orArgs.Racers[i].PedIdx = CREATE_PED_INSIDE_VEHICLE(orArgs.Racers[i].VehIdx, PEDTYPE_CIVMALE, OR_LAUNCHER_GET_RANDOM_DRIVER_MODEL())
SET_VEHICLE_ENGINE_ON(orArgs.Racers[i].VehIdx, TRUE, FALSE)
ELSE
orArgs.Racers[i].PedIdx = CREATE_PED(PEDTYPE_CIVMALE, OR_LAUNCHER_GET_RANDOM_DRIVER_MODEL(), orArgs.Racers[i].PedStandingPosition, orArgs.Racers[i].PedStandingHeading)
idleToPlay = i//GET_RANDOM_INT_IN_RANGE()%3
SWITCH idleToPlay
CASE 0
CASE 3
idleName = "idle_a"
BREAK
CASE 1
CASE 4
idleName = "idle_b"
BREAK
DEFAULT
idleName = "idle_c"
BREAK
ENDSWITCH
idleDictToPlay = i//GET_RANDOM_INT_IN_RANGE(0, 3)
SWITCH idleDictToPlay
CASE 0
CASE 4
idleDictName = "amb@world_human_hang_out_street@male_a@idle_a"
BREAK
CASE 1
CASE 3
idleDictName = "amb@world_human_hang_out_street@male_b@idle_a"
BREAK
CASE 2
CASE 5
idleDictName = "amb@world_human_hang_out_street@male_c@idle_a"
BREAK
ENDSWITCH
orArgs.Racers[i].sIdleDict = idleDictName
orArgs.Racers[i].sIdleClip = idleName
OPEN_SEQUENCE_TASK(seq)
TASK_PAUSE( NULL, GET_RANDOM_INT_IN_RANGE( 100, 500 ) )
TASK_PLAY_ANIM(NULL, idleDictName, idleName, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXIT_AFTER_INTERRUPTED, GET_RANDOM_FLOAT_IN_RANGE())
CLOSE_SEQUENCE_TASK(seq)
//SET_BLOCKING_OF_NON_TEMPORARY_EVENTS( orArgs.Racers[i].PedIdx, TRUE )
CPRINTLN(DEBUG_OR_RACES, "Tasking racer with smoking animation sequence")
TASK_PERFORM_SEQUENCE(orArgs.Racers[i].PedIdx, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
SET_PED_HELMET(orArgs.Racers[i].PedIdx, TRUE)
GIVE_PED_HELMET(orArgs.Racers[i].PedIdx, TRUE)
// WAIT(GET_RANDOM_INT_IN_RANGE(500, 2000))
ELSE
CDEBUG1LN(DEBUG_MG_LAUNCHER, "cant spawn this racer. ZERO VECTOR!! ", orArgs.Racers[i].StartPosition)
ENDIF
ENDREPEAT
// Adding information for loaner
CPRINTLN(DEBUG_OR_RACES, "Creating loaner")
orArgs.Loaner.VehIdx = CREATE_VEHICLE(OR_LAUNCHER_GET_RANDOM_VEHICLE_MODEL(TRUE), orArgs.Loaner.StartPosition, orArgs.Loaner.StartHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(orArgs.Loaner.VehIdx)
SET_VEHICLE_HAS_STRONG_AXLES(orArgs.Loaner.VehIdx, TRUE)
IF IS_VECTOR_ZERO(orArgs.Loaner.PedStandingPosition)
orArgs.Loaner.PedIdx = CREATE_PED_INSIDE_VEHICLE(orArgs.Loaner.VehIdx, PEDTYPE_CIVMALE, OR_LAUNCHER_GET_RANDOM_DRIVER_MODEL())
SET_VEHICLE_ENGINE_ON(orArgs.Loaner.VehIdx, TRUE, FALSE)
ELSE
orArgs.Loaner.PedIdx = CREATE_PED(PEDTYPE_CIVMALE, OR_LAUNCHER_GET_RANDOM_DRIVER_MODEL(), orArgs.Loaner.PedStandingPosition, orArgs.Loaner.PedStandingHeading)
idleToPlay = GET_RANDOM_INT_IN_RANGE()%3
SWITCH idleToPlay
CASE 0
idleName = "idle_a"
BREAK
CASE 1
idleName = "idle_b"
BREAK
DEFAULT
idleName = "idle_c"
BREAK
ENDSWITCH
orArgs.Loaner.sIdleDict = "amb@world_human_aa_smoke@male@idle_a"
orArgs.Loaner.sIdleClip = idleName
OPEN_SEQUENCE_TASK(seq)
TASK_STAND_STILL(NULL, CLAMP_INT(GET_RANDOM_INT_IN_RANGE()%1000, 1, 1000))
TASK_PLAY_ANIM(NULL, "amb@world_human_aa_smoke@male@idle_a", idleName, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE())
CLOSE_SEQUENCE_TASK(seq)
CPRINTLN(DEBUG_OR_RACES, "Tasking racer with smoking animation sequence")
TASK_PERFORM_SEQUENCE(orArgs.Loaner.PedIdx, seq)
CLEAR_SEQUENCE_TASK(seq)
ENDIF
ELSE
IF fFlatSquaredPlayerDistanceToLauncher < 15*15
CDEBUG1LN(DEBUG_MG_LAUNCHER, "we're too close to spawn dudes!")
ELSE
CDEBUG1LN(DEBUG_MG_LAUNCHER, "NO CLUE why we cant spawn dudes!")
ENDIF
ENDIF
dialogueSpeaker = orArgs.Loaner.PedIdx
IF NOT IS_ENTITY_DEAD(orArgs.Racers[0].PedIdx)
ADD_PED_FOR_DIALOGUE(dialoguePedsStruct, 1, orArgs.Racers[0].PedIdx, "MALE1")
ENDIF
IF NOT IS_ENTITY_DEAD(orArgs.Racers[1].PedIdx)
ADD_PED_FOR_DIALOGUE(dialoguePedsStruct, 2, orArgs.Racers[1].PedIdx, "MALE2")
ENDIF
IF NOT IS_ENTITY_DEAD(orArgs.Racers[2].PedIdx)
ADD_PED_FOR_DIALOGUE(dialoguePedsStruct, 3, orArgs.Racers[3].PedIdx, "MALE3")
ENDIF
IF NOT IS_TIMER_STARTED(racerDialogueTimer)
START_TIMER_NOW(racerDialogueTimer)
ELSE
RESTART_TIMER_NOW(racerDialogueTimer)
ENDIF
// ADD_PED_FOR_DIALOGUE(dialoguePedsStruct, 1, dialogueSpeaker, "OR_Taunt")
ENDPROC
PROC ORR_LAUNCHER_UPDATE_AMBIENT_DIALOGUE()
IF NOT IS_TIMER_STARTED(racerDialogueTimer)
START_TIMER_NOW(racerDialogueTimer)
EXIT
ENDIF
IF DOES_ENTITY_EXIST(dialogueSpeaker)
AND NOT IS_ENTITY_DEAD(dialogueSpeaker)
IF IS_AMBIENT_SPEECH_PLAYING(dialogueSpeaker)
EXIT
ENDIF
ENDIF
IF GET_TIMER_IN_SECONDS(racerDialogueTimer) >= 8.0
INT iSpeaker = (GET_RANDOM_INT_IN_RANGE() % 3) + 1
IF iSpeaker > 0 AND iSpeaker <= 3
IF IS_ENTITY_DEAD(orArgs.Racers[iSpeaker-1].PedIdx)
EXIT
ENDIF
STRING sRoot
SWITCH iSpeaker
CASE 1 sRoot = "ORR_GUY1" BREAK
CASE 2 sRoot = "ORR_GUY2" BREAK
CASE 3 sRoot = "ORR_GUY3" BREAK
ENDSWITCH
CREATE_CONVERSATION(dialoguePedsStruct, "ORRAUD", sRoot, CONV_PRIORITY_AMBIENT_MEDIUM)
RESTART_TIMER_NOW(racerDialogueTimer)
ENDIF
ENDIF
ENDPROC
PROC ORR_LAUNCHER_SET_PEDS_AGGRESSIVE()
CPRINTLN(DEBUG_OR_RACES, "Setting peds as aggresive.")
PED_INDEX pedArray[10]
GET_PED_NEARBY_PEDS(PLAYER_PED_ID(), pedArray, PEDTYPE_INVALID)
SEQUENCE_INDEX siSeq
INT i = 0
REPEAT COUNT_OF(pedArray) i
IF DOES_ENTITY_EXIST(pedArray[i]) AND NOT IS_PED_INJURED(pedArray[i])// AND NOT IS_PED_IN_ANY_VEHICLE(pedArray[i])
IF IS_PED_ARMED(PLAYER_PED_ID(), WF_INCLUDE_GUN)
TASK_SMART_FLEE_PED(pedArray[i], PLAYER_PED_ID(), 100, -1)
ELSE
OPEN_SEQUENCE_TASK( siSeq )
TASK_TURN_PED_TO_FACE_ENTITY( NULL, PLAYER_PED_ID(), GET_RANDOM_INT_IN_RANGE( 300, 900 ) )
TASK_COMBAT_PED(NULL, PLAYER_PED_ID(), COMBAT_PED_NONE, TASK_THREAT_RESPONSE_NONE)
CLOSE_SEQUENCE_TASK( siSeq )
TASK_PERFORM_SEQUENCE( pedArray[i], siSeq )
CLEAR_SEQUENCE_TASK( siSeq )
ENDIF
ENDIF
ENDREPEAT
SWITCH (g_savedGlobals.sOffroadData.eCurrentRace)
CASE OFFROAD_RACE_CANYON_CLIFFS
CPRINTLN(DEBUG_OR_RACES, "Terminating offroad race")
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
//GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
// GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
//GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
//GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
//GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE)
//GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
BREAK
ENDSWITCH
// TASK_COMBAT_PED()
ENDPROC
/// PURPOSE: has triggered panic on a particular ped
FUNC BOOL ORR_LAUNCHER_TEST_PED_FOR_PANIC(PED_INDEX testPed, BOOL bInjuredCheck = TRUE, BOOL bCombatCheck = FALSE, BOOL bTargettingCheck = FALSE, BOOL bIncludeTouch = FALSE)
PED_INDEX Player = PLAYER_PED_ID()
VECTOR tempVec
IF orArgs.iRagdollCount >= 3
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(testPed)
IF NOT IS_PED_INJURED(testPed)
tempVec = GET_ENTITY_COORDS(testPed)
IF bInjuredCheck
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(testPed, PLAYER_PED_ID())
RETURN TRUE
ENDIF
ENDIF
//player is in combat with the ped
IF bCombatCheck
IF IS_PED_IN_COMBAT(testPed, Player)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because they are in combat with the player")
RETURN TRUE
ENDIF
ENDIF
//player is touching the target
IF bIncludeTouch
IF IS_ENTITY_TOUCHING_ENTITY(Player, testPed)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because player is touching them")
RETURN TRUE
ENDIF
ENDIF
//player is targetting the enemy within 10 m
IF bTargettingCheck
IF IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), testPed)
OR IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), testPed)
// IF IS_PED_FACING_PED(testPed, Player, 90)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(testPed) < 20
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because player is targetting ped!")
RETURN TRUE
ENDIF
// ENDIF
ENDIF
ENDIF
//player has damaged the target's vehicle (if they are in one)
IF IS_PED_IN_ANY_VEHICLE(testPed)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(GET_VEHICLE_PED_IS_IN(testPed), Player)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because player damaged the ped's vehicle!")
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_FLEEING(testPed)
CPRINTLN(DEBUG_OR_RACES, "Ped responding to code driven event and fleeing!")
RETURN TRUE
ENDIF
//Player is shooting near the target
IF IS_PED_ARMED(Player, ENUM_TO_INT(WF_INCLUDE_GUN))
IF IS_PED_SHOOTING(Player)
IF IS_ENTITY_AT_COORD(testPed, GET_ENTITY_COORDS(Player), <<45, 45, 45>>)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because player is shooting!")
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF IS_BULLET_IN_AREA(tempVec, 4.0, TRUE)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because bullet in area!")
RETURN TRUE
ENDIF
//check to see if player is threatening ped with a thrown weapon
IF IS_PROJECTILE_IN_AREA(<<tempVec.x-5, tempVec.y-5, tempVec.z-5>>, <<tempVec.x+5, tempVec.y+5, tempVec.z+5>>)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because projectile in area!")
RETURN TRUE
ENDIF
IF IS_PED_BEING_JACKED(testPed)
IF GET_PEDS_JACKER(testPed) = Player
CPRINTLN(DEBUG_OR_RACES, "Ped panicking because player is jacking their vehicle!")
RETURN TRUE
ENDIF
ENDIF
IF IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, tempVec, 25)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_STEAM, tempVec, 25)
AND NOT IS_EXPLOSION_IN_SPHERE(EXP_TAG_DIR_WATER_HYDRANT, tempVec, 25)
CPRINTLN(DEBUG_OR_RACES, "Ped panicking becuase there is an explosion near them")
RETURN TRUE
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(testPed)
ELSE
IF bInjuredCheck
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC OR_LAUNCHER_UPDATE_RACERS()
INT waitTime, revTime
INT i = 0
SEQUENCE_INDEX seq
REPEAT OR_NUM_RACERS i
IF DOES_ENTITY_EXIST(orArgs.Racers[i].VehIdx) AND DOES_ENTITY_EXIST(orArgs.Racers[i].PedIdx)
IF ORR_LAUNCHER_TEST_PED_FOR_PANIC(orArgs.Racers[i].PedIdx) OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), orArgs.Racers[i].VehIdx, TRUE)
ORR_LAUNCHER_SET_PEDS_AGGRESSIVE()
GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) //in case the player tries to start the race at the same time.
ENDIF
IF NOT IS_PED_INJURED(orArgs.Racers[i].PedIdx)
IF IS_TIMER_STARTED(racerOpdateTimers[i])
IF GET_TIMER_IN_SECONDS(racerOpdateTimers[i]) > racerUpdateWaitTime[i]
IF IS_VEHICLE_DRIVEABLE(orArgs.Racers[i].VehIdx) AND IS_PED_IN_VEHICLE(orArgs.Racers[i].PedIdx, orArgs.Racers[i].VehIdx)
waitTime = GET_RANDOM_INT_IN_RANGE(250, 500)
revTime = GET_RANDOM_INT_IN_RANGE(250, 500)
OPEN_SEQUENCE_TASK(seq)
TASK_VEHICLE_TEMP_ACTION(NULL, orArgs.Racers[i].VehIdx, TEMPACT_WAIT, waitTime)
TASK_VEHICLE_TEMP_ACTION(NULL, orArgs.Racers[i].VehIdx, TEMPACT_REV_ENGINE, revTime)
CLOSE_SEQUENCE_TASK(seq)
IF NOT IS_PED_INJURED(orArgs.Racers[i].PedIdx)
TASK_PERFORM_SEQUENCE(orArgs.Racers[i].PedIdx, seq)
ENDIF
CLEAR_SEQUENCE_TASK(seq)
ELSE
//tell peds to update idle animations
//TASK_CHAT_TO_PED()
ENDIF
RESTART_TIMER_NOW(racerOpdateTimers[i])
racerUpdateWaitTime[i] = GET_RANDOM_FLOAT_IN_RANGE(0, 3)
ENDIF
ELSE
START_TIMER_NOW(racerOpdateTimers[i])
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD( orArgs.Racers[i].PedIdx )
IF IS_ENTITY_TOUCHING_ENTITY( PLAYER_PED_ID(), orArgs.Racers[i].PedIdx ) //IS_PED_RESPONDING_TO_EVENT( orArgs.Racers[i].PedIdx, EVENT_PED_COLLISION_WITH_PLAYER )
AND NOT IS_PED_RAGDOLL( orArgs.Racers[i].PedIdx )
AND NOT IS_PED_GETTING_UP( orArgs.Racers[i].PedIdx )
orArgs.Racers[i].bJustWalkedInto = TRUE
ELIF OrArgs.Racers[i].bJustWalkedInto
OPEN_SEQUENCE_TASK( seq )
TASK_ACHIEVE_HEADING( NULL, orArgs.Racers[i].PedStandingHeading, 1000 )
TASK_PLAY_ANIM( NULL, orArgs.Racers[i].sIdleDict, orArgs.Racers[i].sIdleClip, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING )
CLOSE_SEQUENCE_TASK( seq )
TASK_PERFORM_SEQUENCE( orArgs.Racers[i].PedIdx, seq )
CLEAR_SEQUENCE_TASK( seq )
orArgs.Racers[i].bJustWalkedInto = FALSE
ENDIF
IF IS_PED_RAGDOLL( orArgs.Racers[i].PedIdx )
OR IS_PED_GETTING_UP( orArgs.Racers[i].PedIdx )
IF NOT orArgs.Racers[i].bJustRagdolled
AND (IS_PED_RAGDOLL( orArgs.Racers[i].PedIdx )
OR IS_PED_GETTING_UP( orArgs.Racers[i].PedIdx ) )
++orArgs.iRagdollCount
ENDIF
orArgs.Racers[i].bJustRagdolled = TRUE
ELIF orArgs.Racers[i].bJustRagdolled
OPEN_SEQUENCE_TASK( seq )
TASK_TURN_PED_TO_FACE_ENTITY( NULL, PLAYER_PED_ID(), 1000 )
TASK_PLAY_ANIM( NULL, "gestures@m@standing@casual", OR_LAUNCHER_GET_RESPONSE_ANIM() )
TASK_ACHIEVE_HEADING( NULL, orArgs.Racers[i].PedStandingHeading, 1000 )
TASK_PLAY_ANIM( NULL, orArgs.Racers[i].sIdleDict, orArgs.Racers[i].sIdleClip, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING )
CLOSE_SEQUENCE_TASK( seq )
TASK_PERFORM_SEQUENCE( orArgs.Racers[i].PedIdx, seq )
CLEAR_SEQUENCE_TASK( seq )
orArgs.Racers[i].bJustRagdolled = FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
////////////////////// LOANER ///////////////////////
IF DOES_ENTITY_EXIST(orArgs.Loaner.VehIdx) AND DOES_ENTITY_EXIST(orArgs.Loaner.PedIdx)
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), orArgs.Loaner.VehIdx)
vehicleLaunch = orArgs.Loaner.VehIdx
ENDIF
IF ORR_LAUNCHER_TEST_PED_FOR_PANIC(orArgs.Loaner.PedIdx)// OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), orArgs.Loaner.VehIdx)
ORR_LAUNCHER_SET_PEDS_AGGRESSIVE()
GENERIC_LAUNCHER_FORCE_WAIT_TERMINATE_AND_CLEAR_STATIC_BLIP(eLauncherStaticBlip)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) //in case the player tries to start the race at the same time.
ENDIF
IF NOT IS_PED_INJURED(orArgs.Loaner.PedIdx)
IF IS_TIMER_STARTED(loanerUpdateTimer)
IF GET_TIMER_IN_SECONDS(loanerUpdateTimer) > loanerUpdateWaitTime
IF IS_VEHICLE_DRIVEABLE(orArgs.Loaner.VehIdx) AND IS_PED_IN_VEHICLE(orArgs.Loaner.PedIdx, orArgs.Loaner.VehIdx)
waitTime = GET_RANDOM_INT_IN_RANGE(250, 500)
revTime = GET_RANDOM_INT_IN_RANGE(250, 500)
OPEN_SEQUENCE_TASK(seq)
TASK_VEHICLE_TEMP_ACTION(NULL, orArgs.Loaner.VehIdx, TEMPACT_WAIT, waitTime)
TASK_VEHICLE_TEMP_ACTION(NULL, orArgs.Loaner.VehIdx, TEMPACT_REV_ENGINE, revTime)
CLOSE_SEQUENCE_TASK(seq)
IF NOT IS_PED_INJURED(orArgs.Loaner.PedIdx)
TASK_PERFORM_SEQUENCE(orArgs.Loaner.PedIdx, seq)
ENDIF
CLEAR_SEQUENCE_TASK(seq)
ELSE
//tell peds to update idle animations
//TASK_CHAT_TO_PED()
ENDIF
RESTART_TIMER_NOW(loanerUpdateTimer)
loanerUpdateWaitTime = GET_RANDOM_FLOAT_IN_RANGE(0, 3)
ENDIF
ELSE
START_TIMER_NOW(loanerUpdateTimer)
ENDIF
ENDIF
IF NOT IS_ENTITY_DEAD( orArgs.Loaner.PedIdx )
IF IS_ENTITY_TOUCHING_ENTITY( PLAYER_PED_ID(), orArgs.Loaner.PedIdx ) //IS_PED_RESPONDING_TO_EVENT( orArgs.Racers[i].PedIdx, EVENT_PED_COLLISION_WITH_PLAYER )
AND NOT IS_PED_RAGDOLL( orArgs.Loaner.PedIdx )
AND NOT IS_PED_GETTING_UP( orArgs.Loaner.PedIdx )
orArgs.Loaner.bJustWalkedInto = TRUE
ELIF OrArgs.Loaner.bJustWalkedInto
OPEN_SEQUENCE_TASK( seq )
TASK_ACHIEVE_HEADING( NULL, orArgs.Loaner.PedStandingHeading, 1000 )
TASK_PLAY_ANIM( NULL, orArgs.Loaner.sIdleDict, orArgs.Loaner.sIdleClip, SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING )
CLOSE_SEQUENCE_TASK( seq )
TASK_PERFORM_SEQUENCE( orArgs.Loaner.PedIdx, seq )
CLEAR_SEQUENCE_TASK( seq )
OrArgs.Loaner.bJustWalkedInto = FALSE
ENDIF
IF IS_PED_RAGDOLL( orArgs.Loaner.PedIdx )
OR IS_PED_GETTING_UP( orArgs.Loaner.PedIdx )
IF NOT orArgs.Loaner.bJustRagdolled
++orArgs.iRagdollCount
ENDIF
orArgs.Loaner.bJustRagdolled = TRUE
ELIF orArgs.Loaner.bJustRagdolled
OPEN_SEQUENCE_TASK( seq )
TASK_TURN_PED_TO_FACE_ENTITY( NULL, PLAYER_PED_ID(), 1000 )
TASK_PLAY_ANIM( NULL, "gestures@m@standing@casual", OR_LAUNCHER_GET_RESPONSE_ANIM() )
TASK_ACHIEVE_HEADING( NULL, orArgs.Loaner.PedStandingHeading, 1000 )
TASK_PLAY_ANIM( NULL, orArgs.Loaner.sIdleDict, orArgs.Loaner.sIdleClip )
CLOSE_SEQUENCE_TASK( seq )
TASK_PERFORM_SEQUENCE( orArgs.Loaner.PedIdx, seq )
CLEAR_SEQUENCE_TASK( seq )
eLoanerState = LGS_GREETING_PLAYER
RESTART_TIMER_NOW( greetTimer )
orArgs.Loaner.bJustRagdolled = FALSE
ENDIF
ENDIF
ENDIF
/////////////////// END LOANER /////////////////
// IF IS_TIMER_STARTED(dialogueTimer)
// IF GET_TIMER_IN_SECONDS(dialogueTimer) > dialogueWaitTime
// OR_LAUNCHER_RACER dialogueRacer
// TEXT_LABEL_15 launchLineLabel = "OR_LAUNCH_"
// launchLineLabel += GET_RANDOM_INT_IN_RANGE(1, 9)
// dialogueRacer = orArgs.Loaner
// dialogueSpeaker = orArgs.Loaner.PedIdx//dialogueRacer.PedIdx
// IF DOES_ENTITY_EXIST(dialogueRacer.VehIdx) AND DOES_ENTITY_EXIST(dialogueRacer.PedIdx)
// IF NOT IS_PED_INJURED(dialogueSpeaker) AND IS_PED_IN_VEHICLE(dialogueRacer.PedIdx, dialogueRacer.VehIdx)
// IF GET_DISTANCE_BETWEEN_ENTITIES(dialogueSpeaker, PLAYER_PED_ID()) <= 40.0
// PLAY_SINGLE_LINE_FROM_CONVERSATION(dialoguePedsStruct, "SPR_OR", "OR_LAUNCH", launchLineLabel, CONV_PRIORITY_LOW)
// ENDIF
// ENDIF
// ENDIF
// RESTART_TIMER_NOW(dialogueTimer)
// dialogueWaitTime = GET_RANDOM_FLOAT_IN_RANGE(6, 15)
// ENDIF
// ELSE
// START_TIMER_NOW(dialogueTimer)
// ENDIF
ENDPROC
/// PURPOSE:
/// Creates the other guys at the shooting range.
PROC LAUNCHER_CUSTOM_SPAWN_SCENE()
INT iCurHour
iCurHour = GET_CLOCK_HOURS()
IF ((iCurHour <= iAvailableAfterHour) AND (iCurHour >= iAvailableBeforeHour)) OR GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) != 0
EXIT
ENDIF
IF bAllowScene
STRING scenarioName
OR_LAUNCHER_CLEAR_RACE_PATH()
OR_LAUNCHER_RESET_DATA()
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS //Canyon Cliffs
//setup racers starting positions and headings
OR_LAUNCHER_ADD_RACER(<<-1930.38, 4441.90, 38.12>>, 260.86, <<-1933.4417, 4440.8657, 37.2504>>, 184.1250)
OR_LAUNCHER_ADD_RACER(<<-1931.24, 4440.26, 38.05>>, 257.2117, <<-1932.7954, 4438.2749, 37.4020>>, 78.7749)
OR_LAUNCHER_ADD_RACER(<<-1935.01, 4442.57, 37.48>>, 263.59, <<-1934.9640, 4438.3062, 37.1741>>, 297.2304)
OR_LAUNCHER_ADD_RACER(<<-1935.50, 4440.32, 37.48>>, 258.09, <<-1937.2506, 4438.7612, 36.9256>>, 23.8377)
OR_LAUNCHER_ADD_RACER(<<-1939.63, 4440.46, 37.25>>, 253.32, <<-1938.3187, 4439.9131, 36.7166>>, 250.6112)
OR_LAUNCHER_ADD_LOANER(<<-1939.5636, 4443.3057, 36.3803>>, 262.3551, <<-1936.2085, 4444.1250, 36.8594>>, 123.8187)
BREAK
CASE OFFROAD_RACE_RIDGE_RUN //Ridge Run
OR_LAUNCHER_ADD_RACER(<<-520.2097, 2010.8163, 203.6035>>, 17.0169, <<-517.2971, 2008.3831, 204.0454>>, 2.9896)
OR_LAUNCHER_ADD_RACER(<<-516.9937, 2013.9797, 203.5907>>, 19.3803, <<-517.1741, 2010.8132, 203.8412>>, 125.7555)
OR_LAUNCHER_ADD_RACER(<<-518.3414, 2005.4489, 204.1878>>, 20.7231, <<-519.0882, 2013.6492, 203.3304>>, 195.7951 )
OR_LAUNCHER_ADD_RACER(<<-514.8247, 2008.5737, 204.3629>>, 20.2278, <<-514.2933, 2004.9231, 204.5935>>, 126.8655)
OR_LAUNCHER_ADD_LOANER(<<-516.1545, 1999.3740, 204.7715>>, 18.7907, <<-515.4201, 2003.6216, 204.5549>>, 1.7570)
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL //Valley Trail
OR_LAUNCHER_ADD_RACER(<<-225.41, 4227.53, 44.45>>, 82.70, <<-231.9795, 4226.3101, 43.8587>>, 353.3938)
OR_LAUNCHER_ADD_RACER(<<-233.16, 4225.81, 44.29>>, 76.66, <<-231.3181, 4229.2505, 43.8681>>, 179.3787)
OR_LAUNCHER_ADD_RACER(<<-233.33, 4228.89, 44.35>>, 80.88, <<-229.4769, 4226.1016, 43.8909>>, 311.8915)
OR_LAUNCHER_ADD_RACER(<<-229.58, 4225.21, 44.34>>, 75.78, <<-227.6066, 4228.8672, 43.9069>>, 186.6535)
OR_LAUNCHER_ADD_RACER(<<-228.85, 4227.71, 44.57>>, 83.38, <<-226.7015, 4226.6826, 43.8597>>, 28.0083)
OR_LAUNCHER_ADD_LOANER(<<-225.6736, 4224.5034, 43.8435>>, 77.7579, <<-227.2893, 4224.6987, 43.8335>>, 36.5500)
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH //Lakeside Splash
OR_LAUNCHER_ADD_RACER(<<1608.91, 3845.06, 33.94>>, 307.24, <<1610.4760, 3839.1633, 32.9854>>, 29.8332)
OR_LAUNCHER_ADD_RACER(<<1606.20, 3838.41, 33.62>>, 307.44, <<1612.9076, 3841.4924, 32.9721>>, 78.3000)
OR_LAUNCHER_ADD_RACER(<<1610.47, 3842.26, 33.61>>, 311.44, <<1608.0966, 3842.6758, 33.3217>>, 198.5355)
OR_LAUNCHER_ADD_RACER(<<1604.49, 3840.42, 34.18>>, 308.19, <<1608.4274, 3837.3677, 32.9989>>, 9.9463)
OR_LAUNCHER_ADD_LOANER(<<1603.4052, 3836.3240, 33.1144>>, 305.0550, <<1605.7883, 3840.2363, 33.2826>>, 288.7775)
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY //Eco Friendly
OR_LAUNCHER_ADD_RACER(<<2046.7721, 2130.4421, 91.9486>>, 233.1493, <<2036.1232, 2133.9807, 92.6150>>, 260.0519)
OR_LAUNCHER_ADD_RACER(<<2045.3445, 2126.3523, 91.9358>>, 236.3633, <<2044.4219, 2128.9607, 92.0880>>, 47.8797)
OR_LAUNCHER_ADD_RACER(<<2036.5120, 2137.8071, 92.6507>>, 237.2446, <<2041.7780, 2131.3538, 92.4544>>, 226.7534)
OR_LAUNCHER_ADD_RACER(<<2041.7390, 2134.3242, 92.4013>>, 232.9560, <<2039.6033, 2132.5635, 92.6648>>, 61.0834)
OR_LAUNCHER_ADD_RACER(<<2039.7745, 2130.0249, 92.5324>>, 241.6337, <<2038.7444, 2134.5232, 92.6235>>, 128.9800)
OR_LAUNCHER_ADD_LOANER(<<2030.8984, 2134.1968, 92.5014>>, 249.4471, <<2036.5801, 2135.3821, 92.6050>>, 233.2111)
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL // Mineward Spiral
OR_LAUNCHER_ADD_RACER(<<2992.58, 2786.28, 43.21>>, 26.81, <<2998.7720, 2777.3918, 42.1008>>, 29.7228)
OR_LAUNCHER_ADD_RACER(<<2995.76, 2787.72, 43.26>>, 33.42, <<2993.1204, 2779.7830, 42.3128>>, 286.9825)
OR_LAUNCHER_ADD_RACER(<<2994.91, 2779.79, 42.73>>, 11.43, <<2999.2527, 2783.9700, 42.5421>>, 108.7426)
OR_LAUNCHER_ADD_RACER(<<2999.44, 2781.11, 43.11>>, 23.89, <<2997.5823, 2787.4763, 42.6953>>, 157.4885)
OR_LAUNCHER_ADD_RACER(<<3000.06, 2775.26, 42.47>>, 17.16, <<2994.7188, 2784.9050, 42.6444>>, 213.8879)//<<2992.8938, 2787.8120, 42.7398>>, 214.0832)
OR_LAUNCHER_ADD_LOANER(<<2995.5249, 2775.5225, 41.9800>>, 4.3249, <<2993.5110, 2776.9482, 42.0941>>, 305.3785)
BREAK
ENDSWITCH
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS
scenarioName = "CanyonCliffs_Start"
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
scenarioName = "RidgeRun_Start"
BREAK
CASE OFFROAD_RACE_VALLEY_TRAIL
scenarioName = "ValleyTrail_Start"
BREAK
CASE OFFROAD_RACE_LAKESIDE_SPLASH
scenarioName = "LakesideSplash_Start"
BREAK
CASE OFFROAD_RACE_ECO_FRIENDLY
scenarioName = "EcoFriendly_Start"
BREAK
CASE OFFROAD_RACE_MINEWARD_SPIRAL
scenarioName = "MinewardSpiral_Start"
BREAK
ENDSWITCH
IF NOT IS_STRING_NULL_OR_EMPTY(scenarioName)
IF DOES_SCENARIO_GROUP_EXIST(scenarioName)
IF NOT IS_SCENARIO_GROUP_ENABLED(scenarioName)
SET_SCENARIO_GROUP_ENABLED(scenarioName, TRUE)
CPRINTLN( DEBUG_OR_RACES, scenarioName, " group exists and is being made!" )
ENDIF
ELSE
CPRINTLN(DEBUG_OR_RACES, scenarioName, " scenario group does not exist!")
ENDIF
ELSE
CPRINTLN(DEBUG_OR_RACES, ">>>>>> WARNING! Do we know what race we're in? We didn't get an attached scenario group")
ENDIF
ENDIF
//create racers
OR_LAUNCHER_POPULATE_RACERS()
ENDPROC
FUNC INT ORR_GET_NUM_RACERS()
SWITCH CurrentRaceIndex
CASE OFFROAD_RACE_CANYON_CLIFFS
CASE OFFROAD_RACE_VALLEY_TRAIL
CASE OFFROAD_RACE_ECO_FRIENDLY
CASE OFFROAD_RACE_MINEWARD_SPIRAL
RETURN 5
BREAK
CASE OFFROAD_RACE_RIDGE_RUN
CASE OFFROAD_RACE_LAKESIDE_SPLASH
RETURN 4
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
FUNC BOOL HAS_ORR_SCENE_SPAWNED()
INT iIndex
REPEAT ORR_GET_NUM_RACERS() iIndex
IF NOT DOES_ENTITY_EXIST( orArgs.Racers[iIndex].PedIdx )
OR NOT DOES_ENTITY_EXIST( orArgs.Racers[iIndex].VehIdx )
RETURN FALSE
ENDIF
ENDREPEAT
IF NOT DOES_ENTITY_EXIST( orArgs.Loaner.PedIdx )
OR NOT DOES_ENTITY_EXIST( orArgs.Loaner.VehIdx )
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Waiting for the player to approach the start point.
PROC LAUNCHER_CUSTOM_APPROACH_WAIT()
//UPDATE_ZVOLUME_WIDGETS()
FLOAT fDist2 = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vRaceLoc)
IF fDist2 < 62500// 250*250
OR_LAUNCHER_UPDATE_RACERS()
OR_LAUNCHER_HANDLE_LOANER_GREETING()
// When the player gets within 8 meters, focus the hint cam.
IF bHintCam
IF fDist2 < 64
OR_LAUNCHER_HANDLE_HINT_CAM()
bHintCam = FALSE
ENDIF
//
// // If the hint cam was focused, and the player gets greater than 20m away, reset it to happen again.
// IF fDist2 > 400
// bHintCam = TRUE
// ENDIF
ENDIF
IF fDist2 < 400 //20*20
ORR_LAUNCHER_UPDATE_AMBIENT_DIALOGUE()
ENDIF
ENDIF
IF NOT bSceneSpawned
IF HAS_ORR_SCENE_SPAWNED()
bSceneSpawned = TRUE
INCREMENT_MINIGAMES_LOADED_COUNT()
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// The script has started. Emergency destroy everything.
PROC LAUNCHER_CUSTOM_CLEAR_SCENE()
// INT i = 0
// REPEAT COUNT_OF(orArgs.Racers) i
// IF DOES_ENTITY_EXIST(orArgs.Racers[i].VehIdx)
// IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), orArgs.Racers[i].VehIdx)
// SET_VEHICLE_AS_NO_LONGER_NEEDED(orArgs.Racers[i].VehIdx)
// ELSE
// DELETE_VEHICLE(orArgs.Racers[i].VehIdx)
// ENDIF
// ENDIF
// IF DOES_ENTITY_EXIST(orArgs.Racers[i].PedIdx)
// DELETE_PED(orArgs.Racers[i].PedIdx)
// ENDIF
// ENDREPEAT
IF NOT bHintCam
STOP_GAMEPLAY_HINT()
bHintCam = TRUE
ENDIF
LAUNCHER_CUSTOM_RELEASE_ASSETS()
ENDPROC
USING "generic_launcher.sch"