// ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : carwash1.sc // AUTHOR : Aaron Gandaa // // ***************************************************************************************** // ***************************************************************************************** //---------------------- // INCLUDES //---------------------- USING "carwash_shared.sch" USING "brains.sch" //---------------------- // VARIABLES //---------------------- CARWASH_HANDLER carWash ASSET_REQUESTER asRequest FLOAT fOriginalDirtLevel // BOOL bSkipped = FALSE BOOL bInCarWash = FALSE BOOL bCarWashBlocked = FALSE BOOL bHasRoof = FALSE BOOL bAudioLoaded = FALSE SHAPETEST_INDEX shapeTest COST_HALO carWashHalo[2] COSTHALO_HANDLER carWashHaloHandler INT iInitialCutTime = 4000 INT iInitialDelay = 3000 VECTOR vShapetestOffset = <<0.2, 0.0, -1.4>>//<<0.2, -0.5, 0.0>> FLOAT fShapetestWidth = 2.2//2.2 FLOAT fShapetestHeight = 3.0//2.4 //---------------------- // DEBUG VARIABLES //---------------------- #IF IS_DEBUG_BUILD WIDGET_GROUP_ID m_WidgetGroup BOOL bQuitScript = FALSE BOOL bDirtyCar = FALSE BOOL bShowDebug = FALSE BOOL bDebugDeposit = FALSE BOOL bNetPlayersDrivingCarwash[NUM_NETWORK_PLAYERS] INT iDamageBitField #ENDIF //---------------------- // DEBUG FUNCTIONS //---------------------- #IF IS_DEBUG_BUILD /// PURPOSE: /// Setups Debug Widgets PROC SETUP_DEBUG_WIDGETS() INT i TEXT_LABEL lbl SET_PROFILING_OF_THIS_SCRIPT(TRUE) m_WidgetGroup = START_WIDGET_GROUP("Carwash") ADD_WIDGET_BOOL("Quit Script", bQuitScript) ADD_WIDGET_BOOL("Dirty Car", bDirtyCar) ADD_WIDGET_BOOL("Show Debug", bShowDebug) ADD_WIDGET_BOOL("Blocked", bCarWashBlocked) ADD_WIDGET_BOOL("In Car Wash", bInCarWash) ADD_WIDGET_BOOL("Halo Custom", carWashHalo[0].bCustomCheck) ADD_WIDGET_BOOL("Debug Deposit", bDebugDeposit) ADD_WIDGET_BOOL("Has Roof", bHasRoof) ADD_WIDGET_INT_SLIDER("Initial Time", iInitialCutTime, 1000, 10000, 100) ADD_WIDGET_INT_SLIDER("Initial Delay", iInitialDelay, 0, 10000, 100) ADD_WIDGET_FLOAT_SLIDER("Box offset x", vShapetestOffset.x, -3.0, 3.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Box offset z", vShapetestOffset.z, -3.0, 3.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Box size x", fShapetestWidth, 0.0, 3.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Box size z", fShapetestHeight, 0.0, 3.0, 0.1) ADD_WIDGET_INT_READ_ONLY("Damage Bitfield", iDamageBitField) SETUP_DEBUG_CARWASH_HANDLER_WIDGETS(carWash) SETUP_DEBUG_CARWASH_CONSTANT_WIDGETS() START_WIDGET_GROUP("Net Carwash Drivers") ADD_WIDGET_BOOL("In Carwash", bInCarWash) REPEAT COUNT_OF(bNetPlayersDrivingCarwash) i lbl = "Player" lbl += i ADD_WIDGET_BOOL(lbl, bNetPlayersDrivingCarwash[i]) ENDREPEAT STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ENDPROC /// PURPOSE: /// Removes Debug Widgets PROC CLEANUP_DEBUG_WIDGETS() IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup) DELETE_WIDGET_GROUP(m_WidgetGroup) ENDIF ENDPROC #ENDIF //---------------------- // SCRIPT FUNCTIONS //---------------------- PROC SCRIPT_CLEANUP(BOOL bSkip = FALSE) DELETE_CARWASH_HANDLER(carWash) CPRINTLN(DEBUG_MISSION, "Carwash Cleanup") SHARED_CARWASH_SCRIPT_CLEANUP(carWash, bSkip) UNLOAD_REQUESTED_ASSETS(asRequest) TERMINATE_THIS_THREAD() ENDPROC PROC SCRIPT_SETUP() // setup the track and cameras CPRINTLN(DEBUG_MISSION, "[CARWASH] - CARWASH 1 - SCRIPT_SETUP") SETUP_CARWASH_TRACK(carWash.cTrack, <<47.6782, -1391.8621, 28.4115>>, <<-5.4552, -1391.8621, 28.2989>>) SETUP_CARWASH_BLOCK_POINTS(carWash.cTrack, <<45.1, -1391.9, 28.7>>, <<1.1, -1391.9, 28.7>>) SETUP_CARWASH_BLOCK_MIN_MAX(carWash.cTrack, <<-1.61825, -1392.04785, 30>>, <<48.67, -1392.05, 30.00>>) CALCULATE_MIN_MAX_FROM_POSITION_AND_RADIUS( <<-7.030046,-1392.319824,28.336014>>, 5.25, carWash.vNoPedWalkMin, carWash.vNoPedWalkMax) SET_CARWASH_WAYPOINT_REC(carWash, "carwash1") carWash.fFinalCameraInterpolate = 0.8 carWash.iLocationID = CARWASH_LOCID_LONG carWash.cTrack.vVehicleSnapPoint = <<58.3062, -1392.1101, 28.9928>> // setup camera SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[0], <<57.0218, -1388.3550, 31.8075>>, <<17.5680, -0.0024, 117.8700>>, <<56.4795, -1388.6339, 30.1578>>, <<-4.4388, -0.0024, 117.2989>>, PICK_INT(g_bInMultiplayer, iInitialCutTime, 7000)) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[0], 34.4668) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[0], -0.02) //-0.092466) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[1], <<28.9995, -1390.5526, 30.1807>>, <<-4.2368, -0.0125, -108.3608>>, <<31.8706, -1390.6946, 30.0388>>, <<-1.9457, -0.0125, -107.5000>>, 6000) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[1], 39.9774) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[1], 0.105879) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[2], <<45.3286, -1389.8623, 29.3692>>, <<2.1520, -0.0125, 108.8446>>, <<45.3630, -1392.8889, 29.3736>>, <<2.1520, -0.0125, 81.5301>>, 6000) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[2], 39.9774) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[2], 0.310310) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[3], <<24.6852, -1395.2002, 31.5041>>, <<-14.0934, -0.2150, -45.2810>>, <<22.9172, -1395.2319, 30.0956>>, <<-12.3702, -0.2150, -2.4293>>, 7000) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[3], 28.1555) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[3], 0.548743) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[4], <<27.0372, -1391.9624, 31.6367>>, <<-13.3479, -0.2150, 88.6287>>, <<27.5526, -1391.9666, 29.4647>>, <<1.0232, -0.2150, 89.3674>>, 9000) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[4], 28.1555) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[4], 0.848018) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[5], <<0.5057, -1394.3345, 29.1631>>, <<2.9577, 0.0000, -66.2075>>, <<0.5057, -1394.3345, 29.1631>>, <<0.1806, -0.0000, 20.2611>>, 7500, 0.7) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[5], 28.1555) SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[5], 1.096745) SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[6], <<-13.0479, -1392.9730, 28.7546>>, <<7.3208, -0.0144, -74.4871>>, <<-12.9594, -1392.9198, 29.2710>>, <<0.1462, -0.0144, -64.7351>>, 6000, 0.45) SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[6], 39.32082) // snap car into place if sp //IF NOT g_bInMultiplayer //SNAP_VEHICLE_TO_CARWASH_START(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), carWash) //ENDIF // Figure out if we're seated high above the ground IS_ENTITY_OK(PLAYER_PED_ID()) // need to entity alive check before doing this... VECTOR vHeadPos = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0,0,0>>) FLOAT fGroundHeight IF GET_GROUND_Z_FOR_3D_COORD(vHeadPos, fGroundHeight) AND vHeadPos.z - fGroundHeight > 1.35 carWash.bTallVehicle = TRUE ENDIF // if not in multiplayer we need to setup camera before switching ipls IF NOT g_bInMultiplayer ENABLE_CAMERA_STRUCT(carWash.carwashCamera[0], carWash.cameraID, carWash.bTallVehicle, TRUE) ENDIF // we load the props here SET_CARWASH_IPL(carWash, BUILDINGNAME_IPL_CARWASH_LONG) IF NETWORK_IS_GAME_IN_PROGRESS() REQUEST_AND_LOAD_CARWASH_ASSETS_MP(asRequest, carWash.sWayPointRec) ELSE REQUEST_AND_LOAD_CARWASH_ASSETS(asRequest, carWash.sWayPointRec) ENDIF // setup carwash parts CREATE_CARWASH_JETS(carWash.soapJets, <<37.0, -1391.8398, 30.9>>, 270.0, 4) SET_CARWASH_JETS_PARTICLES(carWash.soapJets, "ent_amb_car_wash_jet_soap") CARWASH_NETWORK_WAIT() //CREATE_CARWASH_VERTROLLER(carWash.vertRoller, <<20.9, -1391.8398, 28.3279>>, 90.0, 3.0) CREATE_CARWASH_VERTROLLER(carWash.vertRoller, << 20.9, -1391.84, 28.3268 >>, 90.0, 3.25) CARWASH_NETWORK_WAIT() CREATE_CARWASH_HROLLER(carWash.horzRoller, <<28.3, -1391.8398, 30.8>>, 90.0, 28.911366) CARWASH_NETWORK_WAIT() CREATE_CARWASH_JETS(carWash.waterJets, <<13.65, -1391.8398, 30.9>>, 90.0, 4) SET_CARWASH_JETS_PARTICLES(carWash.waterJets, "ent_amb_car_wash_jet") CARWASH_NETWORK_WAIT() CREATE_CARWASH_JETS(carWash.steamJets, <<6.692545,-1391.8398,32.214699>>, 90.0, 5.23, TRUE) SET_CARWASH_JETS_PARTICLES(carWash.steamJets, "ent_amb_car_wash_steam") CARWASH_NETWORK_WAIT() RELEASE_CARWASH_MODEL_ASSETS(asRequest) // Disable car wash scenarios SET_SCENARIO_TYPE_ENABLED("DRIVE", FALSE) SET_SCENARIO_TYPE_ENABLED("WORLD_VEHICLE_DRIVE_SOLO", FALSE) #IF IS_DEBUG_BUILD SETUP_DEBUG_WIDGETS() #ENDIF ENDPROC //---------------------- // UPDATE FUNCTIONS //---------------------- #IF IS_DEBUG_BUILD /// PURPOSE: /// Updates Debug Widgets and draw debug stuff PROC UPDATE_DEBUG_WIDGETS() INT i VECTOR vcMin, vcMax VEHICLE_INDEX veh IF (bQuitScript) SCRIPT_CLEANUP() bQuitScript = FALSE ENDIF IF (bDirtyCar) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) veh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF IS_ENTITY_OK(veh) SET_VEHICLE_DIRT_LEVEL(veh, 14.0) ENDIF ENDIF bDirtyCar = FALSE ENDIF IF (bShowDebug) DRAW_DEBUG_CARWASH(carWash) ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) veh = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF IS_ENTITY_OK(veh) GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh), vcMin, vcMax) DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>)) DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>)) DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>)) DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <>)) ENDIF UPDATE_VEHICLE_DOOR_DAMAGE_BIT_FIELD(veh, iDamageBitField) ENDIF IF bDebugDeposit IF (g_bInMultiplayer) AND NETWORK_IS_GAME_IN_PROGRESS() IF DEPOSIT_VC(COST_CARWASH) //INCREMENT_BY_MP_INT_CHARACTER_STAT(MP_STAT_INTERNET_BANK_BALANCE,1) bDebugDeposit = FALSE ENDIF ELSE bDebugDeposit = FALSE ENDIF ENDIF // tell us who is driving in the carwash REPEAT COUNT_OF(bNetPlayersDrivingCarwash) i bNetPlayersDrivingCarwash[i] = GlobalPlayerBD[i].bDrivingThroughCarwash ENDREPEAT ENDPROC #ENDIF PROC SINGLEPLAYER_SCRIPT() VEHICLE_INDEX washVehicleID IS_ENTITY_OK(PLAYER_PED_ID()) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) CPRINTLN(DEBUG_MISSION, "Carwash is shutting down player is not in vehicle") TERMINATE_THIS_THREAD() ENDIF SET_MISSION_FLAG(TRUE) RC_START_CUTSCENE_MODE(<<0, 0, 0>>, DEFAULT, DEFAULT, DEFAULT, FALSE) STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 60.0) SCRIPT_SETUP() CLEAR_HELP() washVehicleID = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) SET_VEHICLE_THROUGH_CARWASH(washVehicleID, carwash) fOriginalDirtLevel = GET_VEHICLE_DIRT_LEVEL(washVehicleID) bHasRoof = DOES_VEHICLE_HAVE_ROOF(washVehicleID) DUMMY_REFERENCE_BOOL(bHasRoof) WHILE (TRUE) IF NOT IS_ENTITY_OK(washVehicleID) OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR NOT IS_VEHICLE_DRIVEABLE(washVehicleID) REMOVE_CARWASH_STUCK_CHECK(washVehicleID) CHARGE_PLAYER_FOR_CARWASH() CPRINTLN(DEBUG_MISSION, "Carwash - Emergency Breakout - Car wash car is not okay") SCRIPT_CLEANUP() ENDIF #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) SCRIPT_CLEANUP() ENDIF UPDATE_DEBUG_WIDGETS() #ENDIF DISABLE_CONTROL_ACTIONS_FOR_CARWASH() UPDATE_CARWASH_PARTS(carWash) UPDATE_VEHICLE_THROUGH_CARWASH(carwash, washVehicleID, fOriginalDirtLevel) IF UPDATE_CARWASH_HANDLER_CAMERAS(carwash, washVehicleID) RC_END_CUTSCENE_MODE() CPRINTLN(DEBUG_MISSION, "Carwash - Wash Program Complete") REMOVE_CARWASH_STUCK_CHECK(washVehicleID) IF IS_SCREEN_FADING_OUT() OR IS_SCREEN_FADED_OUT() CPRINTLN(DEBUG_MISSION, "Carwash - Wash Program Complete - Someone tried to skip while just as we completed") SCRIPT_CLEANUP(TRUE) ELSE CHARGE_PLAYER_FOR_CARWASH() SCRIPT_CLEANUP() ENDIF ENDIF // handle quitting IF (carwash.bSkipped = FALSE) IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) SAFE_FADE_SCREEN_OUT_TO_BLACK(500, TRUE) carwash.bSkipped = TRUE REMOVE_CARWASH_STUCK_CHECK(washVehicleID) ENDIF ELIF IS_SCREEN_FADED_OUT() SCRIPT_CLEANUP(TRUE) ENDIF WAIT(0) ENDWHILE ENDPROC PROC MULTIPLAYER_SCRIPT() INT iNextClosedTime BOOL bNoWay BOOL bOldInCarWash VEHICLE_INDEX veh VECTOR vPlayerLocTest SHAPETEST_STATUS sTestStatus ENTITY_INDEX hitentity VECTOR vhit, vnorm INT ihits //BREAK_ON_NATIVE_COMMAND("CLEAR_AREA_OF_PROJECTILES", FALSE) CPRINTLN(DEBUG_MISSION, "[CARWASH] - Waiting for screen to be faded in and transition to be over") WHILE IS_SCREEN_FADED_OUT() OR IS_TRANSITION_ACTIVE() WAIT(0) ENDWHILE CPRINTLN(DEBUG_MISSION, "[CARWASH] - Done Waiting for screen to be faded in and transition to be over") SCRIPT_SETUP() // setup cost halo SETUP_COST_HALO(carWashHalo[0], HALO_VEHICLE, "", GET_POSITION_FROM_STATIC_BLIP(STATIC_BLIP_AMBIENT_CARWASH_LONG), 15, "", FALSE, 2.0) // long SETUP_COST_HALO_DIRECTION_TOLERANCE(carWashHalo[0], carWash.cTrack.vDirection, CARWASH_HEAD_TOLERANCE) SET_STRINGS_FOR_CARWASH_HALO_HANDLER(carWashHaloHandler, TRUE) WHILE (TRUE) IS_ENTITY_OK(PLAYER_PED_ID()) IF NETWORK_IS_GAME_IN_PROGRESS() IF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE() CPRINTLN(DEBUG_MISSION, "MP Launcher Carwash: This MP Thread should Terminate") IF IS_PED_IN_CAR_WITH_CARWASH_DRIVER(PLAYER_PED_ID()) IF IS_ENTITY_OK(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF NETWORK_HAS_CONTROL_OF_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF GET_SEAT_PED_IS_IN(PLAYER_PED_ID()) = VS_DRIVER SET_ENTITY_COORDS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), <<51.6073, -1401.6653, 28.4046>>) SET_ENTITY_HEADING(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 344.3805) ENDIF ENDIF ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) // need to turn back control here just incase ENDIF SCRIPT_CLEANUP() ENDIF ENDIF #IF IS_DEBUG_BUILD UPDATE_DEBUG_WIDGETS() #ENDIF // check vehicle validity and update track interpolate bNoWay = FALSE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) bNoWay = IS_VEHICLE_NOT_ALLOWED_IN_CAR_WASH(veh) OR IS_ANY_VEHICLE_MAIN_DOOR_BROKEN(veh) bHasRoof = DOES_VEHICLE_HAVE_ROOF(veh) ENDIF UPDATE_CARWASH_PARTS(carWash) UPDATE_EMERGENCY_PLAYER_WARP_OUT_FOR_CARWASH() // update halos bOldInCarWash = bInCarWash bInCarWash = IS_PED_IN_CAR_WITH_CARWASH_DRIVER(PLAYER_PED_ID()) IF (bOldInCarWash = FALSE) AND (bInCarWash = TRUE) CPRINTLN(DEBUG_MISSION, "[CARWASH]: WE'VE JUST ENTERED THE CARWASH") ENDIF IF (bOldInCarWash = TRUE) AND (bInCarWash = FALSE) CPRINTLN(DEBUG_MISSION, "[CARWASH]: WE'VE JUST LEFT THE CARWASH") ENDIF //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: RUNNING CARWASH bNoWay: ",bNoWay," bHasRoof: ",bHasRoof ) IF (bInCarwash) IF NETWORK_IS_GAME_IN_PROGRESS() IF NOT bAudioLoaded IF REQUEST_SCRIPT_AUDIO_BANK("SCRIPT\\CARWASH") PRINTLN("[CARWASH] Audio bank loaded") bAudioLoaded = True ENDIF ENDIF ENDIF // force camera state to 0 IF (bOldInCarWash <> bInCarWash) carwash.iCurrentCameraState = 0 ENDIF UPDATE_VEHICLE_THROUGH_CARWASH(carwash, veh, fOriginalDirtLevel) IF UPDATE_CARWASH_HANDLER_CAMERAS(carwash, veh) IF (carwash.bCarwashAborted = FALSE) CHARGE_PLAYER_FOR_CARWASH() ENDIF REMOVE_CARWASH_STUCK_CHECK(veh) STOP_ALL_CARWASH_SOUNDS(carwash) RESET_COLLISIONS_FOR_CARWASH(carwash, veh) FORCE_CLEAR_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) CLEAR_PED_TASKS(PLAYER_PED_ID()) bCarWashBlocked = FALSE ENDIF ELSE // handle opening SHUTDOWN_CARWASH_CAMERA(carWash.cameraID, TRUE) FORCE_CLEAR_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID()) IF (bOldInCarWash = TRUE) AND (bInCarWash = FALSE) CPRINTLN(DEBUG_MISSION, "[CARWASH]: WE'VE JUST LEFT THE CARWASH") SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: CHECKING ENTRY") IF IS_PLAYER_IN_COST_HALO(carWashHalo[0]) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IN CORONA") // Calculate shapetest box VECTOR vShapetestCentre = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS((carWash.cTrack.vBlockMinMax[0] + carWash.cTrack.vBlockMinMax[1]) / 2.0, carWash.cTrack.fTrackHeading, vShapetestOffset) VECTOR vShapetestDimension = <> FLOAT fShapetestHeading = carWash.cTrack.fTrackHeading // Debug draw shapetest box #IF IS_DEBUG_BUILD IF bShowDebug DRAW_DEBUG_BOX_WITH_HEADING(vShapetestCentre, vShapetestDimension, fShapetestHeading) ENDIF #ENDIF // Check shapetest box IF (shapeTest = NULL) IF (GET_GAME_TIMER() > iNextClosedTime) // shapeTest = START_SHAPE_TEST_CAPSULE(carWash.cTrack.vBlockMinMax[0], carWash.cTrack.vBlockMinMax[1], 2.0, SCRIPT_INCLUDE_VEHICLE | SCRIPT_INCLUDE_OBJECT, veh) shapeTest = START_SHAPE_TEST_BOX(vShapetestCentre, vShapetestDimension, <<0.0, 0.0, fShapetestHeading>>, EULER_XYZ, SCRIPT_INCLUDE_VEHICLE | SCRIPT_INCLUDE_OBJECT, veh) ENDIF ELSE sTestStatus = GET_SHAPE_TEST_RESULT(shapeTest, ihits, vhit, vnorm, hitentity) IF (sTestStatus = SHAPETEST_STATUS_RESULTS_READY) bCarWashBlocked = FALSE IF (iHits > 0) //DRAW_DEBUG_SPHERE(vhit, 0.0625) //DRAW_DEBUG_LINE(vhit + <<0, 0, 3>> , vhit - <<0, 0, 3>>) IF CAN_THIS_ENTITY_BLOCK_THE_CARWASH(hitentity) bCarWashBlocked = TRUE ELSE SCRIPT_ASSERT("Carwash shapetest: Had to discount hits based on first hit object, might need to reduce size of hit box, otherwise other valid hits could be missed.") ENDIF ENDIF shapeTest = NULL ENDIF IF (sTestStatus = SHAPETEST_STATUS_NONEXISTENT) shapeTest = NULL ENDIF iNextClosedTime = GET_GAME_TIMER() + BLOCKED_SHAPE_CHECK_INTERVAL ENDIF // Print shapetest result object #IF IS_DEBUG_BUILD IF bShowDebug IF DOES_ENTITY_EXIST(hitentity) AND iHits > 0 TEXT_LABEL_63 tBlockedStatus DRAW_DEBUG_SPHERE(carWash.cTrack.vBlockMinMax[0], 0.1, 0, 0, 0) DRAW_DEBUG_LINE(carWash.cTrack.vBlockMinMax[0], GET_ENTITY_COORDS(hitentity, FALSE), 0, 0, 0) DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(hitentity, FALSE), 0.1, 0, 0, 0) DRAW_DEBUG_LINE(carWash.cTrack.vBlockMinMax[1], GET_ENTITY_COORDS(hitentity, FALSE), 0, 0, 0) DRAW_DEBUG_SPHERE(carWash.cTrack.vBlockMinMax[1], 0.1, 0, 0, 0) tBlockedStatus = "Blockage = " tBlockedStatus += GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(hitentity)) DISPLAY_TEXT_WITH_LITERAL_STRING(0.3, 0.6, "STRING", tBlockedStatus) ELSE DRAW_DEBUG_SPHERE(carWash.cTrack.vBlockMinMax[0], 0.1, 0, 200, 100) ENDIF ENDIF #ENDIF ENDIF carWashHalo[0].bCustomCheck = bCarWashBlocked IF NOT bCarWashBlocked AND IS_PLAYER_IN_COST_HALO(carWashHalo[0]) INT iCarCount = COUNT_NUMBER_OF_CARS_IN_CARWASH_HALO(carWashHalo[0]) IF (iCarCount > 0) //carWashHalo[0].bCustomCheck = NOT CAN_PLAYER_TRIGGER_CARWASH_HALO_IN_CAR(carWashHalo[0]) ENDIF ENDIF //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: IN CORONA bCarWashBlocked: ",bCarWashBlocked) IF UPDATE_CARWASH_COSTHALO_HANDLER(carWashHalo, carWashHaloHandler, bNoWay, FALSE, FALSE) //CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: UPDATE_CARWASH_COSTHALO_HANDLER checked") IF IS_ENTITY_OK(veh) // mark me as driving into carwash CLEAR_CYLINDER_OF_FIRE(carwash.cTrack.vTrackPoint[0], carwash.cTrack.vTrackPoint[1], 3.0, FALSE) SNAP_VEHICLE_TO_CARWASH_START(veh, carwash) SET_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID(), TRUE) SET_VEHICLE_THROUGH_CARWASH(veh, carwash, iInitialDelay) // THIS DELAY IS NEEDED AS WE NEED TO STOP THE CAR FOR A COUPLE OF FRAMES IN CASE THE PLAYER IS REVERSING. fOriginalDirtLevel = GET_VEHICLE_DIRT_LEVEL(veh) carwash.iCurrentCameraState = 0 bCarWashBlocked = FALSE ENDIF ENDIF ENDIF vPlayerLocTest = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF IS_PLAYER_SCTV(PLAYER_ID()) vPlayerLocTest.z = 28.323212 ENDIF // shut down script when player gets too far IF VDIST2(vPlayerLocTest, <<20.801605,-1392.830444,28.323212>>) > (CAR_WASH_ACTIVE_RANGE*CAR_WASH_ACTIVE_RANGE) CPRINTLN(DEBUG_MISSION, "Carwash is terminating out of script range") SCRIPT_CLEANUP() ENDIF WAIT(0) ENDWHILE ENDPROC //---------------------- // MAIN SCRIPT //---------------------- SCRIPT CPRINTLN(DEBUG_MISSION, "CARWASH SETUP - 1141") IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("carwash1")) > 1 CPRINTLN(DEBUG_MISSION, "Carwash is attempting to launch with an instance already active.") TERMINATE_THIS_THREAD() ENDIF // Setup callback when player is killed, arrested or goes to multiplayer IF NETWORK_IS_GAME_IN_PROGRESS() NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME() CPRINTLN(DEBUG_MISSION, "CAR WASH 1:: PROCESS_PRE_GAME started in MP - X01") SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE) ELSE CPRINTLN(DEBUG_MISSION, "CAR WASH 1:: PROCESS_PRE_GAME started in SP") IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY) SCRIPT_CLEANUP() ENDIF ENDIF IF NETWORK_IS_GAME_IN_PROGRESS() MULTIPLAYER_SCRIPT() ELSE SINGLEPLAYER_SCRIPT() ENDIF ENDSCRIPT