////////////////////////////////////////////////////////////////////////////////////////// // // // SCRIPT NAME : generic_launcher.sch // // AUTHOR : Ryan Paradis // // DESCRIPTION : default functions and primary loop for minigame launchers // // // ////////////////////////////////////////////////////////////////////////////////////////// USING "mission_control_public.sch" USING "flow_public_core.sch" USING "context_control_public.sch" USING "replay_public.sch" USING "ambience_run_checks.sch" USING "stripclub_public.sch" USING "website_public.sch" #IF NOT DEFINED(LAUNCHER_CUSTOM_SCRIPT_INIT) PROC LAUNCHER_CUSTOM_SCRIPT_INIT() PRINTLN("LAUNCHER_CUSTOM_SCRIPT_INIT()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_REQUEST_ASSETS) PROC LAUNCHER_CUSTOM_REQUEST_ASSETS() PRINTLN("LAUNCHER_CUSTOM_REQUEST_ASSETS()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_ASSETS_LOADED) FUNC BOOL LAUNCHER_CUSTOM_ASSETS_LOADED() RETURN TRUE ENDFUNC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_SPAWN_SCENE) PROC LAUNCHER_CUSTOM_SPAWN_SCENE() PRINTLN("LAUNCHER_CUSTOM_SPAWN_SCENE()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_CLEAR_SCENE) PROC LAUNCHER_CUSTOM_CLEAR_SCENE() PRINTLN("LAUNCHER_CUSTOM_CLEAR_SCENE()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_APPROACH_WAIT) PROC LAUNCHER_CUSTOM_APPROACH_WAIT() ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_LOAD_SCRIPT_WAIT) PROC LAUNCHER_CUSTOM_LOAD_SCRIPT_WAIT() ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_RUN_WAIT) PROC LAUNCHER_CUSTOM_RUN_WAIT() ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_SCRIPT_END) PROC LAUNCHER_CUSTOM_SCRIPT_END() PRINTLN("LAUNCHER_CUSTOM_SCRIPT_END()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_RELEASE_ASSETS) PROC LAUNCHER_CUSTOM_RELEASE_ASSETS() PRINTLN("LAUNCHER_CUSTOM_RELEASE_ASSETS()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_CLEANUP) PROC LAUNCHER_CUSTOM_CLEANUP() PRINTLN("LAUNCHER_CUSTOM_CLEANUP()") ENDPROC #ENDIF #IF NOT DEFINED(LAUNCHER_CAN_RUN_FRIEND_ACTIVITY) FUNC BOOL LAUNCHER_CAN_RUN_FRIEND_ACTIVITY() RETURN TRUE ENDFUNC #ENDIF #IF NOT DEFINED(PERFORM_ONE_TIME_TASK) FUNC BOOL PERFORM_ONE_TIME_TASK() RETURN TRUE ENDFUNC #ENDIF #IF NOT DEFINED(LAUNCHER_CUSTOM_RUN_SCRIPT) FUNC THREADID LAUNCHER_CUSTOM_RUN_SCRIPT() DEBUG_MESSAGE("You're trying to use LAUNCHER_CUSTOM_SCRIPT_LAUNCH, without overriding LAUNCHER_CUSTOM_RUN_SCRIPT(). See Ryan P for why you're doing it wrong.") // Nothing custom has been done, just run default. THREADID threadTemp = START_NEW_SCRIPT(scriptName, iStackSize) SET_SCRIPT_AS_NO_LONGER_NEEDED(scriptName) RETURN threadTemp ENDFUNC #ENDIF PROC MG_LAUNCHER_UNUSED_STUFF() #IF LAUNCHER_VEHICLE_ENTER UNUSED_PARAMETER(fHelpTextScriptDist) #ENDIF ENDPROC #IF IS_DEBUG_BUILD FUNC STRING GET_LAUNCHER_STATE_DEBUG_STRING(LAUNCHER_STATE state) SWITCH state CASE STREAM_ASSETS RETURN "STREAM_ASSETS" BREAK CASE STREAMING_WAIT RETURN "STREAMING_WAIT" BREAK CASE SCENE_SETUP RETURN "SCENE_SETUP" BREAK CASE APPROACH_WAIT RETURN "APPROACH_WAIT" BREAK CASE IDLE_WAIT RETURN "IDLE_WAIT" BREAK CASE RUN_SCRIPT RETURN "RUN_SCRIPT" BREAK CASE RUN_WAIT RETURN "RUN_WAIT" BREAK CASE UNLOAD_ASSETS RETURN "UNLOAD_ASSETS" BREAK CASE WAIT_FOR_FAILSCREEN_REPLAY RETURN "WAIT_FOR_FAILSCREEN_REPLAY" BREAK CASE WAIT_FOR_TERMINATE RETURN "WAIT_FOR_TERMINATE" BREAK CASE CLEANUP_LAUNCHER RETURN "CLEANUP_LAUNCHER" BREAK ENDSWITCH CASSERTLN(DEBUG_MG_LAUNCHER, "GET_LAUNCHER_STATE_DEBUG_STRING: Debug string for launcher state ", ENUM_TO_INT(state), " is missing.") RETURN "MISSING!" ENDFUNC FUNC STRING GET_LAUNCHER_FLAG_DEBUG_STRING(LAUNCHER_STATUS_FLAGS flag) SWITCH flag CASE LAUNCHER_FRIEND_ACTIVITY RETURN "FRIEND_ACTIVITY" BREAK CASE LAUNCHER_MISSION_CANDIDATE_STARTED RETURN "MISSION_CANDIDATE_STARTED" BREAK CASE LAUNCHER_SPAWNED_SCENE_CUSTOM RETURN "SPAWNED_SCENE_CUSTOM" BREAK CASE LAUNCHER_RUN_DESPITE_MISSION RETURN "RUN_DESPITE_MISSION" BREAK CASE LAUNCHER_NEED_SETUP_ON_MISSION RETURN "NEED_SETUP_ON_MISSION" BREAK CASE LAUNCHER_SHOULD_UNLOCK_CARS RETURN "SHOULD_UNLOCK_CARS" BREAK CASE LAUNCHER_SCRIPT_NOT_ALLOWING_RUN RETURN "SCRIPT_NOT_ALLOWING_RUN" BREAK CASE LAUNCHER_BLIP_INACTIVE RETURN "BLIP_INACTIVE" BREAK CASE LAUNCHER_FINISHED_INIT_FADE_DOWN RETURN "FINISHED_INIT_FADE_DOWN" BREAK CASE LAUNCHER_OUTFIT_NOTIFIED RETURN "OUTFIT_NOTIFIED" BREAK CASE LAUNCHER_ON_FOOT_NOTIFIED RETURN "ON_FOOT_NOTIFIED" BREAK CASE LAUNCHER_HELP_TEXT_DISPLAYED RETURN "HELP_TEXT_DISPLAYED" BREAK CASE LAUNCHER_JUSTDONE_WAIT_FOR_LEAVE RETURN "JUSTDONE_WAIT_FOR_LEAVE" BREAK CASE LAUNCHER_PERFORM_ONE_TIME_TASK RETURN "PERFORM_ONE_TIME_TASK" BREAK CASE LAUNCHER_SHUTDOWN_FOR_MISSION_LEADIN RETURN "SHUTDOWN_FOR_MISSION_LEADIN" BREAK CASE LAUNCHER_SHUTDOWN_ON_PLAYER_DEATH RETURN "SHUTDOWN_ON_PLAYER_DEATH" BREAK CASE LAUNCHER_SHUTDOWN_IF_MISSION_RUNNING RETURN "SHUTDOWN_IF_MISSION_RUNNING" BREAK CASE LAUNCHER_SHUTDOWN_ALLOW_MULTIPLE_COPIES RETURN "SHUTDOWN_ALLOW_MULTIPLE_COPIES" BREAK CASE LAUNCHER_SHUTDOWN_FORCED_ON_INIT RETURN "SHUTDOWN_FORCED_ON_INIT" BREAK CASE LAUNCHER_SHUTDOWN_FORCED_ON_FINISH RETURN "SHUTDOWN_FORCED_ON_FINISH" BREAK CASE LAUNCHER_PRICE_NOTIFIED RETURN "PRICE_NOTIFIED" BREAK CASE LAUNCHER_PRINTED_VEHICLE_FIRE RETURN "PRINTED_VEHICLE_FIRE" BREAK CASE LAUNCHER_TOD_NOTIFIED RETURN "TOD_NOTIFIED" BREAK CASE LAUNCHER_ALREADY_SNAPPED_CP RETURN "ALREADY_SNAPPED_CP" BREAK CASE LAUNCHER_WRONG_VEHICLE_PRINTED RETURN "WRONG_VEHICLE_PRINTED" BREAK CASE LAUNCHER_PRINTED_VEHICLE_DMG RETURN "PRINTED_VEHICLE_DMG" BREAK ENDSWITCH CASSERTLN(DEBUG_MG_LAUNCHER, "GET_LAUNCHER_FLAG_DEBUG_STRING: Debug string for launcher flag ", ENUM_TO_INT(flag), " is missing.") RETURN "MISSING!" ENDFUNC // Limits per-frame spamming of block reasons and formats print string. PROC PRINT_LAUNCHER_UPDATE_BLOCK_REASON(STRING reason) IF (GET_FRAME_COUNT() % 120) = 0 CDEBUG2LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher update currently blocked. Reason: ", reason, ".") ENDIF ENDPROC PROC PRINT_LAUNCHER_INIT_DATA() CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> ----------------------------------------------------------") //Core info. CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Script Name: ", scriptName) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Stack Size: " , iStackSize) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Mission Type: ", GET_MISSION_TYPE_DEBUG_STRING(eMinigameMissionType)) IF eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Static Blip: NONE") ELSE CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Static Blip: " , DEBUG_GET_STRING_NAME_OF_STATIC_BLIP(ENUM_TO_INT(eLauncherStaticBlip))) ENDIF #IF LAUNCHER_CHAR_REQUIRED CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Required Character: ", GET_CHARSHEET_DISPLAY_STRING_FROM_CHARSHEET(characterRequired)) #ENDIF #IF LAUNCHER_MONEY_RESTRICTED CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Price To Launch: $", iPriceToLaunch) #ENDIF CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") //Config flags. CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Config Flags:") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VEHICLE_SPAWN ", PICK_STRING(LAUNCHER_VEHICLE_SPAWN = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> HAS_TRIGGER_SCENE ", PICK_STRING(LAUNCHER_HAS_TRIGGER_SCENE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VARIED_VEHICLE_ENTER ", PICK_STRING(LAUNCHER_VARIED_VEHICLE_ENTER = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VEHICLE_ENTER ", PICK_STRING(LAUNCHER_VEHICLE_ENTER = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VEHICLE_GETTING_IN ", PICK_STRING(LAUNCHER_VEHICLE_GETTING_IN = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VEHICLE_ENTER_ANY_SEAT ", PICK_STRING(LAUNCHER_VEHICLE_ENTER_ANY_SEAT = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VEHICLE_IGNORE_PROXIMITY ", PICK_STRING(LAUNCHER_VEHICLE_IGNORE_PROXIMITY = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> POINT_ENTER_IN_VEHICLE ", PICK_STRING(LAUNCHER_POINT_ENTER_IN_VEHICLE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> POINT_AUTO_TRIGGER_IN_VEHICLE ", PICK_STRING(LAUNCHER_POINT_AUTO_TRIGGER_IN_VEHICLE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> POINT_TRIGGER_WITH_FRIEND_IN_VEHICLE ", PICK_STRING(LAUNCHER_POINT_TRIGGER_WITH_FRIEND_IN_VEHICLE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> IGNORE_VEHICLE_HEALTH ", PICK_STRING(LAUNCHER_IGNORE_VEHICLE_HEALTH = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> IGNORE_PLAYER_CONTROL ", PICK_STRING(LAUNCHER_IGNORE_PLAYER_CONTROL = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> DISABLE_FOR_MAGDEMO ", PICK_STRING(LAUNCHER_DISABLE_FOR_MAGDEMO = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CHECK_SPAWN_DIST ", PICK_STRING(LAUNCHER_CHECK_SPAWN_DIST = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> COLLECTORS_AND_SPECIAL_EDITION_ONLY ", PICK_STRING(LAUNCHER_COLLECTORS_AND_SPECIAL_EDITION_ONLY = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> VOL_BUTTON_PRESS ", PICK_STRING(LAUNCHER_VOL_BUTTON_PRESS = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CUSTOM_SCRIPT_LAUNCH ", PICK_STRING(LAUNCHER_CUSTOM_SCRIPT_LAUNCH = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CLEAR_SCENE_ON_START ", PICK_STRING(LAUNCHER_CLEAR_SCENE_ON_START = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CHAR_REQUIRED ", PICK_STRING(LAUNCHER_CHAR_REQUIRED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> SNAP_CHECKPOINT_TO_GROUND ", PICK_STRING(LAUNCHER_SNAP_CHECKPOINT_TO_GROUND = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> HAS_SCENE ", PICK_STRING(LAUNCHER_HAS_SCENE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> NO_BUTTONPRESS ", PICK_STRING(LAUNCHER_NO_BUTTONPRESS = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> DONT_FADE_DOWN ", PICK_STRING(LAUNCHER_DONT_FADE_DOWN = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> DONT_CHECK_RELOAD_RANGE ", PICK_STRING(LAUNCHER_DONT_CHECK_RELOAD_RANGE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> OBJECT_ATTACHED ", PICK_STRING(LAUNCHER_OBJECT_ATTACHED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CHECK_INTERIOR ", PICK_STRING(LAUNCHER_CHECK_INTERIOR = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> REPLAYS_ENABLED ", PICK_STRING(LAUNCHER_REPLAYS_ENABLED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> TIME_RESTRICTED ", PICK_STRING(LAUNCHER_TIME_RESTRICTED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> MONEY_RESTRICTED ", PICK_STRING(LAUNCHER_MONEY_RESTRICTED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> PED_VARIATIONS ", PICK_STRING(LAUNCHER_PED_VARIATIONS = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> ON_FOOT_RESTRICTED ", PICK_STRING(LAUNCHER_ON_FOOT_RESTRICTED = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> CHECK_FOR_FIRE ", PICK_STRING(LAUNCHER_CHECK_FOR_FIRE = 1, "Yes", "No")) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") //Trigger dist info. #IF LAUNCHER_POINT_ENTER CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Point enter trigger dist: ", fLaunchScriptDist) #ENDIF #IF LAUNCHER_VEHICLE_ENTER CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Vehicle enter trigger dist: ", fHelpTextScriptDist) #ENDIF CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Shutdown Distance: " , fLauncherShutdownDist) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Trigger help text: ", helpButtonPress) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #IF LAUNCHER_VEHICLE_SPAWN CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> --- LAUNCHER_VEHICLE_SPAWN Config ---") IF vehicleModel = DUMMY_MODEL_FOR_SCRIPT CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Vehicle Model: NONE") ELSE CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Vehicle Model: ", ENUM_TO_INT(vehicleModel)) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Vehicle Heading: " , vehicleHeading) ENDIF CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #ENDIF #IF LAUNCHER_OBJECT_ATTACHED CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> --- LAUNCHER_OBJECT_ATTACHED Config ---") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Associated Prop: ", ENUM_TO_INT(eAssociatedProp)) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Object LOS Offset: ", vObjectLOSOffset) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Object LOS Coords: ", vObjectLOSCoords) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #ENDIF #IF LAUNCHER_VOL_BUTTON_PRESS CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> --- LAUNCHER_VOL_BUTTON_PRESS Config ---") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Volume Point 1: ", vVolPt1) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Volume Point 2: ", vVolPt2) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Volume Width: ", fVolWidth) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Volume Height: ", fVolHeight) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Max Trigger Distance: ", fMaxTriggerDist) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #ENDIF #IF LAUNCHER_TIME_RESTRICTED CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> --- LAUNCHER_TIME_RESTRICTED Config ---") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Available After Hour: ", iAvailableAfterHour) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Available Before Hour: ", iAvailableBeforeHour) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #ENDIF #IF LAUNCHER_PED_VARIATIONS CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> --- LAUNCHER_TIME_RESTRICTED Config ---") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Outfit Help Text: ", outfitHelpLabel) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> [Drw|Txt]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Michael Torso: [", michaelVariations.pedCompTorsoDrw, "|", michaelVariations.pedCompTorsoTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Michael Legs: [", michaelVariations.pedCompLegDrw, "|", michaelVariations.pedCompLegTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Michael Feet: [", michaelVariations.pedCompFeetDrw, "|", michaelVariations.pedCompFeetTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Franklin Torso: [", franklinVariations.pedCompTorsoDrw, "|", franklinVariations.pedCompTorsoTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Franklin Legs: [", franklinVariations.pedCompLegDrw, "|", franklinVariations.pedCompLegTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Franklin Feet: [", franklinVariations.pedCompFeetDrw, "|", franklinVariations.pedCompFeetTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Trevor Torso: [", trevorVariations.pedCompTorsoDrw, "|", trevorVariations.pedCompTorsoTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Trevor Legs: [", trevorVariations.pedCompLegDrw, "|", trevorVariations.pedCompLegTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Trevor Feet: [", trevorVariations.pedCompFeetDrw, "|", trevorVariations.pedCompFeetTxt, "]") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), ">") #ENDIF CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> ----------------------------------------------------------") ENDPROC #ENDIF PROC SWITCH_LAUNCHER_STATE(LAUNCHER_STATE newState) CDEBUG2LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Switching state from ", GET_LAUNCHER_STATE_DEBUG_STRING(launcherState), " to ", GET_LAUNCHER_STATE_DEBUG_STRING(newState), ".") launcherState = newState ENDPROC /// PURPOSE: /// See if we are looking for a button press /// PARAMS: /// thePlayer - /// theVehicle - /// vVehPos - /// bNeedPositionCheck - /// RETURNS: /// FUNC BOOL GENERIC_LAUNCHER_Reqires_Button_Press(VEHICLE_INDEX thisVehicle) UNUSED_PARAMETER(thisVehicle) #IF LAUNCHER_VARIED_VEHICLE_ENTER IF DOES_ENTITY_EXIST(thisVehicle) AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), thisVehicle) RETURN FALSE ELSE RETURN TRUE ENDIF #ENDIF #IF LAUNCHER_NO_BUTTONPRESS RETURN FALSE #ENDIF #IF LAUNCHER_POINT_TRIGGER_WITH_FRIEND_IN_VEHICLE IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX tempveh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF IS_PED_IN_VEHICLE(FRIEND_A_PED_ID(), tempveh) RETURN FALSE ENDIF ENDIF ENDIF #ENDIF #IF LAUNCHER_POINT_AUTO_TRIGGER_IN_VEHICLE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) thisVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF NOT IS_ENTITY_IN_AIR(thisVehicle) AND IS_VEHICLE_ON_ALL_WHEELS(thisVehicle) RETURN FALSE ELSE PRINTLN("ENTITY IS IN AIR OR VEHICLE IS NOT ON ALL WHEELS") ENDIF ENDIF #ENDIF //IF DOES_ENTITY_EXIST(thisVehicle) // IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), thisVehicle) // VECTOR vTemp = GET_ENTITY_COORDS(thisVehicle) // FLOAT fGroundZ // IF GET_GROUND_Z_FOR_3D_COORD(vTemp, fGroundZ) // IF vTemp.z > (fGroundZ - 2.0) AND vTemp.z < (fGroundZ + 2.0) // PRINTLN("vTemp is... ", vTemp, " and fGroundZ is... ", fGroundZ) // IF NOT IS_ENTITY_IN_AIR(thisVehicle) AND IS_VEHICLE_ON_ALL_WHEELS(thisVehicle) // RETURN FALSE // ELSE // PRINTLN("ENTITY IS IN AIR OR VEHICLE IS NOT ON ALL WHEELS") // ENDIF // ENDIF // ENDIF // ENDIF //ENDIF RETURN TRUE ENDFUNC FUNC BOOL GENERIC_LAUNCHER_IsVehicleAliveWithPlayerInIt(PED_INDEX thePlayer, VEHICLE_INDEX theVehicle, VECTOR vVehPos, BOOL bNeedPositionCheck = TRUE) IF DOES_ENTITY_EXIST(theVehicle) IF NOT IS_ENTITY_DEAD(theVehicle) IF IS_PED_IN_VEHICLE(thePlayer, theVehicle) IF (bNeedPositionCheck) VECTOR vPlayerPos = GET_ENTITY_COORDS(thePlayer) FLOAT fDist2 = VDIST2(vPlayerPos, vVehPos) IF (fDist2 < LOCATE_SIZE_ANY_MEANS*LOCATE_SIZE_ANY_MEANS) RETURN TRUE ENDIF ELSE RETURN TRUE ENDIF ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC FUNC BOOL GENERIC_LAUNCHER_IsPlayerUsingWeapon() WEAPON_TYPE playerWeapon BOOL bHasWeapon IF IS_PED_INJURED(PLAYER_PED_ID()) RETURN FALSE ENDIF GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), playerWeapon) IF playerWeapon = WEAPONTYPE_INVALID OR playerWeapon = WEAPONTYPE_UNARMED OR playerWeapon = WEAPONTYPE_ELECTRIC_FENCE OR playerWeapon = GADGETTYPE_PARACHUTE bHasWeapon = FALSE ELSE bHasWeapon = TRUE ENDIF IF bHasWeapon #IF IS_DEBUG_BUILD IF (GET_FRAME_COUNT() % 120) = 0 CDEBUG3LN(DEBUG_MG_LAUNCHER, "Player has valid weapon equipped for minigame, ENUM ID: ", playerWeapon) ENDIF #ENDIF ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK)) OR (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_ATTACK2)) OR (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_AIM)) OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID()) ELSE RETURN (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)) OR (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)) OR (bHasWeapon AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)) OR IS_PED_PERFORMING_MELEE_ACTION(PLAYER_PED_ID()) OR IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID()) ENDIF ENDFUNC FUNC BOOL GENERIC_LAUNCHER_IsPlayerInTargetVehicleTypeNearby(PED_INDEX thePlayer, MODEL_NAMES modelChk, VECTOR posChk) // There's the possibility that we didn't clear the vehicle (player was maybe in it?)... Just search the area for vehicles // and go from there. VEHICLE_INDEX vehTemp vehTemp = GET_VEHICLE_PED_IS_USING(thePlayer) IF NOT IS_ENTITY_DEAD(vehTemp) IF IS_PED_IN_VEHICLE(thePlayer, vehTemp) IF (GET_ENTITY_MODEL(vehTemp) = modelChk) AND GET_PLAYER_DISTANCE_FROM_LOCATION(posChk) < 30.0 // Bollocks. RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// This function determines if the car model name is of the needed type. /// RETURNS: /// TRUE if the car is the correct type. FUNC BOOL GENERIC_LAUNCHER_CheckAgainstCarType(VEHICLE_TRIGGER_TYPE againstType) SWITCH(againstType) CASE LAUNCHER_VEHTYPE_ANY_VEH IF IS_PED_IN_ANY_BOAT(PLAYER_PED_ID()) OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID()) OR IS_PED_IN_ANY_PLANE(PLAYER_PED_ID()) RETURN FALSE ELSE RETURN IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) ENDIF BREAK DEFAULT SCRIPT_ASSERT("Entered an unhandled vehicle type into GENERIC_LAUNCHER_CheckAgainstCarType. Please define your vehicle type, or put it in this switch.") RETURN FALSE BREAK ENDSWITCH RETURN TRUE ENDFUNC /// PURPOSE: /// Checks to see if we are too close /// RETURNS: /// FUNC BOOL GENERIC_LAUNCHER_IS_PLAYER_TOO_CLOSE_TO_SPAWN_VEH() IF IS_PED_INJURED(PLAYER_PED_ID()) RETURN FALSE ENDIF VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) FLOAT fPlayerDist2 = VDIST2(vPlayerPos, vLaunchLocation) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Checking if the player is too close to spawn launcher vehicle...") CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player distance:", fPlayerDist2, ". On-screen threshold:", LAUNCHER_VEHICLE_SPAWN_DISTANCE, ". Proximity threshold: ", LAUNCHER_TOO_CLOSE_DIST, ".") IF fPlayerDist2 < LAUNCHER_TOO_CLOSE_DIST*LAUNCHER_TOO_CLOSE_DIST CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is very close. Blocking vehicle spawn.") RETURN TRUE //should never get here, but in case we do ELIF fPlayerDist2 < LAUNCHER_VEHICLE_SPAWN_DISTANCE*LAUNCHER_VEHICLE_SPAWN_DISTANCE IF IS_SPHERE_VISIBLE(vLaunchLocation, 5.0) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is close and looking at the spawn location. Blocking vehicle spawn.") RETURN TRUE ELSE CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is close but not looking at the spawn location. Safe.") RETURN FALSE ENDIF ENDIF CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is not close to the spawn location. Safe.") RETURN FALSE ENDFUNC /// PURPOSE: /// If we're in a vehicle trigger launcher, print notification that the player needs the right car to trigger it. /// Turned into a function as I had to use this in a few places. PROC GENERIC_LAUNCHER_PrintCarNotification() #IF LAUNCHER_POINT_ENTER_IN_VEHICLE // He wasn't in a correct vehicle type... IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_WRONG_VEHICLE_PRINTED) IF NOT IS_HELP_MESSAGE_ON_SCREEN() SET_BITMASK_ENUM_AS_ENUM(launcherFlags, LAUNCHER_WRONG_VEHICLE_PRINTED) PRINT_HELP("RACE_AnyVeh") ENDIF ENDIF #ENDIF ENDPROC /// PURPOSE: /// If we're in a vehicle trigger launcher, print notification that the player needs the right car to trigger it. /// Turned into a function as I had to use this in a few places. PROC GENERIC_LAUNCHER_PrintCarDmgNotification() // Print the help once. #IF LAUNCHER_POINT_ENTER_IN_VEHICLE // Is the car too dmg'd to enter? IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_PRINTED_VEHICLE_DMG) IF NOT IS_HELP_MESSAGE_ON_SCREEN() PRINT_HELP("RACE_VehDmg") SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_PRINTED_VEHICLE_DMG) ENDIF ENDIF #ENDIF ENDPROC /// PURPOSE: /// If we're in a vehicle trigger launcher, print notification that the player needs to put out the fire on their car. PROC GENERIC_LAUNCHER_PrintCarFireNotification() // Print the help once. #IF LAUNCHER_POINT_ENTER_IN_VEHICLE // Is the car too dmg'd to enter? IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_PRINTED_VEHICLE_FIRE) IF NOT IS_HELP_MESSAGE_ON_SCREEN() PRINT_HELP("RACE_VehFire") SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_PRINTED_VEHICLE_FIRE) ENDIF ENDIF #ENDIF ENDPROC PROC CLEANUP_SCRIPT_ASSETS() CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher cleaning up assets in memory.") #IF LAUNCHER_VEHICLE_SPAWN IF DOES_ENTITY_EXIST(vehicleLaunch) IF NOT IS_ENTITY_DEAD(vehicleLaunch) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up launcher vehicle.") SET_ENTITY_AS_MISSION_ENTITY(vehicleLaunch, DEFAULT, TRUE) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleLaunch) DELETE_VEHICLE(vehicleLaunch) ENDIF ENDIF #ENDIF CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_SPAWNED_SCENE_CUSTOM) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Running launcher custom cleanup.") LAUNCHER_CUSTOM_CLEANUP() IF IS_THREAD_ACTIVE(threadInstance) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up active minigame thread.") FORCE_CLEANUP_FOR_THREAD_WITH_THIS_ID(threadInstance, DEFAULT_FORCE_CLEANUP_FLAGS) ENDIF IF NOT IS_STRING_NULL(scriptToRun) IF GET_LENGTH_OF_LITERAL_STRING(scriptToRun) <> 0 CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Setting associated minigame script as no longer needed.") SET_SCRIPT_AS_NO_LONGER_NEEDED(scriptToRun) ENDIF ENDIF ENDPROC PROC SCRIPT_CLEANUP(BOOL bTurnBlipOff = TRUE) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher cleaning up.") IF bTurnBlipOff IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> bTurnBlipOff is true, so setting static blip inactive before terminating.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, FALSE) ENDIF ENDIF RELEASE_CONTEXT_INTENTION(iContextIntention) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(helpButtonPress, iPriceToLaunch) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Running custom associated script cleanup.") LAUNCHER_CUSTOM_SCRIPT_END() CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) Mission_Over(iMissionCandInd) ENDIF iMissionCandInd = NO_CANDIDATE_ID CLEANUP_SCRIPT_ASSETS() CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Terminating launcher. Script: ", GET_THIS_SCRIPT_NAME(), ".") TERMINATE_THIS_THREAD() ENDPROC #IF NOT LAUNCHER_OBJECT_ATTACHED SCRIPT(COORDS_STRUCT inCoords) vLaunchLocation = inCoords.vec_coord[0] vLaunchLocation = vLaunchLocation CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Script ", GET_THIS_SCRIPT_NAME(), " starting as proximity based launcher.") #ENDIF #IF LAUNCHER_OBJECT_ATTACHED SCRIPT(OBJECT_INDEX oObject) COORDS_STRUCT inCoords IF DOES_ENTITY_EXIST(oObject) vLaunchLocation = GET_ENTITY_COORDS(oObject) oScriptObject = oObject inCoords.vec_coord[0] = vLaunchLocation eAssociatedProp = GET_ENTITY_MODEL(oScriptObject) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Script ", GET_THIS_SCRIPT_NAME(), " starting as object-attached launcher. Object found.") ELSE oScriptObject = oObject inCoords.vec_coord[0] = vLaunchLocation CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Script ", GET_THIS_SCRIPT_NAME(), " starting as object-attached launcher. Object not found!") ENDIF #ENDIF vehicleLaunch = vehicleLaunch scriptToRun = scriptToRun BOOL bLaunchedAsFriend = FALSE #IF LAUNCHER_DISABLE_FOR_MAGDEMO IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_REPEAT_PLAY|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_MAGDEMO)) #IF IS_DEBUG_BUILD STRING sForceCleanupReason SWITCH GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() CASE FORCE_CLEANUP_FLAG_REPEAT_PLAY sForceCleanupReason = "Repeat Play" BREAK CASE FORCE_CLEANUP_FLAG_SP_TO_MP sForceCleanupReason = "SP to MP" BREAK CASE FORCE_CLEANUP_FLAG_DEBUG_MENU sForceCleanupReason = "Debug Menu" BREAK CASE FORCE_CLEANUP_FLAG_MAGDEMO sForceCleanupReason = "Mag Demo" BREAK ENDSWITCH CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher forced to cleanup. Reason: ", sForceCleanupReason, " Script: ", GET_THIS_SCRIPT_NAME(), ".") #ENDIF SCRIPT_CLEANUP() ENDIF #ENDIF #IF NOT LAUNCHER_DISABLE_FOR_MAGDEMO IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_REPEAT_PLAY|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_DEBUG_MENU)) #IF IS_DEBUG_BUILD STRING sForceCleanupReason SWITCH GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() CASE FORCE_CLEANUP_FLAG_REPEAT_PLAY sForceCleanupReason = "Repeat Play" BREAK CASE FORCE_CLEANUP_FLAG_SP_TO_MP sForceCleanupReason = "SP to MP" BREAK CASE FORCE_CLEANUP_FLAG_DEBUG_MENU sForceCleanupReason = "Debug Menu" BREAK ENDSWITCH CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher forced to cleanup. Reason: ", sForceCleanupReason, " Script: ", GET_THIS_SCRIPT_NAME(), ".") #ENDIF SCRIPT_CLEANUP() ENDIF #ENDIF #IF IS_DEBUG_BUILD bDebugLaunched = bDebugLaunched #ENDIF pedPlayer = GET_PLAYER_PED(PLAYER_ID()) launcherState = STREAM_ASSETS CLEAR_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_MinigameFailed) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Running launcher custom initialisation.") LAUNCHER_CUSTOM_SCRIPT_INIT() #IF LAUNCHER_HAS_TRIGGER_SCENE CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Flagging launcher as having trigger script streaming priority.") SET_THIS_IS_A_TRIGGER_SCRIPT(TRUE) #ENDIF //Define this minigame's mission launch type based on whether it can be played on friend activities. IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_FRIEND_ACTIVITY) CDEBUG2LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Setting launcher minigame type as MISSION_TYPE_MINIGAME_FRIENDS.") eMinigameMissionType = MISSION_TYPE_MINIGAME_FRIENDS ELSE CDEBUG2LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Setting launcher minigame type as MISSION_TYPE_MINIGAME.") eMinigameMissionType = MISSION_TYPE_MINIGAME ENDIF #IF IS_DEBUG_BUILD PRINT_LAUNCHER_INIT_DATA() #ENDIF CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Starting to wait for minigame blip states to be restored...") WHILE NOT g_bMinigameBlipsRestored WAIT(0) ENDWHILE CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> ...Finished waiting for minigame blip states to be restored.") // If any other mission is running. Only if we don't have a very special flag to run despite a mission. IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_RUN_DESPITE_MISSION) // Check if a mission type is running that minigames are not allowed to launch over // the top of. If so we need to back out of the approach and clean up. All mission // launch relationships defined in candidate_public.sch. // Note: The minigame blips will automatically turn on and off to match this result. IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(eMinigameMissionType) #if USE_CLF_DLC IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_CLF_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #if USE_NRM_DLC IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_NRM_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #endif CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher needs to cleanup due to another mission launching.") #IF IS_DEBUG_BUILD PRINTLN(GET_THIS_SCRIPT_NAME(), " going to cleanup since its not allowed to run when another mission is running... g_OnMissionState = ", GET_MISSION_TYPE_DEBUG_STRING(g_OnMissionState)) #ENDIF SCRIPT_CLEANUP(FALSE)//cleanup script, but let the blip_controller handle the blip. ELSE CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher cleaning up as the minigame isn't active in the flow yet.") PRINTLN(GET_THIS_SCRIPT_NAME(), " **** Bitset bit not active for this launcher ****") SCRIPT_CLEANUP() ENDIF ENDIF ENDIF // Does this launcher have a scene that might still run even if the player can't play? IF (eMinigame != MINIGAME_NONE) #if USE_CLF_DLC IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_CLF_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) #endif #if USE_NRM_DLC IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_NRM_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) #endif #if not USE_CLF_DLC #if not USE_NRM_DLC IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) #endif #endif #IF LAUNCHER_HAS_SCENE bPlayerCanPlay = FALSE #ENDIF #IF NOT LAUNCHER_HAS_SCENE PRINTLN(GET_THIS_SCRIPT_NAME(), " **** Bitset bit not active for this launcher ****") SCRIPT_CLEANUP() #ENDIF ENDIF ENDIF IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_FORCED_ON_INIT) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Shutting down as flagged to clean up on init.") SCRIPT_CLEANUP() ENDIF IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_FOR_MISSION_LEADIN) AND (IS_MISSION_LEADIN_WITH_HIGH_MEMORY_ACTIVE() AND NOT IS_HIGH_MEMORY_PC()) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Shutting down as flagged to clean up when a high memory lead-in is active nearby.") SCRIPT_CLEANUP() ENDIF CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Starting ", scriptName, " launcher at ", vLaunchLocation, ".") IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_OF_THIS_SCRIPT_NAME()) > 1 AND NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_ALLOW_MULTIPLE_COPIES) // If there is already a golf launcher up, kill this version. This could happen because of the launch/kill hysteresis PRINTLN("This launcher script already has another instance running. Killing this one.") //prevent the blip from being destroyed. IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL ENDIF SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF //perform check once #IF LAUNCHER_CHECK_SPAWN_DIST IF NOT DOES_ENTITY_EXIST(vehicleLaunch) #IF IS_DEBUG_BUILD AND NOT bDebugLaunched #ENDIF IF GENERIC_LAUNCHER_IS_PLAYER_TOO_CLOSE_TO_SPAWN_VEH() AND NOT g_bPlayerIsInTaxi CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Sending launcher to sleep as the player is too near the spawn vehicle.") LAUNCHER_GOTO_SLEEP(ASLEEP_WAITING_FOR_PLAYER_TO_SPAWN_VEH) ELIF g_bPlayerIsInTaxi CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Noted player is in a taxi.") ENDIF ENDIF #ENDIF // Wipe all misc player characters in the world but us. - #352650 RyanP // This breaks a lot of things. //SET_AMBIENT_PLAYER_CHARS_AS_NO_LONGER_NEEDED() CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Starting launcher main loop...") WHILE (TRUE) #IF LAUNCHER_DISABLE_FOR_MAGDEMO IF g_bMagDemoActive CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up due to magdemo running.") SCRIPT_CLEANUP() ENDIF #ENDIF #IF LAUNCHER_COLLECTORS_AND_SPECIAL_EDITION_ONLY IF NOT IS_COLLECTORS_EDITION_GAME() AND NOT IS_SPECIAL_EDITION_GAME() AND NOT IS_JAPANESE_SPECIAL_EDITION_GAME() CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher is CE/SE only and this game isn't SE, CE or JSE. Cleaning up.") SCRIPT_CLEANUP() ENDIF #ENDIF // Snap the inCoords to the ground if we need to. #IF LAUNCHER_SNAP_CHECKPOINT_TO_GROUND IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_ALREADY_SNAPPED_CP) FLOAT gndZ = 0.0 IF GET_GROUND_Z_FOR_3D_COORD(inCoords.VEC_COORD[0], gndZ) IF (gndZ <> 0.0) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher checkpoint was found to be floating. Snapped to ground.") inCoords.VEC_COORD[0].z = gndZ SET_BITMASK_ENUM_AS_ENUM(launcherFlags, LAUNCHER_ALREADY_SNAPPED_CP) ENDIF ENDIF ENDIF #ENDIF // Getting the player ped only ONCE up above was okay, but that didn't account for swapping the // player ped close to the event. We need to handle that. pedPlayer = GET_PLAYER_PED(PLAYER_ID()) IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_ON_PLAYER_DEATH) IF IS_ENTITY_DEAD(pedPlayer) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> The player is dead. Cleaning up.") SCRIPT_CLEANUP() ENDIF ENDIF IF DOES_ENTITY_EXIST(pedPlayer) AND NOT IS_ENTITY_DEAD(pedPlayer) vPlayerLocation = GET_ENTITY_COORDS(pedPlayer) fPlayerDistToLauncher = VDIST2(vPlayerLocation, inCoords.VEC_COORD[0]) fPlayerDistToLauncher = fPlayerDistToLauncher vFlattenedPlayerLocation = vPlayerLocation vFlattenedLauncherLocation = inCoords.VEC_COORD[0] vFlattenedPlayerLocation.z = 0 vFlattenedLauncherLocation.z = 0 fFlatSquaredPlayerDistanceToLauncher = VDIST2(vFlattenedPlayerLocation, vFlattenedLauncherLocation) SWITCH launcherState CASE STREAM_ASSETS // Check if a mission type is running that minigames are not allowed to launch over // the top of. If so we need to back out and clean up unless explicitly flagged to // continue. IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(eMinigameMissionType) OR (IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_NEED_SETUP_ON_MISSION) AND NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_FOR_MISSION_LEADIN)) //if we need a setup during mission and we're NOT flagged as a high memory launcher then CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Checking distance from launcher before loading assets...") CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player-location:(", vFlattenedPlayerLocation.x, ",", vFlattenedPlayerLocation.y, ") Launcher-pos:(", vFlattenedLauncherLocation.x, ",", vFlattenedLauncherLocation.y, ")") CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> PlayerDistSqrToLauncher:", fFlatSquaredPlayerDistanceToLauncher, " ThresholdDistSqr:", DEFAULT_CUTSCENE_LOAD_DIST*DEFAULT_CUTSCENE_LOAD_DIST, ".") #IF LAUNCHER_HAS_CUT_SCENE IF fFlatSquaredPlayerDistanceToLauncher < DEFAULT_CUTSCENE_LOAD_DIST*DEFAULT_CUTSCENE_LOAD_DIST #ENDIF #IF LAUNCHER_VEHICLE_SPAWN CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Requesting launcher vehicle model.") REQUEST_MODEL(vehicleModel) #ENDIF iMissionCandInd = NO_CANDIDATE_ID CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Running launcher custom request assets.") LAUNCHER_CUSTOM_REQUEST_ASSETS() SWITCH_LAUNCHER_STATE(STREAMING_WAIT) #IF LAUNCHER_HAS_CUT_SCENE ELSE CDEBUG3LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is too far from the launcher. Waiting to load assets.") ENDIF #ENDIF ELSE // If we've moved too far away, just exit. IF fFlatSquaredPlayerDistanceToLauncher > fLauncherShutdownDist*fLauncherShutdownDist CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player past shut down distance for launcher. Cleaning up.") //Prevent the blip from being destroyed. IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Keeping launcher blip alive as launcher shuts down.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL ENDIF SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF IF vPlayerLocation.z - inCoords.VEC_COORD[0].z > 500 CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher is too far below player.") ENDIF ENDIF BREAK CASE STREAMING_WAIT #IF IS_DEBUG_BUILD IF (GET_FRAME_COUNT() % 120) = 0 CDEBUG3LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Waiting for assets to stream in.") ENDIF #ENDIF IF LAUNCHER_CUSTOM_ASSETS_LOADED() #IF LAUNCHER_POINT_ENTER #IF NOT LAUNCHER_DONT_CHECK_RELOAD_RANGE AND fPlayerDistToLauncher > ((fLaunchScriptDist*1.5)*(fLaunchScriptDist*1.5)) #ENDIF #ENDIF #IF LAUNCHER_VEHICLE_SPAWN AND HAS_MODEL_LOADED(vehicleModel) #IF NOT LAUNCHER_DONT_CHECK_RELOAD_RANGE AND fPlayerDistToLauncher > ((LOCATE_SIZE_ON_FOOT_ONLY+2.0)*(LOCATE_SIZE_ON_FOOT_ONLY+2.0)) #ENDIF #ENDIF eTransMode = eTransMode SWITCH_LAUNCHER_STATE(APPROACH_WAIT) ELSE LAUNCHER_CUSTOM_REQUEST_ASSETS() ENDIF BREAK CASE APPROACH_WAIT IF NETWORK_IS_IN_SESSION() PRINTLN("NETWORK_IS_IN_SESSION() returning true. Cleaning up launcher") CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Network session started. Cleaning up.") SCRIPT_CLEANUP() EXIT ENDIF // Check if a mission type is running that minigames are not allowed to launch over // the top of. If so we need to back out and clean up. IF NOT CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(eMinigameMissionType) //PRINTLN("Mission is flagged as running...") // This would send us back to the top but leave us running. Instead, we're going to terminate. //CLEANUP_SCRIPT_ASSETS //SWITCH_LAUNCHER_STATE(STREAM_ASSETS) //EXIT IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_RUN_DESPITE_MISSION) BOOL bForceCleanMission bForceCleanMission = TRUE // If a mission is forcing us to clean... make sure it's not us... IF ARE_STRINGS_EQUAL(g_replay.replayScriptName, scriptToRun) scriptToRun = scriptName bForceCleanMission = FALSE ENDIF IF bForceCleanMission PRINTLN(GET_THIS_SCRIPT_NAME(), " is cleaning up due to mission running in approach wait.") SCRIPT_CLEANUP(FALSE)//cleanup script, but let the blip_controller handle the blip. BREAK ENDIF ENDIF ENDIF #IF LAUNCHER_VEHICLE_SPAWN IF NOT DOES_ENTITY_EXIST(vehicleLaunch) AND (((fPlayerDistToLauncher > LAUNCHER_TOO_CLOSE_DIST*LAUNCHER_TOO_CLOSE_DIST AND NOT IS_SPHERE_VISIBLE(inCoords.VEC_COORD[0], 5)) OR (fPlayerDistToLauncher > LAUNCHER_VEHICLE_SPAWN_DISTANCE*LAUNCHER_VEHICLE_SPAWN_DISTANCE)) //if we're close, check the visibility. If we're far, dont check. OR (NOT DOES_ENTITY_EXIST(vehicleLaunch) AND IS_SCREEN_FADED_OUT()) #IF IS_DEBUG_BUILD OR bDebugLaunched #ENDIF ) CLEAR_AREA_OF_VEHICLES(inCoords.VEC_COORD[0], 8.0) vehicleLaunch = CREATE_VEHICLE(vehicleModel, inCoords.VEC_COORD[0], vehicleHeading) INCREMENT_MINIGAMES_LOADED_COUNT() SET_VEHICLE_HAS_STRONG_AXLES(vehicleLaunch, TRUE) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Created launcher vehicle at position ", inCoords.VEC_COORD[0], " with heading ", vehicleHeading, ".") #IF LAUNCHER_REPLAYS_ENABLED IF bIsReplayLaunch CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Automatically warping the player into launcher vehicle for replay restart.") SET_PED_INTO_VEHICLE(pedPlayer, vehicleLaunch) ENDIF #ENDIF //If we're a replay, we actually don't lock. BOOL bIgnoreLock bIgnoreLock = FALSE #IF LAUNCHER_REPLAYS_ENABLED bIgnoreLock = bIsReplayLaunch #ENDIF // Lock the doors while on a mission. IF IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE() AND NOT bIgnoreLock CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Locking launcher vehicle doors as we go on-mission.") SET_VEHICLE_DOORS_LOCKED(vehicleLaunch, VEHICLELOCK_LOCKED) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_SHOULD_UNLOCK_CARS) ENDIF ELSE // Unlock the doors when the mission is over. IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHOULD_UNLOCK_CARS) IF NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE() CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Unlocking launcher vehicle doors as we come off-mission.") IF NOT IS_ENTITY_DEAD(vehicleLaunch) SET_VEHICLE_DOORS_LOCKED(vehicleLaunch, VEHICLELOCK_UNLOCKED) ENDIF CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_SHOULD_UNLOCK_CARS) ENDIF ENDIF ENDIF #ENDIF // Scene spawning. IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SPAWNED_SCENE_CUSTOM) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Spawning custom scene.") LAUNCHER_CUSTOM_SPAWN_SCENE() SET_BITMASK_ENUM_AS_ENUM(launcherFlags, LAUNCHER_SPAWNED_SCENE_CUSTOM) ENDIF // Check to see if we need to quit first... IF fFlatSquaredPlayerDistanceToLauncher > (fLauncherShutdownDist*fLauncherShutdownDist) AND NOT g_bLaunchMinigameReplay CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is too far from launcher. Starting cleanup.") //Prevent the blip from being destroyed on cleanup. IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL //B* 2054078, 2039255: Only check visiblity if on friend activity IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) AND NOT IS_STATIC_BLIP_CURRENTLY_VISIBLE(eLauncherStaticBlip) //Do nothing as we don't want this reappearing when in a friend activity ELSE CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Setting static blip active as cleanup starts.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) //Not needed, already active eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL ENDIF ENDIF SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ELSE scriptToRun = scriptName // Don't do any launch checks if we're on a refused friend activity. But first, see if the launcher is refusing us. BOOL bUpdateLaunch bUpdateLaunch = NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SCRIPT_NOT_ALLOWING_RUN) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) // Make sure we can run in general IF NOT IS_AMBIENT_SCRIPT_ALLOWED_TO_RUN(RUN_ON_MISSION_NEVER) AND NOT g_bLaunchMinigameReplay // This may be a terminate condition... IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_IF_MISSION_RUNNING) // We may be being ordered to shutdown. // Shutdown if we're not a friend activity, or the friend doesn't exist. Also, make sure we're not a replay. IF (NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_FRIEND_ACTIVITY) OR NOT DOES_ENTITY_EXIST(FRIEND_A_PED_ID())) AND NOT g_bLaunchMinigameReplay PRINTLN("APPROACH_WAIT: minigame not allowed to start, killing myself!") SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) BREAK ENDIF ENDIF ENDIF IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_FOR_MISSION_LEADIN) AND (IS_MISSION_LEADIN_WITH_HIGH_MEMORY_ACTIVE() AND NOT IS_HIGH_MEMORY_PC()) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up due to high memory lead-in being active.") SCRIPT_CLEANUP() ENDIF IF IS_PLAYER_ON_BOOTY_CALL() CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player is on a booty call. Cleaning up.") SCRIPT_CLEANUP() ENDIF IF NOT IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_MINIGAME) OR g_bPlayerIsInTaxi OR GENERIC_LAUNCHER_IsPlayerUsingWeapon() CDEBUG3LN(DEBUG_MG_LAUNCHER, "IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_MINIGAME) is... (1 for true)", IS_IT_SAFE_TO_TRIGGER_SCRIPT_TYPE(ST_MINIGAME)) CDEBUG3LN(DEBUG_MG_LAUNCHER, "GENERIC_LAUNCHER_IsPlayerUsingWeapon() is... (1 for true)", GENERIC_LAUNCHER_IsPlayerUsingWeapon()) CDEBUG3LN(DEBUG_MG_LAUNCHER, "Can't update since its not safe to trigger a MG, or the player is using a weapon!") CDEBUG3LN(DEBUG_MG_LAUNCHER, "IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_ATTACK) (1 for yes) ", IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_ATTACK)) CDEBUG3LN(DEBUG_MG_LAUNCHER, "IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM) (1 for yes) ", IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)) CDEBUG3LN(DEBUG_MG_LAUNCHER, "IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE) (1 for yes) ", IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_DETONATE)) CDEBUG3LN(DEBUG_MG_LAUNCHER, "IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID()) (1 for yes) ", IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())) CDEBUG3LN(DEBUG_MG_LAUNCHER, "g_bPlayerIsInTaxi is... (1 for true)", g_bPlayerIsInTaxi) bUpdateLaunch = FALSE ENDIF // We were refused by a flow flag, but still want to update the scene. #IF LAUNCHER_HAS_SCENE IF NOT bPlayerCanPlay #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("bPlayerCanPlay is FALSE") #ENDIF SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) bUpdateLaunch = FALSE ENDIF #ENDIF // Can't run a friend activity, but we're a friend activity. IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_FRIEND_ACTIVITY) IF NOT LAUNCHER_CAN_RUN_FRIEND_ACTIVITY() #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Can't run a friend activity") #ENDIF SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) bUpdateLaunch = FALSE ENDIF ENDIF // Can't launch with a selector onscreen. IF IS_SELECTOR_ONSCREEN() #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Selector on screen") #ENDIF bUpdateLaunch = FALSE ENDIF IF g_bInMultiplayer #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("In multiplayer") #ENDIF bUpdateLaunch = FALSE ENDIF IF Is_Player_Timetable_Scene_In_Progress() #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Timetable scene in progress") #ENDIF bUpdateLaunch = FALSE ENDIF IF IS_PLAYER_SWITCH_IN_PROGRESS() #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player switch in progress") #ENDIF bUpdateLaunch = FALSE ENDIF // Buncha checks... IF (IS_CUSTOM_MENU_ON_SCREEN()) OR (IS_SCRIPT_HUD_DISPLAYING(HUDPART_TRANSITIONHUD)) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Script HUD or custom menu on screen") #ENDIF bUpdateLaunch = FALSE ENDIF // Can't launch if we don't have control! IF NOT CAN_PLAYER_START_MISSION(PLAYER_ID()) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player not in a safe state to start mission") #ENDIF bUpdateLaunch = FALSE ENDIF #IF NOT LAUNCHER_IGNORE_PLAYER_CONTROL IF NOT IS_PLAYER_SCRIPT_CONTROL_ON(PLAYER_ID()) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player control off") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF // Can't launch minigame with the phone up. - #260195 // Really the bug was for being in a phonecall, but this should cover everything IF IS_PHONE_ONSCREEN() OR IS_BROWSER_OPEN() #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Phone on screen") #ENDIF bUpdateLaunch = FALSE ENDIF // If we're still allowed to launch, do it. IF bUpdateLaunch // See if we're the right char. #IF LAUNCHER_CHAR_REQUIRED IF NOT IS_PED_THE_CURRENT_PLAYER_PED(characterRequired) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player incorrect character") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF // We're in a volume check. #IF LAUNCHER_VOL_BUTTON_PRESS IF (NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vVolPt1, vVolPt2, fVolWidth, TRUE, FALSE, eTransMode)) OR (fMaxTriggerDist > 0.0 AND GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), LERP_VECTOR(vVolPt1, vVolPt2, 0.5), FALSE) > fMaxTriggerDist) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player not in trigger area") #ENDIF bUpdateLaunch = FALSE ELIF fVolHeight > 0 IF ABSF(vPlayerLocation.z - vVolPt1.z) > fVolHeight #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player not in trigger area after height check") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF #ENDIF // We may be a point enter. #IF LAUNCHER_POINT_ENTER #IF LAUNCHER_POINT_AUTO_TRIGGER_IN_VEHICLE IF IS_PED_IN_ANY_VEHICLE(pedPlayer) IF NOT IS_ENTITY_AT_COORD( GET_VEHICLE_PED_IS_IN(pedPlayer), inCoords.VEC_COORD[0], <>, FALSE, FALSE, eTransMode) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't close enough to trigger point (in veh)") #ENDIF bUpdateLaunch = FALSE ENDIF ELSE IF NOT IS_ENTITY_AT_COORD( pedPlayer, inCoords.VEC_COORD[0], <>, FALSE, TRUE, eTransMode) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't close enough to trigger point") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF #ENDIF #IF LAUNCHER_POINT_TRIGGER_WITH_FRIEND_IN_VEHICLE IF IS_PED_IN_ANY_VEHICLE(pedPlayer) IF NOT IS_ENTITY_AT_COORD( GET_VEHICLE_PED_IS_IN(pedPlayer), inCoords.VEC_COORD[0], <>, FALSE, FALSE, eTransMode) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't close enough to trigger point (with friend in veh)") #ENDIF bUpdateLaunch = FALSE ENDIF ELSE IF NOT IS_ENTITY_AT_COORD( pedPlayer, inCoords.VEC_COORD[0], <>, FALSE, TRUE, eTransMode) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't close enough to trigger point (with friend)") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF #ENDIF #IF NOT LAUNCHER_POINT_AUTO_TRIGGER_IN_VEHICLE #IF NOT LAUNCHER_POINT_TRIGGER_WITH_FRIEND_IN_VEHICLE IF NOT IS_ENTITY_AT_COORD( pedPlayer, inCoords.VEC_COORD[0], <>, FALSE, TRUE, eTransMode) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't close enough to trigger point (autotrigger in veh)") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF #ENDIF #ENDIF // Try to see if we can see the prop. #IF LAUNCHER_OBJECT_ATTACHED IF IS_ENTITY_DEAD(oScriptObject) // We don't have the prop? Can we find it? Anyway, return FALSE this update. #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Launcher object not found") #ENDIF oScriptObject = GET_CLOSEST_OBJECT_OF_TYPE(vLaunchLocation, 2.0, eAssociatedProp) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) bUpdateLaunch = FALSE ELSE vObjectLOSCoords = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(oScriptObject, vObjectLOSOffset) IF COMPUTE_LOS_BETWEEN_COORDS(ObjAttachedArgs, vPlayerLocation, vObjectLOSCoords, oScriptObject) bFailedLOSCheck = FALSE ELSE //we dont know if we can see shit IF ObjAttachedArgs.bFailedLosCheck = TRUE //now we know we cant see shit bFailedLOSCheck = TRUE ENDIF ENDIF IF bFailedLOSCheck #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Launcher object not in line of sight") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF IF NOT bStreamsCheck bUpdateLaunch = FALSE ENDIF #ENDIF // See if we're in the correct interior #IF LAUNCHER_CHECK_INTERIOR IF (GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) <> eInterior) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player not in launcher interior") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF #IF LAUNCHER_CHECK_FOR_FIRE IF GET_NUMBER_OF_FIRES_IN_RANGE(vLaunchLocation, fLaunchScriptDist) > 0 #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Fire in launch area") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF #IF LAUNCHER_POINT_ENTER_IN_VEHICLE // If he's not in a vehicle, or he's in a plane, boat, or heli, don't launch. IF (IS_PED_IN_ANY_BOAT(PLAYER_PED_ID()) OR IS_PED_IN_ANY_HELI(PLAYER_PED_ID()) OR IS_PED_IN_ANY_PLANE(PLAYER_PED_ID())) RELEASE_CONTEXT_INTENTION(iContextIntention) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(helpButtonPress, iPriceToLaunch) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) GENERIC_LAUNCHER_PrintCarNotification() ELSE CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_WRONG_VEHICLE_PRINTED) ENDIF SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player in plane, boat or heli") #ENDIF bUpdateLaunch = FALSE ELSE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX tempVeh tempVeh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF NOT (GET_PED_IN_VEHICLE_SEAT(tempVeh) = PLAYER_PED_ID()) RELEASE_CONTEXT_INTENTION(iContextIntention) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(helpButtonPress, iPriceToLaunch) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) GENERIC_LAUNCHER_PrintCarNotification() ELSE CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_WRONG_VEHICLE_PRINTED) ENDIF SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player is not the driver of vehicle") #ENDIF bUpdateLaunch = FALSE ELSE #IF NOT LAUNCHER_IGNORE_VEHICLE_HEALTH // Player's in the vehicle seat. Normally, we'd launch. Make sure the vehicle has enough health now. IF (GET_ENTITY_HEALTH(tempVeh) <= 5) OR IS_ENTITY_ON_FIRE(tempVeh) #ENDIF #IF LAUNCHER_IGNORE_VEHICLE_HEALTH IF IS_ENTITY_ON_FIRE(tempVeh) #ENDIF // Vehicle is too damaged to enter. RELEASE_CONTEXT_INTENTION(iContextIntention) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(helpButtonPress, iPriceToLaunch) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) GENERIC_LAUNCHER_PrintCarDmgNotification() ELSE // Clear that we printed the help. CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_PRINTED_VEHICLE_DMG) ENDIF SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Launch vehicle health too low") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF ENDIF ENDIF // If we find that we're eventually in a correct vehicle, clear the bit associated with this. IF bUpdateLaunch CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_WRONG_VEHICLE_PRINTED) ENDIF #ENDIF // May need to be a vehicle enter. If so, make sure the vehicle is at teh start pos too. #IF LAUNCHER_VEHICLE_ENTER #IF NOT LAUNCHER_VEHICLE_GETTING_IN IF IS_ENTITY_DEAD(vehicleLaunch) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Launch vehicle dead") #ENDIF bUpdateLaunch = FALSE ELIF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't in launch vehicle") #ENDIF bUpdateLaunch = FALSE ELSE VEHICLE_INDEX tempVeh tempVeh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) #IF NOT LAUNCHER_VEHICLE_ENTER_ANY_SEAT IF NOT (GET_PED_IN_VEHICLE_SEAT(tempVeh, VS_DRIVER) = PLAYER_PED_ID()) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't in launch vehicle driving seat") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF IF bUpdateLaunch IF (vehicleLaunch = tempVeh) #IF NOT LAUNCHER_VEHICLE_IGNORE_PROXIMITY // So here, the player is in the target vehicle. Make sure it's at the launch spot. IF NOT IS_ENTITY_AT_COORD(pedPlayer, inCoords.VEC_COORD[0], <>) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player in launch vehicle at incorrect position") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF ELSE SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player is in vehicle other than launch vehicle") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF ENDIF #ENDIF #IF LAUNCHER_VEHICLE_GETTING_IN IF DOES_ENTITY_EXIST(vehicleLaunch) //IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehicleLaunch) IF NOT IS_ENTITY_AT_COORD(vehicleLaunch, vLaunchLocation, <>) CDEBUG3LN(DEBUG_MISSION, " - generic_launcher - SCRIPT - CASE APPROACH_WAIT - Player is in the vehicle or vehicle not on launch spot - Setting launcherState to UNLOAD_ASSETS.") //SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Vehicle not on launch spot - Setting launcherState to UNLOAD_ASSETS.") #ENDIF //bUpdateLaunch = FALSE SWITCH_LAUNCHER_STATE(UNLOAD_ASSETS) ENDIF ENDIF IF IS_ENTITY_DEAD(vehicleLaunch) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Launch vehicle is dead") #ENDIF bUpdateLaunch = FALSE ELIF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player not entering any vehicle") #ENDIF bUpdateLaunch = FALSE ELSE VEHICLE_INDEX tempVeh tempVeh = GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID()) IF bUpdateLaunch IF (vehicleLaunch = tempVeh) #IF NOT LAUNCHER_VEHICLE_IGNORE_PROXIMITY // So here, the player is in the target vehicle. Make sure it's at the launch spot. IF NOT IS_ENTITY_AT_COORD(pedPlayer, inCoords.VEC_COORD[0], <>) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player in launch vehicle at incorrect position") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF ELSE SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player is in vehicle other than launch vehicle") #ENDIF bUpdateLaunch = FALSE ENDIF ENDIF ENDIF #ENDIF #ENDIF #IF LAUNCHER_POINT_AUTO_TRIGGER_IN_VEHICLE IF NOT IS_ENTITY_AT_COORD(pedPlayer, inCoords.VEC_COORD[0], <>) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player in launch vehicle at incorrect position") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF // Can only run during certain times of day. #IF LAUNCHER_TIME_RESTRICTED INT iCurHour iCurHour = GET_CLOCK_HOURS() IF iAvailableAfterHour > iAvailableBeforeHour IF (iCurHour < iAvailableAfterHour) AND (iCurHour >= iAvailableBeforeHour) // The current time of day does not fall within the acceptable hours. SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Incorrect time of day") #ENDIF bUpdateLaunch = FALSE // If the player is within range, notify him. IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_TOD_NOTIFIED) PRINT_HELP_WITH_TWO_NUMBERS("MG_NA_TIME", iAvailableAfterHour, iAvailableBeforeHour) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_TOD_NOTIFIED) ENDIF ELSE CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_TOD_NOTIFIED) ENDIF ENDIF ELSE IF (iCurHour < iAvailableAfterHour) OR (iCurHour >= iAvailableBeforeHour) // The current time of day does not fall within the acceptable hours. SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Incorrect time of day") #ENDIF bUpdateLaunch = FALSE // If the player is within range, notify him. IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_TOD_NOTIFIED) PRINT_HELP_WITH_TWO_NUMBERS("MG_NA_TIME", iAvailableAfterHour, iAvailableBeforeHour) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_TOD_NOTIFIED) ENDIF ELSE CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_TOD_NOTIFIED) ENDIF ENDIF ENDIF #ENDIF #IF LAUNCHER_MONEY_RESTRICTED IF bUpdateLaunch AND (GET_TOTAL_CASH(GET_CURRENT_PLAYER_PED_ENUM()) < iPriceToLaunch) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Not enough money") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_PRICE_NOTIFIED) // tell player how poor he is PRINT_HELP_WITH_NUMBER("MG_YOU_IS_BROKE", iPriceToLaunch) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_PRICE_NOTIFIED) ENDIF ELSE CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_PRICE_NOTIFIED) ENDIF #ENDIF #IF LAUNCHER_PED_VARIATIONS IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL IF michaelVariations.pedCompTorsoDrw >= 0 AND michaelVariations.pedCompTorsoTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> michaelVariations.pedCompTorsoDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> michaelVariations.pedCompTorsoTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Michael has incorrect torso variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player torso") ENDIF IF michaelVariations.pedCompLegDrw >= 0 AND michaelVariations.pedCompLegTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> michaelVariations.pedCompLegDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> michaelVariations.pedCompLegTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Michael has incorrect leg variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player legs") ENDIF IF michaelVariations.pedCompFeetDrw >= 0 AND michaelVariations.pedCompFeetTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> michaelVariations.pedCompFeetDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> michaelVariations.pedCompFeetTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Michael has incorrect foot variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player feet") ENDIF ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN IF franklinVariations.pedCompTorsoDrw >= 0 AND franklinVariations.pedCompTorsoTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> franklinVariations.pedCompTorsoDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> franklinVariations.pedCompTorsoTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Franklin has incorrect torso variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player torso") ENDIF IF franklinVariations.pedCompLegDrw >= 0 AND franklinVariations.pedCompLegTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> franklinVariations.pedCompLegDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> franklinVariations.pedCompLegTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Franklin has incorrect leg variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player legs") ENDIF IF franklinVariations.pedCompFeetDrw >= 0 AND franklinVariations.pedCompFeetTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> franklinVariations.pedCompFeetDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> franklinVariations.pedCompFeetTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Franklin has incorrect foot variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player feet") ENDIF ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR IF trevorVariations.pedCompTorsoDrw >= 0 AND trevorVariations.pedCompTorsoTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> trevorVariations.pedCompTorsoDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO) <> trevorVariations.pedCompTorsoTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Trevor has incorrect torso variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player torso") ENDIF IF trevorVariations.pedCompLegDrw >= 0 AND trevorVariations.pedCompLegTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> trevorVariations.pedCompLegDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG) <> trevorVariations.pedCompLegTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Trevor has incorrect leg variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player legs") ENDIF IF trevorVariations.pedCompFeetDrw >= 0 AND trevorVariations.pedCompFeetTxt >= 0 IF GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> trevorVariations.pedCompFeetDrw OR GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET) <> trevorVariations.pedCompFeetTxt SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Trevor has incorrect foot variations") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) AND NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(outfitHelpLabel) PRINT_HELP(outfitHelpLabel) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) ENDIF ENDIF ELSE PRINTLN("Skipping component variation check on player feet") ENDIF ENDIF ENDIF ELSE IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_OUTFIT_NOTIFIED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF #IF LAUNCHER_ON_FOOT_RESTRICTED IF (fPlayerDistToLauncher < (fLaunchScriptDist*fLaunchScriptDist) + 4.0) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_BLIP_INACTIVE) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player isn't on foot") #ENDIF bUpdateLaunch = FALSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) // tell player he can only start on foot PRINT_HELP("MG_GET_ON_FOOT") SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) ENDIF ELSE IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) CLEAR_THIS_PRINT("MG_GET_ON_FOOT") ENDIF ENDIF ELSE IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_ON_FOOT_NOTIFIED) CLEAR_THIS_PRINT("MG_GET_ON_FOOT") ENDIF ENDIF #ENDIF #IF NOT LAUNCHER_IGNORE_PLAYER_CONTROL IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()) #IF IS_DEBUG_BUILD PRINT_LAUNCHER_UPDATE_BLOCK_REASON("Player control off") #ENDIF bUpdateLaunch = FALSE ENDIF #ENDIF IF bUpdateLaunch CDEBUG3LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Updating launcher") SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_CONTEXT) IF GENERIC_LAUNCHER_Reqires_Button_Press(vehicleLaunch) // So we're here, which means some magical combination has led us to being allowed to play. // Make sure the help is up. IF (iContextIntention = NEW_CONTEXT_INTENTION) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Registering new context intention.") #IF LAUNCHER_MONEY_RESTRICTED IF iPriceToLaunch > 0 REGISTER_CONTEXT_INTENTION(iContextIntention, CP_HIGH_PRIORITY, "", TRUE) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Price to launch set to $", iPriceToLaunch, ".") PRINT_HELP_FOREVER_WITH_NUMBER(helpButtonPress, iPriceToLaunch) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) ELSE REGISTER_CONTEXT_INTENTION(iContextIntention, CP_HIGH_PRIORITY, helpButtonPress) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) ENDIF #ENDIF #IF NOT LAUNCHER_MONEY_RESTRICTED REGISTER_CONTEXT_INTENTION(iContextIntention, CP_HIGH_PRIORITY, helpButtonPress) SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) #ENDIF ELSE IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) OR NOT IS_HELP_MESSAGE_BEING_DISPLAYED() RELEASE_CONTEXT_INTENTION(iContextIntention) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) ENDIF ENDIF // Everything requires a button press to play now. IF HAS_CONTEXT_BUTTON_TRIGGERED(iContextIntention) helpButtonPress = helpButtonPress RELEASE_CONTEXT_INTENTION(iContextIntention) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_HELP_MESSAGE_BEING_DISPLAYED() CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF REQUEST_SCRIPT(scriptToRun) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Disabling player control to prevent last moment user interruptions.") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_PROJECTILES | SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES) SWITCH_LAUNCHER_STATE(RUN_SCRIPT) ENDIF ELSE helpButtonPress = helpButtonPress RELEASE_CONTEXT_INTENTION(iContextIntention) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) #IF LAUNCHER_MONEY_RESTRICTED IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) IF IS_HELP_MESSAGE_BEING_DISPLAYED() CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF REQUEST_SCRIPT(scriptToRun) #IF NOT LAUNCHER_IGNORE_PLAYER_CONTROL CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Disabling player control to prevent last moment user interruptions.") SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_REMOVE_PROJECTILES | SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES) #ENDIF SWITCH_LAUNCHER_STATE(RUN_SCRIPT) ENDIF ENDIF ENDIF // If, for whatever reason, we shouldn't be displaying help, wipe it. IF NOT bUpdateLaunch #IF NOT LAUNCHER_MONEY_RESTRICTED IF (iContextIntention != NEW_CONTEXT_INTENTION) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up context intention.") RELEASE_CONTEXT_INTENTION(iContextIntention) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF #ENDIF #IF LAUNCHER_MONEY_RESTRICTED IF (iContextIntention != NEW_CONTEXT_INTENTION) IF IS_HELP_MESSAGE_BEING_DISPLAYED() CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up help text.") RELEASE_CONTEXT_INTENTION(iContextIntention) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_HELP_TEXT_DISPLAYED) CLEAR_HELP(FALSE) ENDIF ENDIF #ENDIF ENDIF ENDIF LAUNCHER_CUSTOM_APPROACH_WAIT() BREAK CASE RUN_SCRIPT //PRINTLN("RUN_SCRIPT") SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_CONTEXT) // Only run once we've loaded. IF HAS_SCRIPT_LOADED(scriptToRun) IF (iContextIntention != NEW_CONTEXT_INTENTION) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up context intention.") RELEASE_CONTEXT_INTENTION(iContextIntention) ENDIF // If we were told to run, do so. Friend activities don't ping the mission candidate system. // Otherwise we get our launch value from the candidate controller and let it decide if // we've been accepted or rejected. m_enumMissionCandidateReturnValue eLaunchVal eLaunchVal = MCRET_PROCESSING bLaunchedAsFriend = FALSE // For friend activies, auto pass the candidate request if this is a friend activity minigame. IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_FRIEND_ACTIVITY) IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY) OR IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY_WITH_MG) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Auto-passing candidate launch for friend activity!") eLaunchVal = MCRET_ACCEPTED bLaunchedAsFriend = TRUE ENDIF ENDIF // // For replays, auto pass the candidate request. // #IF LAUNCHER_REPLAYS_ENABLED // PRINTLN("RUN_SCRIPT: Auto-passing candidate launch for replay!") // eLaunchVal = MCRET_ACCEPTED // #ENDIF // Poll for permission to launch if we've not already been accepted. IF (eLaunchVal != MCRET_ACCEPTED) eLaunchVal = Request_Mission_Launch(iMissionCandInd, MCTID_CONTACT_POINT, eMinigameMissionType) ENDIF // We were accepted somehow. Launch! IF (eLaunchVal = MCRET_ACCEPTED) CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Candidate request passed. Launching minigame script ", scriptName, ".") #IF LAUNCHER_VARIED_VEHICLE_ENTER IF NOT IS_ENTITY_DEAD(vehicleLaunch) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleLaunch) ENDIF #ENDIF // Clean the vehicle #IF LAUNCHER_VEHICLE_SPAWN IF NOT IS_ENTITY_DEAD(vehicleLaunch) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleLaunch) ENDIF #ENDIF // Clear wanted levels. They must be 0 to get this far but they // may be in the process of being called in. See 446251. IF IS_PLAYER_PLAYING(PLAYER_ID()) CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID()) ENDIF SET_CELLPHONE_PROFILE_TO_NORMAL() // Added for B* 1413571 -AsD // Sober the player up IF g_isPlayerDrunk Make_Ped_Sober(PLAYER_PED_ID()) ENDIF #IF NOT LAUNCHER_IGNORE_PLAYER_CONTROL CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Enabling player control as minigame starts.") SET_PLAYER_CONTROL(PLAYER_ID(), TRUE, SPC_REMOVE_PROJECTILES | SPC_REMOVE_EXPLOSIONS | SPC_REMOVE_FIRES) #ENDIF // Launch! #IF NOT LAUNCHER_CUSTOM_SCRIPT_LAUNCH threadInstance = START_NEW_SCRIPT(scriptToRun, iStackSize) SET_SCRIPT_AS_NO_LONGER_NEEDED(scriptToRun) scriptName = scriptToRun scriptToRun = "" #ENDIF #IF LAUNCHER_CUSTOM_SCRIPT_LAUNCH threadInstance = LAUNCHER_CUSTOM_RUN_SCRIPT() #ENDIF #IF LAUNCHER_CLEAR_SCENE_ON_START CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_SPAWNED_SCENE_CUSTOM) LAUNCHER_CUSTOM_CLEAR_SCENE() #ENDIF // Manage replays... #IF LAUNCHER_REPLAYS_ENABLED IF NOT bIsReplayLaunch Store_Minigame_Replay_Starting_Snapshot(scriptName) ENDIF #ENDIF //g_bLaunchMinigameReplay = FALSE SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) SWITCH_LAUNCHER_STATE(RUN_WAIT) START_TIMER_NOW_SAFE(ojTimer) //starts timer at 0 CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Set odd-job start timer to ", GET_TIMER_IN_SECONDS(ojTimer), " secs.") // Inform the playstats system that a minigame has launched. // TODO: This will need a lot more further work. // Need to standardise how minigames know what variation they are on. IF eMinigame != MINIGAME_NONE SET_RICH_PRESENCE_FOR_SP_MINIGAME(eMinigame) CPRINTLN(DEBUG_FLOW, "Setting RICH PRESENCE for minigame: ", GET_MINIGAME_STAT_ID(eMinigame)) SCRIPT_PLAYSTATS_MISSION_STARTED(GET_MINIGAME_STAT_ID(eMinigame), 0) CPRINTLN(DEBUG_FLOW, "Flagging playstat MISSION STARTED for minigame. Script:", GET_MINIGAME_STAT_ID(eMinigame), " Variation:", 0) ENDIF ELIF (eLaunchVal = MCRET_PROCESSING) LAUNCHER_CUSTOM_LOAD_SCRIPT_WAIT() CDEBUG3LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Still processing mission candidate...") ELIF (eLaunchVal = MCRET_DENIED) CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Failed to secure mission candidate. Cleaning up.") SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF ELSE LAUNCHER_CUSTOM_LOAD_SCRIPT_WAIT() ENDIF BREAK CASE RUN_WAIT //DEBUG_MESSAGE("RUN_WAIT") #IF NOT LAUNCHER_DONT_FADE_DOWN IF NOT IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_FINISHED_INIT_FADE_DOWN) IF IS_SCREEN_FADING_OUT() OR IS_SCREEN_FADED_IN() SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, INPUT_CONTEXT) ELIF IS_SCREEN_FADED_OUT() SET_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_FINISHED_INIT_FADE_DOWN) ENDIF ENDIF #ENDIF //Check if launcher should perform a 1-time event IF IS_BITMASK_AS_ENUM_SET(sLauncherData.iLauncherFlags, LAUNCHER_PERFORM_ONE_TIME_TASK) CLEAR_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHER_PERFORM_ONE_TIME_TASK) PERFORM_ONE_TIME_TASK() ENDIF IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_IF_MISSION_RUNNING) IF NOT IS_AMBIENT_SCRIPT_ALLOWED_TO_RUN(RUN_ON_MISSION_NEVER) AND NOT IS_THREAD_ACTIVE(threadInstance) // Only want to kill ourselves if a mission hasn't started, and that mission is not the script we launch. CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Mission started while we were waiting to launch. Cleaning up.") SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF ENDIF // Normally, we'll just quit when our script is done running. IF NOT IS_THREAD_ACTIVE(threadInstance) CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame thread no longer active. Cleaning up.") PLAYSTATS_ODDJOB_DONE(ROUND(GET_TIMER_IN_SECONDS(ojTimer)*1000), ENUM_TO_INT(eMinigame)) CDEBUG2LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> PLAYSTATS_ODDJOB_DONE(", ROUND(GET_TIMER_IN_SECONDS(ojTimer))*1000, ")") CANCEL_TIMER(ojTimer) CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_FINISHED_INIT_FADE_DOWN) //Set rich presence back to default. SET_DEFAULT_RICH_PRESENCE_FOR_SP() #IF LAUNCHER_VEHICLE_SPAWN IF DOES_ENTITY_EXIST(vehicleLaunch) IF NOT IS_ENTITY_DEAD(vehicleLaunch) SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleLaunch) vehicleLaunch = NULL ENDIF ENDIF #ENDIF // Friend missions don't really get a mission candidate ID. IF bLaunchedAsFriend CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) ELSE // non friend IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) IF IS_BITMASK_AS_ENUM_SET(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_MinigameFailed) // mission failed, cleanup if replays are not enabled #IF NOT LAUNCHER_REPLAYS_ENABLED Mission_Over(iMissionCandInd) iMissionCandInd = NO_CANDIDATE_ID CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) DEBUG_MESSAGE("Clearing the mission candidate.") CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame failed and replay disabled. Cleaning up.") CPRINTLN(DEBUG_REPLAY, "Minigame failed and replay not enabled. Cleaning up.") #ENDIF ELSE // mission passed, cleanup Mission_Over(iMissionCandInd) iMissionCandInd = NO_CANDIDATE_ID CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) DEBUG_MESSAGE("Clearing the mission candidate.") CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame passed. Cleaning up.") CPRINTLN(DEBUG_REPLAY, "Minigame passed. Cleaning up.") ENDIF ENDIF ENDIF // By default, we'll just completely restart. SWITCH_LAUNCHER_STATE(STREAM_ASSETS) // If we're a replay, need to setup a different state, and wait for some notification. #IF LAUNCHER_REPLAYS_ENABLED IF IS_BITMASK_AS_ENUM_SET(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_MinigameFailed) Setup_Minigame_Replay(scriptName) // Since we're doing a replay, we need to wait and see if that'll really happen. CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame failed and replay enabled. Moving to fail screen.") CPRINTLN(DEBUG_REPLAY, "Minigame failed and replay enabled. Moving to fail screen.") SWITCH_LAUNCHER_STATE(WAIT_FOR_FAILSCREEN_REPLAY) ELSE CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame passed and replay enabled. Resetting replay.") CPRINTLN(DEBUG_REPLAY, "Minigame passed and replay enabled. Resetting replay.") Reset_All_Replay_Variables() ENDIF bIsReplayLaunch = FALSE #ENDIF // Inform the playstats system that a minigame has passed/failed. // TODO: This will need a lot more further work. // Need to standardise how minigames know what variation they are on. IF eMinigame != MINIGAME_NONE IF IS_BITMASK_AS_ENUM_SET(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_MinigameFailed) PLAYSTATS_MISSION_CHECKPOINT(GET_MINIGAME_STAT_ID(eMinigame), 0, g_replayMissionStage, 0) SCRIPT_PLAYSTATS_MISSION_OVER(GET_MINIGAME_STAT_ID(eMinigame), 0, g_replayMissionStage, TRUE) CPRINTLN(DEBUG_FLOW, "Flagging playstat MISSION FAILED for minigame. ID:", GET_MINIGAME_STAT_ID(eMinigame), " Variation:", 0) ELSE PLAYSTATS_MISSION_CHECKPOINT(GET_MINIGAME_STAT_ID(eMinigame), 0, g_replayMissionStage, 0) SCRIPT_PLAYSTATS_MISSION_OVER(GET_MINIGAME_STAT_ID(eMinigame), 0, g_replayMissionStage) CPRINTLN(DEBUG_FLOW, "Flagging playstat MISSION PASSED for minigame. ID:", GET_MINIGAME_STAT_ID(eMinigame), " Variation:", 0) ENDIF ENDIF // Regardless, flag this script as over. LAUNCHER_CUSTOM_SCRIPT_END() CLEAR_BITMASK_AS_ENUM(sLauncherData.iLauncherFlags, LAUNCHED_SCRIPT_MinigameFailed) // We may have just been told to shut down. IF IS_BITMASK_AS_ENUM_SET(launcherFlags, LAUNCHER_SHUTDOWN_FORCED_ON_FINISH) CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher cleaning up after minigame has finished.") SCRIPT_CLEANUP() ENDIF // The script we just ran might have messed with our minigame active bitset state. Re-examine it. IF eMinigame != MINIGAME_NONE CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Double checking minigame is still active after minigame has finished.") #if USE_CLF_DLC IF (g_savedGlobalsClifford.sFlow.isGameflowActive) IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_CLF_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Clifford minigame no longer active. Cleaning up.") SCRIPT_CLEANUP() ENDIF ENDIF #endif #if USE_NRM_DLC IF (g_savedGlobalsnorman.sFlow.isGameflowActive) IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_NRM_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Norman minigame no longer active. Cleaning up.") SCRIPT_CLEANUP() ENDIF ENDIF #endif #if NOT USE_SP_DLC IF (g_savedGlobals.sFlow.isGameflowActive) IF NOT (GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame))) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Minigame no longer active. Cleaning up.") SCRIPT_CLEANUP() ENDIF ENDIF #endif ENDIF ENDIF LAUNCHER_CUSTOM_RUN_WAIT() BREAK CASE WAIT_FOR_FAILSCREEN_REPLAY // Wait for some kind of signal that we should be handling a replay... #IF LAUNCHER_REPLAYS_ENABLED IF (g_replay.replayStageID = RS_ACTIVE) IF g_bLaunchMinigameReplay CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Replay is active. Our script: ", scriptToRun, " Replay script: ", g_replay.replayScriptName, ".") bIsReplayLaunch = TRUE scriptToRun = g_replay.replayScriptName // Launchers with vehicles need to go back to streaming them. #IF LAUNCHER_VEHICLE_SPAWN REQUEST_MODEL(vehicleModel) SWITCH_LAUNCHER_STATE(STREAMING_WAIT) #ENDIF // Launchers without vehicles just need to stream the script and go. #IF NOT LAUNCHER_VEHICLE_SPAWN REQUEST_SCRIPT(scriptToRun) SWITCH_LAUNCHER_STATE(RUN_SCRIPT) #ENDIF ELSE CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> There is no replay available. Running replay reject cleanup.") // No replay...cleanup Mission_Over(iMissionCandInd) iMissionCandInd = NO_CANDIDATE_ID CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) Reset_All_Replay_Variables() bIsReplayLaunch = FALSE SWITCH_LAUNCHER_STATE(STREAM_ASSETS) ENDIF ELIF (g_replay.replayStageID = RS_NOT_REQUIRED) CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Replay refused by player. Running replay reject cleanup.") // Replay rejected...cleanup Mission_Over(iMissionCandInd) iMissionCandInd = NO_CANDIDATE_ID CLEAR_BITMASK_AS_ENUM(launcherFlags, LAUNCHER_MISSION_CANDIDATE_STARTED) Reset_All_Replay_Variables() bIsReplayLaunch = FALSE SWITCH_LAUNCHER_STATE(STREAM_ASSETS) ENDIF #ENDIF // If we magically get here somehow, break out. #IF NOT LAUNCHER_REPLAYS_ENABLED SWITCH_LAUNCHER_STATE(STREAM_ASSETS) #ENDIF BREAK CASE CLEANUP_LAUNCHER CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Cleaning up launcher.") SCRIPT_CLEANUP() BREAK CASE WAIT_FOR_TERMINATE IF (fFlatSquaredPlayerDistanceToLauncher > (fLauncherShutdownDist*fLauncherShutdownDist)) // We use vdist2 and square the check dist to save performance //prevent the blip from being destroyed. IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Turning blip back on before terminating.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL ENDIF SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF BREAK CASE UNLOAD_ASSETS CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Releasing assets as we enter WAIT state.") LAUNCHER_CUSTOM_RELEASE_ASSETS() IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Turning blip off as we unload assets.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, FALSE) ENDIF IF iContextIntention != NEW_CONTEXT_INTENTION RELEASE_CONTEXT_INTENTION(iContextIntention) ENDIF IF NOT IS_STRING_NULL_OR_EMPTY(helpButtonPress) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(helpButtonPress) CDEBUG1LN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Clearing button help text as we eneter WAIT state.") CLEAR_HELP() ENDIF ENDIF SWITCH_LAUNCHER_STATE(IDLE_WAIT) BREAK CASE IDLE_WAIT IF iFrameCount % SLEEP_MODE_POLL_FREQ = 0 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF eLauncherSleepReason = ASLEEP_WAITING_FOR_MISSION IF eLauncherSleepReason = ASLEEP_WAITING_FOR_MISSION IF CAN_MISSION_TYPE_START_AGAINST_CURRENT_TYPE(eMinigameMissionType) #if USE_CLF_DLC AND GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_CLF_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #if USE_NRM_DLC AND GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_NRM_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #if not USE_CLF_DLC #if not USE_NRM_DLC AND GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(eMinigame)) #endif #endif CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher is safe to run. Exiting sleep mode.") //switch launcher back on LAUNCHER_CUSTOM_SCRIPT_INIT() IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Turning blip back on as launcher comes out of sleep mode.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) ENDIF SWITCH_LAUNCHER_STATE(STREAM_ASSETS) ENDIF ENDIF ELIF eLauncherSleepReason = ASLEEP_WAITING_FOR_PLAYER_TO_LEAVE IF (fFlatSquaredPlayerDistanceToLauncher > (fLauncherShutdownDist*fLauncherShutdownDist)) // We use vdist2 and square the check dist to save performance //prevent the blip from being destroyed. IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<",GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player left shutdown range while in IDLE_WAIT. Turning blip back on before cleaning up.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) eLauncherStaticBlip = STATIC_BLIP_NAME_DUMMY_FINAL ENDIF PRINTLN("Too far away from launcher! Cleaning up! fFlatSquaredPlayerDistanceToLauncher is... ", fFlatSquaredPlayerDistanceToLauncher, " and fLauncherShutdownDist*fLauncherShutdownDist is... ", fLauncherShutdownDist*fLauncherShutdownDist) SWITCH_LAUNCHER_STATE(CLEANUP_LAUNCHER) ENDIF ELIF eLauncherSleepReason = ASLEEP_WAITING_FOR_PLAYER_TO_SPAWN_VEH IF fFlatSquaredPlayerDistanceToLauncher > (LAUNCHER_VEHICLE_SPAWN_DISTANCE+5)*(LAUNCHER_VEHICLE_SPAWN_DISTANCE+5) //5 meter difference. just in case! CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Launcher is safe to spawn veh!. Exiting sleep mode.") //switch launcher back on LAUNCHER_CUSTOM_SCRIPT_INIT() IF eLauncherStaticBlip != STATIC_BLIP_NAME_DUMMY_FINAL CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Turning blip back on as launcher comes out of sleep mode.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) ENDIF SWITCH_LAUNCHER_STATE(STREAM_ASSETS) ENDIF ENDIF ELSE CPRINTLN(DEBUG_MG_LAUNCHER, "<", GET_MINIGAME_DISPLAY_STRING_FROM_ID(eMinigame), "> Player was detected injured! Turning blip back on as launcher comes out of sleep mode.") SET_STATIC_BLIP_ACTIVE_STATE(eLauncherStaticBlip, TRUE) ENDIF ELSE iFrameCount++ ENDIF BREAK ENDSWITCH ENDIF WAIT(0) ENDWHILE ENDSCRIPT