591 lines
21 KiB
Python
Executable File
591 lines
21 KiB
Python
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : carwash2.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
|
|
|
|
SHAPETEST_INDEX shapeTest
|
|
COST_HALO carWashHalo[2]
|
|
COSTHALO_HANDLER carWashHaloHandler
|
|
INT iCandidateID = NO_CANDIDATE_ID
|
|
|
|
FLOAT fCamera2Backshift = 0.75
|
|
|
|
VECTOR vShapetestOffset = <<0.1, 0.0, -1.0>>
|
|
FLOAT fShapetestWidth = 2.1
|
|
FLOAT fShapetestHeight = 3.0
|
|
|
|
//----------------------
|
|
// DEBUG VARIABLES
|
|
//----------------------
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID m_WidgetGroup
|
|
BOOL bQuitScript = FALSE
|
|
BOOL bDirtyCar = FALSE
|
|
BOOL bShowDebug = FALSE
|
|
BOOL bNetPlayersDrivingCarwash[NUM_NETWORK_PLAYERS]
|
|
#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("Blocked", bCarWashBlocked)
|
|
ADD_WIDGET_BOOL("Halo Custom", carWashHalo[0].bCustomCheck)
|
|
ADD_WIDGET_BOOL("Show Debug", bShowDebug)
|
|
ADD_WIDGET_BOOL("Has Roof", bHasRoof)
|
|
ADD_WIDGET_FLOAT_SLIDER("Camera 2 Shift", fCamera2Backshift, -2.0, 2.0, 0.05)
|
|
|
|
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)
|
|
|
|
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)
|
|
IF (g_bInMultiplayer = FALSE)
|
|
MISSION_OVER(iCandidateID)
|
|
ENDIF
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
PROC SETUP_CAMERA_2()
|
|
VEHICLE_INDEX veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
VECTOR vMin, vMax
|
|
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(veh), vMin, vMax)
|
|
IF vMin.y < -3.8
|
|
SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[2], <<-699.9690, -929.1818, 19.2126>>, <<-0.8962, -0.0038, -179.6509>>, <<-699.9516, -932.0400, 19.1679>>, <<-0.8962, -0.0038, -179.6509>>, 6500, 1.5)
|
|
ELSE
|
|
SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[2], <<-700.0016, -932.0601, 18.7178>>, <<-8.6749, 0.0000, -179.6145>>, <<-700.0532, -936.7521, 18.6515>>, <<3.9366, -0.0000, 179.6510>>, 6500, 1.5)
|
|
ENDIF
|
|
|
|
carWash.carWashCamera[2].vPosition[0].y += fCamera2Backshift
|
|
carWash.carWashCamera[2].vPosition[1].y += fCamera2Backshift
|
|
|
|
SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[2], 50.0)
|
|
SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[2], 1.107178)
|
|
ENDPROC
|
|
|
|
PROC SCRIPT_SETUP()
|
|
|
|
// setup the track and cameras
|
|
SETUP_CARWASH_TRACK(carWash.cTrack, <<-700.1, -922.2, 18.4>>, <<-700.1, -943.6, 18.7>>)
|
|
SETUP_CARWASH_BLOCK_POINTS(carWash.cTrack, <<-700.1, -926.6, 18.7>>, <<-699.934387,-939.570618,18.014494>>)
|
|
SETUP_CARWASH_BLOCK_MIN_MAX(carWash.cTrack, <<-699.93677, -940.40271, 20>>, <<-699.87805, -926.03876, 20>>)
|
|
CALCULATE_MIN_MAX_FROM_POSITION_AND_RADIUS(<<-701.149963,-947.121887,18.491688>>, 6.20, carWash.vNoPedWalkMin, carWash.vNoPedWalkMax)
|
|
|
|
SET_CARWASH_WAYPOINT_REC(carWash, "carwash2_r")
|
|
carWash.fFinalCameraInterpolate = 0.6
|
|
carWash.iLocationID = CARWASH_LOCID_SHORT
|
|
|
|
carWash.cTrack.vVehicleSnapPoint = <<-700.0682, -921.1490, 18.7028>>
|
|
|
|
carWash.fBoostSpeed = 4.0
|
|
|
|
// setup camera
|
|
SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[0], <<-701.0261, -918.9723, 21.3734>>, <<1.9948, -0.0000, -121.2536>>, <<-701.1696, -918.9987, 20.3130>>, <<-2.3997, -0.0000, -166.3155>>, PICK_INT(g_bInMultiplayer, 5000, 8500))
|
|
SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[0], 50.0)
|
|
SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[0], 0.105457)
|
|
|
|
|
|
SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[1], <<-701.5583, -942.6389, 20.2026>>, <<-4.1156, 0.0000, -23.5382>>, <<-698.8515, -942.3990, 20.1769>>, <<-4.1156, 0.0000, 16.0096>>, 8500)
|
|
SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[1], 50.0)
|
|
SETUP_CAMERA_SWITCH_RATIO(carWash.carwashCamera[1], 0.74) // 0.676683)
|
|
|
|
IS_ENTITY_OK(PLAYER_PED_ID()) // need to entity alive check before doing this or we get asserts
|
|
|
|
// in mp this script is setup as soon as the player is in range of the carwash as multiple people can see it running
|
|
// so we need to force the camera when the player is actually in the carwash and not now so it takes into account their vehicle
|
|
IF NOT g_bInMultiplayer
|
|
SETUP_CAMERA_2()
|
|
ENDIF
|
|
|
|
//SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[6], <<-699.0652, -951.9319, 18.9507>>, <<7.8579, -0.0000, 8.7840>>, <<-698.817, -952.476, 19.427>>, <<0.7437, 0.0000, 23.8817>>, 7200, 0.45)
|
|
SETUP_CAMERA_STRUCT_INTERPOLATE(carWash.carwashCamera[6], <<-699.0652, -951.9319, 18.9507>>, <<7.8579, -0.0000, 8.7840>>, <<-698.650, -952.932, 19.260>>, <<0.7437, 0.0000, 23.8817>>, 7200, 0.45)
|
|
SETUP_CAMERA_STRUCT_FOV(carWash.carwashCamera[6], 40.0220)
|
|
|
|
// snap car into place if sp
|
|
//IF NOT g_bInMultiplayer
|
|
//SNAP_VEHICLE_TO_CARWASH_START(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), carWash, FALSE)
|
|
//ENDIF
|
|
|
|
// Figure out if we're seated high above the
|
|
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
|
|
|
|
SET_CARWASH_IPL(carWash, BUILDINGNAME_IPL_CARWASH_SHORT)
|
|
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
|
|
|
|
CREATE_CARWASH_JETS(carWash.soapJets, <<-699.96997, -927.7, 20.8279>>, 0.0, 4.85, FALSE, 0.3)
|
|
SET_CARWASH_JETS_PARTICLES(carWash.soapJets, "ent_amb_car_wash_jet_soap")
|
|
CARWASH_NETWORK_WAIT()
|
|
|
|
|
|
//CREATE_CARWASH_VERTROLLER(carWash.vertRoller, <<-699.96997, -935.0, 19.9>>, 180.0, 3.6, 0.2)
|
|
CREATE_CARWASH_VERTROLLER(carWash.vertRoller, << -699.97, -935, 17.9 >>, 180.0, 3.6, 0.2) // 18.2145
|
|
|
|
CREATE_CARWASH_HROLLER(carWash.horzRoller, <<-699.96997, -931.7, 21.3>>, 0.0, 18.564493)
|
|
CARWASH_NETWORK_WAIT()
|
|
|
|
CREATE_CARWASH_JETS(carWash.waterJets, <<-699.96997, -938.8, 20.8279>>, 180.0, 4.85, FALSE, 0.3)
|
|
SET_CARWASH_JETS_PARTICLES(carWash.waterJets, "ent_amb_car_wash_jet")
|
|
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
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
CPRINTLN(DEBUG_MISSION, "[CARWASH] - BANK:", NETWORK_GET_VC_BANK_BALANCE(), " WALLET:", NETWORK_GET_VC_WALLET_BALANCE(), " BALANCE:", NETWORK_GET_VC_BALANCE())
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//----------------------
|
|
// UPDATE FUNCTIONS
|
|
//----------------------
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE:
|
|
/// Updates Debug Widgets and draw debug stuff
|
|
PROC UPDATE_DEBUG_WIDGETS()
|
|
INT i
|
|
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
|
|
|
|
// tell us who is driving in the carwash
|
|
REPEAT COUNT_OF(bNetPlayersDrivingCarwash) i
|
|
bNetPlayersDrivingCarwash[i] = GlobalPlayerBD[i].bDrivingThroughCarwash
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
FUNC BOOL SINGLEPLAYER_CANDIDATE_ID_CHECK()
|
|
INT iTimer = GET_GAME_TIMER() + 100
|
|
|
|
WHILE (GET_GAME_TIMER() < iTimer)
|
|
CPRINTLN(DEBUG_MISSION, "Carwash - Candidate Check", iTimer - GET_GAME_TIMER())
|
|
|
|
SWITCH Request_Mission_Launch(iCandidateID, MCTID_MUST_LAUNCH, MISSION_TYPE_MINIGAME)
|
|
CASE MCRET_ACCEPTED
|
|
CPRINTLN(DEBUG_MISSION, "Carwash - Candidate Accepted")
|
|
RETURN TRUE
|
|
CASE MCRET_DENIED
|
|
CPRINTLN(DEBUG_MISSION, "Carwash - Candidate Denied")
|
|
RETURN FALSE
|
|
ENDSWITCH
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
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
|
|
|
|
CPRINTLN(DEBUG_MISSION, "Carwash trying to get candidate ID")
|
|
iCandidateID = NO_CANDIDATE_ID
|
|
IF NOT SINGLEPLAYER_CANDIDATE_ID_CHECK()
|
|
SCRIPT_CLEANUP()
|
|
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())
|
|
carwash.fForwardSpeed = 1.75
|
|
SET_VEHICLE_THROUGH_CARWASH(washVehicleID, carwash)
|
|
fOriginalDirtLevel = GET_VEHICLE_DIRT_LEVEL(washVehicleID)
|
|
bHasRoof = DOES_VEHICLE_HAVE_ROOF(washVehicleID)
|
|
|
|
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(CARWASH_LOCID_SHORT)
|
|
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_FADED_OUT()
|
|
SCRIPT_CLEANUP(TRUE)
|
|
ELSE
|
|
CHARGE_PLAYER_FOR_CARWASH(CARWASH_LOCID_SHORT)
|
|
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, FALSE)
|
|
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
|
|
|
|
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()
|
|
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
// setup cost halo
|
|
SETUP_COST_HALO(carWashHalo[0], HALO_VEHICLE, "", GET_POSITION_FROM_STATIC_BLIP(STATIC_BLIP_AMBIENT_CARWASH_SHORT), 15, "", FALSE, 2.5) // short
|
|
SETUP_COST_HALO_DIRECTION_TOLERANCE(carWashHalo[0], carWash.cTrack.vDirection, CARWASH_HEAD_TOLERANCE)
|
|
SET_STRINGS_FOR_CARWASH_HALO_HANDLER(carWashHaloHandler, TRUE)
|
|
carWash.fForwardSpeed = 1.5
|
|
|
|
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")
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) // need to turn back control here just incase
|
|
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)
|
|
DUMMY_REFERENCE_BOOL(bHasRoof)
|
|
ENDIF
|
|
|
|
UPDATE_CARWASH_PARTS(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)
|
|
// force camera state to 0
|
|
IF (bOldInCarWash <> bInCarWash)
|
|
carwash.iCurrentCameraState = 0
|
|
SETUP_CAMERA_2()
|
|
ENDIF
|
|
|
|
UPDATE_VEHICLE_THROUGH_CARWASH(carwash, veh, fOriginalDirtLevel)
|
|
IF UPDATE_CARWASH_HANDLER_CAMERAS(carwash, veh)
|
|
IF (carwash.bCarwashAborted = FALSE)
|
|
CHARGE_PLAYER_FOR_CARWASH(CARWASH_LOCID_SHORT)
|
|
ENDIF
|
|
REMOVE_CARWASH_STUCK_CHECK(veh)
|
|
STOP_ALL_CARWASH_SOUNDS(carwash)
|
|
|
|
FORCE_CLEAR_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) // need to turn back control here just incase
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ELSE // handle opening
|
|
SHUTDOWN_CARWASH_CAMERA(carWash.cameraID, TRUE)
|
|
FORCE_CLEAR_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID())
|
|
//CPRINTLN(DEBUG_MISSION, "[CARWASH] - CDM: CHECKING ENTRY")
|
|
IF (bOldInCarWash = TRUE) AND (bInCarWash = FALSE)
|
|
CPRINTLN(DEBUG_MISSION, "[CARWASH]: WE'VE JUST LEFT THE CARWASH")
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_IN_COST_HALO(carWashHalo[0]) //AND AM_I_DRIVING_CLOSEST_CAR_TO_CARWASH(carWashHalo[0], vehCheck)
|
|
//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 = <<fShapetestWidth, VDIST(carWash.cTrack.vBlockMinMax[0], carWash.cTrack.vBlockMinMax[1]), fShapetestHeight>>
|
|
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, 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 > 1)
|
|
//carWashHalo[0].bCustomCheck = NOT CAN_PLAYER_TRIGGER_CARWASH_HALO_IN_CAR(carWashHalo[0])
|
|
ENDIF
|
|
ENDIF
|
|
|
|
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, TRUE)
|
|
SET_NET_PED_DRIVING_CARWASH_STATUS(PLAYER_PED_ID(), TRUE)
|
|
SET_VEHICLE_THROUGH_CARWASH(veh, carwash)
|
|
fOriginalDirtLevel = GET_VEHICLE_DIRT_LEVEL(veh)
|
|
carwash.iCurrentCameraState = 0
|
|
carwash.bThrottleBoosted = FALSE
|
|
bCarWashBlocked = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
vPlayerLocTest = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
|
|
IF IS_PLAYER_SCTV(PLAYER_ID())
|
|
vPlayerLocTest.z = 18.5
|
|
ENDIF
|
|
|
|
// shut down script when player gets too far
|
|
IF VDIST2(vPlayerLocTest, <<-700.6, -933.4, 18.5>>) > (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 - 101")
|
|
|
|
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("carwash2")) > 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 2:: PROCESS_PRE_GAME started in MP")
|
|
SET_THIS_SCRIPT_CAN_BE_PAUSED(FALSE)
|
|
ELSE
|
|
CPRINTLN(DEBUG_MISSION, "CAR WASH 2:: 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
|
|
|
|
|