// ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : cost_halo.sch // AUTHOR : Aaron Gandaa // DESCRIPTION : Cost Halo // // ***************************************************************************************** // ***************************************************************************************** //---------------------- // INCLUDES //---------------------- USING "rgeneral_include.sch" USING "RC_Helper_Functions.sch" USING "menu_public.sch" #IF IS_DEBUG_BUILD USING "shared_debug.sch" #ENDIF //---------------------- // ENUM //---------------------- ENUM eHALO_SELECTION APPROACH_HALO, CANTAFFORD_HALO, CUSTOMCHECK_HALO, // if the param in bCustomCheck in the handler update is true go to this DENIED_HALO, // for doing certain checks TRIGGER_HALO, // pressing right with enough LAUNCH_HALO, CLOSED_HALO, DAMAGED_HALO, // if the car is too broken to go in WANTED_HALO, WRONGWAY_HALO ENDENUM ENUM eHALO_TYPE HALO_PED, HALO_VEHICLE, HALO_ALL ENDENUM //---------------------- // STRUCT //---------------------- STRUCT COSTHALO_LAUNCH_STRUCT INT iCandidateID = NO_CANDIDATE_ID VECTOR vec_coord ENDSTRUCT STRUCT COST_HALO BOOL bIsActive = FALSE VECTOR vTriggerPoint STRING sNameHelpText STRING sScriptName eHALO_TYPE haloType = HALO_PED BOOL bClosed = FALSE BOOL bCustomCheck = FALSE INT iCost = 5 FLOAT fTriggerDist = LOCATE_SIZE_MISSION_TRIGGER BOOL bUseAngledArea = FALSE VECTOR vDesiredDirection FLOAT fHeadingTolerance = 360.0 ANGLED_AREA triggerArea ENDSTRUCT STRUCT COSTHALO_HANDLER STRING sActivateString // help string for activation - has to have a substring and number STRING sBrokenString // help string if activity is broken STRING sPoorString // help string if player is too broke for activity - has to have a substring and number STRING sNoWayString // help string if player is denied (eg wrong vehicle type) STRING sWantedString // help string if player is wanted STRING sDamagedString // help string if player is too damaged STRING sCustomString // has to have a substring STRING sWrongWayString // help string if player is pointing the wrong way STRING sUpsideDownString // help string if player is pointing the wrong way BOOL bTriggerHelpShown = FALSE BOOL bShowMarkers = FALSE BOOL bNoWayCheck = FALSE INT iSelectedHalo = -1 eHALO_SELECTION selectState STRING sLastDisplayedString INT iLastDisplayedNumber = 0 BOOL bAllowOnMission = FALSE ENDSTRUCT CONST_FLOAT CARWASH_HEAD_TOLERANCE 15.0 //---------------------- // FUNCTIONS //---------------------- FUNC BOOL IS_COSTHALO_HANDLER_HELP_MESSAGE_BEING_DISPLAYED(COSTHALO_HANDLER& hndlr) IF IS_STRING_NULL_OR_EMPTY(hndlr.sLastDisplayedString) RETURN FALSE ENDIF IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() RETURN FALSE ENDIF // if we are displaying cost halo IF ARE_STRINGS_EQUAL(hndlr.sActivateString, hndlr.sLastDisplayedString) OR ARE_STRINGS_EQUAL(hndlr.sPoorString, hndlr.sLastDisplayedString) RETURN IS_THIS_HELP_MESSAGE_WITH_NUMBER_BEING_DISPLAYED(hndlr.sLastDisplayedString, hndlr.iLastDisplayedNumber) ENDIF RETURN IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hndlr.sLastDisplayedString) ENDFUNC /// PURPOSE: /// Clear Help /// PARAMS: /// hndlr - PROC CLEAR_COSTHALO_HANDLER_HELP(COSTHALO_HANDLER& hndlr) IF IS_COSTHALO_HANDLER_HELP_MESSAGE_BEING_DISPLAYED(hndlr) CPRINTLN(DEBUG_AMBIENT, "[COST_HALO]:Help String being Reset:", hndlr.sLastDisplayedString) CLEAR_HELP() ENDIF hndlr.sLastDisplayedString = NULL hndlr.iLastDisplayedNumber = 0 IF hndlr.bTriggerHelpShown = TRUE CPRINTLN(DEBUG_AMBIENT, "[COST_HALO]:Help Shown Variable being Cleared") hndlr.bTriggerHelpShown = FALSE ENDIF ENDPROC FUNC BOOL IS_STRING_OKAY_FOR_HELP(STRING str) IF IS_HELP_MESSAGE_BEING_DISPLAYED() RETURN FALSE ENDIF RETURN NOT IS_STRING_NULL_OR_EMPTY(str) ENDFUNC FUNC BOOL PRINT_COSTHALO_HELP(COSTHALO_HANDLER& hndlr, STRING textString) IF IS_STRING_NULL_OR_EMPTY(textString) RETURN FALSE ENDIF IF IS_COSTHALO_HANDLER_HELP_MESSAGE_BEING_DISPLAYED(hndlr) OR NOT IS_HELP_MESSAGE_BEING_DISPLAYED() CLEAR_HELP() PRINT_HELP_FOREVER(textString) hndlr.sLastDisplayedString = textString hndlr.iLastDisplayedNumber = 0 hndlr.bTriggerHelpShown = TRUE CPRINTLN(DEBUG_AMBIENT, "[COST_HALO]:Help String being displayed:", hndlr.sLastDisplayedString) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL PRINT_COSTHALO_HELP_WITH_NUMBER(COSTHALO_HANDLER& hndlr, STRING textString, INT number) IF IS_STRING_NULL_OR_EMPTY(textString) RETURN FALSE ENDIF IF IS_COSTHALO_HANDLER_HELP_MESSAGE_BEING_DISPLAYED(hndlr) OR NOT IS_HELP_MESSAGE_BEING_DISPLAYED() CLEAR_HELP() PRINT_HELP_FOREVER_WITH_NUMBER(textString, number) hndlr.sLastDisplayedString = textString hndlr.iLastDisplayedNumber = number hndlr.bTriggerHelpShown = TRUE CPRINTLN(DEBUG_AMBIENT, "[COST_HALO]:Help String being displayed:", hndlr.sLastDisplayedString) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Doesn't allow launching if mission isn't allowed to launch /// RETURNS: /// FUNC BOOL IS_COSTHALO_ALLOWED_TO_LAUNCH(BOOL bAllowOnMission = FALSE) // #IF FEATURE_BUSINESS_BATTLES // IF GB_GET_MEGA_BUSINESS_VARIATION_PLAYER_IS_ON(PLAYER_ID()) != MBV_COLLECT_DJ // #ENDIF IF (bAllowOnMission = FALSE) IF IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE() RETURN FALSE ENDIF ENDIF // #IF FEATURE_BUSINESS_BATTLES // ENDIF // #ENDIF IF IS_PAUSE_MENU_ACTIVE() RETURN FALSE ENDIF IF IS_SYSTEM_UI_BEING_DISPLAYED() RETURN FALSE ENDIF IF IS_CUSTOM_MENU_ON_SCREEN() RETURN FALSE ENDIF IF g_bMissionOverStatTrigger RETURN FALSE ENDIF IF IS_SELECTOR_ONSCREEN(FALSE) RETURN FALSE ENDIF IF IS_PHONE_ONSCREEN() RETURN FALSE ENDIF // #IF FEATURE_BUSINESS_BATTLES // IF GB_GET_MEGA_BUSINESS_VARIATION_PLAYER_IS_ON(PLAYER_ID()) != MBV_COLLECT_DJ // #ENDIF IF IS_PLAYER_CRITICAL_TO_ANY_EVENT(PLAYER_ID()) RETURN FALSE ENDIF // #IF FEATURE_BUSINESS_BATTLES // ENDIF // #ENDIF RETURN TRUE ENDFUNC /// PURPOSE: /// Setups Cost Halo /// PARAMS: /// r - halo reference /// haloType - halo type /// scrpt - the script the halo will launch /// pos - halo position /// cost - cost of the halo /// hlp - name of the object (this goes in the help text) /// closed - does it start off closed /// haloOverride - use this size of the area instead PROC SETUP_COST_HALO(COST_HALO &r, eHALO_TYPE haloType, STRING scrpt, VECTOR pos, INT cost, STRING hlp, BOOL closed = TRUE, FLOAT haloOverride = 0.0) r.sScriptName = scrpt r.vTriggerPoint = pos r.sNameHelpText = hlp r.iCost = cost r.bClosed = closed r.haloType = haloType r.bUseAngledArea = false r.bIsActive = TRUE r.vDesiredDirection = <<0, 0, 0>> r.fHeadingTolerance = 360.0 IF (haloType = HALO_PED) r.fTriggerDist = LOCATE_SIZE_MISSION_TRIGGER ELSE r.fTriggerDist = LOCATE_SIZE_MISSION_TRIGGER * 2.0 ENDIF IF (haloOverride > 0.0) r.fTriggerDist = haloOverride ENDIF ENDPROC /// PURPOSE: /// Setups Cost Halo but using an angled area instead /// PARAMS: /// r - halo reference /// haloType - halo type /// scrpt - the script the halo will launch /// pos1 - position 1 of area /// pos2 - position 2 of area /// width - area width /// cost - /// hlp - /// closed - PROC SETUP_COST_AREA(COST_HALO &r, eHALO_TYPE haloType, STRING scrpt, VECTOR pos1, VECTOR pos2, FLOAT width, INT cost, STRING hlp, BOOL closed = TRUE) r.sScriptName = scrpt r.sNameHelpText = hlp r.iCost = cost r.bClosed = closed r.haloType = haloType r.bUseAngledArea = TRUE r.fTriggerDist = 0.0 r.bIsActive = TRUE r.vDesiredDirection = <<0, 0, 0>> r.fHeadingTolerance = 360.0 SET_ANGLED_AREA(r.triggerArea, pos1, pos2, width) r.vTriggerPoint = GET_ANGLED_AREA_CENTER(r.triggerArea) ENDPROC /// PURPOSE: /// Setup tolerance for halo, object has to be pointing within tol degrees of this direction /// PARAMS: /// r - halo /// dir - direction as vector as rotation /// tol - angle tolerance PROC SETUP_COST_HALO_DIRECTION_TOLERANCE(COST_HALO &r, VECTOR dir, FLOAT tol = 360.0) r.vDesiredDirection = NORMALISE_VECTOR(dir * 5.0) r.fHeadingTolerance = CLAMP(tol, 0, 360.0) ENDPROC /// PURPOSE: /// Shutdown halos - this used to turn of the blips but i'm keeping this function just in case /// PARAMS: /// halo - halo ref PROC SHUTDOWN_COST_HALO(COST_HALO &r) r.bIsActive = FALSE ENDPROC /// PURPOSE: /// Shutdown all halos in array /// PARAMS: /// halo - array ref PROC SHUTDOWN_COST_HALOS(COST_HALO& halo[]) INT i = 0 REPEAT COUNT_OF(halo) i SHUTDOWN_COST_HALO(halo[i]) ENDREPEAT ENDPROC /// PURPOSE: /// Draws the marker /// PARAMS: /// halo - halo ref PROC DRAW_COST_HALO(COST_HALO& halo) IF (halo.bUseAngledArea = TRUE) DEBUG_DRAW_ANGLED_AREA_EX(halo.triggerArea, 255, 100, 0, 100) ELSE DRAW_DEBUG_CIRCLE(halo.vTriggerPoint, halo.fTriggerDist) ENDIF ENDPROC /// PURPOSE: /// Returns True if we in cost halo /// PARAMS: /// halo - halo ref FUNC BOOL IS_PLAYER_IN_COST_HALO(COST_HALO& halo) IS_ENTITY_OK(PLAYER_PED_ID()) IF halo.bIsActive = FALSE RETURN FALSE ENDIF IF IS_SELECTOR_ONSCREEN(FALSE) RETURN FALSE ENDIF IF IS_CUSTOM_MENU_ON_SCREEN() RETURN FALSE ENDIF IF (halo.haloType = HALO_PED) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN FALSE ENDIF ELIF (halo.haloType = HALO_VEHICLE) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN FALSE ENDIF IF (GET_SEAT_PED_IS_IN(PLAYER_PED_ID()) <> VS_DRIVER) RETURN FALSE ENDIF ENDIF IF (halo.bUseAngledArea = TRUE) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IS_PLAYER_IN_COST_HALO halo.triggerArea.vPosition[0]: ",halo.triggerArea.vPosition[0]) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IS_PLAYER_IN_COST_HALO halo.triggerArea.vPosition[1]: ",halo.triggerArea.vPosition[1]) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IS_PLAYER_IN_COST_HALO halo.triggerArea.fWidth: ",halo.triggerArea.fWidth) RETURN IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), halo.triggerArea.vPosition[0], halo.triggerArea.vPosition[1], halo.triggerArea.fWidth) ENDIF //VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IS_PLAYER_IN_COST_HALO halo.vTriggerPoint: ",halo.vTriggerPoint) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IS_PLAYER_IN_COST_HALO halo.fTriggerDist: ",halo.fTriggerDist) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: player coords", vPlayerPos) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: in range: ",IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), halo.vTriggerPoint, halo.fTriggerDist)) RETURN IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), halo.vTriggerPoint, halo.fTriggerDist) ENDFUNC /// PURPOSE: /// Returns True if we aren't in cost halo /// PARAMS: /// halo - halo ref FUNC BOOL IS_PLAYER_OUT_OF_COST_HALO(COST_HALO& halo) ANGLED_AREA ex IF (halo.haloType = HALO_PED) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN TRUE ENDIF ELIF (halo.haloType = HALO_VEHICLE) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN TRUE ENDIF IF (GET_SEAT_PED_IS_IN(PLAYER_PED_ID()) <> VS_DRIVER) RETURN TRUE ENDIF ENDIF IF (halo.bUseAngledArea = FALSE) RETURN NOT IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), halo.vTriggerPoint, halo.fTriggerDist + 2.0) ENDIF ex = EXPAND_ANGLED_AREA(halo.triggerArea, 2.0) RETURN NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), ex.vPosition[0], ex.vPosition[1], ex.fWidth) ENDFUNC /// PURPOSE: /// Test if given vehicle has x amount of tyres burst /// PARAMS: /// vehIndex - vehicle to check /// iNumTyresBurstToReturnTrue - num tyres to be burst inorder to return true /// RETURNS: /// TRUE - if num of burst tyres >= iNumTyresBurstToReturnTrue FUNC BOOL ARE_VEHICLE_TYRES_BURST(VEHICLE_INDEX vehIndex, INT iNumTyresBurstToReturnTrue = 1) IF IS_VEHICLE_OK(vehIndex) INT iNumBurstTyres = 0 // B*1744975 IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_LEFT) AND IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_RIGHT) RETURN TRUE ENDIF IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_LEFT) AND IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_RIGHT) RETURN TRUE ENDIF IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_LEFT) iNumBurstTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_FRONT_RIGHT) iNumBurstTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_LEFT) iNumBurstTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(vehIndex, SC_WHEEL_CAR_REAR_RIGHT) iNumBurstTyres++ ENDIF IF iNumBurstTyres >= iNumTyresBurstToReturnTrue RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Returns true if the player is in a bust vehicle /// RETURNS: /// FUNC BOOL IS_PLAYER_IN_A_BUST_VEHICLE() VEHICLE_INDEX veh IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN FALSE ENDIF veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF IS_ENTITY_ON_FIRE(veh) RETURN TRUE ENDIF IF IS_VEHICLE_FUCKED(veh) RETURN TRUE ENDIF IF ARE_VEHICLE_TYRES_BURST(veh, 3) RETURN TRUE ENDIF RETURN NOT IS_VEHICLE_DRIVEABLE(veh) ENDFUNC PROC RESET_COST_HALO(COST_HALO& halo) halo.bIsActive = TRUE ENDPROC PROC SET_COSTHALO_HANDLER_STATE(COSTHALO_HANDLER &hndlr, eHALO_SELECTION state) hndlr.selectState = state CLEAR_COSTHALO_HANDLER_HELP(hndlr) CPRINTLN(DEBUG_AMBIENT, "[COST_HALO]:Changing State To:", ENUM_TO_INT(hndlr.selectState)) ENDPROC FUNC BOOL IS_PLAYER_WITHIN_HALO_TOLERANCE(COST_HALO& halo) VECTOR fwd VEHICLE_INDEX veh ENTITY_INDEX ent = PLAYER_PED_ID() IF (halo.fHeadingTolerance = 360.0) RETURN TRUE ENDIF IF IS_VECTOR_ZERO(halo.vDesiredDirection) RETURN TRUE ENDIF // check vehicle is upright IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF IS_ENTITY_OK(veh) fwd = GET_ENTITY_ROTATION(veh) IF (fwd.y > 45) OR (fwd.y < -45) RETURN FALSE ENDIF ent = veh ENDIF ENDIF fwd = GET_ENTITY_FORWARD_VECTOR(ent) IF DOT_PRODUCT_XY(halo.vDesiredDirection, fwd) > COS(halo.fHeadingTolerance) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Updates the cost halos /// PARAMS: /// halo - array of halos /// hndlr - handler reference (string and other stuff) /// bNoWay - if we've passed the no way check /// bFadeLaunch - do we fade when we launch /// RETURNS: /// Returns true if we have launched the script FUNC BOOL UPDATE_COSTHALO_HANDLER(COST_HALO& halo[], COSTHALO_HANDLER& hndlr, BOOL bNoWay = FALSE, BOOL bFadeLaunch = FALSE, BOOL bAutoLaunch = TRUE, INT iStack = DEFAULT_STACK_SIZE) INT i IF (hndlr.bShowMarkers) i = 0 REPEAT COUNT_OF(halo) i DRAW_COST_HALO(halo[i]) ENDREPEAT ENDIF SWITCH (hndlr.selectState) CASE APPROACH_HALO i = 0 IF IS_COSTHALO_ALLOWED_TO_LAUNCH(hndlr.bAllowOnMission) REPEAT COUNT_OF(halo) i IF IS_PLAYER_IN_COST_HALO(halo[i]) AND (halo[i].bIsActive) hndlr.iSelectedHalo = i IF (halo[i].bClosed) OR (GET_MISSION_FLAG() AND (hndlr.bAllowOnMission = FALSE)) SET_COSTHALO_HANDLER_STATE(hndlr, CLOSED_HALO) ELIF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0) SET_COSTHALO_HANDLER_STATE(hndlr, WANTED_HALO) ELIF (bNoWay) SET_COSTHALO_HANDLER_STATE(hndlr, DENIED_HALO) ELIF (halo[i].bCustomCheck) SET_COSTHALO_HANDLER_STATE(hndlr, CUSTOMCHECK_HALO) ELIF (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() < halo[hndlr.iSelectedHalo].iCost) SET_COSTHALO_HANDLER_STATE(hndlr, CANTAFFORD_HALO) ELIF IS_PLAYER_IN_A_BUST_VEHICLE() SET_COSTHALO_HANDLER_STATE(hndlr, DAMAGED_HALO) ELSE SET_COSTHALO_HANDLER_STATE(hndlr, TRIGGER_HALO) ENDIF ENDIF ENDREPEAT ELSE CLEAR_COSTHALO_HANDLER_HELP(hndlr) ENDIF BREAK CASE CUSTOMCHECK_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP(hndlr, hndlr.sCustomString) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR (halo[i].bCustomCheck = FALSE) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE CANTAFFORD_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP_WITH_NUMBER(hndlr, hndlr.sPoorString, halo[hndlr.iSelectedHalo].iCost) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() >= halo[hndlr.iSelectedHalo].iCost) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE CLOSED_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP(hndlr, hndlr.sBrokenString) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR NOT IS_COSTHALO_ALLOWED_TO_LAUNCH(hndlr.bAllowOnMission) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE DENIED_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP(hndlr, hndlr.sNoWayString) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR (bNoWay = FALSE) OR NOT IS_COSTHALO_ALLOWED_TO_LAUNCH(hndlr.bAllowOnMission) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE DAMAGED_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP(hndlr, hndlr.sDamagedString) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR NOT IS_COSTHALO_ALLOWED_TO_LAUNCH(hndlr.bAllowOnMission) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE WANTED_HALO IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP(hndlr, hndlr.sWantedString) ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE WRONGWAY_HALO IF NOT (hndlr.bTriggerHelpShown) IF IS_PLAYER_UPRIGHT() PRINT_COSTHALO_HELP(hndlr, hndlr.sWrongWayString) ELSE PRINT_COSTHALO_HELP(hndlr, hndlr.sUpsideDownString) ENDIF ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR IS_PLAYER_WITHIN_HALO_TOLERANCE(halo[hndlr.iSelectedHalo]) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF BREAK CASE TRIGGER_HALO SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ROOF) DISABLE_SELECTOR_THIS_FRAME() IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0) SET_COSTHALO_HANDLER_STATE(hndlr, WANTED_HALO) RETURN FALSE ENDIF IF (halo[hndlr.iSelectedHalo].bCustomCheck) SET_COSTHALO_HANDLER_STATE(hndlr, CUSTOMCHECK_HALO) RETURN FALSE ENDIF IF IS_PLAYER_OUT_OF_COST_HALO(halo[hndlr.iSelectedHalo]) OR NOT IS_COSTHALO_ALLOWED_TO_LAUNCH(hndlr.bAllowOnMission) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF // don't launch if browser is running IF (g_bBrowserVisible) RETURN FALSE ENDIF #IF FEATURE_SP_DLC_DIRECTOR_MODE //Don't launch if launching director mode IF IS_DIRECTOR_MODE_RUNNING(TRUE) RETURN FALSE ENDIF #ENDIF // need to add wrong type check here IF (halo[hndlr.iSelectedHalo].haloType = HALO_VEHICLE) IF (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR (GET_SEAT_PED_IS_IN(PLAYER_PED_ID()) <> VS_DRIVER)) SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN FALSE ENDIF ENDIF IF (halo[hndlr.iSelectedHalo].bClosed) OR (GET_MISSION_FLAG() AND (hndlr.bAllowOnMission = FALSE)) SET_COSTHALO_HANDLER_STATE(hndlr, CLOSED_HALO) RETURN FALSE ENDIF IF IS_PLAYER_IN_A_BUST_VEHICLE() SET_COSTHALO_HANDLER_STATE(hndlr, DAMAGED_HALO) RETURN FALSE ENDIF IF (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() < halo[hndlr.iSelectedHalo].iCost) SET_COSTHALO_HANDLER_STATE(hndlr, CANTAFFORD_HALO) RETURN FALSE ENDIF IF NOT (hndlr.bTriggerHelpShown) PRINT_COSTHALO_HELP_WITH_NUMBER(hndlr, hndlr.sActivateString, halo[hndlr.iSelectedHalo].iCost) ENDIF // don't let player trigger if they are driving straight through it // cant use a vehicle stuck on roof check as i need to add it so check for roll instead IF (halo[hndlr.iSelectedHalo].haloType = HALO_VEHICLE) /* IF (GET_ENTITY_SPEED(PLAYER_PED_ID()) > 5.0) RETURN FALSE ENDIF */ // if ped is getting out of vehicle don't allow launch IF (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())) RETURN FALSE ENDIF ENDIF IF IS_PAUSE_MENU_ACTIVE() OR IS_SYSTEM_UI_BEING_DISPLAYED() RETURN FALSE ENDIF // don't let a ped this if the player is on foot but on with both feet on the ground IF IS_PED_ON_FOOT(PLAYER_PED_ID()) IF IS_PED_FALLING(PLAYER_PED_ID()) OR IS_PED_JUMPING(PLAYER_PED_ID()) OR IS_PED_JUMPING_OUT_OF_VEHICLE(PLAYER_PED_ID()) RETURN FALSE ENDIF IF IS_PED_RUNNING_RAGDOLL_TASK(PLAYER_PED_ID()) OR IS_PED_RAGDOLL(PLAYER_PED_ID()) OR IS_PED_GETTING_UP(PLAYER_PED_ID()) RETURN FALSE ENDIF IF IS_PED_CLIMBING(PLAYER_PED_ID()) RETURN FALSE ENDIF IF IS_PED_DUCKING(PLAYER_PED_ID()) OR IS_PED_SWIMMING(PLAYER_PED_ID()) RETURN FALSE ENDIF IF (GET_ENTITY_SPEED(PLAYER_PED_ID()) > 0.05) RETURN FALSE ENDIF ENDIF IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT) AND (hndlr.bTriggerHelpShown = TRUE) IF NOT IS_PLAYER_WITHIN_HALO_TOLERANCE(halo[hndlr.iSelectedHalo]) SET_COSTHALO_HANDLER_STATE(hndlr, WRONGWAY_HALO) ELSE SET_COSTHALO_HANDLER_STATE(hndlr, LAUNCH_HALO) ENDIF ENDIF BREAK CASE LAUNCH_HALO CLEAR_COSTHALO_HANDLER_HELP(hndlr) halo[hndlr.iSelectedHalo].bCustomCheck = FALSE IF NOT bAutoLaunch SET_COSTHALO_HANDLER_STATE(hndlr, APPROACH_HALO) RETURN TRUE ENDIF CLEAR_HELP() CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0) IF NOT IS_STRING_NULL_OR_EMPTY(halo[hndlr.iSelectedHalo].sScriptName) REQUEST_SCRIPT(halo[hndlr.iSelectedHalo].sScriptName) WHILE NOT HAS_SCRIPT_LOADED(halo[hndlr.iSelectedHalo].sScriptName) DISABLE_SELECTOR_THIS_FRAME() IF IS_ENTITY_OK(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT g_bInMultiplayer BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 2) SET_VEHICLE_BRAKE_LIGHTS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE) ENDIF ENDIF SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT) REQUEST_SCRIPT(halo[hndlr.iSelectedHalo].sScriptName) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ROOF) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) WAIT(0) ENDWHILE IF (bFadeLaunch) DO_SCREEN_FADE_OUT(250) ENDIF IF HAS_SCRIPT_LOADED(halo[hndlr.iSelectedHalo].sScriptName) IF (bFadeLaunch) WHILE NOT IS_SCREEN_FADED_OUT() IF IS_ENTITY_OK(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT g_bInMultiplayer BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 2) SET_VEHICLE_BRAKE_LIGHTS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), FALSE) ENDIF ENDIF SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ROOF) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_SELECTOR_THIS_FRAME() WAIT(0) ENDWHILE ENDIF START_NEW_SCRIPT(halo[hndlr.iSelectedHalo].sScriptName, iStack) SET_SCRIPT_AS_NO_LONGER_NEEDED(halo[hndlr.iSelectedHalo].sScriptName) RETURN TRUE ENDIF ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC /// PURPOSE: /// Set up default string for halo handler /// PARAMS: /// hndlr - halo handler /// onMission - on mission flag PROC SET_STRINGS_FOR_CARWASH_HALO_HANDLER(COSTHALO_HANDLER &hndlr, BOOL onMission = FALSE) hndlr.sActivateString = "CWASH_RIDEHLP" hndlr.sBrokenString = "" hndlr.sNoWayString = "CWASH_NOWAY" hndlr.sWantedString = "CWASH_WANTED" hndlr.sDamagedString = "CWASH_CARBROKE" hndlr.sCustomString = "CWASH_BLOCKED" hndlr.sWrongWayString = "CWASH_WRONGWAY" hndlr.sUpsideDownString = "CWASH_UPSIDEDO" hndlr.bAllowOnMission = onMission IF NOT g_bInMultiplayer hndlr.sPoorString = "CWASH_NOMONEY" EXIT ENDIF IF IS_PS3_VERSION() OR IS_PLAYSTATION_PLATFORM() hndlr.sPoorString = "CWASH_POOR_PSN" ELIF IS_XBOX360_VERSION() OR IS_XBOX_PLATFORM() hndlr.sPoorString = "CWASH_POOR_XBX" ELSE hndlr.sPoorString = "CWASH_POOR_STD" ENDIF ENDPROC /// PURPOSE: /// Checks if car is allowed in car wash /// PARAMS: /// veh - /// RETURNS: /// FUNC BOOL IS_VEHICLE_MODEL_BLATANTLY_STUPID_FOR_CARWASH(MODEL_NAMES mdl) IF NOT IS_THIS_MODEL_A_CAR(mdl) RETURN TRUE ENDIF SWITCH (mdl) CASE AMBULANCE CASE ARMYTRAILER CASE AIRTUG CASE BIFTA CASE BISON2 CASE BISON3 CASE BODHI2 CASE BOXVILLE CASE BOXVILLE2 CASE BOXVILLE3 CASE BULLDOZER CASE CADDY CASE CADDY2 CASE CADDY3 CASE CUTTER CASE DILETTANTE2 CASE DUBSTA3 CASE DUMP CASE DUNE CASE DLOADER CASE FORKLIFT CASE GUARDIAN CASE GRAINTRAILER CASE HANDLER CASE INSURGENT CASE INSURGENT2 CASE KALAHARI CASE MESA3 CASE MIXER CASE MIXER2 CASE MOWER CASE PACKER CASE PBUS CASE RATLOADER CASE RENTALBUS CASE RHINO CASE RIPLEY CASE RIOT CASE SADLER CASE SADLER2 CASE SANDKING CASE SANDKING2 CASE SCRAP CASE STOCKADE CASE STOCKADE3 CASE TECHNICAL CASE TRACTOR CASE TRACTOR2 CASE TORNADO4 CASE TOURBUS CASE LIMO2 CASE RAPTOR CASE RATLOADER2 CASE DUNE3 CASE DUNE4 CASE DUNE5 CASE VIGILANTE CASE DELUXO CASE CARACARA CASE SCRAMJET CASE MENACER CASE CARACARA2 CASE LOCUST CASE JUGULAR CASE ZORRUSSO CASE FORMULA CASE EVERON CASE ZHABA CASE OUTLAW CASE VAGRANT CASE FORMULA2 CASE MINITANK CASE PEYOTE3 CASE YOUGA3 CASE OPENWHEEL1 CASE OPENWHEEL2 CASE WINKY CASE SLAMTRUCK CASE VETO CASE VETO2 CASE SQUADDIE #IF FEATURE_FIXER CASE COMET7 #ENDIF #IF FEATURE_DLC_1_2022 CASE SM722 CASE DRAUGUR #ENDIF RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC BOOL IS_VEHICLE_BLATANTLY_STUPID_FOR_CARWASH(VEHICLE_INDEX veh) MODEL_NAMES mdl = GET_ENTITY_MODEL(veh) IF IS_VEHICLE_MODEL_BLATANTLY_STUPID_FOR_CARWASH(mdl) RETURN TRUE ENDIF IF (mdl = REGINA) IF IS_VEHICLE_EXTRA_TURNED_ON(veh, 2) RETURN TRUE ENDIF IF IS_VEHICLE_EXTRA_TURNED_ON(veh, 3) AND IS_VEHICLE_EXTRA_TURNED_ON(veh, 4) RETURN TRUE ENDIF ENDIF IF (mdl = BANSHEE) AND IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = PEYOTE) AND IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = COQUETTE) AND NOT DOES_VEHICLE_HAVE_ROOF(veh) //IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = MANANA) AND IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = MESA) AND NOT IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = VOLTIC) AND IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = BOBCATXL) AND NOT IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF IF (mdl = RUINER) IF IS_VEHICLE_EXTRA_TURNED_ON(veh, 3) AND NOT IS_VEHICLE_EXTRA_TURNED_ON(veh, 7) RETURN FALSE ENDIF RETURN TRUE ENDIF IF (mdl = YOSEMITE3) IF GET_VEHICLE_MOD(veh, MOD_CHASSIS) = 4 RETURN TRUE ENDIF ENDIF #IF FEATURE_COPS_N_CROOKS IF (mdl = COQUETTE4) AND NOT DOES_VEHICLE_HAVE_ROOF(veh) //IS_VEHICLE_EXTRA_TURNED_ON(veh, 1) RETURN TRUE ENDIF #ENDIF #IF FEATURE_TUNER IF (mdl = RT3000) AND GET_VEHICLE_MOD(veh, MOD_ROOF) = 3 RETURN TRUE ENDIF #ENDIF #IF FEATURE_DLC_1_2022 IF (mdl = BRIOSO3) SWITCH GET_VEHICLE_MOD(veh, MOD_ROOF) CASE 1 CASE 4 CASE 7 CASE 10 RETURN TRUE ENDSWITCH ENDIF #ENDIF IF mdl = ZR350 AND GET_VEHICLE_MOD(veh, MOD_SPOILER) > 10 RETURN TRUE ENDIF IF mdl = KRIEGER AND GET_VEHICLE_MOD(veh, MOD_SPOILER) > 0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if car is allowed in car wash /// PARAMS: /// veh - /// RETURNS: /// FUNC BOOL IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH(VEHICLE_INDEX veh) VECTOR dMin, dMax #IF IS_DEBUG_BUILD BOOL bPrintReason = TRUE #ENDIF IF NOT IS_ENTITY_ALIVE(veh) RETURN FALSE ENDIF IF NOT DOES_VEHICLE_HAVE_ROOF(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: NOT DOES_VEHICLE_HAVE_ROOF") ENDIF #ENDIF RETURN TRUE ENDIF IF IS_VEHICLE_ATTACHED_TO_TRAILER(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: IS_VEHICLE_ATTACHED_TO_TRAILER") ENDIF #ENDIF RETURN TRUE ENDIF IF NOT IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(veh)) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: NOT NOT IS_THIS_MODEL_A_CAR") ENDIF #ENDIF RETURN TRUE ENDIF IF IS_ENTITY_ON_FIRE(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: NOT IS_ENTITY_ON_FIRE()") ENDIF #ENDIF RETURN TRUE ENDIF #IF FEATURE_DLC_1_2022 IF IS_VEHICLE_A_TEST_DRIVE_VEHICLE(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: IS_VEHICLE_A_TEST_DRIVE_VEHICLE") ENDIF #ENDIF RETURN TRUE ENDIF #ENDIF IF IS_VEHICLE_BLATANTLY_STUPID_FOR_CARWASH(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: IS_VEHICLE_BLATANTLY_STUPID_FOR_CARWASH(") ENDIF #ENDIF RETURN TRUE ENDIF GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh), dMin, dMax) // #IF IS_DEBUG_BUILD // IF bPrintReason // PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: ABSF(dMax.x(",dMax.x,") - dMin.x(",dMin.x,")) > 3.4)") // ENDIF // #ENDIF IF (GET_ENTITY_MODEL(veh) != ZENO) // B*7310301 - don't check width for the Zeno only. IF (ABSF(dMax.x - dMin.x) > 3.4) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: ABSF(dMax.x(",dMax.x,") - dMin.x(",dMin.x,")) > 3.4)") ENDIF #ENDIF RETURN TRUE ENDIF ENDIF IF (ABSF(dMax.z - dMin.z) > 2.9) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: (ABSF(dMax.z - dMin.z) > 2.9)") ENDIF #ENDIF RETURN TRUE ENDIF // B*1439838 - only the machine who owns this can call this IF (g_bInMultiplayer) IF NOT NETWORK_HAS_CONTROL_OF_ENTITY(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: NOT NETWORK_HAS_CONTROL_OF_ENTITY(") ENDIF #ENDIF RETURN FALSE ENDIF ENDIF IF IS_VEHICLE_A_CONVERTIBLE(veh, TRUE) AND NOT DOES_VEHICLE_HAVE_ROOF(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH: IS_VEHICLE_A_CONVERTIBLE(veh, TRUE) AND NOT DOES_VEHICLE_HAVE_ROOF(veh") ENDIF #ENDIF RETURN TRUE ENDIF IF NOT IS_VEHICLE_A_CONVERTIBLE(veh, TRUE) AND NOT DOES_VEHICLE_HAVE_ROOF(veh) #IF IS_DEBUG_BUILD IF bPrintReason PRINTLN("IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH:NOT IS_VEHICLE_A_CONVERTIBLE(veh, TRUE) AND NOT DOES_VEHICLE_HAVE_ROOF(veh)") ENDIF #ENDIF RETURN TRUE ENDIF /* special case for ROOSEVOLT */ IF GET_ENTITY_MODEL(veh) = INT_TO_ENUM(MODEL_NAMES, HASH("btype")) OR GET_ENTITY_MODEL(veh) = BTYPE3 IF IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_LEFT_1)) OR IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_RIGHT_1)) OR IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_LEFT_2)) OR IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_RIGHT_2)) OR IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_LEFT_3)) OR IS_ENTITY_ALIVE(GET_PED_IN_VEHICLE_SEAT(veh, VS_EXTRA_RIGHT_3)) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC