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

867 lines
30 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Assassin_Shared.sch //
// AUTHOR : Mike Bagley //
// DESCRIPTION : Shared functions for assassinations //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "minigame_stats_tracker_helpers.sch"
USING "oddjob_aggro.sch"
USING "script_player.sch"
USING "cutscene_public.sch"
USING "script_oddjob_funcs.sch"
USING "timer_public.sch"
USING "shop_public.sch"
USING "cheat_controller_public.sch"
// ********************************** Script Globals *************************************
AGGRO_ARGS aggroArgs
CUTSCENE_ARGS cutArgs
EAggro aggroReason
FLOAT fTimeTaken
FLOAT fBaseReward
FLOAT fBonusReward
BOOL bBonus
BOOL bHaveRetryOnce = FALSE
BOOL bResultsCreated
BOOL bGrabbedDistance = FALSE
FLOAT fStoredDistance
//BOOL bWarningHelp
//CAMERA_INDEX camKill
CAMERA_INDEX camHint
INT iKillCamStage
INT iCutsceneStartTime
INT iMissionPercentage = 100 // Default to 100
INT iMedal = 3 // Default to Gold
structTimer assFailTimer
END_SCREEN_DATASET assassinationEndScreen
//END RESULTS SCREEN STUFF
STRUCT END_RESULTS_LABELS
TEXT_LABEL_23 tlMissionPassed
TEXT_LABEL_23 tlMissionName
// TEXT_LABEL_23 tlTargetTime
TEXT_LABEL_23 tlTimeTaken
TEXT_LABEL_23 tlBaseReward
TEXT_LABEL_23 tlBonusDesc
TEXT_LABEL_23 tlCashEarned
TEXT_LABEL_23 tlCompletionGold
TEXT_LABEL_23 tlCompletionSilver
TEXT_LABEL_23 tlCompletionBronze
TEXT_LABEL_23 tlCompletionNoMedal
TEXT_LABEL_23 tlContinue
ENDSTRUCT
END_RESULTS_LABELS endLabel
ENUM PASS_REASON_ENUM
PASS_STANDARD = 0,
PASS_BONUS
ENDENUM
// ********************************** ************** *************************************
// ********************************** DEBUG ONLY FUNCTIONS *************************************
#IF IS_DEBUG_BUILD
STRUCT DEBUG_POS_DATA
BOOL bTurnOnDebugPos
VECTOR vDebugVector
FLOAT fDebugFloat
FLOAT fDebugX
FLOAT fDebugY
FLOAT fdebugWidth
FLOAT fdebugHeight
FLOAT fRotateX
FLOAT fRotateY
FLOAT fRotateZ
FLOAT fOffsetX
FLOAT fOffsetY
FLOAT fOffsetZ
FLOAT fFOV
ENTITY_INDEX myObject
VECTOR myObjectPos
ENDSTRUCT
PROC AddWidgets(DEBUG_POS_DATA& myData)
// UNUSED_PARAMETER(myData)
START_WIDGET_GROUP("Assassin")
ADD_WIDGET_BOOL("turn on positioning", myData.bTurnOnDebugPos)
ADD_WIDGET_VECTOR_SLIDER("DebugPosition", myData.vDebugVector, -2000, 2000, 0.01)
ADD_WIDGET_FLOAT_SLIDER("DebugRotation", myData.fDebugFloat, -360, 360, 1.0)
ADD_WIDGET_FLOAT_SLIDER("DebugX", myData.fDebugX, 0, 1, 0.01)
ADD_WIDGET_FLOAT_SLIDER("DebugY", myData.fDebugY, 0, 1, 0.01)
ADD_WIDGET_FLOAT_SLIDER("DebugWidth", myData.fdebugWidth, 0, 2, 0.01)
ADD_WIDGET_FLOAT_SLIDER("DebugHeight", myData.fdebugHeight, 0, 2, 0.01)
ADD_WIDGET_FLOAT_SLIDER("RotateX", myData.fRotateX, 0, 360, 1)
ADD_WIDGET_FLOAT_SLIDER("RotateY", myData.fRotateY, 0, 360, 1)
ADD_WIDGET_FLOAT_SLIDER("RotateZ", myData.fRotateZ, 0, 360, 1)
ADD_WIDGET_FLOAT_SLIDER("OffsetX", myData.fOffsetX, -2000, 2000, 0.1)
ADD_WIDGET_FLOAT_SLIDER("OffsetY", myData.fOffsetY, -2000, 2000, 0.1)
ADD_WIDGET_FLOAT_SLIDER("OffsetZ", myData.fOffsetZ, -2000, 2000, 0.1)
ADD_WIDGET_FLOAT_SLIDER("FOV", myData.fFOV, 0, 125, 0.1)
STOP_WIDGET_GROUP()
ENDPROC
#ENDIF
// ********************************** ************** *************************************
PROC GIVE_PLAYER_WEAPONS(WEAPON_TYPE wtWeapon, INT iDesiredAmmoCount)
INT iAmmoCount
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), wtWeapon)
PRINTLN("PLAYER HAS WEAPON ALREADY")
iAmmoCount = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtWeapon)
PRINTLN("NUMBER OF AMMO 01 = ", iAmmoCount)
IF iAmmoCount < iDesiredAmmoCount
SET_PED_AMMO(PLAYER_PED_ID(), wtWeapon, iDesiredAmmoCount)
PRINTLN("GIVING PLAYER WEAPON WITH AMMO")
ENDIF
ELSE
iAmmoCount = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), wtWeapon)
PRINTLN("NUMBER OF AMMO 02 = ", iAmmoCount)
IF iAmmoCount < iDesiredAmmoCount
SET_PED_AMMO(PLAYER_PED_ID(), wtWeapon, iDesiredAmmoCount)
ENDIF
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), wtWeapon, 0, FALSE, FALSE)
PRINTLN("GIVING PLAYER WEAPON")
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE(FLOAT fVehicleStopDist = 5.0, BOOL bUseExraSecondDelay = TRUE)
VEHICLE_INDEX vehPlayer
IF ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()),
fVehicleStopDist, 1) AND NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID()))
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_TIMER_STARTED(cutArgs.cutSceneTimer)
RESTART_TIMER_NOW(cutArgs.cutSceneTimer)
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) //handle instance of player trying to ghost ride his vehicle into the scene
vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
SET_VEHICLE_FORWARD_SPEED(vehPlayer, 0)
ENDIF
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ELSE
//delay intro cutscene for a second so that it isnt such an abrupt transition from gameplay to cutscene
IF GET_TIMER_IN_SECONDS(cutArgs.cutSceneTimer) > 1
OR bUseExraSecondDelay = FALSE
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_READY_FOR_ASSASSINATION_CUTSCENE_WASHER()
VEHICLE_INDEX vehPlayer
IF ( IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_ENTITY_IN_AIR(PLAYER_PED_ID()))
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_TIMER_STARTED(cutArgs.cutSceneTimer)
RESTART_TIMER_NOW(cutArgs.cutSceneTimer)
IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE()) //handle instance of player trying to ghost ride his vehicle into the scene
vehPlayer = GET_PLAYERS_LAST_VEHICLE()
IF IS_VEHICLE_DRIVEABLE(vehPlayer)
SET_VEHICLE_FORWARD_SPEED(vehPlayer, 0)
ENDIF
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ELSE
//delay intro cutscene for a second so that it isnt such an abrupt transition from gameplay to cutscene
IF GET_TIMER_IN_SECONDS(cutArgs.cutSceneTimer) > 1
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//removes a specific blip and prints a specified message
PROC REMOVE_BLIP_AND_PRINT_OBJECTIVE_MSG_IF_WANTED(BLIP_INDEX blipToRemove, STRING msgToDisplay)
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
IF DOES_BLIP_EXIST(blipToRemove)
REMOVE_BLIP(blipToRemove)
CLEAR_PRINTS()
PRINT_NOW(msgToDisplay, DEFAULT_GOD_TEXT_TIME, 1)
ENDIF
ENDIF
ENDPROC
PROC SET_PLAYER_WANTED_LEVEL_NO_DROP_NOW(INT playerWantedLevel = 1, FLOAT fDifficulty = 0.1, FLOAT fWantedMultiplier = 0.3)
SET_PLAYER_WANTED_LEVEL_NO_DROP(PLAYER_ID(), playerWantedLevel)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), fDifficulty)
SET_WANTED_LEVEL_MULTIPLIER(fWantedMultiplier)
ENDPROC
FUNC BOOL HANDLE_FRANKLIN_PLAYING_TARGET_KILL_LINE(BOOL& bBoolToFlipWhenPlayed, structPedsForConversation &YourPedStruct, STRING WhichBlockOfTextToLoad, STRING WhichRootLabel, enumConversationPriority PassedConversationPriority,
enumSubtitlesState ShouldDisplaySubtitles = DO_NOT_DISPLAY_SUBTITLES, enumBriefScreenState ShouldAddToBriefScreen = DO_ADD_TO_BRIEF_SCREEN, BOOL cloneConversation = FALSE)
IF NOT bBoolToFlipWhenPlayed
IF CREATE_CONVERSATION(YourPedStruct, WhichBlockOfTextToLoad, WhichRootLabel, PassedConversationPriority, ShouldDisplaySubtitles, ShouldAddToBriefScreen, cloneConversation)
PRINTLN("FRANKLIN PLAYING KILL LINE")
bBoolToFlipWhenPlayed = TRUE
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_STATS()
// -------------------------------------------HOTEL-------------------------------------------
IF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Assassin_Valet")) = 1)
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_TIME, FLOOR(fTimeTaken), TRUE)
PRINTLN("HOTEL STATS: TIME - ", FLOOR(fTimeTaken))
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_SNIPER_USED, 1, TRUE)
PRINTLN("HOTEL STATS: BONUS IS TRUE")
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_SNIPER_USED, 0, TRUE)
PRINTLN("HOTEL STATS: BONUS IS FALSE")
ENDIF
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_CASH, ROUND(fBonusReward + fBaseReward), TRUE)
PRINTLN("HOTEL STATS: MONEY - ", ROUND(fBonusReward + fBaseReward))
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_CASH, ROUND(fBaseReward), TRUE)
PRINTLN("HOTEL STATS: MONEY - ", ROUND(fBaseReward))
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_PERCENT, iMissionPercentage, TRUE)
PRINTLN("HOTEL STATS: PERCENTAGE - ", iMissionPercentage)
INFORM_MISSION_STATS_OF_INCREMENT(ASS1_MIRROR_MEDAL, iMedal, TRUE)
PRINTLN("HOTEL STATS: MEDAL - ", iMedal)
// -------------------------------------------MULTI-------------------------------------------
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Assassin_Multi")) = 1)
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_TIME, FLOOR(fTimeTaken), TRUE)
PRINTLN("MULTI STATS: TIME - ", FLOOR(fTimeTaken))
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_QUICKBOOL, 1, TRUE)
PRINTLN("MULTI STATS: BONUS IS TRUE")
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_QUICKBOOL, 0, TRUE)
PRINTLN("MULTI STATS: BONUS IS FALSE")
ENDIF
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_CASH, ROUND(fBonusReward + fBaseReward), TRUE)
PRINTLN("MULTI STATS: MONEY - ", ROUND(fBonusReward + fBaseReward))
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_CASH, ROUND(fBaseReward), TRUE)
PRINTLN("MULTI STATS: MONEY - ", ROUND(fBaseReward))
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_PERCENT, iMissionPercentage, TRUE)
PRINTLN("MULTI STATS: PERCENTAGE - ", iMissionPercentage)
INFORM_MISSION_STATS_OF_INCREMENT(ASS2_MIRROR_MEDAL, iMedal, TRUE)
PRINTLN("MULTI STATS: MEDAL - ", iMedal)
// -------------------------------------------VICE-------------------------------------------
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Assassin_Hooker")) = 1)
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_TIME, FLOOR(fTimeTaken), TRUE)
PRINTLN("VICE STATS: TIME - ", FLOOR(fTimeTaken))
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_CLEAN_ESCAPE, 1, TRUE)
PRINTLN("VICE STATS: BONUS IS TRUE")
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_CLEAN_ESCAPE, 0, TRUE)
PRINTLN("VICE STATS: BONUS IS FALSE")
ENDIF
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_CASH, ROUND(fBonusReward + fBaseReward), TRUE)
PRINTLN("VICE STATS: MONEY - ", ROUND(fBonusReward + fBaseReward))
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_CASH, ROUND(fBaseReward), TRUE)
PRINTLN("VICE STATS: MONEY - ", ROUND(fBaseReward))
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_PERCENTAGE, iMissionPercentage, TRUE)
PRINTLN("VICE STATS: PERCENTAGE - ", iMissionPercentage)
INFORM_MISSION_STATS_OF_INCREMENT(ASS3_MIRROR_MEDAL, iMedal, TRUE)
PRINTLN("VICE STATS: MEDAL - ", iMedal)
// -------------------------------------------BUS-------------------------------------------
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Assassin_Bus")) = 1)
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_TIME, FLOOR(fTimeTaken), TRUE)
PRINTLN("BUS STATS: TIME - ", FLOOR(fTimeTaken))
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_HIT_AND_RUN, 1, TRUE)
PRINTLN("BUS STATS: BONUS IS TRUE")
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_HIT_AND_RUN, 0, TRUE)
PRINTLN("BUS STATS: BONUS IS FALSE")
ENDIF
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_CASH, ROUND(fBonusReward + fBaseReward), TRUE)
PRINTLN("BUS STATS: MONEY - ", ROUND(fBonusReward + fBaseReward))
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_CASH, ROUND(fBaseReward), TRUE)
PRINTLN("BUS STATS: MONEY - ", ROUND(fBaseReward))
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_PERCENTAGE, iMissionPercentage, TRUE)
PRINTLN("BUS STATS: PERCENTAGE - ", iMissionPercentage)
INFORM_MISSION_STATS_OF_INCREMENT(ASS4_MIRROR_MEDAL, iMedal, TRUE)
PRINTLN("BUS STATS: MEDAL - ", iMedal)
// -------------------------------------------CONTSTRUCTION-------------------------------------------
ELIF (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Assassin_Construction")) = 1)
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_TIME, FLOOR(fTimeTaken), TRUE)
PRINTLN("CONTSTRUCTION STATS: TIME - ", FLOOR(fTimeTaken))
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_NO_FLY, 1, TRUE)
PRINTLN("CONTSTRUCTION STATS: BONUS IS TRUE")
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_NO_FLY, 0, TRUE)
PRINTLN("CONTSTRUCTION STATS: BONUS IS FALSE")
ENDIF
IF bBonus
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_CASH, ROUND(fBonusReward + fBaseReward), TRUE)
PRINTLN("CONTSTRUCTION STATS: MONEY - ", ROUND(fBonusReward + fBaseReward))
ELSE
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_CASH, ROUND(fBaseReward), TRUE)
PRINTLN("CONTSTRUCTION STATS: MONEY - ", ROUND(fBaseReward))
ENDIF
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_PERCENT, iMissionPercentage, TRUE)
PRINTLN("CONTSTRUCTION STATS: PERCENTAGE - ", iMissionPercentage)
INFORM_MISSION_STATS_OF_INCREMENT(ASS5_MIRROR_MEDAL, iMedal, TRUE)
PRINTLN("CONTSTRUCTION STATS: MEDAL - ", iMedal)
ELSE
SCRIPT_ASSERT("We're not running any Assassination script, but we're trying to update stats!")
ENDIF
ENDPROC
PROC SETUP_RESULTS_UI()
IF NOT bResultsCreated
SET_ENDSCREEN_DATASET_HEADER(assassinationEndScreen, endLabel.tlMissionPassed, g_sMissionStatsName)
fTimeTaken = fTimeTaken * 1000
IF g_bShitskipAccepted //Invalidate stats if shit-skipped the mission
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlTimeTaken, "MTPHPERSKI", FLOOR(fTimeTaken), 0, ESCM_INVALIDATED)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlBonusDesc, "MTPHPERSKI", 0, 0, ESCM_INVALIDATED)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlCashEarned, "MTPHPERSKI", ROUND(fBonusReward + fBaseReward), 0, ESCM_INVALIDATED)
//Reset shitskipped bool
ResetShitskipVariables()
ELSE
IF bHaveRetryOnce
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlTimeTaken, "MTPHPERRET", FLOOR(fTimeTaken), 0, ESCM_INVALIDATED, FALSE)
PRINTLN("bHaveRetryOnce IS TRUE, INVALIDATING TIME STAT")
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_TIME_M_S, endLabel.tlTimeTaken, "", FLOOR(fTimeTaken), 0, ESCM_NO_MARK, FALSE)
PRINTLN("bHaveRetryOnce IS FALSE, VALIDATING TIME STAT")
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(endLabel.tlBaseReward)
// ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_DOLLAR_VALUE, endLabel.tlBaseReward, "", ROUND(fBaseReward), 0, ESCM_NO_MARK, FALSE)
IF bBonus
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlBonusDesc, "", 0, 0, ESCM_CHECKED, FALSE)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_DOLLAR_VALUE, endLabel.tlCashEarned, "", ROUND(fBonusReward + fBaseReward), 0, ESCM_CHECKED, FALSE)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_RAW_STRING, endLabel.tlBonusDesc, "", 0, 0, ESCM_UNCHECKED, FALSE)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_DOLLAR_VALUE, endLabel.tlCashEarned, "", ROUND(fBaseReward), 0, ESCM_NO_MARK, FALSE)
ENDIF
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(assassinationEndScreen, ESEF_DOLLAR_VALUE, endLabel.tlCashEarned, "", ROUND(fBaseReward), 0, ESCM_NO_MARK, FALSE)
ENDIF
ENDIF
BOOL bShitskiped = FALSE
IF g_bShitskipAccepted
INT i
REPEAT g_iMissionStatsBeingTracked i
IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) >= 0
AND NOT g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].bHidden
IF g_MissionStatTrackingArray[i].invalidationReason = MSSIR_SKIP
CPRINTLN(DEBUG_MISSION_STATS, "SHITSKIPPED - stat[", i, "] ", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target))
bShitskiped = TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF bShitskiped = TRUE
iMissionPercentage = 50
iMedal = 1
SET_ENDSCREEN_COMPLETION_LINE_STATE(assassinationEndScreen, TRUE, endLabel.tlCompletionBronze, iMissionPercentage, 0, ESC_PERCENTAGE_COMPLETION, ESMS_BRONZE)
PRINTLN("SHITSKIPPED - NO MEDAL")
ELSE
IF bBonus // You get the bonus, you get Gold.
IF bHaveRetryOnce
iMissionPercentage = 75
iMedal = 2
SET_ENDSCREEN_COMPLETION_LINE_STATE(assassinationEndScreen, TRUE, endLabel.tlCompletionSilver, iMissionPercentage, 0, ESC_PERCENTAGE_COMPLETION, ESMS_SILVER)
PRINTLN("AWARDING - ESMS_SILVER, WITH BONUS")
ELSE
iMissionPercentage = 100
iMedal = 3
SET_ENDSCREEN_COMPLETION_LINE_STATE(assassinationEndScreen, TRUE, endLabel.tlCompletionGold, iMissionPercentage, 0, ESC_PERCENTAGE_COMPLETION, ESMS_GOLD)
PRINTLN("AWARDING - ESMS_GOLD")
ENDIF
ELIF (NOT bBonus AND NOT bHaveRetryOnce) // No bonus, one retry. Silver
iMissionPercentage = 75
iMedal = 2
SET_ENDSCREEN_COMPLETION_LINE_STATE(assassinationEndScreen, TRUE, endLabel.tlCompletionSilver, iMissionPercentage, 0, ESC_PERCENTAGE_COMPLETION, ESMS_SILVER)
PRINTLN("AWARDING - ESMS_SILVER")
ELSE
iMissionPercentage = 50
iMedal = 1
SET_ENDSCREEN_COMPLETION_LINE_STATE(assassinationEndScreen, TRUE, endLabel.tlCompletionBronze, iMissionPercentage, 0, ESC_PERCENTAGE_COMPLETION, ESMS_BRONZE)
PRINTLN("AWARDING - ESMS_BRONZE")
ENDIF
ENDIF
UPDATE_STATS()
PRINTLN("INSIDE - SETUP_RESULTS_UI")
bResultsCreated = TRUE
ENDIF
ENDPROC
PROC CUTSCENE_SKIP_FADE_OUT()
DO_SCREEN_FADE_OUT(500)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDPROC
PROC CUTSCENE_SKIP_FADE_IN()
DO_SCREEN_FADE_IN(1000)
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDPROC
FUNC BOOL IS_PLAYER_SKIPPING_CUTSCENE()
IF TIMERA() >= DEFAULT_CAR_STOPPING_TO_CUTSCENE
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED()
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC INT GET_ASSASSIN_CUTSCENE_START_TIME()
iCutsceneStartTime = GET_GAME_TIMER()
RETURN iCutsceneStartTime
ENDFUNC
FUNC BOOL HAS_TARGET_ESCAPED(PED_INDEX pedToCheck, FLOAT fDistToCheck, FLOAT fFailDistDisregardSightChecks = 0.0)
VEHICLE_INDEX vehToCheck
FLOAT fPlayerDistFromPed
IF DOES_ENTITY_EXIST(pedToCheck)
IF NOT IS_PED_INJURED(pedToCheck)
IF IS_PED_IN_ANY_VEHICLE(pedToCheck)
vehToCheck = GET_VEHICLE_PED_IS_IN(pedToCheck)
fPlayerDistFromPed = GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck)
IF fPlayerDistFromPed > fDistToCheck
IF NOT IS_ENTITY_ON_SCREEN(vehToCheck)
OR IS_ENTITY_OCCLUDED(vehToCheck)
RETURN TRUE
ELSE
IF fFailDistDisregardSightChecks != 0
IF fPlayerDistFromPed > fFailDistDisregardSightChecks
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //since the player could potentially be able to make up some ground while they are still in sight
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) > fDistToCheck
IF NOT IS_ENTITY_ON_SCREEN(pedToCheck)
OR IS_ENTITY_OCCLUDED(pedToCheck)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//Return TRUE if the killcam has finished playing
FUNC BOOL HAS_SLOW_KILLCAM_FINISHED(PED_INDEX pedToFocus, BOOL bPlayCamera = TRUE, BOOL bUseSlowMoEffect = TRUE, FLOAT fSlowestTimeScale = 0.1)
VECTOR vTempCamPos
FLOAT fCutsceneTime
IF bPlayCamera
SWITCH iKillCamStage
CASE 0
//ecit out early if the target is too far away to render the kill camera
vTempCamPos = GET_ENTITY_COORDS(pedToFocus, FALSE)
IF GET_DISTANCE_BETWEEN_COORDS( GET_ENTITY_COORDS(PLAYER_PED_ID()), vTempCamPos ) >= 250.0
PRINTLN("OJAS - ASSASSINATIONS - SKIPPING KILL CAM BECAUSE TARGET IS TOO FAR AWAY!")
RETURN TRUE
ENDIF
GET_ASSASSIN_CUTSCENE_START_TIME()
CLEAR_PRINTS()
CLEAR_HELP()
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
WAIT(0) //wait a frame to make sure that the sniper scope is not displayed on screen during kill cam
ENDIF
// IF NOT DOES_CAM_EXIST(camKill)
// camKill = CREATE_CAMERA()
// SET_CAM_PARAMS(camKill, << vTempCamPos.x - 4.0, vTempCamPos.y + 4.0, vTempCamPos.z + 3.5 >>, <<0,0,0>>, 35)
// ENDIF
// POINT_CAM_AT_PED_BONE(camKill, pedToFocus, BONETAG_HEAD, <<0,0,0>>, FALSE)
//
// SET_CAM_ACTIVE(camKill, TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
IF bUseSlowMoEffect
SET_TIME_SCALE(fSlowestTimeScale)
ENDIF
SETTIMERB(0)
iKillCamStage++
BREAK
CASE 1
IF bUseSlowMoEffect
float fGameSpeed
fGameSpeed = TO_FLOAT(TIMERB() - 40) / 220.0
If fGameSpeed > 1.0
fGameSpeed = 1.0
ENDIF
IF fGameSpeed < fSlowestTimeScale
fGameSpeed = fSlowestTimeScale
endif
SET_TIME_SCALE(fGameSpeed)
fCutsceneTime = 700
ELSE
fCutsceneTime = 2000
ENDIF
if TIMERB() > fCutsceneTime
OR HANDLE_SKIP_CUTSCENE(iCutsceneStartTime)
OR IS_ENTITY_OCCLUDED(pedToFocus)
ODDJOB_EXIT_CUTSCENE()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEAR_HELP(TRUE)
// DESTROY_CAM(camKill)
PRINTLN("KILL CAM FINISHED")
CUTSCENE_SKIP_FADE_IN()
SET_TIME_SCALE(1.0)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
ELSE
SET_TIME_SCALE(1.0)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC KILL_CURRENT_AMBIENT_MISSION_DIALOGUE_IF_TOUCHED(PED_INDEX ped)
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), ped)
IF IS_SCRIPTED_SPEECH_PLAYING(ped)
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Only allow the player to aim and shoot from their current position
PROC DISABLE_PLAYER_ACTIONS()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_WHISTLE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_NEXT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PREV_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LEFT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_RIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_DOWN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_PICKUP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_OUT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_IN_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SNIPER_ZOOM_OUT_ALTERNATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_RELOAD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK1)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK)
ENDPROC
//Cut to a camera shot of the target
//If bAttachToPed then vCamCoords is used as the offset of the ped you are attaching the camera to (otherwise use world coords)
PROC CONTROL_CIRCLE_CAM_CUT_FOR_TARGET(ENTITY_INDEX target, VECTOR vCamCoords, VECTOR vCamRot, BOOL bPointCamAtEntity = TRUE, BOOL bSetCamRenderingFalseOnExit = TRUE)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_PLAYER_ACTIONS()
IF NOT DOES_CAM_EXIST(camHint)
camHint = CREATE_CAMERA(CAMTYPE_SCRIPTED)
SET_CAM_COORD(camHint, vCamCoords)
IF bPointCamAtEntity
POINT_CAM_AT_ENTITY(camHint, target, <<0,0,0>>)
ELSE
POINT_CAM_AT_COORD(camHint, vCamRot)
ENDIF
ENDIF
IF NOT IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
ENDIF
ELSE
IF DOES_CAM_EXIST(camHint)
IF IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, FALSE)
IF bSetCamRenderingFalseOnExit
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DISPLAY_HUD(TRUE)
DISPLAY_RADAR(TRUE)
ENDIF
DESTROY_CAM(camHint)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC KILL_HINT_CAM_IF_ACTIVE()
IF DOES_CAM_EXIST(camHint)
IF IS_CAM_ACTIVE(camHint)
SET_CAM_ACTIVE(camHint, FALSE)
DESTROY_CAM(camHint)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
CLEAR_FOCUS()
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
ENDIF
ENDIF
ENDPROC
FUNC BOOL CAN_ASSASSIN_SPEECH_PLAY(PED_INDEX pedToCheck)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(pedToCheck) < 50
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_NEAR_COORD_AND_NOT_A_TAXI_PASSENGER(VECTOR vLocation, FLOAT fDistToCheck)
IF GET_PLAYER_DISTANCE_FROM_LOCATION(vLocation) <= fDistToCheck
AND NOT IS_PLAYER_A_TAXI_PASSENGER()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_NEAR_ENTITY_AND_NOT_A_TAXI_PASSENGER(ENTITY_INDEX myObject, FLOAT fDistToCheck)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(myObject) <= fDistToCheck
AND NOT IS_PLAYER_A_TAXI_PASSENGER()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_VEHICLE_SAFE_FOR_ASSASSIN_MISSION(VEHICLE_INDEX vehToCheck)
IF DOES_ENTITY_EXIST(vehToCheck)
IF NOT IS_VEHICLE_DRIVEABLE(vehToCheck)
RETURN FALSE
ELSE
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehToCheck, PLAYER_PED_ID())
RETURN FALSE
ENDIF
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
//remove the wanted check from aggro checks
PROC DONT_CHECK_FOR_WANTED_IN_AGGRO_CHECKS()
IF NOT IS_BITMASK_AS_ENUM_SET(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
ENDIF
ENDPROC
//add the wanted bit check for aggro checks
PROC CHECK_FOR_WANTED_IN_AGGRO_CHECKS()
IF IS_BITMASK_AS_ENUM_SET(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
ENDIF
ENDPROC
// put out fires near the player and on their car
PROC STOP_FIRES_AROUND_PLAYER_FOR_CUTSCENE()
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 15)
IF IS_VEHICLE_DRIVEABLE(GET_PLAYERS_LAST_VEHICLE())
STOP_ENTITY_FIRE(GET_PLAYERS_LAST_VEHICLE())
ENDIF
ENDPROC
PROC PREP_PLAYER_FOR_CUTSCENE()
BOOL bPlayerInCar
VEHICLE_INDEX playerVeh
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
playerVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
bPlayerInCar = TRUE
ENDIF
IF bPlayerInCar
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(playerVeh, 5, 3)
ELSE
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
ENDIF
ENDPROC
//Returns TRUE if the player has abandoned the area -
FUNC BOOL HAS_PLAYER_ABANDONED_ASSASSINATION_AREA(BOOL & bWarnBoolToCheck, VECTOR vPosToCheck, STRING warnMsg, FLOAT fFailDist)
FLOAT fCurrentDistance
// //TODO: change this! always returning false now!
// RETURN FALSE
IF NOT bGrabbedDistance
fStoredDistance = GET_PLAYER_DISTANCE_FROM_LOCATION(vPosToCheck)
PRINTLN("fStoredDistance = ", fStoredDistance)
bGrabbedDistance = TRUE
ENDIF
fCurrentDistance = GET_PLAYER_DISTANCE_FROM_LOCATION(vPosToCheck)
// PRINTLN("fCurrentDistance = ", fCurrentDistance)
IF NOT bWarnBoolToCheck
IF fCurrentDistance > (fStoredDistance + (fFailDist/2))
//warn the player
IF NOT IS_MESSAGE_BEING_DISPLAYED()
PRINT_NOW(warnMsg, DEFAULT_GOD_TEXT_TIME, 1)
bWarnBoolToCheck = TRUE
RESTART_TIMER_NOW(assFailTimer)
ENDIF
ENDIF
ELSE
//fail the player if they have been told to return to the location and have ignored it
IF fCurrentDistance > fFailDist
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF IS_TIMER_STARTED(assFailTimer)
IF GET_TIMER_IN_SECONDS(assFailTimer) > 15
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_PLAYER_NEED_SAFE_WARP()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_HELI(PLAYER_PED_ID()) OR IS_PED_IN_ANY_PLANE(PLAYER_PED_ID())
PRINTLN("RETURNING TRUE ON - DOES_PLAYER_NEED_SAFE_WARP")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//functions to fade in and out safely
PROC FADE_IN(INT iTime = 500)
IF NOT IS_SCREEN_FADED_IN()
DO_SCREEN_FADE_IN(iTime)
WHILE NOT IS_SCREEN_FADED_IN()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
PROC FADE_OUT(INT iTime = 500)
IF NOT IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_OUT(iTime)
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_IN_ANY_SHOP_EXCEPT_AMMUNATION()
IF IS_PLAYER_IN_ANY_SHOP()
IF NOT IS_PLAYER_IN_SHOP_OF_TYPE(SHOP_TYPE_GUN)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC