608 lines
22 KiB
Python
Executable File
608 lines
22 KiB
Python
Executable File
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// 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, <<vcMin.x, vcMin.y, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMax.x, vcMin.y, 0>>))
|
|
DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMax.x, vcMin.y, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMax.x, vcMax.y, 0>>))
|
|
DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMax.x, vcMax.y, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMin.x, vcMax.y, 0>>))
|
|
DRAW_DEBUG_LINE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMin.x, vcMax.y, 0>>), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(veh, <<vcMin.x, vcMin.y, 0>>))
|
|
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 = <<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 | 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
|
|
|
|
|