USING "random_event_private.sch" // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : random_events_Public.sch // CREATED : Paul Davies // DESCRIPTION : Contains all Random Events public functions. // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** //INT i_REVariation //BOOL b_REpassed CONST_INT RANDOM_EVENT_NUMBER_OF_FLASHING_BLIPS 5 CONST_INT REBLIP_NUMBER_OF_FLASHES 5 CONST_INT REBLIP_FLASH_PHASE 1000 CONST_INT REBLIP_DARK_TIME 400 CONST_INT REBLIP_LIGHT_TIME (REBLIP_FLASH_PHASE - REBLIP_DARK_TIME) CONST_INT REBLIP_FLASH_TIME (REBLIP_FLASH_PHASE * REBLIP_NUMBER_OF_FLASHES) STRUCT structRandomEventBlipFlasher BLIP_INDEX blipsToFlash[RANDOM_EVENT_NUMBER_OF_FLASHING_BLIPS] FLOAT fBlipSize[RANDOM_EVENT_NUMBER_OF_FLASHING_BLIPS] INT iFlashStage INT iStartFlash INT iStartPhase ENDSTRUCT PROC SET_BLIP_CAN_FLASH(structRandomEventBlipFlasher &sBlipStruct, BLIP_INDEX blipToAdd, FLOAT defaultSize = BLIP_SIZE_COORD) IF DOES_BLIP_EXIST(blipToAdd) INT iTemp REPEAT COUNT_OF(sBlipStruct.blipsToFlash) iTemp IF NOT DOES_BLIP_EXIST(sBlipStruct.blipsToFlash[iTemp]) OR sBlipStruct.blipsToFlash[iTemp] = blipToAdd sBlipStruct.blipsToFlash[iTemp] = blipToAdd sBlipStruct.fBlipSize[iTemp] = defaultSize IF sBlipStruct.iFlashStage < 2 SET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp], 0) ENDIF ENDIF ENDREPEAT ENDIF ENDPROC PROC UPDATE_FLASHING_BLIPS(structRandomEventBlipFlasher &sBlipStruct) INT iTemp SWITCH sBlipStruct.iFlashStage CASE 0 sBlipStruct.iStartFlash = GET_GAME_TIMER() sBlipStruct.iStartPhase = GET_GAME_TIMER() sBlipStruct.iFlashStage++ CPRINTLN(DEBUG_RANDOM_EVENTS, "Setting flash timer start") REPEAT COUNT_OF(sBlipStruct.blipsToFlash) iTemp IF DOES_BLIP_EXIST(sBlipStruct.blipsToFlash[iTemp]) sBlipStruct.iFlashStage++ EXIT ENDIF ENDREPEAT BREAK CASE 1 IF GET_GAME_TIMER() - sBlipStruct.iStartFlash < REBLIP_FLASH_TIME SET_BLIP_SCALE(sBlipStruct.blipsToFlash[iTemp], BLIP_SIZE_COORD) IF GET_GAME_TIMER() - sBlipStruct.iStartPhase < REBLIP_LIGHT_TIME CPRINTLN(DEBUG_RANDOM_EVENTS, "ON") REPEAT COUNT_OF(sBlipStruct.blipsToFlash) iTemp IF DOES_BLIP_EXIST(sBlipStruct.blipsToFlash[iTemp]) IF GET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp]) <> 0 SET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp], 0) ENDIF ENDIF ENDREPEAT ELSE CPRINTLN(DEBUG_RANDOM_EVENTS, "OFF") REPEAT COUNT_OF(sBlipStruct.blipsToFlash) iTemp IF DOES_BLIP_EXIST(sBlipStruct.blipsToFlash[iTemp]) IF GET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp]) <> 255 SET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp], 255) ENDIF ENDIF ENDREPEAT ENDIF IF GET_GAME_TIMER() - sBlipStruct.iStartPhase >= REBLIP_FLASH_PHASE sBlipStruct.iStartPhase = GET_GAME_TIMER() ENDIF ELSE CPRINTLN(DEBUG_RANDOM_EVENTS, "Flashing done") sBlipStruct.iFlashStage++ ENDIF BREAK CASE 2 REPEAT COUNT_OF(sBlipStruct.blipsToFlash) iTemp IF DOES_BLIP_EXIST(sBlipStruct.blipsToFlash[iTemp]) SET_BLIP_SCALE(sBlipStruct.blipsToFlash[iTemp], sBlipStruct.fBlipSize[iTemp]) SET_BLIP_ALPHA(sBlipStruct.blipsToFlash[iTemp], 255) ENDIF ENDREPEAT CPRINTLN(DEBUG_RANDOM_EVENTS, "Resetting blip sizes and alpha") sBlipStruct.iFlashStage++ BREAK ENDSWITCH ENDPROC PROC SET_PASS_TYPE_FOR_THIS_RANDOM_EVENT(RANDOM_EVENT_PASS_TYPE eParamPassType) g_iREPassType = ENUM_TO_INT(eParamPassType) ENDPROC FUNC STRING GET_STRING_FOR_RANDOM_EVENT_HELP(RANDOM_EVENT_HELP_ENUM eHelp) STRING sReturn = "" SWITCH eHelp CASE REHLP_EVENT_ACTIVE sReturn = "AM_H_REFS" BREAK CASE REHLP_BLIP_FLASH sReturn = "RE_FLASHBLIP" BREAK CASE REHLP_RETURN_ITEM sReturn = "RE_HANDOVER" BREAK ENDSWITCH RETURN sReturn ENDFUNC PROC PRINT_LIMITED_RANDOM_EVENT_HELP(RANDOM_EVENT_HELP_ENUM eHelp) SWITCH eHelp CASE REHLP_EVENT_ACTIVE IF g_savedGlobals.sRandomEventData.iHelpCount < 3 IF NOT IS_HELP_MESSAGE_ON_SCREEN() PRINT_HELP(GET_STRING_FOR_RANDOM_EVENT_HELP(eHelp)) g_savedGlobals.sRandomEventData.iHelpCount++ SET_BIT(g_iREHelpShown, ENUM_TO_INT(REHLP_EVENT_ACTIVE)) ENDIF ENDIF BREAK CASE REHLP_BLIP_FLASH IF NOT IS_BIT_SET(g_iREHelpShown, ENUM_TO_INT(REHLP_BLIP_FLASH)) IF NOT IS_HELP_MESSAGE_ON_SCREEN() PRINT_HELP(GET_STRING_FOR_RANDOM_EVENT_HELP(eHelp)) g_savedGlobals.sRandomEventData.iBlipFlashHelpCount++ SET_BIT(g_iREHelpShown, ENUM_TO_INT(REHLP_BLIP_FLASH)) ENDIF ENDIF BREAK CASE REHLP_RETURN_ITEM IF NOT IS_BIT_SET(g_iREHelpShown, ENUM_TO_INT(REHLP_RETURN_ITEM)) IF NOT IS_HELP_MESSAGE_ON_SCREEN() PRINT_HELP(GET_STRING_FOR_RANDOM_EVENT_HELP(eHelp)) g_savedGlobals.sRandomEventData.iItemReturnHelpCount++ SET_BIT(g_iREHelpShown, ENUM_TO_INT(REHLP_RETURN_ITEM)) ENDIF ENDIF BREAK ENDSWITCH ENDPROC FUNC BOOL IS_THIS_RANDOM_EVENT_HELP_BEING_DISPLAYED(RANDOM_EVENT_HELP_ENUM eHelp) RETURN IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(GET_STRING_FOR_RANDOM_EVENT_HELP(eHelp)) ENDFUNC FUNC BOOL HAS_LIMITED_RANDOM_EVENT_HELP_BEEN_DISPLAYED(RANDOM_EVENT_HELP_ENUM eHelp) RETURN IS_BIT_SET(g_iREHelpShown, ENUM_TO_INT(eHelp)) ENDFUNC /// PURPOSE: /// Sets the lock state of a random event /// PARAMS: /// eRandomEvent - enum of random event /// bLockState - Set to true to lock the event, false to unlock 1 is open, 0 is locked /// PROC SET_RANDOM_EVENT_AVAILABLE(SP_RANDOM_EVENTS eRandomEvent, BOOL bAvailable = TRUE) INT iBit = ENUM_TO_INT(eRandomEvent) IF iBit < 31 IF bAvailable SET_BIT(g_savedGlobals.sRandomEventData.iBitsetReUnlockA, iBit) ELSE CLEAR_BIT(g_savedGlobals.sRandomEventData.iBitsetReUnlockA, iBit) ENDIF ELSE iBit -= 31 IF bAvailable SET_BIT(g_savedGlobals.sRandomEventData.iBitsetReUnlockB, iBit) ELSE CLEAR_BIT(g_savedGlobals.sRandomEventData.iBitsetReUnlockB, iBit) ENDIF ENDIF #IF IS_DEBUG_BUILD IF bAvailable CPRINTLN(DEBUG_RANDOM_EVENTS, "Setting ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " available") ELSE CPRINTLN(DEBUG_RANDOM_EVENTS, "Setting ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " unavailable") ENDIF #ENDIF ENDPROC /// PURPOSE: /// Gets the lock state of a random event /// PARAMS: /// eRandomEvent - enum of random event /// FUNC BOOL IS_RANDOM_EVENT_AVAILABLE(SP_RANDOM_EVENTS eRandomEvent) // Two new CGtoNG only REs. IF eRandomEvent = RE_DUEL OR eRandomEvent = RE_SEAPLANE IF NOT IS_LAST_GEN_PLAYER() RETURN FALSE ENDIF ENDIF INT iBit = ENUM_TO_INT(eRandomEvent) BOOL bRet IF iBit < 31 bRet = IS_BIT_SET(g_savedGlobals.sRandomEventData.iBitsetReUnlockA, iBit) ELSE iBit -= 31 bRet = IS_BIT_SET(g_savedGlobals.sRandomEventData.iBitsetReUnlockB, iBit) ENDIF #IF IS_DEBUG_BUILD IF bRet //CPRINTLN(DEBUG_RANDOM_EVENTS, "Querying locked state of ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - event is LOCKED") ELSE //CPRINTLN(DEBUG_RANDOM_EVENTS, "Querying locked state of ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - event is UNLOCKED") ENDIF #ENDIF RETURN bRet ENDFUNC FUNC BOOL IS_RANDOM_EVENT_COMPLETE(SP_RANDOM_EVENTS eRandomEvent, INT iVariation = 0) IF IS_BIT_SET(g_savedGlobals.sRandomEventData.iREVariationComplete[eRandomEvent], iVariation) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL ARE_LEADINS_BLOCKING_RE() IF (IS_MISSION_LEADIN_WITH_HIGH_MEMORY_ACTIVE() AND NOT IS_HIGH_MEMORY_PC()) RETURN TRUE ENDIF //Block REs if both a mission lead-in and an RC lead-in is active at the same time. IF IS_MISSION_TRIGGER_ACTIVE() #IF NOT USE_SP_DLC AND IS_RC_LEADIN_ACTIVE() #ENDIF RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL CAN_RANDOM_EVENT_LAUNCH(VECTOR paramWorldPointCoords, SP_RANDOM_EVENTS eRandomEvent = RE_NONE, INT iVariation = 0, BOOL bIgnoreCompletion = FALSE, BOOL bDisableHeightCheck = FALSE) //Don't launch REs before initial has finished - could lead to REs starting before loading is complete. IF NOT g_isSPMainInitialised CPRINTLN(DEBUG_RANDOM_EVENTS,"Random Event Debug: RE tried to launch before main.sc had started, Terminating") RETURN FALSE ENDIF //If the random event enum has not been supplied with the function call then get it from the script name IF eRandomEvent = RE_NONE eRandomEvent = GET_RANDOM_EVENT_ENUM_FROM_CURRENT_SCRIPT() ENDIF //If the random event enum is still invalid then break out, the error message will have already printed IF eRandomEvent = RE_NONE RETURN FALSE ENDIF // Two new CGtoNG only REs. IF eRandomEvent = RE_DUEL OR eRandomEvent = RE_SEAPLANE IF NOT IS_LAST_GEN_PLAYER() RETURN FALSE ENDIF ENDIF vThisWorldPointLocation = paramWorldPointCoords BOOL bSkipChecksForDebug = FALSE // the following funtion is purely for launching the script from the debug menu #IF IS_DEBUG_BUILD IF NOT IS_STRING_NULL_OR_EMPTY(g_sRandomEventDebugScriptRequested) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: current requested script is ", g_sRandomEventDebugScriptRequested) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Current script is ", GET_THIS_SCRIPT_NAME()) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: current requested variation is ", g_iRandomEventDebugVarRequested, " compared to passed variation of ", iVariation) ENDIF // This section allows any event selected from XML to start without altering the datestamp IF ARE_STRINGS_EQUAL(GET_THIS_SCRIPT_NAME(), g_sRandomEventDebugScriptRequested) AND (g_iRandomEventDebugVarRequested = iVariation OR g_iRandomEventDebugVarRequested = 0) IF g_bDontResetCompletionOnDebugLaunch CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: g_bDontResetCompletionOnDebugLaunch has been set, ", GET_THIS_SCRIPT_NAME(), " variation may already be complete.") ELSE RESET_COMPLETION_FOR_THIS_RANDOM_EVENT(eRandomEvent) ENDIF CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_THIS_SCRIPT_NAME(), " launched through debug menu.") bSkipChecksForDebug = TRUE ELIF NOT IS_STRING_NULL_OR_EMPTY(g_sRandomEventDebugScriptRequested) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_THIS_SCRIPT_NAME(), " is not the selected event, or the random event flag is already set. Expecting ", g_sRandomEventDebugScriptRequested) RETURN FALSE ENDIF #ENDIF IF NOT bSkipChecksForDebug VECTOR vPlayerCoords IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) vPlayerCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) //Don't allow REs to launch if the player is moving very fast. //The streaming engine will be under too much stress. IF VMAG2(GET_ENTITY_VELOCITY(PLAYER_PED_ID())) > AMBIENT_LOAD_PLAYER_SPEED_CUTOFF AND NOT IS_HIGH_MEMORY_PC() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run as the player is moving too fast.") RETURN FALSE ENDIF ENDIF IF NOT g_savedGlobals.sFlow.isGameflowActive CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run as flow is not active.") RETURN FALSE ENDIF IF IS_REPEAT_PLAY_ACTIVE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run as repeat play is active.") RETURN FALSE ENDIF IF ARE_LEADINS_BLOCKING_RE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run as mission lead-ins are blocking REs.") RETURN FALSE ENDIF IF IS_PLAYER_WITH_A_PROSTITUTE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". Can't launch random event as player is with a hooker.") RETURN FALSE ENDIF //If is any ambient mission active IF g_eCurrentRandomEvent != RE_NONE CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". Random event terminating as ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), " is currently active.") RETURN FALSE ENDIF #IF NOT USE_SP_DLC //check to see if a random character is awaiting launch IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM()) IF GET_NEAREST_VALID_RC_MISSION(100) != NO_RC_MISSION CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - Random character is awaiting activation within 100m." ) RETURN FALSE ENDIF ENDIF #ENDIF //if the player is too high above the worldpoint then don't run as the event will probably be spotted streaming in. IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT bDisableHeightCheck // Override added for RE_SeaPlane - url:bugstar:2035010 IF vPlayerCoords.z - vThisWorldPointLocation.z > 50 CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - Random event is too far below player." ) RETURN FALSE ENDIF ENDIF //check if the event has been unlocked in the flow IF NOT IS_RANDOM_EVENT_AVAILABLE(eRandomEvent) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - Random event is currently locked.") RETURN FALSE ENDIF //check if the player is waiting on a high priority phone call IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM()) IF GET_PLAYER_CHAR_COMMUNICATION_PRIORITY_LEVEL(GET_CURRENT_PLAYER_PED_ENUM()) = CPR_HIGH OR GET_PLAYER_CHAR_COMMUNICATION_PRIORITY_LEVEL(GET_CURRENT_PLAYER_PED_ENUM()) = CPR_VERY_HIGH CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " - Current player is awaiting a high priority phone call") RETURN FALSE ENDIF ENDIF //check that the event is available for the current player ped IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM()) IF NOT SHOULD_RANDOM_EVENT_START_FOR_PLAYER_PED(eRandomEvent, iVariation) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " cannot launch for ", GET_CURRENT_PLAYER_PED_STRING()) RETURN FALSE ENDIF ENDIF //Has enough time passed since this type of event launched IF NOT IS_NOW_AFTER_TIMEOFDAY(g_savedGlobals.sRandomEventData.eTimeBlockUntil[eRandomEvent]) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run, Not enough time has passed since last launch of this event.") RETURN FALSE ENDIF // //Has enough time passed since last random event was seen on the map (RE_SIMEONYETARIAN ignores this) // IF eRandomEvent != RE_SIMEONYETARIAN // AND (GET_GAME_TIMER() - g_iLastSuccessfulAmbientLaunchTime) < iMinTimeBetweenLaunches // // CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run, Not enough time has passed since last ambient event.") // RETURN FALSE // // ENDIF //Has enough time passed since last random event was seen on the map IF (GET_GAME_TIMER() - g_iLastRandomEventLaunch) < iMinTimeBetweenLaunches IF eRandomEvent != RE_SIMEONYETARIAN CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run, Not enough time has passed since last random event.") RETURN FALSE ENDIF ENDIF //Checks the game isn't in sleep mode IF IS_CURRENT_PLAYER_IN_SLEEP_MODE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run if the player is in sleep.") RETURN FALSE ENDIF //is any mission active IF GET_MISSION_FLAG() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run if there's a mission running.") RETURN FALSE ENDIF //is the random event flag set IF GET_RANDOM_EVENT_FLAG() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run if there's already one running.") RETURN FALSE ENDIF //a set of checks for other situations that may block random events such as lead ins etc. IF NOT IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_RANDOM_EVENT) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run as IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_RANDOM_EVENT) returned false.") RETURN FALSE ENDIF //Checks if a random event can launch against current mission type IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_RANDOM_EVENT) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run if there's a mission running. Checked against CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE") RETURN FALSE ENDIF //Is this event and variation complete IF IS_RANDOM_EVENT_COMPLETE(eRandomEvent, iVariation) AND NOT bIgnoreCompletion CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". This variation has been completed, exiting.") RETURN FALSE ENDIF //If the magdemo is running, only the pap event should launch IF g_bMagDemoActive AND eRandomEvent != RE_PAPARAZZI CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". Mag demo is active, cannot launch events other than RE - Escape Paparazzi.") RETURN FALSE ENDIF // Random events can't happen in a cinema. IF IS_VALID_INTERIOR(GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID())) IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = GET_INTERIOR_AT_COORDS(<< 377.1530, -717.5670, 10.0536 >>) // Downtown cinema OR GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = GET_INTERIOR_AT_COORDS(<<320.9934, 265.2515, 82.1221>>) // Vinewood cinema OR GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = GET_INTERIOR_AT_COORDS(<< -1425.5645, -244.3000, 15.8053 >>) // Morningwood cinema CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ". New random event can't run if the player is in a cinema.") RETURN FALSE ENDIF ENDIF IF eRandomEvent = RE_SECURITYVAN AND (iVariation = 2 OR iVariation = 5) AND NOT IS_RANDOM_EVENT_COMPLETE(RE_ACCIDENT) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Security van ", iVariation, " cannot start until RE_ACCIDENT has been completed.") RETURN FALSE ENDIF IF g_bPlayerInteractingWithChop CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Cannot launch random events when the player is with Chop") RETURN FALSE ENDIF IF IS_RANDOM_EVENT_AVAILABLE(RE_SIMEONYETARIAN) AND NOT IS_RANDOM_EVENT_COMPLETE(RE_SIMEONYETARIAN) IF eRandomEvent != RE_SIMEONYETARIAN //Added this for bug 1585566 to ensure simeon will run when available. IF VDIST2(vPlayerCoords, <<-61.2745, -1100.4675, 25.3752>>) < 176400 //210^2 CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Blocking launch of ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " as the player is near to re_yetarian and it's availablilty is limited.") RETURN FALSE ENDIF ENDIF ENDIF IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM()) enumCharacterList currentCharID REPEAT NUM_OF_PLAYABLE_PEDS currentCharID VECTOR vLastKnownCoords = g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[currentCharID] TIMEOFDAY sLastTimeActive = g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[currentCharID] IF Is_TIMEOFDAY_Valid(sLastTimeActive) IF HasHourPassedSinceCharLastTimeActive(currentCharID) IF NOT ARE_VECTORS_EQUAL(vLastKnownCoords, <<0,0,0>>) IF (VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE), vLastKnownCoords) < (210.0*210.0)) IF GET_CURRENT_PLAYER_PED_ENUM() <> currentCharID CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_THIS_SCRIPT_NAME(), ". Player is near last known coords of another playable ped, random event should not run.") RETURN FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDIF ENDIF CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " has passed all launch checks.") CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), " world point coords are ", vThisWorldPointLocation) RETURN TRUE ENDFUNC FUNC BOOL SHOULD_SHOW_HELP_FOR_THIS_RANDOM_EVENT(SP_RANDOM_EVENTS eRandomEvent) //List of REs to hide help for. SWITCH eRandomEvent CASE RE_BORDERPATROL CASE RE_SIMEONYETARIAN CASE RE_BUSTOUR CASE RE_CULTSHOOTOUT RETURN FALSE BREAK ENDSWITCH RETURN TRUE ENDFUNC FUNC BOOL SET_RANDOM_EVENT_ACTIVE(BOOL bFlashDisplay = TRUE) IF PRIVATE_CAN_RE_RUN_THROUGH_CANDIDATE_SYSTEM() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), ". Candidate system has allowed event to go active.") g_bRandomEventActive = TRUE g_iREStartTime = GET_GAME_TIMER() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: g_savedGlobals.sRandomEventData.iHelpCount = ", g_savedGlobals.sRandomEventData.iHelpCount) IF SHOULD_SHOW_HELP_FOR_THIS_RANDOM_EVENT(g_eCurrentRandomEvent) PRINT_LIMITED_RANDOM_EVENT_HELP(REHLP_EVENT_ACTIVE) ENDIF SET_MISSION_NAME(TRUE, "RE_TITLE") IF bFlashDisplay AND SHOULD_SHOW_HELP_FOR_THIS_RANDOM_EVENT(g_eCurrentRandomEvent) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: flashing minimap display in SET_RANDOM_EVENT_ACTIVE") FLASH_MINIMAP_DISPLAY() ENDIF RETURN TRUE ELSE CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), ". Candidate system did not allow event to go active.") ENDIF CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), ", cannot set random event active, random event flag is already set.") RETURN FALSE ENDFUNC PROC APPLY_DELAY_FOR_RANDOM_EVENT(SP_RANDOM_EVENTS eRandomEvent) APPLY_SPECIFIC_DELAY_TO_RANDOM_EVENT(eRandomEvent, 0, GET_RANDOM_EVENT_BLOCKING_TIME(eRandomEvent)) ENDPROC FUNC BOOL SHOULD_THIS_RANDOM_EVENT_EXIT_BEFORE_LOADING_ASSETS() IF IS_PLAYER_PLAYING(PLAYER_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) IF VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vThisWorldPointLocation) < fREMinDistanceRequiredForSpawn*fREMinDistanceRequiredForSpawn CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Too close to world point whilst awaiting assets.") RETURN TRUE ENDIF //Don't allow REs to launch if the player is moving very fast. //The streaming engine will be under too much stress. IF VMAG2(GET_ENTITY_VELOCITY(PLAYER_PED_ID())) > AMBIENT_LOAD_PLAYER_SPEED_CUTOFF AND NOT IS_HIGH_MEMORY_PC() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Player is moving too fast whilst awaiting assets.") RETURN FALSE ENDIF ENDIF IF ARE_LEADINS_BLOCKING_RE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ARE_LEADINS_BLOCKING_RE() returned false.") RETURN TRUE ENDIF #IF NOT USE_SP_DLC //check to see if a random character is awaiting launch IF GET_NEAREST_VALID_RC_MISSION(100) != NO_RC_MISSION CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), " - Random character is awaiting activation within 100m." ) RETURN TRUE ENDIF #ENDIF RETURN FALSE ENDFUNC FUNC BOOL SHOULD_THIS_RANDOM_EVENT_EXIT_BEFORE_ACTIVATION() IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_RANDOM_EVENT) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(MISSION_TYPE_RANDOM_EVENT) returned false.") RETURN TRUE ENDIF IF ARE_LEADINS_BLOCKING_RE() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ARE_LEADINS_BLOCKING_RE() returned false.") RETURN TRUE ENDIF //Don't allow REs to launch if the player is moving very fast. //The streaming engine will be under too much stress. IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF VMAG2(GET_ENTITY_VELOCITY(PLAYER_PED_ID())) > AMBIENT_LOAD_PLAYER_SPEED_CUTOFF AND NOT IS_HIGH_MEMORY_PC() CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: Player is moving too fast whilst awaiting activation.") RETURN FALSE ENDIF ENDIF #IF NOT USE_SP_DLC //check to see if a random character is awaiting launch IF GET_NEAREST_VALID_RC_MISSION(100) != NO_RC_MISSION CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent), " - Random character is awaiting activation within 100m." ) RETURN TRUE ENDIF #ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_THIS_RANDOM_EVENT_SCRIPT_ACTIVE() IF g_eCurrentRandomEvent = GET_RANDOM_EVENT_ENUM_FROM_CURRENT_SCRIPT() AND GET_RANDOM_EVENT_FLAG() AND g_bRandomEventActive RETURN TRUE ENDIF RETURN FALSE ENDFUNC PROC LAUNCH_RANDOM_EVENT(SP_RANDOM_EVENTS eRandomEvent = RE_NONE) //If the random event enum has not been supplied with the function call then get it from the script name IF eRandomEvent = RE_NONE eRandomEvent = GET_RANDOM_EVENT_ENUM_FROM_CURRENT_SCRIPT() ENDIF //If the random event enum is still invalid then ignor the rest of the funciton IF eRandomEvent = RE_NONE EXIT ENDIF SET_CURRENT_RANDOM_EVENT(eRandomEvent) SET_SCRIPT_HIGH_PRIO(FALSE) SET_RANDOM_EVENT_FLAG(TRUE) //SET_RANDOM_EVENT_ACTIVE() // this is being added unitl all scripts are using the new system. #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RANDOM_EVENTS, "Random event launched ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent)) g_sRandomEventDebugScriptRequested = "" g_iRandomEventDebugVarRequested = 0 #ENDIF g_iREPassType = 0 // b_REpassed = FALSE // SCRIPT_PLAYSTATS_MISSION_STARTED(GET_THIS_SCRIPT_NAME(), i_REVariation) SUPPRESS_PLAYERS_CAR_FOR_RANDOM_EVENT() ENDPROC PROC RANDOM_EVENT_PASSED(SP_RANDOM_EVENTS eRandomEvent = RE_NONE, INT iVariation = 0) //If the random event enum has not been supplied with the function call then get it from the script name IF eRandomEvent = RE_NONE eRandomEvent = GET_RANDOM_EVENT_ENUM_FROM_CURRENT_SCRIPT() ENDIF //If the random event enum is still invalid then ignore the rest of the funciton IF eRandomEvent = RE_NONE CPRINTLN(DEBUG_RANDOM_EVENTS, "Invalid random event enum passed to RANDOM_EVENT_PASSED by ", GET_THIS_SCRIPT_NAME()) EXIT ENDIF IF iVariation <= GET_RANDOM_EVENT_NUMBER_OF_VARIATIONS(eRandomEvent) SET_RANDOM_EVENT_VARIATION_COMPLETE(eRandomEvent, iVariation) #IF NOT USE_SP_DLC IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_RE_STAT_BOOSTS) ADD_HELP_TO_FLOW_QUEUE("RE_REWARD", FHP_MEDIUM, 0, 4000, DEFAULT_HELP_TEXT_TIME, GET_CURRENT_PLAYER_PED_BIT(), CID_BLANK, CID_RE_STAT_BOOST_HELP_DISPLAYED) SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_RE_STAT_BOOSTS) ENDIF #ENDIF IF SHOULD_SHOW_HELP_FOR_THIS_RANDOM_EVENT(eRandomEvent) g_savedGlobals.sRandomEventData.iHelpCount = 3 ENDIF IF GET_RANDOM_EVENT_COMPLETION_ID(eRandomEvent, iVariation) <> UNUSED_DEFAULT CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent), ", completed.") REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(GET_RANDOM_EVENT_COMPLETION_ID(eRandomEvent, iVariation), vThisWorldPointLocation.x, vThisWorldPointLocation.y) ELSE CPRINTLN(DEBUG_RANDOM_EVENTS, "No percentage pass ID found for random event ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent)) ENDIF #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_RANDOM_EVENTS, "Random event passed ", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent)) #ENDIF g_iREVariation = iVariation IF g_iREPassType = 0 IF g_eCurrentRandomEvent = RE_ATMROBBERY OR g_eCurrentRandomEvent = RE_SHOPROBBERY OR g_eCurrentRandomEvent = RE_CHASETHIEVES OR g_eCurrentRandomEvent = RE_MUGGING SET_PASS_TYPE_FOR_THIS_RANDOM_EVENT(RE_PASS_KEEP_ITEM) ELIF g_eCurrentRandomEvent = RE_BIKETHIEF OR g_eCurrentRandomEvent = RE_BIKETHIEFSTAMP OR g_eCurrentRandomEvent = RE_CARTHEFT SET_PASS_TYPE_FOR_THIS_RANDOM_EVENT(RE_PASS_KEEP_VEHICLE) ELSE SET_PASS_TYPE_FOR_THIS_RANDOM_EVENT(RE_PASS_NORMAL) ENDIF ENDIF ENDIF ENDPROC PROC RANDOM_EVENT_OVER(SP_RANDOM_EVENTS eRandomEvent = RE_NONE) //If the random event enum has not been supplied with the function call then get it from the script name IF eRandomEvent = RE_NONE eRandomEvent = GET_RANDOM_EVENT_ENUM_FROM_CURRENT_SCRIPT() ENDIF //If the random event enum is still invalid then ignore the rest of the funciton IF eRandomEvent = RE_NONE EXIT ENDIF IF IS_THIS_RANDOM_EVENT_SCRIPT_ACTIVE() APPLY_DELAY_FOR_RANDOM_EVENT(eRandomEvent) #IF IS_DEBUG_BUILD g_sLastRandomEventScript = "NULL" #ENDIF SET_MISSION_NAME(FALSE) g_iLastRandomEventLaunch = GET_GAME_TIMER() ADD_GLOBAL_COMMUNICATION_DELAY(CC_GLOBAL_DELAY_POST_MISSION) CPRINTLN(DEBUG_RANDOM_EVENTS, "Random Event Debug: ", GET_THIS_SCRIPT_NAME(), " RESET_RANDOM_EVENT_LAUNCH_TIMER()") CPRINTLN(DEBUG_RANDOM_EVENTS, "Random event over, initial interaction completed.", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent)) TEXT_LABEL_63 sTemp sTemp = GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(g_eCurrentRandomEvent, TRUE) IF GET_RANDOM_EVENT_NUMBER_OF_VARIATIONS(g_eCurrentRandomEvent) > 0 sTemp += " Variation " sTemp += g_iREVariation ENDIF PLAYSTATS_RANDOM_MISSION_DONE(sTemp, g_iREPassType, GET_GAME_TIMER() - g_iREStartTime) ELSE IF IS_BIT_SET(g_iREHelpShown, ENUM_TO_INT(REHLP_EVENT_ACTIVE)) AND g_savedGlobals.sRandomEventData.iHelpCount < 3 CLEAR_BIT(g_iREHelpShown, ENUM_TO_INT(REHLP_EVENT_ACTIVE)) ENDIF CPRINTLN(DEBUG_RANDOM_EVENTS, "Random event over, no interaction with the player.", GET_RANDOM_EVENT_DISPLAY_STRING_FROM_ID(eRandomEvent)) ENDIF Mission_Over(g_iRECandidateID) g_bRandomEventActive = FALSE #IF IS_DEBUG_BUILD g_sRandomEventDebugScriptRequested = "" g_iRandomEventDebugVarRequested = 0 #ENDIF SET_CURRENT_RANDOM_EVENT(RE_NONE) ENDPROC PROC SET_LAST_ATM_LAUNCH_LOCATION(VECTOR paramLocation) g_vLastCompletedATMRobbery = paramLocation ENDPROC FUNC VECTOR GET_LAST_ATM_LAUNCH_LOCATION() RETURN g_vLastCompletedATMRobbery ENDFUNC FUNC BOOL HAS_SECURITY_VAN_HELP_DISPLAYED(INT iParamBit) RETURN IS_BIT_SET(g_savedGlobals.sRandomEventData.iSecurityVanHelps, iParamBit) ENDFUNC PROC SET_SECURITY_VAN_HELP_DISPLAYED(INT iParamBit) SET_BIT(g_savedGlobals.sRandomEventData.iSecurityVanHelps, iParamBit) ENDPROC PROC FLASH_RANDOM_EVENT_DECISION_BLIP(BLIP_INDEX flashBlip, INT &timeOfLastFlash) IF DOES_BLIP_EXIST(flashBlip) IF GET_GAME_TIMER() > (timeOfLastFlash+500) IF GET_BLIP_COLOUR(flashBlip) = BLIP_COLOUR_RED SET_BLIP_AS_FRIENDLY(flashBlip, TRUE) ELSE SET_BLIP_AS_FRIENDLY(flashBlip, FALSE) SET_BLIP_COLOUR(flashBlip, BLIP_COLOUR_RED) ENDIF timeOfLastFlash = GET_GAME_TIMER() PRINTLN(GET_THIS_SCRIPT_NAME(), " - FLASH_RANDOM_EVENT_DECISION_BLIP") ENDIF IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() AND HAS_LIMITED_RANDOM_EVENT_HELP_BEEN_DISPLAYED(REHLP_EVENT_ACTIVE) PRINT_LIMITED_RANDOM_EVENT_HELP(REHLP_BLIP_FLASH) ENDIF ENDIF ENDPROC PROC FLASH_RANDOM_EVENT_RETURN_ITEM_BLIP(BLIP_INDEX flashBlip, INT &iBlipTimer) IF iBlipTimer = -99 iBlipTimer = GET_GAME_TIMER() ENDIF IF DOES_BLIP_EXIST(flashBlip) INT iTimer = GET_GAME_TIMER() - iBlipTimer IF iTimer < REBLIP_NUMBER_OF_FLASHES*1000 INT iFlashNo = CEIL(TO_FLOAT(iTimer)/1000) IF (iFlashNo * 1000) - iTimer < 500 IF GET_BLIP_ALPHA(flashBlip) != 255 SET_BLIP_ALPHA(flashBlip, 255) ENDIF ELSE IF GET_BLIP_ALPHA(flashBlip) != 0 SET_BLIP_ALPHA(flashBlip, 0) ENDIF ENDIF ELSE IF iBlipTimer != -100 iBlipTimer = -100 IF GET_BLIP_ALPHA(flashBlip) != 255 SET_BLIP_ALPHA(flashBlip, 255) ENDIF ENDIF ENDIF ENDIF ENDPROC PROC START_RETURN_ITEM_BLIP_FLASHING(INT &iBlipTimer) iBlipTimer = -99 ENDPROC PROC STOP_RETURN_ITEM_BLIP_FLASHING(INT &iBlipTimer) iBlipTimer = GET_GAME_TIMER() - REBLIP_NUMBER_OF_FLASHES*1000 ENDPROC FUNC BOOL HAS_PLAYER_BEEN_TO_DRUG_FARM() RETURN g_savedGlobals.sRandomEventData.bHasPlayerAttackedDrugFarm ENDFUNC PROC SET_PLAYER_HAS_ATTACKED_DRUG_FARM(BOOL bAttacked = TRUE) g_savedGlobals.sRandomEventData.bHasPlayerAttackedDrugFarm = bAttacked ENDPROC