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, <>, 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, <>, 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, <>, TRUE, TRUE) RETURN TRUE ENDIF ENDIF ELSE IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), pos, <>, 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, <>, FALSE, TRUE, TM_IN_VEHICLE) IS_ENTITY_AT_COORD(PLAYER_PED_ID(), pos, <>, 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, <>, 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