418 lines
14 KiB
Python
Executable File
418 lines
14 KiB
Python
Executable File
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// SCRIPT NAME : controller_Races.sc //
|
|
// AUTHOR : //
|
|
// DESCRIPTION : Simple script that manages the race blip state //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
USING "globals.sch"
|
|
USING "commands_entity.sch"
|
|
USING "commands_script.sch"
|
|
USING "code_control_public.sch"
|
|
USING "flow_public_game.sch"
|
|
|
|
// Enums
|
|
ENUM RACE_CONTROLLER_STATE
|
|
RACE_CONTROL_INIT,
|
|
RACE_CONTROL_DAY,
|
|
RACE_CONTROL_NIGHT
|
|
ENDENUM
|
|
RACE_CONTROLLER_STATE eControlState = RACE_CONTROL_INIT
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Script Cleanup
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
/// PURPOSE:
|
|
/// Script Cleanup
|
|
PROC SCRIPT_CLEANUP()
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Cleanup")
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Script Functions
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
FUNC STRING GET_SEA_RACE_NAME_FOR_DEBUG(INT iIndex)
|
|
SWITCH iIndex
|
|
CASE 0 RETURN "SEA_RACE_EAST" BREAK
|
|
CASE 1 RETURN "SEA_RACE_NORTH" BREAK
|
|
CASE 2 RETURN "SEA_RACE_CANYON" BREAK
|
|
CASE 3 RETURN "SEA_RACE_CITY" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "SEA_RACE_NONE"
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_STREET_RACE_NAME_FOR_DEBUG(INT iIndex)
|
|
SWITCH iIndex
|
|
CASE 0 RETURN "STREET_RACE_LOS_SANTOS" BREAK
|
|
CASE 1 RETURN "STREET_RACE_CITY_CIRCUIT" BREAK
|
|
CASE 2 RETURN "STREET_RACE_AIRPORT" BREAK
|
|
CASE 3 RETURN "STREET_RACE_FREEWAY" BREAK
|
|
CASE 4 RETURN "STREET_RACE_VESPUCCI_CANALS" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "STREET_RACE_NONE"
|
|
ENDFUNC
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Gets the street race enum from the index
|
|
FUNC STATIC_BLIP_NAME_ENUM GET_SEA_RACE_BLIP_NAME(INT iIndex)
|
|
|
|
SWITCH iIndex
|
|
CASE 0 RETURN STATIC_BLIP_MINIGAME_SEA_RACE1 BREAK
|
|
CASE 1 RETURN STATIC_BLIP_MINIGAME_SEA_RACE2 BREAK
|
|
CASE 2 RETURN STATIC_BLIP_MINIGAME_SEA_RACE3 BREAK
|
|
CASE 3 RETURN STATIC_BLIP_MINIGAME_SEA_RACE4 BREAK
|
|
ENDSWITCH
|
|
|
|
SCRIPT_ASSERT("Invalid index passed to GET_SEA_RACE_BLIP_NAME()")
|
|
RETURN STATIC_BLIP_MINIGAME_SEA_RACE1
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Gets the street race enum from the index
|
|
FUNC STATIC_BLIP_NAME_ENUM GET_STREET_RACE_BLIP_NAME(INT iIndex)
|
|
|
|
SWITCH iIndex
|
|
CASE 0 RETURN STATIC_BLIP_MINIGAME_STREET_RACE1 BREAK
|
|
CASE 1 RETURN STATIC_BLIP_MINIGAME_STREET_RACE2 BREAK
|
|
CASE 2 RETURN STATIC_BLIP_MINIGAME_STREET_RACE4 BREAK
|
|
CASE 3 RETURN STATIC_BLIP_MINIGAME_STREET_RACE5 BREAK
|
|
CASE 4 RETURN STATIC_BLIP_MINIGAME_STREET_RACE6 BREAK
|
|
ENDSWITCH
|
|
|
|
SCRIPT_ASSERT("Invalid index passed to GET_STREET_RACE_BLIP_NAME()")
|
|
RETURN STATIC_BLIP_MINIGAME_STREET_RACE1
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Removes all street race blips from the map
|
|
PROC TURN_OFF_ALL_STREET_RACE_BLIPS()
|
|
INT iRace
|
|
FOR iRace = 0 TO (ENUM_TO_INT(NUM_STREET_RACES) - 1)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(GET_STREET_RACE_BLIP_NAME(iRace), FALSE)
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Checks the current time of day and updates mission state accordingly
|
|
PROC CHECK_TIME_OF_DAY()
|
|
|
|
SWITCH(eControlState)
|
|
|
|
CASE RACE_CONTROL_INIT
|
|
IF GET_CLOCK_HOURS() < MIN_STREET_RACE_HOUR
|
|
AND GET_CLOCK_HOURS() >= MAX_STREET_RACE_HOUR
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: RACE_CONTROL_INIT->RACE_CONTROL_DAY")
|
|
TURN_OFF_ALL_STREET_RACE_BLIPS()
|
|
eControlState = RACE_CONTROL_DAY
|
|
ELSE
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: RACE_CONTROL_INIT->RACE_CONTROL_NIGHT")
|
|
eControlState = RACE_CONTROL_NIGHT
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_CONTROL_DAY
|
|
IF GET_CLOCK_HOURS() >= MIN_STREET_RACE_HOUR
|
|
OR GET_CLOCK_HOURS() < MAX_STREET_RACE_HOUR
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: RACE_CONTROL_DAY->RACE_CONTROL_NIGHT")
|
|
eControlState = RACE_CONTROL_NIGHT
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_CONTROL_NIGHT
|
|
IF GET_CLOCK_HOURS() < MIN_STREET_RACE_HOUR
|
|
AND GET_CLOCK_HOURS() >= MAX_STREET_RACE_HOUR
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: RACE_CONTROL_NIGHT->RACE_CONTROL_DAY")
|
|
TURN_OFF_ALL_STREET_RACE_BLIPS()
|
|
eControlState = RACE_CONTROL_DAY
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Maintains the triggering of sea races
|
|
PROC UPDATE_SEA_RACE_BLIPS()
|
|
|
|
IF IS_MINIGAME_ACTIVE(MINIGAME_SEA_RACES)
|
|
|
|
// For all sea races...
|
|
INT iSeaRace
|
|
FOR iSeaRace = 0 TO (ENUM_TO_INT(NUM_SEA_RACES) - 1)
|
|
|
|
// Get blip name for current race
|
|
STATIC_BLIP_NAME_ENUM eBlipName = GET_SEA_RACE_BLIP_NAME(iSeaRace)
|
|
|
|
// Do we need to check for leaving the race vicinity
|
|
IF IS_BIT_SET(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(iSeaRace))
|
|
|
|
// Get distance from race
|
|
FLOAT fRaceDistance
|
|
fRaceDistance = VDIST2(GET_PLAYER_COORDS(PLAYER_ID()), GET_STATIC_BLIP_POSITION(eBlipName))
|
|
|
|
// Left vicinity of race
|
|
IF fRaceDistance > (209*209)
|
|
|
|
// Enable blip
|
|
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
IF NOT g_bSeaRaceTimeout[iSeaRace]
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Reactivating blip ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
CLEAR_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(iSeaRace))
|
|
ELSE
|
|
IF (GET_GAME_TIMER()- g_iSeaRaceCooldown[iSeaRace]) > SEA_RACE_TIMEOUT
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Reactivating blip after timeout ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
g_bSeaRaceTimeout[iSeaRace] = FALSE
|
|
g_iSeaRaceCooldown[iSeaRace] = GET_GAME_TIMER()
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
CLEAR_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(iSeaRace))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Remove blip
|
|
IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Removing blip ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Do we need to blip the race?
|
|
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
IF NOT g_bSeaRaceTimeout[iSeaRace]
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Activating blip ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
ELSE
|
|
IF (GET_GAME_TIMER() - g_iSeaRaceCooldown[iSeaRace]) > SEA_RACE_TIMEOUT
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Activating blip after timeout ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
g_bSeaRaceTimeout[iSeaRace] = FALSE
|
|
g_iSeaRaceCooldown[iSeaRace] = GET_GAME_TIMER()
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Flash the first blip instance
|
|
IF NOT g_savedGlobals.sSeaRaceData.bFirstBlip
|
|
IF eBlipName = STATIC_BLIP_MINIGAME_SEA_RACE1
|
|
SET_STATIC_BLIP_LONG_RANGE(STATIC_BLIP_MINIGAME_SEA_RACE1)
|
|
EXECUTE_CODE_ID(CID_FLASH_SEA_RACE_BLIP, 1000)
|
|
g_savedGlobals.sSeaRaceData.bFirstBlip = TRUE
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Flashing blip ", GET_SEA_RACE_NAME_FOR_DEBUG(iSeaRace))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Maintains the triggering of street races
|
|
PROC UPDATE_STREET_RACE_BLIPS()
|
|
|
|
IF IS_MINIGAME_ACTIVE(MINIGAME_STREET_RACES)
|
|
|
|
// For all street races...
|
|
INT iStreetRace
|
|
FOR iStreetRace = 0 TO (ENUM_TO_INT(NUM_STREET_RACES) - 1)
|
|
|
|
// Get blip name for current race
|
|
STATIC_BLIP_NAME_ENUM eBlipName = GET_STREET_RACE_BLIP_NAME(iStreetRace)
|
|
|
|
// Race has been unlocked
|
|
IF IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceUnlocked, ENUM_TO_INT(iStreetRace))
|
|
|
|
// Do we need to check for leaving the race vicinity
|
|
IF IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(iStreetRace))
|
|
|
|
// Get distance from race
|
|
FLOAT fRaceDistance
|
|
fRaceDistance = VDIST2(GET_PLAYER_COORDS(PLAYER_ID()), GET_STATIC_BLIP_POSITION(eBlipName))
|
|
|
|
// Left vicinity of race
|
|
IF fRaceDistance > (209*209)
|
|
|
|
// Enable blip
|
|
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
IF NOT g_bStreetRaceTimeout[iStreetRace]
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Reactivating blip ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
//SET_STATIC_BLIP_FLASH_ON_ACTIVE(eBlipName, FALSE)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
|
|
// Player has left the world point and race can retrigger
|
|
CLEAR_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(iStreetRace))
|
|
ELSE
|
|
IF (GET_GAME_TIMER()- g_iStreetRaceCooldown[iStreetRace]) > STREET_RACE_TIMEOUT
|
|
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Reactivating blip after timeout ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
g_bStreetRaceTimeout[iStreetRace] = FALSE
|
|
g_iStreetRaceCooldown[iStreetRace] = GET_GAME_TIMER()
|
|
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
//SET_STATIC_BLIP_FLASH_ON_ACTIVE(eBlipName, FALSE)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
|
|
// Player has left the world point and race can retrigger
|
|
CLEAR_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(iStreetRace))
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Clearing leave area bit for blip ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
CLEAR_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(iStreetRace))
|
|
ENDIF
|
|
ELSE
|
|
// Remove blip
|
|
IF IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Removing blip ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
// Do we need to blip the race?
|
|
ELSE
|
|
IF NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(eBlipName)
|
|
|
|
IF NOT g_bStreetRaceTimeout[iStreetRace]
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Activating blip ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
//SET_STATIC_BLIP_FLASH_ON_ACTIVE(eBlipName, FALSE)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
ELSE
|
|
IF (GET_GAME_TIMER()- g_iStreetRaceCooldown[iStreetRace]) > STREET_RACE_TIMEOUT
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Activating blip after timeout ", GET_STREET_RACE_NAME_FOR_DEBUG(iStreetRace))
|
|
g_bStreetRaceTimeout[iStreetRace] = FALSE
|
|
g_iStreetRaceCooldown[iStreetRace] = GET_GAME_TIMER()
|
|
SET_STATIC_BLIP_SHORT_RANGE(eBlipName)
|
|
//SET_STATIC_BLIP_FLASH_ON_ACTIVE(eBlipName, FALSE)
|
|
SET_STATIC_BLIP_ACTIVE_STATE(eBlipName, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Should the controller update or wait another second?
|
|
FUNC BOOL DO_CONTROLLER_UPDATE()
|
|
|
|
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_TIMETABLE_SCENE_IN_PROGRESS()
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_SWITCH_IN_PROGRESS()
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Initialise timeouts for sea and street races
|
|
PROC INIT_RACE_UNSAVED_GLOBALS()
|
|
|
|
INT i
|
|
FOR i=0 TO (ENUM_TO_INT(NUM_SEA_RACES) - 1)
|
|
g_bSeaRaceTimeout[i] = FALSE
|
|
g_iSeaRaceCooldown[i] = GET_GAME_TIMER()
|
|
ENDFOR
|
|
|
|
// Street race timeouts
|
|
FOR i=0 TO (ENUM_TO_INT(NUM_STREET_RACES) - 1)
|
|
g_bStreetRaceTimeout[i] = FALSE
|
|
ENDFOR
|
|
ENDPROC
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
// Main Script
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
SCRIPT
|
|
|
|
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_REPEAT_PLAY)
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Cleanup: FORCE CLEANUP")
|
|
SCRIPT_CLEANUP()
|
|
ENDIF
|
|
|
|
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("controller_Races")) > 1
|
|
CPRINTLN(DEBUG_AMBIENT, "Controller Races: Cleanup: Attempting to launch with an instance already active...")
|
|
TERMINATE_THIS_THREAD()
|
|
ENDIF
|
|
|
|
// Wait until game has loaded to ensure blips get correctly setup.
|
|
// RESTORE_MINIGAME_BLIPS_AFTER_LOAD() is called after script relaunch and clock value is incorrect to initialise blips there...
|
|
WHILE GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("initial")) > 0
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
// Setup race timeouts
|
|
INIT_RACE_UNSAVED_GLOBALS()
|
|
|
|
// Main loop
|
|
WHILE (TRUE)
|
|
|
|
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_MINIGAME)
|
|
OR g_bPlayerLockedInToTrigger
|
|
CPRINTLN(DEBUG_RANDOM_CHAR, "Controller Races: Cleaning up as we have gone on mission...")
|
|
Script_Cleanup()
|
|
ENDIF
|
|
|
|
// Entity check
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
|
|
// Only update when Franklin
|
|
IF DO_CONTROLLER_UPDATE()
|
|
|
|
// Check for races activation
|
|
CHECK_TIME_OF_DAY()
|
|
|
|
// Sea Races
|
|
UPDATE_SEA_RACE_BLIPS()
|
|
|
|
// Street Races
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
|
|
// Handle TOD
|
|
SWITCH(eControlState)
|
|
CASE RACE_CONTROL_DAY
|
|
BREAK
|
|
|
|
CASE RACE_CONTROL_NIGHT
|
|
UPDATE_STREET_RACE_BLIPS()
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
WAIT(1000)
|
|
ENDWHILE
|
|
ENDSCRIPT
|