Files
gtav-src/script/dev_ng/singleplayer/include/public/prep_mission_common.sch
T
2025-09-29 00:52:08 +02:00

999 lines
28 KiB
Scheme
Executable File

USING "RC_Area_public.sch"
USING "RC_helper_functions.sch"
USING "RC_threat_public.sch"
ENUM COP_MONITOR
CM_MONITER,
CM_INIT_WANTED,
CM_LOSING_WANTED
ENDENUM
ENUM IN_STEAL_CAR_MONITOR
ISCM_NOT_IN_VEHICLE,
ISCM_IN_VEHICLE,
ISCM_IN_ANY_VEHICLE,
ISCM_IS_TOWING_VEHICLE
ENDENUM
ENUM DYNAMIC_PHONE_STATE
DPS_CHOOSE_PHONE_CALL,
DPS_CONV_STARTED,
DPS_UPDATE_LINE,
DPS_WAITING_LAST_LINE,
DPS_REGISTER_PASS_CALL_AND_QUIT
ENDENUM
/// PURPOSE:
///
/// PARAMS:
/// objstr -
/// Show -
PROC PRINT_OBJ(String objstr, BOOL &Show)
IF NOT Show
PRINT_NOW(objstr, DEFAULT_GOD_TEXT_TIME,0)
CPRINTLN(DEBUG_MISSION, " Showing objective = ", objstr)
Show = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Adds a blip to a location safly checking to see that its not in existance before creatinging it
/// PARAMS:
/// blipIn - The blip index to write the newly created blip to
/// pos - the position to set the blip at
/// route - should the blip have a GPS route
PROC ADD_BLIP_LOCATION(BLIP_INDEX &blipIn, VECTOR pos, BOOL route = TRUE)
IF NOT DOES_BLIP_EXIST(blipIn)
blipIn = CREATE_COORD_BLIP(pos, BLIPPRIORITY_MED, route)
ENDIF
ENDPROC
/// PURPOSE:
/// Adds blip to Peds first checking that the blip doesnt exist then if the ped is ok. Also can set the ped to be enemy blip or not
/// PARAMS:
/// blipIn - The blip index to write the newly created blip to
/// pedindex - The ped to add the blip to
/// bFriendly - Is the ped an enemy if TRUE the blip is blue
PROC ADD_SAFE_BLIP_TO_PED(BLIP_INDEX &blipIn, PED_INDEX pedindex, BOOL bFriendly = FALSE, BOOL bCritical = TRUE)
IF NOT DOES_BLIP_EXIST(blipIn)
blipIn = CREATE_PED_BLIP(pedindex, bCritical, bFriendly)
ENDIF
ENDPROC
/// PURPOSE:
/// Adds blip to vehicle checking blip doesnt exist then that the vehicle does
/// PARAMS:
/// blipIn - The blip index to write the newly created blip to
/// vhc - The vehicle to add the blip to
/// benemy - Is the vehicle an enemy if false the blip is blue
PROC ADD_SAFE_BLIP_TO_VEHICLE(BLIP_INDEX &blipIn, VEHICLE_INDEX vhc, BOOL bFriendly = FALSE)
IF NOT DOES_BLIP_EXIST(blipIn)
blipIn = CREATE_VEHICLE_BLIP(vhc, bFriendly)
ENDIF
ENDPROC
PROC MARK_PREP_START_CAR_AS_VEH_GEN()
VEHICLE_INDEX veh = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(veh)
IF IS_VEHICLE_DRIVEABLE(veh)
CPRINTLN(DEBUG_MISSION, "Setting snapshop vehicle as vehicle get for prep ", GET_THIS_SCRIPT_NAME())
SET_MISSION_VEHICLE_GEN_VEHICLE(veh, GET_ENTITY_COORDS(veh), GET_ENTITY_HEADING(veh))
ELSE
CPRINTLN(DEBUG_MISSION, " vehicle not drivable ", GET_THIS_SCRIPT_NAME())
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "vehicle doesnt exist ", GET_THIS_SCRIPT_NAME())
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// MissionID -
/// RETURNS:
///
FUNC STRING GET_PREP_TAKE_VEHICLE_BACK_OBJ(SP_MISSIONS MissionID, BOOL SecondObj = FALSE)
STRING sObj
SWITCH MissionID
CASE SP_MISSION_FBI_4_PREP_1
sObj = "PRA_TAKBACK"
BREAK
CASE SP_MISSION_FBI_4_PREP_2
sObj = "PRB_TAKBACK"
BREAK
CASE SP_HEIST_FINALE_PREP_A
sObj = "PR_TAKBACK"
BREAK
CASE SP_HEIST_FINALE_PREP_C1
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C2
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C3
IF NOT SecondObj
sObj = "PRF_TAKBACK"
ELSE
sObj = "PRF_GARAGE"
ENDIF
BREAK
ENDSWITCH
RETURN sObj
ENDFUNC
/// PURPOSE:
///
/// PARAMS:
/// MissionID -
/// RETURNS:
///
FUNC STRING GET_PREP_RETURN_TO_VEHICLE_OBJ(SP_MISSIONS MissionID)
STRING sObj
SWITCH MissionID
CASE SP_MISSION_FBI_4_PREP_1
sObj = "PRA_RETVEH"
BREAK
CASE SP_MISSION_FBI_4_PREP_2
sObj = "PRB_RETVEH"
BREAK
CASE SP_HEIST_FINALE_PREP_A
sObj = "PR_RETVEH"
BREAK
CASE SP_HEIST_FINALE_PREP_C1
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C2
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C3
sObj = "PRF_RETVEH"
BREAK
ENDSWITCH
RETURN sObj
ENDFUNC
/// PURPOSE:
///
/// PARAMS:
/// MissionID -
/// RETURNS:
///
FUNC STRING GET_PREP_LEAVE_VEHICLE_OBJ(SP_MISSIONS MissionID)
STRING sObj
SWITCH MissionID
CASE SP_MISSION_FBI_4_PREP_1
sObj = "PRA_LEVVEH"
BREAK
CASE SP_MISSION_FBI_4_PREP_2
sObj = "PRB_LEVVEH"
BREAK
CASE SP_HEIST_FINALE_PREP_A
sObj = "PR_LEVVEH"
BREAK
CASE SP_HEIST_FINALE_PREP_C1
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C2
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C3
sObj = "PRF_LEAVE"
BREAK
ENDSWITCH
RETURN sObj
ENDFUNC
FUNC TEXT_LABEL_15 GET_UPDATE_STRING_FOR_PREP(BOOL bMissionAvailable)
TEXT_LABEL_15 sString
IF bMissionAvailable
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
sString = "FBI4_ISAGO"
BREAK
CASE CHAR_TREVOR
sString = "FBI4_ISAGO"
BREAK
ENDSWITCH
ELSE
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
sString = "FBI4_THATSIT"
BREAK
CASE CHAR_TREVOR
sString = "FBI4_THATSIT"
BREAK
ENDSWITCH
ENDIF
RETURN sString
ENDFUNC
/// PURPOSE:
///
/// PARAMS:
/// MissionID -
/// RETURNS:
///
FUNC MODEL_NAMES GET_PREP_VEHICLE_VALID_MODEL(SP_MISSIONS MissionID)
MODEL_NAMES Name
SWITCH MissionID
CASE SP_MISSION_FBI_4_PREP_1
Name = TRASH
BREAK
CASE SP_MISSION_FBI_4_PREP_2
Name = TOWTRUCK
BREAK
CASE SP_HEIST_FINALE_PREP_A
Name = DUMMY_MODEL_FOR_SCRIPT
BREAK
CASE SP_HEIST_FINALE_PREP_C1
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C2
FALLTHRU
CASE SP_HEIST_FINALE_PREP_C3
Name = GAUNTLET
BREAK
ENDSWITCH
RETURN Name
ENDFUNC
FUNC enumCharacterList GET_CONTACT_TO_CALL()
enumCharacterList returnChar
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
returnChar = CHAR_FRANK_TREV_CONF
BREAK
CASE CHAR_FRANKLIN
returnChar = CHAR_MIKE_TREV_CONF
BREAK
CASE CHAR_TREVOR
returnChar = CHAR_MIKE_FRANK_CONF
BREAK
ENDSWITCH
RETURN returnChar
ENDFUNC
/// PURPOSE:
///
FUNC STRING GET_PASS_CALL_FOR_PLAYER_CHAR()
STRING sCall
SWITCH MISSION_FLOW_GET_RUNNING_MISSION()
CASE SP_MISSION_FBI_4_PREP_1
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sCall = "FBIP1_MENDC"
BREAK
CASE CHAR_FRANKLIN
sCall = "FBIP1_FENDC"
BREAK
CASE CHAR_TREVOR
sCall = "FBIP1_TENDC"
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_2
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sCall = "FBIP2_MENDC"
BREAK
CASE CHAR_FRANKLIN
sCall = "FBIP2_FENDC"
BREAK
CASE CHAR_TREVOR
sCall = "FBIP2_TENDC"
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_4
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sCall = "FBIP4_MENDC"
BREAK
CASE CHAR_FRANKLIN
sCall = "FBIP4_FENDC"
BREAK
CASE CHAR_TREVOR
sCall = "FBIP4_TENDC"
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_5
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
sCall = "FBIP5_MENDC"
BREAK
CASE CHAR_FRANKLIN
sCall = "FBIP5_FENDC"
BREAK
CASE CHAR_TREVOR
sCall = "FBIP5_TENDC"
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN sCall
ENDFUNC
/// PURPOSE:
///
FUNC CC_CommID GET_PASS_COMM_ID_FOR_PLAYER_CHAR()
SWITCH MISSION_FLOW_GET_RUNNING_MISSION()
CASE SP_MISSION_FBI_4_PREP_1
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
RETURN CALL_FIB4_P1_M_DONE
BREAK
CASE CHAR_FRANKLIN
RETURN CALL_FIB4_P1_F_DONE
BREAK
CASE CHAR_TREVOR
RETURN CALL_FIB4_P1_T_DONE
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_2
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
RETURN CALL_FIB4_P2_M_DONE
BREAK
CASE CHAR_FRANKLIN
RETURN CALL_FIB4_P2_F_DONE
BREAK
CASE CHAR_TREVOR
RETURN CALL_FIB4_P2_T_DONE
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_4
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
RETURN CALL_FIB4_P4_M_DONE
BREAK
CASE CHAR_FRANKLIN
RETURN CALL_FIB4_P4_F_DONE
BREAK
CASE CHAR_TREVOR
RETURN CALL_FIB4_P4_T_DONE
BREAK
ENDSWITCH
BREAK
CASE SP_MISSION_FBI_4_PREP_5
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
RETURN CALL_FIB4_P5_M_DONE
BREAK
CASE CHAR_FRANKLIN
RETURN CALL_FIB4_P5_F_DONE
BREAK
CASE CHAR_TREVOR
RETURN CALL_FIB4_P5_T_DONE
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN COMM_NONE
ENDFUNC
PROC REGISTER_PASS_CALL()
enumCharacterList eChar
REPEAT MAX_BATTLE_BUDDIES eChar
PED_INDEX hBuddy = GET_BATTLEBUDDY_PED(eChar)
IF NOT IS_PED_INJURED(hBuddy)
// Does script need to take control of buddy and drive to dest?
IF IS_BATTLEBUDDY_AVAILABLE(hBuddy, FALSE)
EXIT
ENDIF
ENDIF
ENDREPEAT
REGISTER_CALL_FROM_PLAYER_TO_CHARACTER(GET_PASS_COMM_ID_FOR_PLAYER_CHAR(), CT_END_OF_MISSION, GET_CURRENT_PLAYER_PED_ENUM(), GET_CONTACT_TO_CALL(), 9, CC_END_OF_MISSION_QUEUE_TIME, CC_END_OF_MISSION_QUEUE_TIME)
ENDPROC
PROC REGISTER_PASS_CALL_LAST_PREP(BOOL bMissionAvailable)
// enumCharacterList eChar
// REPEAT MAX_BATTLE_BUDDIES eChar
//
// PED_INDEX hBuddy = GET_BATTLEBUDDY_PED(eChar)
//
// IF NOT IS_PED_INJURED(hBuddy)
// // Does script need to take control of buddy and drive to dest?
// IF IS_BATTLEBUDDY_AVAILABLE(hBuddy, FALSE)
// EXIT
// ENDIF
// ENDIF
// ENDREPEAT
IF bMissionAvailable
REGISTER_CALL_FROM_PLAYER_TO_CHARACTER(CALL_FIB4_PREPS_DONE, CT_END_OF_MISSION, GET_CURRENT_PLAYER_PED_ENUM(), CHAR_STEVE, 3, CC_END_OF_MISSION_QUEUE_TIME, CC_END_OF_MISSION_QUEUE_TIME)
ELSE
IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_ASSASSIN_1)
REGISTER_CALL_FROM_PLAYER_TO_CHARACTER(CALL_FIB4_PREPS_DONE_WAIT, CT_END_OF_MISSION, GET_CURRENT_PLAYER_PED_ENUM(), CHAR_STEVE, 3, CC_END_OF_MISSION_QUEUE_TIME, CC_END_OF_MISSION_QUEUE_TIME,VID_BLANK,CID_TEXT_ASS1_REMINDER)
ELSE
REGISTER_CALL_FROM_PLAYER_TO_CHARACTER(CALL_FIB4_PREPS_DONE_WAIT, CT_END_OF_MISSION, GET_CURRENT_PLAYER_PED_ENUM(), CHAR_STEVE, 3, CC_END_OF_MISSION_QUEUE_TIME, CC_END_OF_MISSION_QUEUE_TIME)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
///
/// RETURNS:
///
FUNC BOOL ARE_ALL_OTHER_PREPS_COMPLETE()
INT iCount = 0
INT iPrepMission
FOR iPrepMission = ENUM_TO_INT(SP_MISSION_FBI_4_PREP_1) TO ENUM_TO_INT(SP_MISSION_FBI_4_PREP_5)
CPRINTLN(DEBUG_MISSION, "PREP MISSION = = ", iPrepMission)
IF GET_MISSION_COMPLETE_STATE(INT_TO_ENUM(SP_MISSIONS, iPrepMission))
iCount++
CPRINTLN(DEBUG_MISSION, "iCount = = ", iCount)
ENDIF
ENDFOR
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FBI_4_PREP_3_COMPLETED)
iCount++
CPRINTLN(DEBUG_MISSION, "iCount = = ", iCount)
ENDIF
IF iCount = 4
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_OTHER_STORY_MISSIONS_COMPLETE()
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_FRANKLIN_1)
AND GET_MISSION_COMPLETE_STATE(SP_MISSION_ASSASSIN_1)
AND GET_MISSION_COMPLETE_STATE(SP_MISSION_FAMILY_5)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_FIB4_AVAILABLE_AFTER_PASSED()
IF ARE_ALL_OTHER_PREPS_COMPLETE()
IF (GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2A)
OR GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2B)) //probaly wrong but kinda makes sence testing needed
AND ARE_OTHER_STORY_MISSIONS_COMPLETE()
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_PHONE_STATES(DYNAMIC_PHONE_STATE &state, TEXT_LABEL_15 &sPhoneUpdateString, structPedsForConversation &s_conversation_peds)
SWITCH state
CASE DPS_CHOOSE_PHONE_CALL
IF ARE_ALL_OTHER_PREPS_COMPLETE()
IF (GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2A)
OR GET_MISSION_COMPLETE_STATE(SP_HEIST_DOCKS_2B)) //probaly wrong but kinda makes sence testing needed
AND ARE_OTHER_STORY_MISSIONS_COMPLETE()
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CPRINTLN(DEBUG_MISSION, "All Preps complete and Docks heist is complete, Player is Michael rings steve conv = FBI4_READY" )
REGISTER_PASS_CALL_LAST_PREP(TRUE)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FBI_4_UNLOCKED_FROM_PREP, TRUE)
state = DPS_REGISTER_PASS_CALL_AND_QUIT
ELSE
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
IF PLAYER_MAKE_CONFERENCE_CALL(s_conversation_peds, GET_CONTACT_TO_CALL(), GET_CURRENT_PLAYER_PED_ENUM(), "FBIPRAU", GET_PASS_CALL_FOR_PLAYER_CHAR(), CONV_PRIORITY_VERY_HIGH)
sPhoneUpdateString = GET_UPDATE_STRING_FOR_PREP(TRUE)
CPRINTLN(DEBUG_MISSION, "All Preps complete and Docks heist is complete, Player is NOT MIKE update string = ", sPhoneUpdateString )
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FBI_4_UNLOCKED_FROM_PREP, TRUE)
state = DPS_CONV_STARTED
ENDIF
ENDIF
ELSE
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
CPRINTLN(DEBUG_MISSION, "All Preps complete BUT Docks heist NOT complete, Player is Michael rings steve conv = FBI4_WAIT" )
REGISTER_PASS_CALL_LAST_PREP(FALSE)
state = DPS_REGISTER_PASS_CALL_AND_QUIT
ELSE
ADD_PED_FOR_DIALOGUE(s_conversation_peds, 0, NULL, "MICHAEL")
IF PLAYER_MAKE_CONFERENCE_CALL(s_conversation_peds, GET_CONTACT_TO_CALL(), GET_CURRENT_PLAYER_PED_ENUM(), "FBIPRAU", GET_PASS_CALL_FOR_PLAYER_CHAR(), CONV_PRIORITY_VERY_HIGH)
sPhoneUpdateString = GET_UPDATE_STRING_FOR_PREP(FALSE)
CPRINTLN(DEBUG_MISSION, "All Preps complete BUT Docks heist NOT complete, Player is NOT MIKE update string = ", sPhoneUpdateString, " Normal conversation is = ", GET_PASS_CALL_FOR_PLAYER_CHAR() )
state = DPS_CONV_STARTED
ENDIF
ENDIF
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION, "All preps not complete just a normal call, register and pass mission")
REGISTER_PASS_CALL()
state = DPS_REGISTER_PASS_CALL_AND_QUIT
ENDIF
BREAK
CASE DPS_CONV_STARTED
IF IS_CELLPHONE_CONVERSATION_PLAYING()
CPRINTLN(DEBUG_MISSION, "Call going on script line is = ", GET_CURRENT_SCRIPTED_CONVERSATION_LINE())
IF GET_CURRENT_SCRIPTED_CONVERSATION_LINE() >= 0
CPRINTLN(DEBUG_MISSION, "Setting dynamic line = ", sPhoneUpdateString)
SET_DYNAMIC_BRANCH_FOR_ONGOING_CALL("FBIPRAU", sPhoneUpdateString)
PLAY_DYNAMIC_BRANCH()
state = DPS_WAITING_LAST_LINE
ENDIF
ENDIF
IF WAS_LAST_CELLPHONE_CALL_INTERRUPTED()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "SET call interupted = DPS_WAITING_LAST_LINE") #ENDIF
state = DPS_WAITING_LAST_LINE
ENDIF
BREAK
CASE DPS_UPDATE_LINE
BREAK
CASE DPS_WAITING_LAST_LINE
CPRINTLN(DEBUG_MISSION, "Waiting for the line to finish")
IF NOT IS_CELLPHONE_CONVERSATION_PLAYING()
IF NOT IS_PHONE_ONSCREEN()
IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_ASSASSIN_1)
AND ARE_ALL_OTHER_PREPS_COMPLETE()
Execute_Code_ID(CID_TEXT_ASS1_REMINDER)
CPRINTLN(DEBUG_MISSION, "Execute_Code_ID from script - ", GET_THIS_SCRIPT_NAME())
ENDIF
CPRINTLN(DEBUG_MISSION, "Mobile call isnt going on after waiting for the line to finish")
RETURN TRUE
ENDIF
ENDIF
BREAK
CASE DPS_REGISTER_PASS_CALL_AND_QUIT
CPRINTLN(DEBUG_MISSION, "DPS_REGISTER_PASS_CALL_AND_QUIT - returning true to end mission call has been registered")
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC MONITOR_ENTERING_ANY_VALID_VEHICLE(VEHICLE_INDEX &StealVeh)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF viVeh != StealVeh
IF IS_VEHICLE_OK(viVeh)
IF GET_ENTITY_MODEL(viVeh) = GET_PREP_VEHICLE_VALID_MODEL(MISSION_FLOW_GET_RUNNING_MISSION())
// IF GET_PREP_VEHICLE_VALID_MODEL(MISSION_FLOW_GET_RUNNING_MISSION()) = GAUNTLET
// IF IS_VEHICLE_PLAYER_BOUGHT(viVeh)
// EXIT
// ENDIF
// ENDIF
SAFE_RELEASE_VEHICLE(StealVeh)
StealVeh = viVeh
SET_VEHICLE_AS_RESTRICTED(StealVeh, 1)
SET_ENTITY_AS_MISSION_ENTITY(StealVeh, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MONITOR_ENTERING_ANY_TRUCK(VEHICLE_INDEX &vehSteal, VEHICLE_INDEX &Anyveh)
IF NOT bJumpSkip
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
VEHICLE_INDEX viVeh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF viVeh != vehSteal
IF IS_VEHICLE_OK(viVeh)
MODEL_NAMES mod = GET_ENTITY_MODEL(viVeh)
IF mod = TRASH
Anyveh = vehSteal
SAFE_RELEASE_VEHICLE(vehSteal)
vehSteal = viVeh
SET_VEHICLE_AS_RESTRICTED(vehSteal, 1)
SET_VEHICLE_AS_RESTRICTED(Anyveh, 3)
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehSteal)
SET_ENTITY_AS_MISSION_ENTITY(vehSteal, TRUE, TRUE)
ENDIF
ELIF mod = TOWTRUCK
ENTITY_INDEX ent = GET_ENTITY_ATTACHED_TO_TOW_TRUCK (GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
IF IS_ENTITY_ALIVE(ent)
viVeh = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(ent)
IF GET_ENTITY_MODEL(viVeh) = TRASH
Anyveh = vehSteal
SAFE_RELEASE_VEHICLE(vehSteal)
vehSteal = viVeh
SET_VEHICLE_AS_RESTRICTED(vehSteal, 1)
SET_VEHICLE_AS_RESTRICTED(Anyveh, 3)
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehSteal)
SET_ENTITY_AS_MISSION_ENTITY(vehSteal, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// veh -
/// State -
/// Vehblip -
/// blip -
/// pos -
PROC MONITOR_IN_STEAL_CAR(VEHICLE_INDEX &vehSteal, VEHICLE_INDEX &vehAny, IN_STEAL_CAR_MONITOR &State, BLIP_INDEX &Vehblip, BLIP_INDEX &blip, VECTOR pos, VEHICLE_INDEX vehMission = NULL, BOOL bSecondObj = FALSE, FLOAT fDropoffDist = 8.0)
IF IS_VEHICLE_OK(vehSteal)
SWITCH State
CASE ISCM_NOT_IN_VEHICLE //wait for player to be in the truck
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehSteal)
SAFE_REMOVE_BLIP(Vehblip)
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
IF vehSteal = vehMission
State = ISCM_IN_VEHICLE
ELSE
State = ISCM_IN_ANY_VEHICLE
ENDIF
ELIF IS_PLAYER_TOWING_VEHICLE(vehSteal)
OR IS_PLAYER_FLYING_WITH_ATTACHED_VEHICLE(vehSteal)
SAFE_REMOVE_BLIP(Vehblip)
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
State = ISCM_IS_TOWING_VEHICLE
ELSE
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION(), bSecondObj))
CLEAR_THIS_PRINT(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION(), bSecondObj))
ENDIF
IF MISSION_FLOW_GET_RUNNING_MISSION() != SP_MISSION_FBI_4_PREP_1
MONITOR_ENTERING_ANY_VALID_VEHICLE(vehSteal)
ELSE
MONITOR_ENTERING_ANY_TRUCK(vehSteal, vehAny)
ENDIF
ENDIF
BREAK
CASE ISCM_IN_ANY_VEHICLE
FALLTHRU
CASE ISCM_IN_VEHICLE //watch for player to be in the truck
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehSteal)
AND NOT IS_PLAYER_TOWING_VEHICLE(vehSteal)
AND NOT IS_PLAYER_FLYING_WITH_ATTACHED_VEHICLE(vehSteal)
SAFE_REMOVE_BLIP(blip)
IF NOT IS_ENTITY_AT_COORD(vehSteal, pos, <<fDropoffDist, fDropoffDist, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_IN_VEHICLE)
ADD_SAFE_BLIP_TO_VEHICLE(Vehblip, vehSteal, TRUE)
ENDIF
State = ISCM_NOT_IN_VEHICLE
ENDIF
BREAK
CASE ISCM_IS_TOWING_VEHICLE
IF NOT IS_PLAYER_TOWING_VEHICLE(vehSteal)
AND NOT IS_PLAYER_FLYING_WITH_ATTACHED_VEHICLE(vehSteal)
SAFE_REMOVE_BLIP(blip)
IF NOT IS_ENTITY_AT_COORD(vehSteal, pos, <<fDropoffDist, fDropoffDist, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_IN_VEHICLE)
ADD_SAFE_BLIP_TO_VEHICLE(Vehblip, vehSteal, TRUE)
ENDIF
State = ISCM_NOT_IN_VEHICLE
ENDIF
BREAK
ENDSWITCH
ELSE
IF MISSION_FLOW_GET_RUNNING_MISSION() != SP_MISSION_FBI_4_PREP_1
MONITOR_ENTERING_ANY_VALID_VEHICLE(vehSteal)
ELSE
MONITOR_ENTERING_ANY_TRUCK(vehSteal, vehAny)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// blip -
/// pos -
/// state -
/// inCarState -
/// bObj -
/// expireReturn -
PROC MONITER_PLAYER_WANTED(BLIP_INDEX &blip, VECTOR pos, COP_MONITOR &state, IN_STEAL_CAR_MONITOR inCarState, BOOL &bObj, BOOL &expireReturnWant)
SWITCH state
CASE CM_MONITER
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
state = CM_INIT_WANTED
ENDIF
BREAK
CASE CM_INIT_WANTED
SAFE_REMOVE_BLIP(blip)
IF inCarState = ISCM_IN_VEHICLE
OR inCarState = ISCM_IN_ANY_VEHICLE
OR inCarState = ISCM_IS_TOWING_VEHICLE
CLEAR_PRINTS()
PRINT_NOW("LOSE_WANTED", DEFAULT_GOD_TEXT_TIME, 0)
state = CM_LOSING_WANTED
ENDIF
BREAK
CASE CM_LOSING_WANTED
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
CLEAR_PRINTS()
IF inCarState = ISCM_IN_VEHICLE
OR inCarState = ISCM_IN_ANY_VEHICLE
OR inCarState = ISCM_IS_TOWING_VEHICLE
PRINT_OBJ(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), bObj)
ADD_BLIP_LOCATION(blip, pos)
ELIF inCarState = ISCM_NOT_IN_VEHICLE
AND NOT expireReturnWant
PRINT_NOW(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), DEFAULT_GOD_TEXT_TIME, 0)
expireReturnWant = TRUE
ENDIF
state = CM_MONITER
// ELSE
// IF inCarState = ISCM_NOT_IN_VEHICLE
// AND NOT expireReturnWant
// CLEAR_PRINTS()
// PRINT_NOW(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), DEFAULT_GOD_TEXT_TIME, 0)
// expireReturnWant = TRUE
// ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// veh -
/// pos -
/// blip -
/// bObj -
/// state -
/// inCarState -
/// expireReturnVeh -
/// RETURNS:
///
FUNC BOOL RETURN_STOLEN_VEHICLE(VEHICLE_INDEX veh, VECTOR pos, BLIP_INDEX &blip, COP_MONITOR state, IN_STEAL_CAR_MONITOR inCarState, BOOL &bObj, BOOL &expireReturnVeh, BOOL bSecondObj = FALSE, BOOL bUsePlayerCheck = FALSE, FLOAT fDropoff = LOCATE_SIZE_ANY_MEANS)
IF inCarState = ISCM_IN_VEHICLE
OR inCarState = ISCM_IN_ANY_VEHICLE
OR inCarState = ISCM_IS_TOWING_VEHICLE
IF state = CM_MONITER
ADD_BLIP_LOCATION(blip, pos)
IF NOT bUsePlayerCheck
IF IS_VEHICLE_OK(veh)
IF IS_ENTITY_AT_COORD(veh, pos, <<fDropoff, fDropoff, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE)
RETURN TRUE
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), pos, <<fDropoff, fDropoff, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_IN_VEHICLE)
RETURN TRUE
ENDIF
ENDIF
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
IF NOT IS_PLAYER_IN_ANY_SHOP()
PRINT_OBJ(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION(), bSecondObj), bObj)
ENDIF
ENDIF
ELSE
IF state = CM_MONITER
IF NOT expireReturnVeh
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
PRINT_NOW(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), DEFAULT_GOD_TEXT_TIME, 0)
expireReturnVeh = TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
///
/// PARAMS:
/// veh -
/// pos -
/// blip -
/// inCarstate -
/// copState -
/// forceStop -
/// expireReturnVeh -
/// callTimerDelay -
/// callTimer -
/// bObj -
/// RETURNS:
///
FUNC BOOL LEAVE_VEHICLE_STEAL(VEHICLE_INDEX veh, VECTOR pos, BLIP_INDEX &blip, IN_STEAL_CAR_MONITOR inCarstate, COP_MONITOR copState, BOOL &forceStop, BOOL &expireReturnVeh, INT &callTimerDelay, BOOL &callTimer, BOOL &bObj, FLOAT fDropoff = 8.0)
IF inCarstate = ISCM_IN_VEHICLE
OR inCarState = ISCM_IN_ANY_VEHICLE
OR inCarState = ISCM_IS_TOWING_VEHICLE
IF copState = CM_MONITER
IF IS_VEHICLE_OK(veh)
IF NOT IS_ENTITY_UPSIDEDOWN(veh)
PRINT_OBJ(GET_PREP_LEAVE_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), bObj)
ENDIF
ENDIF
IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), pos, <<fDropoff, fDropoff, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_IN_VEHICLE)
IS_ENTITY_AT_COORD(PLAYER_PED_ID(), pos, <<fDropoff, fDropoff, LOCATE_SIZE_HEIGHT>>, TRUE, TRUE, TM_IN_VEHICLE)
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_LEAVE_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_LEAVE_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
forceStop = TRUE
ADD_BLIP_LOCATION(blip, pos)
ELSE
IF forceStop
FLOAT StopDist = fDropoff/2
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), pos, StopDist)
forceStop = FALSE
STOP_MY_VEHICLE()
ENDIF
ENDIF
SAFE_REMOVE_BLIP(blip)
ENDIF
ENDIF
ELSE
IF IS_ENTITY_AT_COORD(veh, pos, <<fDropoff, fDropoff, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_IN_VEHICLE)
IF callTimerDelay = -1
SET_VEHICLE_DOORS_LOCKED(veh, VEHICLELOCK_LOCKED)
RETURN TRUE
ENDIF
IF NOT callTimer
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_LEAVE_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_PRINTS()
ENDIF
callTimerDelay = GET_GAME_TIMER()
callTimer = TRUE
SET_VEHICLE_DOORS_LOCKED(veh, VEHICLELOCK_LOCKED)
ELSE
IF (GET_GAME_TIMER() - callTimerDelay) > 3000
RETURN TRUE
ENDIF
ENDIF
ELSE
IF GET_VEHICLE_DOOR_LOCK_STATUS(veh) = VEHICLELOCK_LOCKED
SET_VEHICLE_DOORS_LOCKED(veh, VEHICLELOCK_UNLOCKED)
ENDIF
IF NOT expireReturnVeh
IF IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
CLEAR_THIS_PRINT(GET_PREP_TAKE_VEHICLE_BACK_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
ENDIF
IF NOT IS_THIS_PRINT_BEING_DISPLAYED(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()))
PRINT_NOW(GET_PREP_RETURN_TO_VEHICLE_OBJ(MISSION_FLOW_GET_RUNNING_MISSION()), DEFAULT_GOD_TEXT_TIME, 0)
expireReturnVeh = TRUE
ENDIF
ENDIF
forceStop = TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC CLOSE_MASK_SHOP_ON_OTHER_PREP()
IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_FBI_4_PREP_4)
SET_SHOP_IS_AVAILABLE(CLOTHES_SHOP_A_01_VB, FALSE)
ENDIF
ENDPROC
PROC OPEN_MASK_SHOP_ON_OTHER_PREP()
SET_SHOP_IS_AVAILABLE(CLOTHES_SHOP_A_01_VB, TRUE)
ENDPROC
FUNC BOOL IS_CAR_STUCK(VEHICLE_INDEX veh)
IF IS_VEHICLE_OK(veh)
IF IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_ROOF, ROOF_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_JAMMED, JAMMED_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(veh, VEH_STUCK_ON_SIDE, SIDE_TIME)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC INT GET_REQUIRED_CASH_FOR_ITEM(enumBankAccountName ePlayerAccount, INT iAmountNeeded)
INT iCash
iCash = GET_ACCOUNT_BALANCE(ePlayerAccount) - iAmountNeeded
RETURN iCash
ENDFUNC
FUNC BOOL DOES_PLAYER_HAVE_THE_CASH(BOOL bPlayerBoughtThing, INT iAmountNeeded)
IF NOT bPlayerBoughtThing
enumBankAccountName ePlayerAccount
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
ePlayerAccount = BANK_ACCOUNT_MICHAEL
BREAK
CASE CHAR_FRANKLIN
ePlayerAccount = BANK_ACCOUNT_FRANKLIN
BREAK
CASE CHAR_TREVOR
ePlayerAccount = BANK_ACCOUNT_TREVOR
BREAK
ENDSWITCH
IF GET_REQUIRED_CASH_FOR_ITEM(ePlayerAccount, iAmountNeeded) < 0
RETURN FALSE
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
PROC ADD_CURRENT_PLAYER_FOR_DIALOGUE(structPedsForConversation &s_conversation_peds)
INT i
STRING voice
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
i = 0
voice = "MICHAEL"
BREAK
CASE CHAR_FRANKLIN
i = 1
voice = "FRANKLIN"
BREAK
CASE CHAR_TREVOR
i = 2
voice = "TREVOR"
BREAK
ENDSWITCH
ADD_PED_FOR_DIALOGUE(s_conversation_peds, i, PLAYER_PED_ID(), voice)
ENDPROC