Files
gtav-src/script/dev_ng/singleplayer/scripts/Ambient/CableCar/cablecar.sc
T
2025-09-29 00:52:08 +02:00

3561 lines
114 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : cablecar.sc
// AUTHOR : Aaron Gandaa
// DESCRIPTION : Cable Car Handler Script
//
// *****************************************************************************************
// *****************************************************************************************
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//----------------------
// INCLUDES
//----------------------
USING "rgeneral_include.sch"
USING "rc_helper_functions.sch"
USING "RC_asset_public.sch"
USING "RC_Setup_public.sch"
USING "RC_Camera_Public.sch"
USING "net_fps_cam.sch"
USING "friendactivity_public.sch"
//----------------------
// ENUM
//----------------------
ENUM eCableCarState
CABLECAR_NULLSTATE,
CABLECAR_WAITING,
CABLECAR_DEPARTING, // close the door
CABLECAR_SPEEDUP,
CABLECAR_MOVING,
CABLECAR_SLOWDOWN,
CABLECAR_ARRIVING, // open the doors
CABLECAR_ARRIVED,
CABLECAR_PAUSESTART,
CABLECAR_PAUSED,
CABLECAR_PAUSEEND,
CABLECAR_DEAD,
CABLECAR_REGEN
ENDENUM
ENUM eCableCarDirection
CABLECAR_MOVEUP,
CABLECAR_MOVEDOWN
ENDENUM
ENUM eCableCarDestination
CABLECAR_LOWDOCK,
CABLECAR_HIGHDOCK
ENDENUM
ENUM eCableCarHaloMode
APPROACH_MODE,
CANTAFFORD_MODE,
DENIED_MODE, // for doing certain checks
TRIGGER_MODE, // pressing right with enough
LAUNCH_MODE,
CLOSED_MODE,
DAMAGED_MODE, // if the car is too broken to go in
WANTED_MODE
ENDENUM
//----------------------
// CONSTANTS
//----------------------
CONST_INT MAX_CABLEWIRE_POINTS 15
CONST_INT MAX_CABLEWIRES 2
CONST_INT COST_CABLECAR 10
CONST_INT CABLE_WIRE_LEFT 0
CONST_INT CABLE_WIRE_RIGHT 1
CONST_INT CABLE_DOCK_LOW 0
CONST_INT CABLE_DOCK_HIGH 1
CONST_FLOAT CABLE_CAR_SLOW_TIME 10.0
CONST_FLOAT CABLE_CAR_WIRE_OFFSET -0.2
CONST_FLOAT WIRE_SHIFT_INTERPOLATE 0.0
CONST_FLOAT CABLE_CAR_RESTART_MIN_X -800.0 // if player x is smaller than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MAX_X 640.0 // if player x is smaller than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MIN_Y 5300.0 // if player y is bigger than this - restart
CONST_FLOAT CABLE_CAR_RESTART_MAX_Y 5800.0 // if player y is bigger than this - restart
CONST_FLOAT CABLE_CAR_SHUTDOWN_MIN_X -900.0 // if player x is smaller than this - suspsend
CONST_FLOAT CABLE_CAR_SHUTDOWN_MAX_X 740.0 // if player x is bigger than this - suspsend
CONST_FLOAT CABLE_CAR_SHUTDOWN_MIN_Y 5200.0 // if player y is smaller than this - suspsend
CONST_FLOAT CABLE_CAR_SHUTDOWN_MAX_Y 5900.0 // if player y is bigger than this - suspsend
CONST_INT CABLECAR_ASSET_SLOT 0
CONST_INT CABLECARDOORL_ASSET_SLOT 1
CONST_INT CABLECARDOORR_ASSET_SLOT 2
CONST_INT CABLECARSND_ASSET_SLOT 3
CONST_INT CABLECARANIM_ASSET_SLOT 4
CONST_FLOAT CABLE_CAR_DOOR_OPEN_LIMIT 0.88
STREAMVOL_ID streamVolCam
BOOL bNewCam = TRUE
//----------------------
// STRUCTS
//----------------------
STRUCT CABLECAR_WIRE
VECTOR vPoints[MAX_CABLEWIRE_POINTS]
INT iPointsUsed
#IF IS_DEBUG_BUILD
INT iDebugPoint
FLOAT fDebugInterpolate
VECTOR vWireDebugPoint
BOOL bWarpCarToDebugPoint
#ENDIF
BOOL bShowWire = FALSE
FLOAT fRopeLength
ENDSTRUCT
STRUCT CABLE_CAR
eCableCarState carState
eCableCarHaloMode haloState
OBJECT_INDEX cablecarID
OBJECT_INDEX lDoor[2] // doors on the left side not the two left sided doors (confusing...)
OBJECT_INDEX rDoor[2]
BOOL bIsMoving = FALSE
BOOL bHelpShown = FALSE
BOOL bIsPlayerIn = FALSE
VECTOR vPosition // position along the wire - vehicle has offset added to it
INT iWireIndex = 0
FLOAT fSpeed = 0.0
FLOAT fSpdSgn = 1.0
INT iWireSegment = 0
FLOAT fTValue = 0.0
FLOAT fDistTravelled = 0.0
VEHICLE_INDEX storedVehicles[2]
INT iStoredVehicleCount = 0
INT iDepartTime = 0
INT iDiedTime = 0
INT iJourneyTimer = 0
INT iRunningSound = -1
INT iRainSound = -1
FLOAT fDistToNextPoint
FLOAT fDoorValue = 0.0
BOOL bIsPaused = FALSE
BOOL bIsPlayerOnTop = FALSE
BOOL bIsPlayerRiding = FALSE
#IF IS_DEBUG_BUILD
INT iHaloStateDebug = 0
INT iCarStateDebug = 0
BOOL bDebugPause = FALSE
#ENDIF
ENDSTRUCT
//----------------------
// VARIABLES
//----------------------
VECTOR vLowDockPosition = <<-740.3, 5594.5, 41.2>>
VECTOR vHighDockPosition = <<446.8, 5571.1, 780.7>>
VECTOR vCableCarPlayerAttachOffset = <<0, 2.48, -5.3>>
VECTOR vCableCarLeftExitOffset = <<1.3, 0, -5.3>>
VECTOR vCableCarRightExitOffset = <<-1.3, 0, -5.3>>
FLOAT fTimeStepFactor = 1.0
FLOAT fCableCarMaxSpeed = 10.0
FLOAT fCableCarAcceleration = 0.65
INT iCableCarRegenTime = 120000
INT iCableCarDockWaitTime = 35000
CABLECAR_WIRE cableWire[MAX_CABLEWIRES] // this assumes there are only 2 cable car wires in the entire game
MODEL_NAMES cableCarModel = P_CABLECAR_S
MODEL_NAMES cableCarDoorLModel = P_CABLECAR_S_DOOR_L
MODEL_NAMES cableCarDoorRModel = P_CABLECAR_S_DOOR_R
FLOAT fCamShiftHack = -15.0
FIRST_PERSON_CAM_STRUCT fpsCam
BOOL bFPSMode = FALSE
BOOL bSkipped = FALSE
BOOL bSimulateMapSkip = TRUE
ASSET_REQUESTER asRequest
CABLE_CAR cableCarLeft
CABLE_CAR cableCarRight
CAMERA_STRUCT externalCamera
CAMERA_INDEX cameraID
INT iCameraPointIndex = 0
FLOAT fImranFactor = 3.0
BOOL bSRLOK = FALSE
FLOAT fSrlTime = 0.0
INT iRevealCounter = 0
enumActivityLocation activityLoc = ALOC_suspendFriends
#IF IS_DEBUG_BUILD
INT iActiveCamera = 0
FLOAT fDebugWireVertexSize = 0.0625
FLOAT fDebugWireVertexHeight = 10.0
BOOL bExitScript = FALSE
BOOL bWarpToLowDock = FALSE
BOOL bWarpToHighDock = FALSE
BOOL bBlipCars = FALSE
BLIP_INDEX blipID[2]
BOOL bCreateAtHighDock[2]
BOOL bCreateAtLowDock[2]
INT iExternalCameraTest
INT iTestInterptime
BOOL bExternalCamOn
BOOL bExternalCamOff
BOOL bInterpolateBackwards = FALSE
BOOL bExternalCamAlternate
BOOL bIsCamStatic
BOOL bDoorSlideTest
FLOAT fDoorSlideValue = 0
BOOL bShowLoadSceneArea = TRUE
#ENDIF
BOOL bIsOnMission = FALSE
BOOL bNoCarMsgShown = FALSE
INT iLoadSceneTimeOut = 0
INT iCurrentLoadSceneIndex = -1
VECTOR vSceneLoadPosition
VECTOR vSceneLoadDirection
FLOAT fSceneLoadFarClip
BOOL bLoadSceneOK = FALSE
BOOL bUseSRLS = FALSE
BOOL bUseFocusChange = FALSE
//INT iUpdateWaitMsgTimer = 0
//----------------------
// MISC FUNCTIONS
//----------------------
/// PURPOSE:
/// Cleanups Script and terminates thread - this should be the last function called
PROC LOAD_CABLE_CAR_ASSETS()
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Loading Assets")
CLEAR_ASSET_REQUESTER(asRequest)
ADD_ASSET_REQUEST_FOR_MODEL(asRequest, CABLECAR_ASSET_SLOT, cableCarModel)
ADD_ASSET_REQUEST_FOR_MODEL(asRequest, CABLECARDOORL_ASSET_SLOT, cableCarDoorLModel)
ADD_ASSET_REQUEST_FOR_MODEL(asRequest, CABLECARDOORR_ASSET_SLOT, cableCarDoorRModel)
ADD_ASSET_REQUEST_FROM_STRING(asRequest, CABLECARSND_ASSET_SLOT, ASSET_AUDIOBANK, "CABLE_CAR", "CABLE_CAR_SOUNDS")
ADD_ASSET_REQUEST_FROM_STRING(asRequest, CABLECARANIM_ASSET_SLOT, ASSET_ANIMDICT, "P_CableCar_S")
WHILE NOT HAVE_ASSET_REQUESTS_LOADED(asRequest)
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Loaded Assets")
ENDPROC
PROC UNLOAD_CABLE_CAR_MODEL_ASSETS()
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Unloading Model Assets")
_UNLOAD_ASSET_FROM_REQUESTER(asRequest, CABLECAR_ASSET_SLOT)
_UNLOAD_ASSET_FROM_REQUESTER(asRequest, CABLECARDOORL_ASSET_SLOT)
_UNLOAD_ASSET_FROM_REQUESTER(asRequest, CABLECARDOORR_ASSET_SLOT)
ENDPROC
//----------------------
// CAMERA FUNCTIONS
//----------------------
/// PURPOSE:
/// Enable First Person Camera
PROC ENABLE_CABLE_CAR_FIRST_PERSON(eCableCarDirection dir = CABLECAR_MOVEDOWN)
VECTOR v = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, 0, 0>>)
fpsCam.iLookXLimit = 60
fpsCam.iLookYLimit = 20
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
IF (dir = CABLECAR_MOVEDOWN)
INIT_FIRST_PERSON_CAMERA(fpsCam, v, GET_ENTITY_ROTATION(PLAYER_PED_ID()) + <<fCamShiftHack, 0, 0>>, 50.0, fpsCam.iLookXLimit, fpsCam.iLookYLimit)
ELSE
INIT_FIRST_PERSON_CAMERA(fpsCam, v, GET_ENTITY_ROTATION(PLAYER_PED_ID()), 50.0, fpsCam.iLookXLimit, fpsCam.iLookYLimit)
ENDIF
ATTACH_CAM_TO_ENTITY(fpsCam.theCam, PLAYER_PED_ID(), <<0, 0.2, 0.5>>)
// CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE) // SamH: Removing as requested in b*1776373. Problem is fixed in code now.
bNewCam = TRUE
bFPSMode = TRUE
ENDPROC
/// PURPOSE:
/// Disable First Person Camera
PROC DISABLE_CABLE_CAR_FIRST_PERSON()
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
// CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) // SamH: Removing as requested in b*1776373. Problem is fixed in code now.
ENABLE_CAMERA_STRUCT(externalCamera, cameraID)
bNewCam = TRUE
bFPSMode = FALSE
ENDPROC
PROC SET_EXTERNAL_CAMERA_STRUCT(CAMERA_STRUCT &cst, INT ind, BOOL bUseAlternateShot = FALSE)
SWITCH (ind)
CASE 0
IF (bUseAlternateShot = FALSE)
SETUP_CAMERA_STRUCT(cst, <<-741.9, 5602.2, 42.3>>, <<-2.2, 0.0, -130.5>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-741.9, 5602.2, 42.3>>, <<16.9, 0.0, -116.8>>, 4500)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
ELSE
/*
SETUP_CAMERA_STRUCT(cst, <<-746.1391, 5567.7998, 53.6983>>, <<-12.1941, 0.0000, -44.5173>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
*/
SETUP_CAMERA_STRUCT(cst, <<-733.0331, 5557.0503, 54.3150>>, <<-13.2766, 0.0000, 26.2995>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-733.0331, 5557.0503, 54.3050>>, <<3.6561, 0.0000, -49.3377>>, 15000)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
ENDIF
BREAK
CASE 1
SETUP_CAMERA_STRUCT(cst, <<-674.4, 5644.0, 40.1>>, <<7.5, 0.0, 148.3>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-674.4, 5644.0, 40.1>>, <<7.5, 0.0, -133.2>>, 12000)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
BREAK
CASE 2
IF (bUseAlternateShot = FALSE)
SETUP_CAMERA_STRUCT(cst, <<-575.3, 5584.3, 81.1>>, <<-25.8, 0.0, 53.1>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-575.4, 5590.0, 81.1>>, <<-25.8, -0.0, 53.1>>, 6000)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
ELSE
SETUP_CAMERA_STRUCT(cst, <<-575.3, 5584.3, 81.1>>, <<-25.8, 0.0, 53.1>>)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
ENDIF
BREAK
CASE 3
IF (bUseAlternateShot = FALSE)
SETUP_CAMERA_STRUCT(cst, <<-536.0, 5524.6, 65.4>>, <<3.7, 0.0, 25.1>>)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
ELSE
SETUP_CAMERA_STRUCT(cst, <<-627.3716, 5543.3877, 51.0491>>, <<9.2403, -0.0000, -30.7826>>)
// <<-607.9493, 5532.4712, 52.6296>>, <<19.1993, -0.0000, -26.6786>>) //<<-536.5602, 5524.1216, 65.3995>>, <<3.8445, 0.0000, 40.0685>>)
// backup <<-628.0014, 5534.6714, 52.2195>>, <<11.8051, -0.0000, -55.3615>>
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
ENDIF
BREAK
CASE 4
SETUP_CAMERA_STRUCT(cst, <<-580.2, 5589.0, 77.7>>, <<26.3, 0.0, -53.0>>)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
BREAK
CASE 5
SETUP_CAMERA_STRUCT(cst, <<-476.7, 5650.8, 59.9>>, <<6.8, 0.0, 117.7>>)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
BREAK
CASE 6
SETUP_CAMERA_STRUCT(cst, <<-476.7, 5650.8, 59.9>>, <<29.8, 0.0, -170.8>>)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
BREAK
CASE 7
SETUP_CAMERA_STRUCT(cst, <<-428.1, 5383.4, 102.3>>, <<-4.1, 0.0, -18.6>>)
SETUP_CAMERA_STRUCT_FOV(cst, 45.0)
BREAK
CASE 8
//SETUP_CAMERA_STRUCT(cst, <<-458.7833, 5337.7959, 91.2493>>, <<7.9000, 0.0000, 4.6000>>)
SETUP_CAMERA_STRUCT(cst, <<-475.9374, 5375.9893, 94.2374>>, <<3.4297, 0.0000, 10.0545>>)
SETUP_CAMERA_STRUCT_FOV(cst, 30.0)
BREAK
CASE 9
SETUP_CAMERA_STRUCT(cst, <<-433.4, 5643.9, 121.2>>, <<26.5, 0.0, -120.0>>)
SETUP_CAMERA_STRUCT_FOV(cst, 44.0)
BREAK
CASE 10
SETUP_CAMERA_STRUCT(cst, <<-508.9219, 5674.6777, 74.7000>>, <<27.0000, -0.0000, -121.7744>>)
SETUP_CAMERA_STRUCT_FOV(cst, 44.0)
BREAK
CASE 11
SETUP_CAMERA_STRUCT(cst, <<-281.3, 5596.8, 226.0>>, <<31.9, 0.0, -120.4>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-282.5, 5584.3, 226.0>>, <<33.5, 0.0, -105.0>>, 6000)
SETUP_CAMERA_STRUCT_FOV(cst, 44.0)
BREAK
CASE 12
SETUP_CAMERA_STRUCT(cst, <<-56.5844, 5560.8516, 311.4859>>, <<-15.2417, -0.0000, 108.7200>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 13
SETUP_CAMERA_STRUCT(cst, <<-88.8881, 5539.6621, 280.1666>>, <<49.9000, 0.0000, -19.4625>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 14
SETUP_CAMERA_STRUCT(cst, <<-6.2591, 5609.3184, 402.8656>>, <<-0.9222, 0.0000, 153.9538>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-5.9107, 5609.6133, 401.1573>>, <<-11.4635, 0.0000, 130.2651>>, 10000)
SETUP_CAMERA_STRUCT_FOV(cst, 55.0)
BREAK
CASE 15
SETUP_CAMERA_STRUCT(cst, <<0.3, 5584.0, 422.6>>, <<26.5, 0.0, -112.1>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 16
SETUP_CAMERA_STRUCT(cst, <<-69.8260, 5595.7646, 390.4564>>, <<25.1669, 0.0000, -110.1190>>) //<<0.8, 5591.6, 422.6>>, <<26.5, 0.0, -112.1>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<-68.5961, 5595.1831, 386.8474>>, <<20.6269, 0.0000, -115.1379>>, 10000) // <0.8, 5574.0, 422.6>>, <<26.5, 0.0, -112.1>>, 10000)
SETUP_CAMERA_STRUCT_FOV(cst, 40.43)
BREAK
CASE 17
SETUP_CAMERA_STRUCT(cst, <<250.3515, 5575.8872, 617.4193>>, <<-43.3782, 0.0000, 90.4725>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<247.1179, 5575.8872, 614.3633>>, <<-40.0590, 0.0000, 90.4725>>, 10000)
SETUP_CAMERA_STRUCT_FOV(cst, 45.0)
BREAK
CASE 18
SETUP_CAMERA_STRUCT(cst, <<234.6, 5588.8, 596.5>>, <<33.1, 0.0, -126.3>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 19
SETUP_CAMERA_STRUCT(cst, <<215.1628, 5595.8301, 615.1234>>, <<22.9775, -0.0000, -111.6452>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<221.7997, 5593.1108, 597.7890>>, <<17.1025, -0.0000, -121.5107>>, 16000)
SETUP_CAMERA_STRUCT_FOV(cst, 45.0)
BREAK
CASE 20
SETUP_CAMERA_STRUCT(cst, <<351.2, 5522.4, 695.0>>, <<37.9, 0.0, -72.5>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 21
SETUP_CAMERA_STRUCT(cst, <<373.0, 5467.3, 719.7>>, <<18.8, 0.0, -45.0>>)
SETUP_CAMERA_STRUCT_FOV(cst, 50.0)
BREAK
CASE 22
SETUP_CAMERA_STRUCT(cst, <<351.9, 5504.4, 709.1>>, <<28.0, 0.0, -61.2>>)
SETUP_CAMERA_STRUCT_FOV(cst, 29.0)
BREAK
CASE 23
SETUP_CAMERA_STRUCT(cst, <<462.0, 5599.4, 805.6>>, <<-41.0, 0.0, 120.2>>)
SETUP_CAMERA_STRUCT_FOV(cst, 40.0)
BREAK
CASE 24
SETUP_CAMERA_STRUCT(cst, <<462.1715, 5634.8574, 803.8868>>, <<-25.3865, -0.0000, 137.5704>>)
SETUP_CAMERA_STRUCT_END_SHOT(cst, <<470.8885, 5624.8687, 803.6818>>, <<-27.3184, 0.0000, 124.5155>>, 8000)
SETUP_CAMERA_STRUCT_FOV(cst, 40.0)
BREAK
ENDSWITCH
ENDPROC
PROC SET_EXTERNAL_CAMERA(CAMERA_STRUCT &cst, INT ind, BOOL bUseAlternateShot = FALSE)
SET_EXTERNAL_CAMERA_STRUCT(cst, ind, bUseAlternateShot)
#IF IS_DEBUG_BUILD
iActiveCamera = ind
#ENDIF
ENDPROC
FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot)
RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>>
ENDFUNC
PROC NEW_LOAD_SCENE_FOR_CAMERA_STRUCT(CAMERA_STRUCT &cst, INT ind)
EXIT
VECTOR v
IF (iCurrentLoadSceneIndex <> ind)
NEW_LOAD_SCENE_STOP()
v = CONVERT_ROTATION_TO_DIRECTION_VECTOR(cst.vRotation[0])
IF NEW_LOAD_SCENE_START_SPHERE(cst.vPosition[0] + (v * 140.0), 141.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE)
CPRINTLN(DEBUG_AMBIENT, "[CABLE CAR]:NEW SCENE LOAD FOR:", cst.vPosition[0], " CAM INDEX:", ind)
iLoadSceneTimeOut = GET_GAME_TIMER() + 10000
iCurrentLoadSceneIndex = ind
vSceneLoadPosition = cst.vPosition[0]
vSceneLoadDirection = v
fSceneLoadFarClip = 100.0
bLoadSceneOK = FALSE
ENDIF
ENDIF
ENDPROC
PROC UPDATE_NEW_LOAD_SCENE_FOR_CABLE_CAR_CAMERA()
EXIT
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED())
CPRINTLN(DEBUG_AMBIENT, "[CABLE_CAR]: NEW SCENE LOADED OK")
NEW_LOAD_SCENE_STOP()
bLoadSceneOK = TRUE
iLoadSceneTimeOut = 0
EXIT
ENDIF
IF (iLoadSceneTimeOut > 0) AND (GET_GAME_TIMER() > iLoadSceneTimeOut)
CPRINTLN(DEBUG_AMBIENT, "[CABLE_CAR]: LOAD SCENE TIMED OUT")
iLoadSceneTimeOut = 0
EXIT
ENDIF
ENDPROC
PROC CREATE_STREAMVOL_FOR_NEXT_CAMERA(VECTOR vCamPos, VECTOR vCamRot, FLOAT fFarClip = 200.0)
IF IS_SCREEN_FADING_OUT() OR IS_SCREEN_FADED_OUT()
EXIT
ENDIF
IF (bUseSRLS = TRUE)
EXIT
ENDIF
IF bNewCam
IF STREAMVOL_IS_VALID(streamVolCam)
STREAMVOL_DELETE(streamVolCam)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "CREATE_STREAMVOL_FOR_NEXT_CAMERA: Creating frustum")
streamVolCam = STREAMVOL_CREATE_FRUSTUM(vCamPos, CONVERT_ROTATION_TO_DIRECTION_VECTOR(vCamRot), fFarClip, FLAG_MAPDATA, STREAMVOL_LOD_FLAG_ALL)
bNewCam = FALSE
ELSE
IF STREAMVOL_IS_VALID(streamVolCam)
IF IS_STREAMVOL_ACTIVE()
IF STREAMVOL_HAS_LOADED(streamVolCam)
CPRINTLN(DEBUG_AMBIENT, "CREATE_STREAMVOL_FOR_NEXT_CAMERA: Successful load")
STREAMVOL_DELETE(streamVolCam)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/*
PROC CREATE_STREAMVOL_FOR_CAMERA_STRUCT(CAMERA_STRUCT &cst)
IF (IS_NEW_LOAD_SCENE_ACTIVE() AND IS_NEW_LOAD_SCENE_LOADED()) OR (GET_GAME_R
IF STREAMVOL_IS_VALID(cameraStreamVol)
CPRINTLN(DEBUG_AMBIENT, "DELETED STREAMING VOL")
STREAMVOL_DELETE(cameraStreamVol)
ENDIF
cameraStreamVol = STREAMVOL_CREATE_SPHERE(cst.vPosition[0], 30.0, FLAG_MAPDATA, STREAMVOL_LOD_FLAG_HIGH)
//STREAMVOL_CREATE_FRUSTUM(cst.vPosition[0], CONVERT_ROTATION_TO_DIRECTION_VECTOR(cst.vRotation[0]), 200.0, FLAG_MAPDATA)
IF STREAMVOL_IS_VALID(cameraStreamVol)
CPRINTLN(DEBUG_AMBIENT, "CREATED STREAMING VOL AT ", cst.vPosition[0])
STREAMVOL_DELETE(cameraStreamVol)
ENDIF
ENDPROC
*/
//----------------------
// WIRE FUNCTIONS
//----------------------
/// PURPOSE:
/// Adds a point to the spline list
/// PARAMS:
/// x - xcoord
/// y - ycoord
/// z - zcoord
PROC ADD_CABLE_CAR_WIRE_POINT(CABLECAR_WIRE &wire, FLOAT x, FLOAT y, FLOAT z)
IF (wire.iPointsUsed >= COUNT_OF(wire.vPoints))
SCRIPT_ASSERT("INCREASE ARRAY SIZE OF CABLECAR_WIRE::vPoints")
EXIT
ENDIF
wire.vPoints[wire.iPointsUsed].x = x
wire.vPoints[wire.iPointsUsed].y = y
wire.vPoints[wire.iPointsUsed].z = z
wire.iPointsUsed ++
ENDPROC
/// PURPOSE:
/// Fills the points for the cable
/// PARAMS:
/// wire - wire reference
PROC CALCULATE_CABLE_CAR_WIRE_LENGTH(CABLECAR_WIRE &wire)
INT i
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CALCULATE_CABLE_CAR_WIRE_LENGTH()")
wire.fRopeLength = 0
REPEAT wire.iPointsUsed - 2 i
wire.fRopeLength += GET_DISTANCE_BETWEEN_COORDS(wire.vPoints[i], wire.vPoints[i + 1])
ENDREPEAT
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CALCULATE_CABLE_CAR_WIRE_LENGTH() - Wire Length:", wire.fRopeLength)
ENDPROC
/// PURPOSE:
/// Fills the points for the cable
/// PARAMS:
/// wire - wire reference
PROC SETUP_CABLE_CAR_WIRE_LEFT(CABLECAR_WIRE &wire)
wire.iPointsUsed = 0
ADD_CABLE_CAR_WIRE_POINT(wire, -740.911, 5599.341, 47.25)
ADD_CABLE_CAR_WIRE_POINT(wire, -739.557, 5599.346, 46.997)
ADD_CABLE_CAR_WIRE_POINT(wire, -581.009, 5596.517, 77.379)
ADD_CABLE_CAR_WIRE_POINT(wire, -575.717, 5596.388, 79.220)
ADD_CABLE_CAR_WIRE_POINT(wire, -273.805, 5590.844, 240.795)
ADD_CABLE_CAR_WIRE_POINT(wire, -268.707, 5590.744, 243.395)
ADD_CABLE_CAR_WIRE_POINT(wire, 6.896, 5585.668, 423.614)
ADD_CABLE_CAR_WIRE_POINT(wire, 11.774, 5585.591, 426.711)
ADD_CABLE_CAR_WIRE_POINT(wire, 236.820, 5581.445, 599.642)
ADD_CABLE_CAR_WIRE_POINT(wire, 241.365, 5581.369, 603.183)
ADD_CABLE_CAR_WIRE_POINT(wire, 412.855, 5578.216, 774.401)
ADD_CABLE_CAR_WIRE_POINT(wire, 417.541, 5578.124, 777.688)
ADD_CABLE_CAR_WIRE_POINT(wire, 444.930, 5577.589, 786.535)
ADD_CABLE_CAR_WIRE_POINT(wire, 446.288, 5577.590, 786.750)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:SETUP_CABLE_CAR_WIRE_LEFT() - Cable Car Left Wire Setup")
CALCULATE_CABLE_CAR_WIRE_LENGTH(wire)
ENDPROC
/// PURPOSE:
/// Fills the points for the cable
/// PARAMS:
/// wire - wire reference
PROC SETUP_CABLE_CAR_WIRE_RIGHT_FLIPPED(CABLECAR_WIRE &wire)
wire.iPointsUsed = 0
ADD_CABLE_CAR_WIRE_POINT(wire, 446.291, 5566.377, 786.750)
ADD_CABLE_CAR_WIRE_POINT(wire, 444.937, 5566.383, 786.551)
ADD_CABLE_CAR_WIRE_POINT(wire, 417.371, 5567.001, 777.708)
ADD_CABLE_CAR_WIRE_POINT(wire, 412.661, 5567.085, 774.439)
ADD_CABLE_CAR_WIRE_POINT(wire, 241.310, 5570.594, 603.137)
ADD_CABLE_CAR_WIRE_POINT(wire, 236.821, 5570.663, 599.561)
ADD_CABLE_CAR_WIRE_POINT(wire, 11.350, 5575.298, 426.629)
ADD_CABLE_CAR_WIRE_POINT(wire, 6.575, 5575.391, 423.570)
ADD_CABLE_CAR_WIRE_POINT(wire, -268.965, 5580.996, 243.386)
ADD_CABLE_CAR_WIRE_POINT(wire, -273.993, 5581.124, 240.808)
ADD_CABLE_CAR_WIRE_POINT(wire, -575.898, 5587.286, 79.251)
ADD_CABLE_CAR_WIRE_POINT(wire, -581.321, 5587.400, 77.348)
ADD_CABLE_CAR_WIRE_POINT(wire, -739.646, 5590.614, 47.006)
ADD_CABLE_CAR_WIRE_POINT(wire, -740.970, 5590.617, 47.306)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:SETUP_CABLE_CAR_WIRE_RIGHT_FLIPPED() - Cable Car Right Wire Flipped Setup")
CALCULATE_CABLE_CAR_WIRE_LENGTH(wire)
ENDPROC
/// PURPOSE:
/// Draw Wire with debug
/// PARAMS:
/// wire - wire reference
PROC DRAW_DEBUG_CABLE_CAR_WIRE(CABLECAR_WIRE &wire, INT r = 0, INT g = 0, INT b = 255, INT a = 255)
INT i
IF (wire.bShowWire = FALSE)
EXIT
ENDIF
#IF IS_DEBUG_BUILD
IF (wire.iDebugPoint > (wire.iPointsUsed - 1))
wire.iDebugPoint = (wire.iPointsUsed - 1)
ENDIF
#ENDIF
REPEAT wire.iPointsUsed i
IF (i > 0)
IF ((i % 2) = 0)
DRAW_DEBUG_LINE(wire.vPoints[i], wire.vPoints[i - 1], r, g, b, a)
ELSE
DRAW_DEBUG_LINE(wire.vPoints[i], wire.vPoints[i - 1], r, 255, b, a)
ENDIF
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
IF (wire.iDebugPoint <= (wire.iPointsUsed - 2))
wire.vWireDebugPoint = INTERPOLATE_VECTOR(wire.vPoints[wire.iDebugPoint], wire.vPoints[wire.iDebugPoint + 1], wire.fDebugInterpolate, TRUE)
ELSE
wire.vWireDebugPoint = wire.vPoints[wire.iDebugPoint]
ENDIF
DRAW_DEBUG_LINE(wire.vWireDebugPoint + <<0, 0, fDebugWireVertexHeight>>, wire.vWireDebugPoint - <<0, 0, fDebugWireVertexHeight>>, 0, 255, 0, 255)
DRAW_DEBUG_SPHERE(wire.vWireDebugPoint, fDebugWireVertexSize)
DRAW_DEBUG_CIRCLE(wire.vWireDebugPoint, 1.0)
#ENDIF
ENDPROC
/// PURPOSE:
/// intepolate across wire and gives us a vector
/// PARAMS:
/// wire - wire
/// seg - segment number
/// t - value across segment from 0 to 1
/// out - return vector
/// RETURNS:
/// true if this works
FUNC VECTOR GET_WIRE_POSITION(CABLECAR_WIRE &wire, INT seg, FLOAT &t)
IF (seg < 0)
t = 0.0
RETURN wire.vPoints[0]
ENDIF
IF (seg >= wire.iPointsUsed - 1)
t = 0.0
RETURN wire.vPoints[wire.iPointsUsed - 1]
ENDIF
// clamp t
IF (t < 0.0)
t = 0.0
ENDIF
IF (t > 1.0)
t = 1.0
ENDIF
RETURN INTERPOLATE_VECTOR(wire.vPoints[seg], wire.vPoints[seg + 1], t, TRUE)
ENDFUNC
//----------------------
// CAR FUNCTIONS
//----------------------
/// PURPOSE:
/// Zeros out variables
/// PARAMS:
/// car -
PROC ZERO_CABLE_CAR_STRUCT(CABLE_CAR &car)
car.fDistTravelled = 0
car.bIsMoving = FALSE
car.fSpeed = 0.0
car.bHelpShown = FALSE
car.carState = CABLECAR_NULLSTATE
car.bIsPaused = FALSE
ENDPROC
FUNC BOOL IS_IT_RAINING_OUTSIDE()
IF IS_NEXT_WEATHER_TYPE("RAIN")
OR IS_NEXT_WEATHER_TYPE("THUNDER")
OR IS_PREV_WEATHER_TYPE("RAIN")
OR IS_PREV_WEATHER_TYPE("THUNDER")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_INTERNAL_RAIN_SOUND_ENABLED(CABLE_CAR &car, BOOL bOk = TRUE)
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRainSound)
IF (bOk)
#IF IS_NEXTGEN_BUILD
IF IS_IT_RAINING_OUTSIDE()
car.iRainSound = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(car.iRainSound, "Interior_Rain", PLAYER_PED_ID(), "CABLE_CAR_SOUNDS")
ENDIF
#ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Rain Sound is:", bOk)
ENDPROC
/// PURPOSE:
/// Check if ped is in cable car
/// PARAMS:
/// ped - ped index
/// car - cable car index
/// RETURNS:
/// cable car
FUNC BOOL IS_ENTITY_IN_CABLE_CAR(ENTITY_INDEX ent, CABLE_CAR &car, FLOAT ex = 0.0, BOOL drawArea = FALSE)
ANGLED_AREA area
IF NOT IS_ENTITY_OK(car.cablecarID)
RETURN FALSE
ENDIF
SET_ANGLED_AREA(area,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, <<0, 2.750, vCableCarPlayerAttachOffset.z>>) + <<0, 0, 1>>,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, <<0, -2.750, vCableCarPlayerAttachOffset.z>>) - <<0, 0, 1>>,
3.0)
IF (drawArea)
DEBUG_DRAW_ANGLED_AREA_EX(area)
ENDIF
IF (ex > 0.0)
ANGLED_AREA areaex = EXPAND_ANGLED_AREA(area, ex)
RETURN IS_ENTITY_IN_ANGLED_AREA(ent, areaex.vPosition[0], areaex.vPosition[1], areaex.fWidth)
ENDIF
RETURN IS_ENTITY_IN_ANGLED_AREA(ent, area.vPosition[0], area.vPosition[1], area.fWidth)
ENDFUNC
/// PURPOSE:
/// Check if ped is in cable car
/// PARAMS:
/// ped - ped index
/// car - cable car index
/// RETURNS:
/// cable car
FUNC BOOL IS_ENTITY_ON_TOP_OF_CABLE_CAR(ENTITY_INDEX ent, CABLE_CAR &car, FLOAT ex = 0.0, BOOL drawArea = FALSE)
ANGLED_AREA area
IF NOT IS_ENTITY_OK(car.cablecarID)
RETURN FALSE
ENDIF
SET_ANGLED_AREA(area,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, <<0, 2.750, vCableCarPlayerAttachOffset.z + 2.63>>) + <<0, 0, 1>>,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, <<0, -2.750, vCableCarPlayerAttachOffset.z + 2.63>>) - <<0, 0, 1>>,
3.0)
IF (drawArea)
DEBUG_DRAW_ANGLED_AREA_EX(area)
ENDIF
IF (ex > 0.0)
ANGLED_AREA areaex = EXPAND_ANGLED_AREA(area, ex)
RETURN IS_ENTITY_IN_ANGLED_AREA(ent, areaex.vPosition[0], areaex.vPosition[1], areaex.fWidth)
ENDIF
RETURN IS_ENTITY_IN_ANGLED_AREA(ent, area.vPosition[0], area.vPosition[1], area.fWidth)
ENDFUNC
/// PURPOSE:
/// Returns the direction enum for the cable car
/// PARAMS:
/// car - cable car reference
FUNC eCableCarDirection GET_CABLE_CAR_DIRECTION_ENUM(CABLE_CAR &car)
IF (car.iWireIndex = CABLE_WIRE_LEFT)
IF (car.fSpdSgn = 1.0)
RETURN CABLECAR_MOVEUP
ELSE
RETURN CABLECAR_MOVEDOWN
ENDIF
ENDIF
IF (car.fSpdSgn = -1.0)
RETURN CABLECAR_MOVEUP
ELSE
RETURN CABLECAR_MOVEDOWN
ENDIF
ENDFUNC
/// PURPOSE:
/// Updates a cable car moving forward
/// PARAMS:
/// car - cable car reference
/// RETURNS:
/// We return true if the ride is finished
PROC UPDATE_CABLE_CAR_WIRE_ANIM(CABLE_CAR &car)
TEXT_LABEL lbl = "C"
lbl += ((car.iWireIndex) + 1)
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
SWITCH (car.iWireSegment)
CASE 0
lbl += "_up_9"
BREAK
CASE 1
lbl += "_up_1"
BREAK
CASE 3
lbl += "_up_3"
BREAK
CASE 5
lbl += "_up_4"
BREAK
CASE 7
lbl += "_up_5"
BREAK
CASE 9
lbl += "_up_6"
BREAK
CASE 11
lbl += "_up_8"
BREAK
CASE 12
lbl += "_up_9"
BREAK
DEFAULT
EXIT
ENDSWITCH
ELSE
SWITCH (car.iWireSegment)
CASE 0
lbl += "_down_1"
BREAK
CASE 1
lbl += "_down_2"
BREAK
CASE 3
lbl += "_down_3"
BREAK
CASE 5
lbl += "_down_4"
BREAK
CASE 7
lbl += "_down_5"
BREAK
CASE 9
lbl += "_down_6"
BREAK
CASE 11
lbl += "_down_8"
BREAK
CASE 12
lbl += "_down_9"
BREAK
DEFAULT
EXIT
ENDSWITCH
ENDIF
PLAY_ENTITY_ANIM(car.cableCarID, lbl, "p_cablecar_s", NORMAL_BLEND_IN, FALSE, TRUE)
ENDPROC
PROC UPDATE_CABLE_CAR_CAMERA_MOVE_UP(CABLE_CAR &car)
BOOL camSwitch = FALSE
SWITCH (iCameraPointIndex)
CASE 0
SETUP_CAMERA_STRUCT(externalCamera, <<-733.0331, 5557.0503, 54.3150>>, <<-13.2766, 0.0000, 26.2995>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-733.0331, 5557.0503, 54.3050>>, <<3.6561, 0.0000, -49.3377>>, 20000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 50.0)
iCameraPointIndex ++
camSwitch = TRUE
BREAK
CASE 1
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-674.4, 5644.0, 40.1>>, <<7.5, 0.0, 148.3>>)
IF (car.fDistTravelled > 45.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-674.4, 5644.0, 40.1>>, <<7.5, 0.0, 148.3>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-674.4, 5644.0, 40.1>>, <<7.5, 0.0, -133.2>>, 11000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 55.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 2
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-539.4792, 5522.9756, 65.4000>>, <<4.1853, -0.0000, 23.2142>>)
IF (car.fDistTravelled > 136.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-539.4792, 5522.9756, 65.4000>>, <<4.1853, -0.0000, 23.2142>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-536.2819, 5524.2173, 65.4000>>, <<9.7636, -0.0000, 14.8368>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 55.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 3
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-428.1000, 5383.3999, 102.3000>>, <<-6.4381, 0.0000, 12.5398>>)
IF (car.fDistTravelled > 220.3)
SETUP_CAMERA_STRUCT(externalCamera, <<-428.1000, 5383.3999, 102.3000>>, <<-6.4381, 0.0000, 12.5398>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-428.1000, 5383.3999, 102.3000>>, <<1.7164, 0.0000, -8.3420>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 4
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-443.8493, 5570.7671, 143.7865>>, <<24.0363, -0.0000, -84.8520>>)
IF (car.fDistTravelled > 337.3)
SETUP_CAMERA_STRUCT(externalCamera, <<-443.8493, 5570.7671, 143.7865>>, <<24.0363, -0.0000, -84.8520>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-446.9265, 5570.4902, 150.7141>>, <<24.0363, -0.0000, -84.8520>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 42.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 5
iCameraPointIndex ++
BREAK
CASE 6
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-237.0857, 5571.8896, 262.2075>>, <<-38.2954, 0.0082, 79.4291>>)
IF (car.fDistTravelled > 440.5)
SETUP_CAMERA_STRUCT(externalCamera, <<-237.0857, 5571.8896, 262.2075>>, <<-38.2954, 0.0082, 79.4291>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-234.3823, 5571.3843, 258.7245>>, <<-23.0862, 0.0082, 79.4291>>, 13500)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 44.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 7
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-318.7657, 5556.8384, 239.9462>>, <<18.0440, 0.0339, -85.4425>>)
IF (car.fDistTravelled > 545.5)
SETUP_CAMERA_STRUCT(externalCamera, <<-318.7657, 5556.8384, 239.9462>>, <<18.0440, 0.0339, -85.4425>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-311.4510, 5557.4204, 242.3366>>, <<20.0948, 0.0339, -85.4425>>, 20000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 50.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 8
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<46.513, 5534.116, 378.619>>, <<-12.2512, 0.004, 70.544>>)
IF (car.fDistTravelled > 663.5)
SETUP_CAMERA_STRUCT(externalCamera, <<46.513, 5534.116, 378.619>>, <<-12.2512, 0.004, 70.544>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<46.513, 5534.116, 378.619>>, <<8.2022, 0.004, 56.5520>>, 20000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 9
iCameraPointIndex ++
BREAK
CASE 10
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<229.948, 5536.094, 522.865>>, <<-14.7644, -0.1333, 67.2156>>)
IF (car.fDistTravelled > 855.5)
//SETUP_CAMERA_STRUCT(externalCamera, <<230.9404, 5535.6777, 523.1490>>, <<-14.7644, -0.1333, 67.2156>>)
SETUP_CAMERA_STRUCT(externalCamera, <<229.948, 5536.094, 522.865>>, <<-14.7644, -0.1333, 67.2156>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<227.183, 5534.888, 523.006>>, <<-2.897, -0.133, 52.652>>, 21000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 50.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 11
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<235.3752, 5515.3662, 564.9175>>, <<18.2202, 0.0000, 8.5423>>)
IF (car.fDistTravelled > 1060.36)
SETUP_CAMERA_STRUCT(externalCamera, <<235.3752, 5515.3662, 564.9175>>, <<18.2202, 0.0000, 8.5423>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<234.0372, 5524.2749, 567.8823>>, <<18.2202, 0.0000, 8.5423>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 50.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 12
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<262.3502, 5562.6812, 624.7158>>, <<33.0263, -0.0000, -82.3579>>)
IF (car.fDistTravelled > 1185.503540)
SETUP_CAMERA_STRUCT(externalCamera, <<262.3502, 5562.6812, 624.7158>>, <<33.0263, -0.0000, -82.3579>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<268.5094, 5563.5073, 628.7556>>, <<33.0263, -0.0000, -82.3579>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 50.0)
//SET_EXTERNAL_CAMERA(externalCamera, 10)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 13
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<358.3939, 5507.8916, 702.6762>>, <<12.1268, -0.0966, -6.9744>>)
IF (car.fDistTravelled > 1285.0)
SETUP_CAMERA_STRUCT(externalCamera, <<358.3939, 5507.8916, 702.6762>>, <<12.1268, -0.0966, -6.9744>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<351.1451, 5510.4966, 702.6633>>, <<28.5814, -0.0966, -30.1375>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 14
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<419.673, 5542.148, 781.969>>, <<2.839, 0.0000, -38.893>>)
IF (car.fDistTravelled > 1380.0)
SETUP_CAMERA_STRUCT(externalCamera, <<419.673, 5542.148, 781.969>>, <<2.839, 0.0000, -38.893>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<426.675, 5545.488, 782.306>>, <<2.839, 0.0000, -30.850>>, 12000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 15
iCameraPointIndex ++
BREAK
// CASE 16
// iCameraPointIndex ++
//
// /*
// IF (car.fDistTravelled > 840.0)
// SET_EXTERNAL_CAMERA(externalCamera, 15)
// iCameraPointIndex ++
// camSwitch = TRUE
// ENDIF
// */
// BREAK
// CASE 17
// iCameraPointIndex ++
//// IF (car.fDistTravelled > 840.0)
//// SET_EXTERNAL_CAMERA(externalCamera, 16)
//// SETUP_CAMERA_STRUCT_INTERPOLATE_TIME(externalCamera, 14000)
//// iCameraPointIndex ++
//// camSwitch = TRUE
//// ENDIF
// BREAK
//
// BREAK
// CASE 18
// iCameraPointIndex ++
//// IF (car.fDistTravelled > 1130.0)
//// SET_EXTERNAL_CAMERA(externalCamera, 18)
//// iCameraPointIndex ++
//// camSwitch = TRUE
//// ENDIF
// BREAK
// CASE 19
// iCameraPointIndex ++
//// IF (car.fDistTravelled > 1200.0)
//// SET_EXTERNAL_CAMERA(externalCamera, 19)
//// iCameraPointIndex ++
//// camSwitch = TRUE
//// ENDIF
// BREAK
// CASE 20
// iCameraPointIndex ++
//// IF (car.fDistTravelled > 1325.0)
//// SET_EXTERNAL_CAMERA(externalCamera, 20)
//// iCameraPointIndex ++
//// camSwitch = TRUE
//// ENDIF
// BREAK
// CASE 21
// iCameraPointIndex ++
// /*
// IF (car.fDistTravelled > 1346.0)
// SET_EXTERNAL_CAMERA(externalCamera, 21)
// iCameraPointIndex ++
// camSwitch = TRUE
// ENDIF
// */
// BREAK
// CASE 22
// iCameraPointIndex ++
// /*
// IF (car.fDistTravelled > 1372.0)
// SET_EXTERNAL_CAMERA(externalCamera, 22)
//
// camSwitch = TRUE
// ENDIF
// */
// BREAK
// CASE 23
// iCameraPointIndex ++
// /*
// IF (car.fDistTravelled > 1388.0)
// SET_EXTERNAL_CAMERA(externalCamera, 23)
// iCameraPointIndex ++
// camSwitch = TRUE
// ENDIF
// */
// BREAK
// CASE 24
// iCameraPointIndex ++
//// IF (car.fDistTravelled > 1380.0)
//// SET_EXTERNAL_CAMERA(externalCamera, 24)
//// iCameraPointIndex ++
//// camSwitch = TRUE
//// ENDIF
// BREAK
ENDSWITCH
IF (camSwitch = TRUE) AND (bFPSMode = FALSE)
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_CAMERA_MOVE_UP - Switching to case: ", iCameraPointIndex)
ENABLE_CAMERA_STRUCT(externalCamera, cameraID, default, default, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
bNewCam = TRUE
ENDIF
ENDPROC
PROC UPDATE_CABLE_CAR_CAMERA_MOVE_DOWN(CABLE_CAR &car)
BOOL camSwitch = FALSE
CAMERA_STRUCT streamCam
SWITCH (iCameraPointIndex)
CASE 0
SETUP_CAMERA_STRUCT(externalCamera, <<461.3928, 5634.5933, 803.8433>>, <<-21.1986, 0.0407, 152.8518>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<465.1065, 5631.4941, 803.8177>>, <<-26.0362, 0.0546, 133.1987>>, 23000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.0)
iCameraPointIndex ++
camSwitch = TRUE
BREAK
CASE 1
iCameraPointIndex ++
BREAK
CASE 2
CASE 3
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<215.1628, 5595.8301, 615.1234>>, <<22.9775, -0.0000, -111.6452>>)
IF (car.fDistTravelled > 112.0)
SETUP_CAMERA_STRUCT(externalCamera, <<215.1628, 5595.8301, 615.1234>>, <<22.9775, -0.0000, -111.6452>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<221.7997, 5593.1108, 597.7890>>, <<17.1025, -0.0000, -121.5107>>, 18000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 4
iCameraPointIndex ++
BREAK
CASE 5
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<251.0161, 5575.7451, 617.5678>>, <<-56.0667, 0.0000, 89.7301>>)
IF (car.fDistTravelled > 288.0)
SETUP_CAMERA_STRUCT(externalCamera, <<251.0161, 5575.7451, 617.5678>>, <<-56.0667, 0.0000, 89.7301>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<248.8245, 5575.7476, 619.0521>>, <<-54.6050, 0.0000, 89.7301>>, 11000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
NEW_LOAD_SCENE_FOR_CAMERA_STRUCT(streamCam, 16)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 6
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-69.8260, 5595.7646, 390.4564>>, <<25.1669, 0.0000, -110.1190>>)
IF (car.fDistTravelled > 400.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-69.8260, 5595.7646, 390.4564>>, <<25.1669, 0.0000, -110.1190>>) //<<0.8, 5591.6, 422.6>>, <<26.5, 0.0, -112.1>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-68.5961, 5595.1831, 386.8474>>, <<20.6269, 0.0000, -115.1379>>, 18000) // <0.8, 5574.0, 422.6>>, <<26.5, 0.0, -112.1>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.43)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 7
CASE 8
CASE 9
CASE 10
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-6.2591, 5609.3184, 402.8656>>, <<-0.9222, 0.0000, 153.9538>>)
IF (car.fDistTravelled > 575.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-6.2591, 5609.3184, 402.8656>>, <<-0.9222, 0.0000, 153.9538>>) //<<0.8, 5591.6, 422.6>>, <<26.5, 0.0, -112.1>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-5.9107, 5609.6133, 401.1573>>, <<-11.4635, 0.0000, 130.2651>>, 10000) // <0.8, 5574.0, 422.6>>, <<26.5, 0.0, -112.1>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 55.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 11
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-215.7561, 5606.1870, 282.0778>>, <<22.8233, -0.0000, -118.7368>>)
IF (car.fDistTravelled > 660.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-215.7561, 5606.1870, 282.0778>>, <<22.8233, -0.0000, -118.7368>>) //<<0.8, 5591.6, 422.6>>, <<26.5, 0.0, -112.1>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-199.8146, 5615.9712, 284.7165>>, <<22.8233, -0.0000, -138.4323>>, 10000) // <0.8, 5574.0, 422.6>>, <<26.5, 0.0, -112.1>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.026)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 12
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-61.8849, 5558.9736, 338.9037>>, <<-15.2417, 0.0000, 104.1686>>)
IF (car.fDistTravelled > 740.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-61.8849, 5558.9736, 338.9037>>, <<-15.2417, 0.0000, 104.1686>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-58.0053, 5559.9546, 323.4490>>, <<-10.6159, -0.0000, 104.1686>>, 10000) // <0.8, 5574.0, 422.6>>, <<26.5, 0.0, -112.1>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 47.9808)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 13
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-291.6088, 5570.3823, 227.2185>>, <<26.4681, 0.0000, -73.2798>>)
IF (car.fDistTravelled > 840.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-291.6088, 5570.3823, 227.2185>>, <<26.4681, 0.0000, -73.2798>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-292.7007, 5575.8618, 227.2185>>, <<24.4170, -0.0000, -69.0123>>, 10000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.05)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 14
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-509.6508, 5683.8433, 89.9184>>, <<21.3193, 0.0000, -128.1549>>)
IF (car.fDistTravelled > 920.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-509.6508, 5683.8433, 89.9184>>, <<21.3193, 0.0000, -128.1549>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-511.7916, 5681.1201, 89.9184>>, <<21.3193, 0.0000, -128.1549>>, 18000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 40.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 15
iCameraPointIndex ++
BREAK
CASE 16
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-475.9374, 5375.9893, 94.2374>>, <<6.8777, -0.0000, 6.4845>>)
IF (car.fDistTravelled > 1090.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-475.9374, 5375.9893, 94.2374>>, <<6.8777, -0.0000, 6.4845>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-475.9374, 5375.9893, 94.2374>>, <<-2.0745, -0.0000, 21.1399>>, 16000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 30.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 17
iCameraPointIndex ++
BREAK
CASE 18
iCameraPointIndex ++
BREAK
CASE 19
iCameraPointIndex ++
BREAK
CASE 20
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-674.5237, 5574.5649, 41.1581>>, <<15.6335, 0.0000, -77.0593>>)
IF (car.fDistTravelled > 1245.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-674.5237, 5574.5649, 41.1581>>, <<15.6335, 0.0000, -77.0593>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-675.0132, 5576.0742, 41.1581>>, <<24.5521, 0.0000, -57.7690>>, 13000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
CASE 21
iCameraPointIndex ++
BREAK
CASE 22
CREATE_STREAMVOL_FOR_NEXT_CAMERA(<<-743.0775, 5570.7764, 47.8665>>, <<-3.7547, 0.2510, -46.5015>>)
IF (car.fDistTravelled > 1355.0)
SETUP_CAMERA_STRUCT(externalCamera, <<-743.0775, 5570.7764, 47.8665>>, <<-3.7547, 0.2510, -46.5015>>)
SETUP_CAMERA_STRUCT_END_SHOT(externalCamera, <<-749.0400, 5577.4209, 47.9055>>, <<-9.6095, 0.2510, -48.8215>>, 20000)
SETUP_CAMERA_STRUCT_FOV(externalCamera, 45.0)
iCameraPointIndex ++
camSwitch = TRUE
ENDIF
BREAK
ENDSWITCH
IF (camSwitch = TRUE) AND (bFPSMode = FALSE)
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_CAMERA_MOVE_Down - Switching to case: ", iCameraPointIndex)
ENABLE_CAMERA_STRUCT(externalCamera, cameraID, default, default, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
bNewCam = TRUE
ENDIF
ENDPROC
PROC UPDATE_CABLE_CAR_CAMERA(CABLE_CAR &car)
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
UPDATE_CABLE_CAR_CAMERA_MOVE_UP(car)
ELSE
UPDATE_CABLE_CAR_CAMERA_MOVE_DOWN(car)
ENDIF
UPDATE_NEW_LOAD_SCENE_FOR_CABLE_CAR_CAMERA()
/*
IF STREAMVOL_IS_VALID(cameraStreamVol)
IF STREAMVOL_HAS_LOADED(cameraStreamVol)
STREAMVOL_DELETE(cameraStreamVol)
ENDIF
ENDIF
*/
ENDPROC
/// PURPOSE:
/// Attach entity to cable car - attaches object to the car relative to where it is
/// PARAMS:
/// ent - entity
/// car - car
PROC ATTACH_ENTITY_TO_CABLE_CAR(ENTITY_INDEX ent, CABLE_CAR &car)
VECTOR v
VECTOR cmin, cmax
VECTOR entmin, entmax
FLOAT entlength, entwidth
IF IS_ENTITY_ATTACHED(ent)
DETACH_ENTITY(ent)
ENDIF
v = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(car.cablecarID, GET_ENTITY_COORDS(ent))
// attach vehicle and make sure it's inside
GET_MODEL_DIMENSIONS(CABLECAR, cmin, cmax)
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(ent), entmin, entmax)
entlength = ABSF(entmax.y - entmin.y)
entwidth = ABSF(entmax.x - entmin.x)
v.x = CLAMP(v.x, cmin.x + (entwidth * 0.75), cmax.x - (entwidth * 0.75))
v.y = CLAMP(v.y, cmin.y + (entlength * 0.5), cmax.y - (entlength * 0.5))
v.y *= car.fSpdSgn
SET_ENTITY_HEADING(ent, GET_ENTITY_HEADING(car.cablecarID))
FREEZE_ENTITY_POSITION(ent, TRUE)
ATTACH_ENTITY_TO_ENTITY(ent, car.cablecarID, 0, v, <<0, 0, 0>>)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Attaching Entity ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(ent)), " to cable car at ", v, " Model Dimensions [", entmin, "] [", entmax, "]")
ENDPROC
FUNC BOOL IS_VEHICLE_ALLOWED_TO_BE_ON_CABLE_CAR(VEHICLE_INDEX ind)
MODEL_NAMES mdl = GET_ENTITY_MODEL(ind)
IF (mdl = CABLECAR)
RETURN FALSE
ENDIF
RETURN IS_THIS_MODEL_A_BIKE(mdl) OR IS_THIS_MODEL_A_BICYCLE(mdl)
ENDFUNC
PROC ATTACH_FRIEND_A_TO_CABLE_CAR(CABLE_CAR &car)
IF NOT IS_ENTITY_OK(FRIEND_A_PED_ID()) OR NOT IS_ENTITY_OK(car.cablecarID)
EXIT
ENDIF
VECTOR v = vCableCarPlayerAttachOffset
v.x = -1.0
SET_ENTITY_COORDS(FRIEND_A_PED_ID(), GET_ENTITY_COORDS(car.cablecarID))
IF IS_ENTITY_ATTACHED(FRIEND_A_PED_ID())
DETACH_ENTITY(FRIEND_A_PED_ID())
ENDIF
v.y *= car.fSpdSgn
IF (car.fSpdSgn = -1.0)
ATTACH_ENTITY_TO_ENTITY(FRIEND_A_PED_ID(), car.cablecarID, 0, v, <<0, 0, 180.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(FRIEND_A_PED_ID(), car.cablecarID, 0, v, <<0, 0, 0>>)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:ATTACH_FRIEND_A_TO_CABLE_CAR() - Friend A Attached")
ENDPROC
PROC ATTACH_FRIEND_B_TO_CABLE_CAR(CABLE_CAR &car)
IF NOT IS_ENTITY_OK(FRIEND_B_PED_ID()) OR NOT IS_ENTITY_OK(car.cablecarID)
EXIT
ENDIF
VECTOR v = vCableCarPlayerAttachOffset
v.x = 1.0
SET_ENTITY_COORDS(FRIEND_B_PED_ID(), GET_ENTITY_COORDS(car.cablecarID))
IF IS_ENTITY_ATTACHED(FRIEND_B_PED_ID())
DETACH_ENTITY(FRIEND_B_PED_ID())
ENDIF
v.y *= car.fSpdSgn
IF (car.fSpdSgn = -1.0)
ATTACH_ENTITY_TO_ENTITY(FRIEND_B_PED_ID(), car.cablecarID, 0, v, <<0, 0, 180.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(FRIEND_B_PED_ID(), car.cablecarID, 0, v, <<0, 0, 0>>)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:ATTACH_FRIEND_B_TO_CABLE_CAR() - Friend B Attached")
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_PLAYER_TO_CABLE_CAR(CABLE_CAR &car)
IF NOT IS_ENTITY_OK(PLAYER_PED_ID()) OR NOT IS_ENTITY_OK(car.cablecarID)
EXIT
ENDIF
VECTOR v = vCableCarPlayerAttachOffset
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(car.cablecarID))
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
v.y *= car.fSpdSgn
IF (car.fSpdSgn = -1.0)
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), car.cablecarID, 0, v, <<0, 0, 180.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), car.cablecarID, 0, v, <<0, 0, 0>>)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:ATTACH_PED_TO_CABLE_CAR() - Player Ped Attached")
ATTACH_FRIEND_A_TO_CABLE_CAR(car)
ATTACH_FRIEND_B_TO_CABLE_CAR(car)
ENDPROC
PROC ATTACH_VEHICLE_TO_CABLE_CAR(ENTITY_INDEX ent, CABLE_CAR &car, INT iIndex)
VECTOR v
IF IS_ENTITY_ATTACHED(ent)
DETACH_ENTITY(ent)
ENDIF
// 0.463465
IF (iIndex = 0)
v = << 0.6, -1.21756, -5.854 >>
ELSE
v = << -0.6, -1.21756, -5.85388 >>
ENDIF
v.y *= car.fSpdSgn
IF (car.fSpdSgn = -1.0)
ATTACH_ENTITY_TO_ENTITY(ent, car.cablecarID, 0, v, <<0, 0, 180.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(ent, car.cablecarID, 0, v, <<0, 0, 0>>)
ENDIF
SET_ENTITY_HEADING(ent, GET_ENTITY_HEADING(car.cablecarID))
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Attaching Vehicle ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(ent)), " to cable car at ", v)
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_FRIEND_A_CABLE_CAR_ARRIVAL(CABLE_CAR &car)
VECTOR v = vCableCarLeftExitOffset
IF IS_ENTITY_OK(FRIEND_A_PED_ID()) AND IS_ENTITY_OK(car.cablecarID)
IF IS_ENTITY_ATTACHED(FRIEND_A_PED_ID())
DETACH_ENTITY(FRIEND_A_PED_ID())
ENDIF
v.x += 0.2
v.y += 0.5
ATTACH_ENTITY_TO_ENTITY(FRIEND_A_PED_ID(), car.cablecarID, 0, v, <<0, 0, -90.0>>)
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_FRIEND_B_CABLE_CAR_ARRIVAL(CABLE_CAR &car)
VECTOR v = vCableCarLeftExitOffset
IF IS_ENTITY_OK(FRIEND_B_PED_ID()) AND IS_ENTITY_OK(car.cablecarID)
IF IS_ENTITY_ATTACHED(FRIEND_B_PED_ID())
DETACH_ENTITY(FRIEND_B_PED_ID())
ENDIF
v.x -= 0.4
v.y -= 0.5
ATTACH_ENTITY_TO_ENTITY(FRIEND_B_PED_ID(), car.cablecarID, 0, v, <<0, 0, -90.0>>)
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_PLAYER_TO_CABLE_CAR_ARRIVAL(CABLE_CAR &car)
VECTOR v = vCableCarLeftExitOffset
IF IS_ENTITY_OK(PLAYER_PED_ID()) AND IS_ENTITY_OK(car.cablecarID)
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), car.cablecarID, 0, v, <<0, 0, -90.0>>)
ENDIF
ATTACH_FRIEND_A_CABLE_CAR_ARRIVAL(car)
ATTACH_FRIEND_B_CABLE_CAR_ARRIVAL(car)
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC DETACH_PED_FROM_CABLE_CAR(PED_INDEX ped, CABLE_CAR &car)
IS_ENTITY_OK(car.cablecarID)
IS_ENTITY_OK(ped)
IF DOES_ENTITY_EXIST(car.cablecarID) AND DOES_ENTITY_EXIST(ped)
IF IS_ENTITY_ATTACHED_TO_ENTITY(ped, car.cablecarID)
DETACH_ENTITY(ped)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Detaches and releases vehicles attached to cable car
/// PARAMS:
/// car - car
PROC DETACH_STORED_VEHICLES_IN_CABLE_CAR(CABLE_CAR &car)
INT i
CPRINTLN(DEBUG_AMBIENT, "Cable Car:", car.iWireIndex, " Ready to Release ", car.iStoredVehicleCount, " vehicles")
REPEAT car.iStoredVehicleCount i
IF DOES_ENTITY_EXIST(car.storedVehicles[i])
IS_ENTITY_OK(car.storedVehicles[i])
IF IS_ENTITY_ATTACHED(car.storedVehicles[i])
DETACH_ENTITY(car.storedVehicles[i], FALSE, FALSE)
ENDIF
FREEZE_ENTITY_POSITION(car.storedVehicles[i], FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(car.storedVehicles[i])
CPRINTLN(DEBUG_AMBIENT, "Cable Car:", car.iWireIndex, " has detached a vehicles")
SAFE_RELEASE_VEHICLE(car.storedVehicles[i])
car.storedVehicles[i] = NULL
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_AMBIENT, "Cable Car:", car.iWireIndex, " has released ", car.iStoredVehicleCount, " vehicles")
car.iStoredVehicleCount = 0
ENDPROC
/// PURPOSE:
/// Attach and store vehicles
/// PARAMS:
/// car -
PROC ATTACH_AND_STORE_VEHICLES_IN_CABLE_CAR(CABLE_CAR &car)
INT i = 0
INT cnt = 0
VEHICLE_INDEX array[10]
IS_ENTITY_OK(PLAYER_PED_ID())
cnt = GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), array)
IF (cnt = 0)
EXIT
ENDIF
DETACH_STORED_VEHICLES_IN_CABLE_CAR(car)
REPEAT cnt i
IF (car.iStoredVehicleCount < COUNT_OF(car.storedVehicles))
IF IS_ENTITY_OK(array[i]) AND IS_VEHICLE_ALLOWED_TO_BE_ON_CABLE_CAR(array[i])
IF IS_ENTITY_IN_CABLE_CAR(array[i], car)
car.storedVehicles[car.iStoredVehicleCount] = array[i]
IF NOT IS_ENTITY_A_MISSION_ENTITY(car.storedVehicles[car.iStoredVehicleCount])
SET_ENTITY_AS_MISSION_ENTITY(car.storedVehicles[car.iStoredVehicleCount])
ENDIF
ATTACH_VEHICLE_TO_CABLE_CAR(car.storedVehicles[car.iStoredVehicleCount], car, car.iStoredVehicleCount)
//ATTACH_ENTITY_TO_CABLE_CAR(car.storedVehicles[car.iStoredVehicleCount], car)
car.iStoredVehicleCount ++
ENDIF
ENDIF
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_AMBIENT, "Cable Car:", car.iWireIndex, " has stored ", car.iStoredVehicleCount, " vehicles")
ENDPROC
/// PURPOSE:
/// cHECKs if player is trying to put stupid stuff in cable car
/// PARAMS:
/// car -
FUNC BOOL IS_A_WRONG_VEHICLE_IN_CABLE_CAR(CABLE_CAR &car)
INT i = 0
INT cnt = 0
VEHICLE_INDEX array[10]
IS_ENTITY_OK(PLAYER_PED_ID())
cnt = GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), array)
IF (cnt = 0)
RETURN FALSE
ENDIF
REPEAT cnt i
IF IS_ENTITY_OK(array[i]) AND NOT IS_VEHICLE_ALLOWED_TO_BE_ON_CABLE_CAR(array[i])
IF IS_ENTITY_IN_CABLE_CAR(array[i], car)
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC BOOL IS_PLAYER_RIDING_ANY_CABLE_CAR()
RETURN (cableCarLeft.bIsPlayerIn AND cableCarLeft.bIsPlayerRiding) OR (cableCarRight.bIsPlayerIn AND cableCarRight.bIsPlayerRiding)
ENDFUNC
PROC SHARED_CLEANUP_CABLE_CAR(CABLE_CAR &car)
IF IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_UP_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:PLAYER_END_CABLE_CAR() - Cable Car:", car.iWireIndex, " Stop Audio Scene: CABLE_CAR_RIDE_UP_SCENE")
STOP_AUDIO_SCENE("CABLE_CAR_RIDE_UP_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_DOWN_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:PLAYER_END_CABLE_CAR() - Cable Car:", car.iWireIndex, " Stop Audio Scene: CABLE_CAR_RIDE_DOWN_SCENE")
STOP_AUDIO_SCENE("CABLE_CAR_RIDE_DOWN_SCENE")
ENDIF
SET_INTERNAL_RAIN_SOUND_ENABLED(car, FALSE)
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRunningSound)
DETACH_PED_FROM_CABLE_CAR(PLAYER_PED_ID(), car)
DETACH_STORED_VEHICLES_IN_CABLE_CAR(car)
car.bIsPlayerOnTop = FALSE
ENDPROC
/// PURPOSE:
/// Cleans up a cable car
/// PARAMS:
/// car - car reference
PROC CLEANUP_CABLE_CAR(CABLE_CAR &car, BOOL bForceDelete = FALSE)
SHARED_CLEANUP_CABLE_CAR(car)
IF DOES_ENTITY_EXIST(car.cablecarID)
IF IS_SCREEN_FADED_OUT() or bForceDelete
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CLEANUP_CABLE_CAR - Cable Car:", car.iWireIndex, " Deleted")
SAFE_DELETE_OBJECT(car.lDoor[0])
SAFE_DELETE_OBJECT(car.lDoor[1])
SAFE_DELETE_OBJECT(car.rDoor[0])
SAFE_DELETE_OBJECT(car.rDoor[1])
SAFE_DELETE_OBJECT(car.cablecarID)
ELSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CLEANUP_CABLE_CAR() - Cable Car:", car.iWireIndex, " Released")
SAFE_RELEASE_OBJECT(car.lDoor[0])
SAFE_RELEASE_OBJECT(car.lDoor[1])
SAFE_RELEASE_OBJECT(car.rDoor[0])
SAFE_RELEASE_OBJECT(car.rDoor[1])
SAFE_RELEASE_OBJECT(car.cablecarID)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Cleans up a cable car
/// PARAMS:
/// car - car reference
PROC DELETE_CABLE_CAR(CABLE_CAR &car)
SHARED_CLEANUP_CABLE_CAR(car)
SAFE_DELETE_OBJECT(car.lDoor[0])
SAFE_DELETE_OBJECT(car.lDoor[1])
SAFE_DELETE_OBJECT(car.rDoor[0])
SAFE_DELETE_OBJECT(car.rDoor[1])
SAFE_DELETE_OBJECT(car.cablecarID)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CLEANUP_CABLE_CAR() - Cable Car:", car.iWireIndex, " Deleted")
ENDPROC
/// PURPOSE:
/// Skips the cable car to position
/// PARAMS:
/// car -
/// wire -
/// seg -
/// t -
PROC SKIP_CABLE_CAR_TO_WIRE_POSITION(CABLE_CAR &car, INT seg = 0, FLOAT t = 0.0)
car.vPosition = GET_WIRE_POSITION(cableWire[car.iWireIndex], seg, t)
IF IS_ENTITY_OK(car.cablecarID)
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
ENDIF
car.iWireSegment = seg
car.fTValue = t
ENDPROC
PROC SET_CABLE_CAR_DOOR_OFFSET(CABLE_CAR &car, FLOAT x)
INT i
IF IS_ENTITY_OK(car.cablecarID)
REPEAT COUNT_OF(car.lDoor) i
IF IS_ENTITY_OK(car.lDoor[i])
IF IS_ENTITY_ATTACHED(car.lDoor[i])
DETACH_ENTITY(car.lDoor[i])
ENDIF
IF (i = 0)
ATTACH_ENTITY_TO_ENTITY(car.lDoor[i], car.cablecarID, 0, <<0, x, 0>>, <<0, 0, 0>>, FALSE, FALSE, TRUE)
ELSE
ATTACH_ENTITY_TO_ENTITY(car.lDoor[i], car.cablecarID, 0, <<0, -x, 0>>, <<0, 0, 0>>, FALSE, FALSE, TRUE)
ENDIF
ENDIF
IF IS_ENTITY_OK(car.rDoor[i])
IF IS_ENTITY_ATTACHED(car.rDoor[i])
DETACH_ENTITY(car.rDoor[i])
ENDIF
IF (i = 0)
ATTACH_ENTITY_TO_ENTITY(car.rDoor[i], car.cablecarID, 0, <<0, -x, 0>>, <<0, 0, 180>>, FALSE, FALSE, TRUE)
ELSE
ATTACH_ENTITY_TO_ENTITY(car.rDoor[i], car.cablecarID, 0, <<0, x, 0>>, <<0, 0, 180>>, FALSE, FALSE, TRUE)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
PROC FORCE_BREAK_CABLE_CAR_DOORS(CABLE_CAR &car)
IF IS_ENTITY_OK(car.cablecarID)
car.fDoorValue = CABLE_CAR_DOOR_OPEN_LIMIT
SET_CABLE_CAR_DOOR_OFFSET(car, CABLE_CAR_DOOR_OPEN_LIMIT)
ENDIF
ENDPROC
PROC REPAIR_CABLE_CAR_DOORS(CABLE_CAR &car)
IF IS_ENTITY_OK(car.cablecarID)
car.fDoorValue = 0.0
SET_CABLE_CAR_DOOR_OFFSET(car, 0.0)
ENDIF
ENDPROC
PROC START_CABLE_CAR_CUTSCENE(CABLE_CAR &car)
INT iTimer = 0
STRING srl = NULL
BOOL bExitLoop = FALSE
IF bUseSRLS = TRUE
IF GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP
srl = "cablecar_up"
ELSE
srl = "cablecar_down"
ENDIF
ENDIF
bSRLOK = FALSE
g_bIsOnCableCar = TRUE
RC_START_CUTSCENE_MODE(<<0, 0, 0>>)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 2.0)
IF NOT IS_STRING_NULL_OR_EMPTY(srl)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car ", car.iWireIndex, " Prefetch SRL:", srl)
PREFETCH_SRL(srl)
iTimer = GET_GAME_TIMER() + 6000
WHILE (bExitLoop = FALSE)
IF IS_SRL_LOADED()
bSRLOK = TRUE
bExitLoop = TRUE
ENDIF
car.fDoorValue -= TIMESTEP()
IF (car.fDoorValue <= 0.0)
car.fDoorValue = 0.0
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
IF (GET_GAME_TIMER() > iTimer)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car ", car.iWireIndex, " Prefetch SRL:", srl , " Failed Abort")
bExitLoop = TRUE
bSRLOK = FALSE
ENDIF
WAIT(0)
ENDWHILE
IF bSRLOK = TRUE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car ", car.iWireIndex, " SRL:", srl, " Loaded - Load Time:", GET_GAME_TIMER() - iTimer)
fSrlTime = 0.0
SET_SRL_READAHEAD_TIMES(5, 5, 5, 5)
BEGIN_SRL()
ELSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car ", car.iWireIndex, " Prefetch SRL:", srl , " End SRL")
END_SRL()
ENDIF
ENDIF
ENDPROC
PROC END_CABLE_CAR_CUTSCENE(CABLE_CAR &car)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
SHUTDOWN_CAMERA(cameraID)
IF (car.bIsPlayerIn = TRUE)
DETACH_PED_FROM_CABLE_CAR(PLAYER_PED_ID(), car)
DETACH_PED_FROM_CABLE_CAR(FRIEND_A_PED_ID(), car)
DETACH_PED_FROM_CABLE_CAR(FRIEND_B_PED_ID(), car)
ENDIF
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
RC_END_CUTSCENE_MODE()
IF (car.bIsPlayerIn = TRUE)
g_bIsOnCableCar = FALSE
ENDIF
IF bSRLOK = TRUE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car ", car.iWireIndex, " SRL Ended")
bSRLOK = FALSE
END_SRL()
ENDIF
ENDPROC
/// PURPOSE:
/// Creates a cable car
/// PARAMS:
/// car - car reference
/// wire - index of wire to be on
/// seg - wire segment to start on - 0 if going down to up
/// f - how far along the wire segment to be placed
PROC CREATE_CABLE_CAR(CABLE_CAR &car, INT wire, INT seg = 0, FLOAT t = 0.0, FLOAT fSpdSgn = 1.0)
FLOAT heading
ZERO_CABLE_CAR_STRUCT(car)
car.iWireIndex = wire
car.iWireSegment = seg
car.vPosition = GET_WIRE_POSITION(cableWire[wire], seg, t)
CLEAR_AREA_OF_OBJECTS(car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>, 2.0)
car.cablecarID = CREATE_OBJECT(cableCarModel, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
car.fTValue = t
car.fSpdSgn = fSpdSgn
car.iDepartTime = GET_GAME_TIMER() + iCableCarDockWaitTime
car.bIsPaused = FALSE
FREEZE_ENTITY_POSITION(car.cablecarID, TRUE)
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
heading = GET_HEADING_FROM_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
SET_ENTITY_HEADING(car.cablecarID, heading)
car.lDoor[0] = CREATE_OBJECT(cableCarDoorLModel, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>) SET_ENTITY_HEADING(car.lDoor[0], heading)
car.lDoor[1] = CREATE_OBJECT(cableCarDoorRModel, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>) SET_ENTITY_HEADING(car.lDoor[1], heading)
ATTACH_ENTITY_TO_ENTITY(car.lDoor[0], car.cablecarID, 0, <<0, 0, 0>>, <<0, 0, 0>>, FALSE, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(car.lDoor[1], car.cablecarID, 0, <<0, 0, 0>>, <<0, 0, 0>>, FALSE, FALSE, TRUE)
car.rDoor[0] = CREATE_OBJECT(cableCarDoorLModel, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
car.rDoor[1] = CREATE_OBJECT(cableCarDoorRModel, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
ATTACH_ENTITY_TO_ENTITY(car.rDoor[0], car.cablecarID, 0, <<0, 0, 0>>, <<0, 0, 180>>, FALSE, FALSE, TRUE)
ATTACH_ENTITY_TO_ENTITY(car.rDoor[1], car.cablecarID, 0, <<0, 0, 0>>, <<0, 0, 180>>, FALSE, FALSE, TRUE)
UPDATE_CABLE_CAR_WIRE_ANIM(car)
FORCE_BREAK_CABLE_CAR_DOORS(car)
IF IS_ENTITY_OK(car.cablecarID)
PLAY_SOUND_FROM_ENTITY(-1, "Arrive_Station", car.cablecarID, "CABLE_CAR_SOUNDS")
ENDIF
//SET_ENTITY_PROOFS(car.carID, TRUE, FALSE, FALSE, FALSE, TRUE)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CREATE_CABLE_CAR() - Cable Car Created - Wire:", wire, " Segment:", seg, " T:", t)
ENDPROC
FUNC CABLE_CAR GET_OPPOSITE_CABLE_CAR(CABLE_CAR &car)
IF (car.cableCarID = cableCarLeft.cablecarID)
RETURN cableCarRight
ELSE
RETURN cableCarLeft
ENDIF
ENDFUNC
PROC SKIP_CABLE_CAR_TO_END(CABLE_CAR &car)
eCableCarDirection dir = GET_CABLE_CAR_DIRECTION_ENUM(car)
IF (car.iWireIndex = CABLE_WIRE_LEFT)
IF (dir = CABLECAR_MOVEDOWN)
SKIP_CABLE_CAR_TO_WIRE_POSITION(car, 0, 0)
ELSE
SKIP_CABLE_CAR_TO_WIRE_POSITION(car, cableWire[car.iWireIndex].iPointsUsed - 1, 0)
ENDIF
ELSE
IF (dir = CABLECAR_MOVEUP)
SKIP_CABLE_CAR_TO_WIRE_POSITION(car, 0, 0)
ELSE
SKIP_CABLE_CAR_TO_WIRE_POSITION(car, cableWire[car.iWireIndex].iPointsUsed - 1, 0)
ENDIF
ENDIF
ENDPROC
PROC SIMULATE_MAP_FILL(CABLECAR_WIRE &wire)
INT cp
FLOAT t
VECTOR pos
IF bSimulateMapSkip = FALSE
EXIT
ENDIF
REPEAT wire.iPointsUsed - 2 cp
t = 0
WHILE t < 1.0
pos = INTERPOLATE_VECTOR(wire.vPoints[cp], wire.vPoints[cp + 1], t, TRUE)
CPRINTLN(DEBUG_AMBIENT, "SIMULATE MAP FILL AT:", pos, " CP:", cp, " T:", t)
SET_MINIMAP_FOW_REVEAL_COORDINATE(pos)
t += 0.125
ENDWHILE
WAIT (0)
ENDREPEAT
SET_MINIMAP_FOW_REVEAL_COORDINATE(wire.vPoints[wire.iPointsUsed - 1])
bSimulateMapSkip = FALSE
ENDPROC
PROC HANDLE_CABLE_CAR_FAKE_SKIP(CABLE_CAR &car)
SKIP_CABLE_CAR_TO_END(car)
FORCE_BREAK_CABLE_CAR_DOORS(car)
car.bIsMoving = FALSE
car.carState = CABLECAR_ARRIVED
car.fDistTravelled = 0.0
ENDPROC
/// PURPOSE:
/// Handles cable car arriving
/// PARAMS:
/// car -
/// skip -
PROC CABLE_CAR_ARRIVED(CABLE_CAR &car, BOOL skip = FALSE)
BOOL bFriendWait = FALSE
SET_INTERNAL_RAIN_SOUND_ENABLED(car, FALSE)
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRunningSound)
IF (skip) AND ((car.bIsPlayerIn = TRUE) OR (car.bIsPlayerRiding = TRUE))
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED - Cable Car:", car.iWireIndex, " Skipped Re-Spotting Cable Car")
bFPSMode = FALSE
IF STREAMVOL_IS_VALID(streamVolCam)
STREAMVOL_DELETE(streamVolCam)
ENDIF
SKIP_CABLE_CAR_TO_END(car)
IF (skip)
IF (car.iWireIndex <> cableCarLeft.iWireIndex)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Left car to end to re-sync")
HANDLE_CABLE_CAR_FAKE_SKIP(cableCarLeft)
ENDIF
IF (car.iWireIndex <> cableCarRight.iWireIndex)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Right car to end to re-sync")
HANDLE_CABLE_CAR_FAKE_SKIP(cableCarRight)
ENDIF
ENDIF
CLEAR_FOCUS()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_SELECTOR_THIS_FRAME()
WAIT(0)
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(car.cablecarID), 50, FLAG_MAPDATA | FLAG_COLLISIONS_MOVER, DEFAULT, TRUE, TRUE)
DETACH_PED_FROM_CABLE_CAR(PLAYER_PED_ID(), car)
SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(car.cablecarID) + <<6, 0, 0>>)
IF IS_ENTITY_OK(car.cablecarID)
PLAY_SOUND_FROM_ENTITY(-1, "Arrive_Station", car.cablecarID, "CABLE_CAR_SOUNDS")
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_OPEN", car.cablecarID, "CABLE_CAR_SOUNDS")
ENDIF
ATTACH_PLAYER_TO_CABLE_CAR_ARRIVAL(car)
bSkipped = FALSE
ENDIF
IF (car.bIsPlayerIn = TRUE) OR (car.bIsPlayerRiding = TRUE)
IF (skip)
FORCE_BREAK_CABLE_CAR_DOORS(car)
ENDIF
CLEAR_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_CABLE_CAR_UP))
CLEAR_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_CABLE_CAR_DOWN))
IF (car.iStoredVehicleCount = 0)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1000)
ENDIF
ENDIF
IF IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car)
IF IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_UP_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Cable Car:", car.iWireIndex, " Stop Audio Scene: CABLE_CAR_RIDE_UP_SCENE")
STOP_AUDIO_SCENE("CABLE_CAR_RIDE_UP_SCENE")
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_DOWN_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Cable Car:", car.iWireIndex, " Stop Audio Scene: CABLE_CAR_RIDE_DOWN_SCENE")
STOP_AUDIO_SCENE("CABLE_CAR_RIDE_DOWN_SCENE")
ENDIF
END_CABLE_CAR_CUTSCENE(car)
ENDIF
ENDIF
IF (skip)
FORCE_BREAK_CABLE_CAR_DOORS(car)
/* B*2206536 - WAIT(125) gave a 1/8th of a second for phone calls to slip through
// Instead We run a loop which blocks the phone and selector every frame until the wait is over
INT iDelayTimer = (GET_GAME_TIMER() + 15)
WHILE (GET_GAME_TIMER() < iDelayTimer)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_SELECTOR_THIS_FRAME()
WAIT(0)
ENDWHILE
*/
ENDIF
car.bIsMoving = FALSE
car.carState = CABLECAR_ARRIVED
car.fDistTravelled = 0.0
IF (car.bIsPlayerIn = TRUE) OR (car.bIsPlayerRiding = TRUE)
DO_SCREEN_FADE_IN(500)
IF (skip)
FORCE_BREAK_CABLE_CAR_DOORS(car)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SHUTDOWN_CAMERA(cameraID)
CHARGE_CURRENT_PLAYER_PED_ACCOUNT_BALANCE(COST_CABLECAR)
CHARGE_PLAYER_PED_ACCOUNT_BALANCE(FRIEND_A_PED_ID(), COST_CABLECAR)
CHARGE_PLAYER_PED_ACCOUNT_BALANCE(FRIEND_B_PED_ID(), COST_CABLECAR)
car.bIsPlayerIn = FALSE
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_CABLE)
CLEAR_FOCUS()
IF IS_ENTITY_OK(FRIEND_A_PED_ID())
TASK_GO_STRAIGHT_TO_COORD_RELATIVE_TO_ENTITY(FRIEND_A_PED_ID(), PLAYER_PED_ID(), <<-1, 2, 0>>, PEDMOVE_WALK)
bFriendWait = TRUE
ENDIF
IF IS_ENTITY_OK(FRIEND_B_PED_ID())
TASK_GO_STRAIGHT_TO_COORD_RELATIVE_TO_ENTITY(FRIEND_B_PED_ID(), PLAYER_PED_ID(), <<1, 2, 0>>, PEDMOVE_WALK)
bFriendWait = TRUE
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Cable Car:", car.iWireIndex, " Delay For Friend Walkout")
IF (bFriendWait)
WAIT(1000)
ENDIF
finishActivity(activityLoc, AR_playerWon)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CABLE_CAR_ARRIVED() - Cable Car:", car.iWireIndex, " Finish Friend Cable Car")
ENDIF
ENDIF
IF (skip)
SIMULATE_MAP_FILL(cableWire[car.iWireIndex])
ENDIF
car.bIsPlayerRiding = FALSE
DETACH_STORED_VEHICLES_IN_CABLE_CAR(car)
ENDPROC
/// PURPOSE:
/// Actually moves the cable car
/// PARAMS:
/// car -
PROC UPDATE_CABLE_CAR_POSITION(CABLE_CAR &car)
IF (cableCarLeft.bIsPlayerIn) OR (cableCarRight.bIsPlayerIn)
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
EXIT
ENDIF
IF IS_SPHERE_VISIBLE(car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET / 2.0>>, 15.0)
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
EXIT
ENDIF
IF IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(car.cablecarID) + <<0, 0, CABLE_CAR_WIRE_OFFSET / 2.0>>, 15.0)
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
EXIT
ENDIF
ENDPROC
/// PURPOSE:
/// Updates a cable car moving forward
/// PARAMS:
/// car - cable car reference
/// RETURNS:
/// We return true if the ride is finished
FUNC BOOL UPDATE_CABLE_CAR_FORWARD(CABLE_CAR &car)
FLOAT delta
IF (ENUM_TO_INT(car.carState) >= ENUM_TO_INT(CABLECAR_PAUSESTART))
RETURN FALSE
ENDIF
IF (!car.bIsMoving)
RETURN TRUE
ENDIF
IF ((car.iWireSegment + 1) >= cableWire[car.iWireIndex].iPointsUsed)
RETURN TRUE
ENDIF
VECTOR oldpos = car.vPosition
//FLOAT fDist = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
// zero divide defense
IF (car.fDistToNextPoint != 0.0)
delta = (car.fSpdSgn * car.fSpeed) / car.fDistToNextPoint
ELSE
delta = 0.0
ENDIF
IF (car.bIsPlayerOnTop)
delta = 0.0
ENDIF
// only bother to update if we have told car to move
IF (delta != 0.0)
FLOAT tShift = (delta * TIMESTEP() * fTimeStepFactor)
IF NOT IS_PLAYER_RIDING_ANY_CABLE_CAR()
IF NOT IS_ENTITY_IN_RANGE_COORDS_2D(PLAYER_PED_ID(), car.vPosition, 50.0)
IF NOT IS_ENTITY_ON_SCREEN(car.cablecarID)
tShift *= fImranFactor
ENDIF
ENDIF
ENDIF
car.fTValue += tShift
IF (car.fTValue >= 1.0)
car.fTValue = 0.0
IF (car.bIsPlayerIn = TRUE)
VECTOR vpos = GET_ENTITY_COORDS(PLAYER_PED_ID())
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_FORWARD() - REVEAL MAP AT:", vpos)
SET_MINIMAP_FOW_REVEAL_COORDINATE(vpos)
ENDIF
car.iWireSegment ++
IF (car.iWireSegment >= (cableWire[car.iWireIndex].iPointsUsed - 1))
car.iWireSegment = (cableWire[car.iWireIndex].iPointsUsed - 1)
car.fSpeed = 0.0
car.bIsMoving = FALSE
car.vPosition = cableWire[car.iWireIndex].vPoints[car.iWireSegment]
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_FORWARD() - Cable Car:", car.iWireIndex, " Finished")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_FORWARD() - Cable Car:", car.iWireIndex, " At Point:", car.iWireSegment)
UPDATE_CABLE_CAR_WIRE_ANIM(car)
car.fDistToNextPoint = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
ENDIF
// check no bounds are broken
IF (car.iWireSegment < (cableWire[car.iWireIndex].iPointsUsed - 1))
car.vPosition = GET_WIRE_POSITION(cableWire[car.iWireIndex], car.iWireSegment, car.fTValue)
UPDATE_CABLE_CAR_POSITION(car)
ENDIF
car.fDistTravelled += GET_DISTANCE_BETWEEN_COORDS(car.vPosition, oldpos)
//CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_FORWARD() Distance travelled:", car.fDistTravelled)
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Updates a cable car moving backward
/// PARAMS:
/// car - cable car reference
/// RETURNS:
/// We return true if the ride is finished
FUNC BOOL UPDATE_CABLE_CAR_BACKWARD(CABLE_CAR &car)
FLOAT delta
IF (ENUM_TO_INT(car.carState) >= ENUM_TO_INT(CABLECAR_PAUSESTART))
RETURN FALSE
ENDIF
IF (!car.bIsMoving)
RETURN TRUE
ENDIF
VECTOR oldpos = car.vPosition
//FLOAT fDist = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
// zero divide defense
IF (car.fDistToNextPoint != 0.0)
delta = (car.fSpdSgn * car.fSpeed) / car.fDistToNextPoint
ELSE
delta = 0.0
ENDIF
IF (car.bIsPlayerOnTop)
delta = 0.0
ENDIF
// only bother to update if we have told car to move
IF (delta != 0.0)
FLOAT tShift = (delta * TIMESTEP() * fTimeStepFactor)
IF NOT IS_PLAYER_RIDING_ANY_CABLE_CAR()
IF NOT IS_ENTITY_IN_RANGE_COORDS_2D(PLAYER_PED_ID(), car.vPosition, 50.0)
IF NOT IS_ENTITY_ON_SCREEN(car.cablecarID)
tShift *= fImranFactor
ENDIF
ENDIF
ENDIF
car.fTValue += tShift
IF (car.fTValue < 0.0)
car.fTValue = 1.0
IF (car.bIsPlayerIn = TRUE)
VECTOR vpos = GET_ENTITY_COORDS(PLAYER_PED_ID())
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_BACKWARD() - REVEAL MAP AT:", vpos)
SET_MINIMAP_FOW_REVEAL_COORDINATE(vpos)
ENDIF
car.iWireSegment --
IF (car.iWireSegment < 0)
car.iWireSegment = 0
car.fTValue = 0.0
car.fSpeed = 0.0
car.bIsMoving = FALSE
car.vPosition = cableWire[car.iWireIndex].vPoints[car.iWireSegment]
SET_ENTITY_COORDS(car.cablecarID, car.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_BACKWARD() - Cable Car:", car.iWireIndex, " Finished")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_BACKWARD() - Cable Car:", car.iWireIndex, " At Point:", car.iWireSegment)
UPDATE_CABLE_CAR_WIRE_ANIM(car)
car.fDistToNextPoint = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
ENDIF
IF (car.iWireSegment < (cableWire[car.iWireIndex].iPointsUsed - 1))
car.vPosition = INTERPOLATE_VECTOR(cableWire[car.iWireIndex].vPoints[car.iWireSegment],
cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1], car.fTValue)
UPDATE_CABLE_CAR_POSITION(car)
ENDIF
car.fDistTravelled += GET_DISTANCE_BETWEEN_COORDS(car.vPosition, oldpos)
//CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_BACKWARD() Distance travelled:", car.fDistTravelled)
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Disables attack, weapon select and certain movement controls when about to trigger a cutscene
PROC DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
ENDPROC
FUNC BOOL UPDATE_CABLE_CAR_PLAYER_HALO(CABLE_CAR &car)
BOOL bInCableCar = IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car)
IF bInCableCar
car.iDepartTime = GET_GAME_TIMER() + iCableCarDockWaitTime
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT)
DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
ENDIF
SWITCH (car.haloState)
CASE APPROACH_MODE
IF bInCableCar
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0)
car.haloState = WANTED_MODE
ELIF IS_A_WRONG_VEHICLE_IN_CABLE_CAR(car)
car.haloState = DENIED_MODE
ELSE
car.haloState = TRIGGER_MODE
ENDIF
IF (car.bHelpShown = TRUE)
CHECK_AND_CLEAR_HELP()
ENDIF
car.bHelpShown = FALSE
ENDIF
BREAK
CASE CANTAFFORD_MODE
IF NOT (car.bHelpShown)
PRINT_HELP_FOREVER("PLAY_CABLE_NO_CASH")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player Can't Afford It")
car.bHelpShown = TRUE
ENDIF
IF (NOT bInCableCar) OR (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() >= COST_CABLECAR)
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
RETURN FALSE
ENDIF
BREAK
CASE DENIED_MODE
IF NOT (car.bHelpShown)
PRINT_HELP_FOREVER("CAR_IN_CABLECAR")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " You can't put a car in a cable car")
car.bHelpShown = TRUE
ENDIF
IF (NOT bInCableCar) OR NOT IS_A_WRONG_VEHICLE_IN_CABLE_CAR(car)
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
RETURN FALSE
ENDIF
BREAK
CASE WANTED_MODE
IF NOT (car.bHelpShown)
PRINT_HELP_FOREVER("CABLE_WANTED")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " No Cable Car For You")
car.bHelpShown = TRUE
ENDIF
IF (NOT bInCableCar) OR (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0)
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
RETURN FALSE
ENDIF
BREAK
CASE TRIGGER_MODE
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT)
DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
DISABLE_SELECTOR_THIS_FRAME()
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0)
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
car.bHelpShown = FALSE
RETURN FALSE
ENDIF
IF (NOT bInCableCar)
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
car.bHelpShown = FALSE
RETURN FALSE
ENDIF
IF IS_SELECTOR_ONSCREEN(FALSE)
OR IS_PLAYER_SWITCH_IN_PROGRESS()
CHECK_AND_CLEAR_HELP()
car.haloState = APPROACH_MODE
RETURN FALSE
ENDIF
IF (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() < COST_CABLECAR)
CHECK_AND_CLEAR_HELP()
car.haloState = CANTAFFORD_MODE
car.bHelpShown = FALSE
RETURN FALSE
ENDIF
IF NOT (car.bHelpShown) AND NOT IS_PHONE_ONSCREEN()
PRINT_HELP_FOREVER("PLAY_CABLE")
car.bHelpShown = FALSE
ENDIF
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT) AND NOT IS_PHONE_ONSCREEN()
car.haloState = LAUNCH_MODE
ENDIF
BREAK
CASE LAUNCH_MODE
DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
DISABLE_SELECTOR_THIS_FRAME()
car.haloState = APPROACH_MODE
car.bHelpShown = FALSE
car.bIsPlayerRiding = TRUE
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_CABLE_CAR_UP))
ELSE
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_CABLE_CAR_DOWN))
ENDIF
CLEAR_HELP()
RETURN TRUE
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_CABLE_CAR_PLAYER_ENTRY(CABLE_CAR &car)
IF (car.bIsMoving)
EXIT
ENDIF
//If in director mode, disable starting the cablecar
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player is in Director mode, disabling cablecar usage")
EXIT
ENDIF
BOOL ok
CABLE_CAR opp
IF IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car, 1.05)
car.iDepartTime = GET_GAME_TIMER() + iCableCarDockWaitTime
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_CONTEXT)
DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
IF (car.bHelpShown = TRUE) AND IS_PHONE_ONSCREEN()
CLEAR_HELP()
car.bHelpShown = FALSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player Ride Help Cleared - Phone is on screen")
ENDIF
ok = UPDATE_CABLE_CAR_PLAYER_HALO(car)
IF (ok = TRUE)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Is Ready To Depart With Player")
SHUTDOWN_CAMERA(cameraID)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Waiting for Player Off Vehicle")
ok = IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
WHILE (OK = TRUE)
IF NOT IS_ENTITY_OK(PLAYER_PED_ID())
ok = FALSE
ELSE
ok = IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
ENDIF
WAIT(0)
// frames where control blocking won't be active
DISABLE_CONTROL_ACTIONS_FOR_CABLE_CAR()
DISABLE_SELECTOR_THIS_FRAME()
ENDWHILE
ENDIF
car.bIsPlayerIn = TRUE
iCameraPointIndex = 0
car.carState = CABLECAR_DEPARTING
iCurrentLoadSceneIndex = -1
iLoadSceneTimeOut = GET_GAME_TIMER()
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_FRIEND_ACTIVITY)
startActivity(activityLoc)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Starting Friend Cable Car")
ENDIF
UPDATE_CABLE_CAR_CAMERA(car)
ATTACH_AND_STORE_VEHICLES_IN_CABLE_CAR(car)
ATTACH_PLAYER_TO_CABLE_CAR(car)
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Moving Up")
ELSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Moving Down")
ENDIF
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_CLOSE", car.cablecarID, "CABLE_CAR_SOUNDS")
START_CABLE_CAR_CUTSCENE(car)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 10.0)
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
IF NOT IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_UP_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Start Audio Scene: CABLE_CAR_RIDE_UP_SCENE")
START_AUDIO_SCENE("CABLE_CAR_RIDE_UP_SCENE")
ENDIF
ELIF NOT IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_DOWN_SCENE")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Start Audio Scene: CABLE_CAR_RIDE_DOWN_SCENE")
START_AUDIO_SCENE("CABLE_CAR_RIDE_DOWN_SCENE")
ENDIF
//REPAIR_CABLE_CAR_DOORS(car)
CLEAR_HELP()
EXIT
ENDIF
ELIF (car.bHelpShown = TRUE)
CLEAR_HELP()
car.bHelpShown = FALSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Player Ride Help Cleared")
ENDIF
// or make the cable car go by itself
IF (GET_GAME_TIMER() > car.iDepartTime)
IF IS_POSITION_OCCUPIED(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, vCableCarLeftExitOffset), 1.0, FALSE, TRUE, TRUE, FALSE, FALSE)
EXIT
ENDIF
IF IS_POSITION_OCCUPIED(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.cablecarID, vCableCarRightExitOffset), 1.0, FALSE, TRUE, TRUE, FALSE, FALSE)
EXIT
ENDIF
// don't let a cable car go until the one with the player in is at least 200 meters away
IF IS_PLAYER_RIDING_ANY_CABLE_CAR()
IF IS_ENTITY_IN_RANGE_COORDS_2D(PLAYER_PED_ID(), car.vPosition, 200.0)
EXIT
ENDIF
ELSE
opp = GET_OPPOSITE_CABLE_CAR(car)
IF IS_ENTITY_OK(opp.cablecarID) AND ((opp.fDistTravelled > 0.0) OR (opp.bIsMoving))
IF IS_ENTITY_IN_RANGE_COORDS_2D(car.cablecarID, opp.vPosition, 200.0)
EXIT
ENDIF
ENDIF
ENDIF
ATTACH_AND_STORE_VEHICLES_IN_CABLE_CAR(car)
car.carState = CABLECAR_DEPARTING
IF (car.bHelpShown = TRUE)
CLEAR_HELP()
car.bHelpShown = FALSE
ENDIF
car.bIsPlayerIn = FALSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR_PLAYER_ENTRY() - Cable Car:", car.iWireIndex, " Car is going by itself")
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_CLOSE", car.cablecarID, "CABLE_CAR_SOUNDS")
ENDIF
ENDPROC
/// PURPOSE:
/// Handles controls while in cable car - skipping and camera switch
/// PARAMS:
/// car -
PROC UPDATE_CABLE_CAR_PLAYER_CONTROLS(CABLE_CAR &car)
INT iEnum = ENUM_TO_INT(car.carState)
IF (iEnum < ENUM_TO_INT(CABLECAR_SPEEDUP)) OR (iEnum > ENUM_TO_INT(CABLECAR_SLOWDOWN))
EXIT
ENDIF
// camera switching
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
// block char switching
DISABLE_SELECTOR_THIS_FRAME()
IF (iEnum < ENUM_TO_INT(CABLECAR_SLOWDOWN))
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT) AND (car.bIsPaused = FALSE)
IF NOT bFPSMode
SHUTDOWN_CAMERA(cameraID)
ENABLE_CABLE_CAR_FIRST_PERSON(GET_CABLE_CAR_DIRECTION_ENUM(car))
SET_INTERNAL_RAIN_SOUND_ENABLED(car, TRUE)
SET_FOCUS_ENTITY(car.cableCarID)
ELSE
SET_INTERNAL_RAIN_SOUND_ENABLED(car, FALSE)
DISABLE_CABLE_CAR_FIRST_PERSON()
ENABLE_CAMERA_STRUCT(externalCamera, cameraID)
ENDIF
ENDIF
ENDIF
IF (bFPSMode) AND NOT IS_IT_RAINING_OUTSIDE()
IF (car.iRainSound <> -1)
SET_INTERNAL_RAIN_SOUND_ENABLED(car, FALSE)
ENDIF
ENDIF
// skipping
IF (bSkipped = FALSE)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
AND (car.bIsPaused = FALSE)
bSkipped = TRUE
car.bIsPlayerRiding = FALSE
SAFE_FADE_SCREEN_OUT_TO_BLACK(500, FALSE)
ENDIF
ELIF IS_SCREEN_FADED_OUT()
CABLE_CAR_ARRIVED(car, TRUE)
ELIF NOT IS_SCREEN_FADING_OUT() //B*-2183175
//If screen faded for other reason, and cablecar is continuing- undo skip.
bSkipped = FALSE
car.bIsPlayerRiding = TRUE
ENDIF
ENDPROC
PROC UPDATE_CABLE_CAR(CABLE_CAR &car)
VECTOR v
IF NOT DOES_ENTITY_EXIST(car.cablecarID)
EXIT
ENDIF
#IF IS_DEBUG_BUILD
car.iHaloStateDebug = ENUM_TO_INT(car.haloState)
car.iCarStateDebug = ENUM_TO_INT(car.carState)
IF (car.bDebugPause) AND (car.bIsMoving)
car.bIsPaused = TRUE
car.bDebugPause = FALSE
ENDIF
IF (cableWire[0].bShowWire OR cableWire[1].bShowWire)
IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car, 0, TRUE)
ENDIF
#ENDIF
car.iJourneyTimer = GET_GAME_TIMER() - car.iDepartTime
IF (car.iJourneyTimer < 0)
car.iJourneyTimer = 0
ENDIF
// make vehicle drop when dead
IF IS_ENTITY_DEAD(car.cablecarID) AND (car.carState < CABLECAR_DEAD)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " is dead...")
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRunningSound)
car.carState = CABLECAR_DEAD
ENDIF
IF bSRLOK = TRUE
fSrlTime += GET_FRAME_TIME()
SET_SRL_TIME(fSrlTime)
ENDIF
car.bIsPlayerOnTop = IS_ENTITY_ON_TOP_OF_CABLE_CAR(PLAYER_PED_ID(), car, 0, FALSE)
IF (car.bIsPlayerOnTop)
IF (car.iRunningSound <> -1)
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRunningSound)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Player is on top - stopping running sound")
ENDIF
IF (GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) < 2)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Player is on top - give wanted rating")
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
ENDIF
//DRAW_DEBUG_LINE(GET_ENTITY_COORDS(car.cablecarID) + <<0, 0, fDebugWireVertexHeight>>, GET_ENTITY_COORDS(car.cablecarID) - <<0, 0, fDebugWireVertexHeight>>, 0, 255, 0, 255)
SWITCH (car.carState)
CASE CABLECAR_NULLSTATE
CASE CABLECAR_WAITING
IF (car.fDoorValue < CABLE_CAR_DOOR_OPEN_LIMIT)
car.fDoorValue += TIMESTEP()
IF (car.fDoorValue > CABLE_CAR_DOOR_OPEN_LIMIT)
car.fDoorValue = CABLE_CAR_DOOR_OPEN_LIMIT
ENDIF
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
UPDATE_CABLE_CAR_PLAYER_ENTRY(car)
BREAK
CASE CABLECAR_DEPARTING
//CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Accelerating")
SET_ENTITY_HAS_GRAVITY(car.cablecarID, FALSE)
car.fDoorValue -= TIMESTEP()
IF (car.fDoorValue <= 0.0)
car.fDoorValue = 0.0
car.carState = CABLECAR_SPEEDUP
car.fDistTravelled = 0.0
car.bIsMoving = TRUE
car.fSpeed = 0.0
car.iDepartTime = GET_GAME_TIMER()
car.iJourneyTimer = 0
PLAY_SOUND_FROM_ENTITY(-1, "Leave_Station", car.cablecarID, "CABLE_CAR_SOUNDS")
car.iRunningSound = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(car.iRunningSound, "Running", car.cablecarID, "CABLE_CAR_SOUNDS")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " has started moving play running sound")
car.fDistToNextPoint = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
IF (car.bIsPlayerIn = TRUE)
PRINT_HELP("FGND_SWTCHCAM")
ENDIF
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
BREAK
CASE CABLECAR_SPEEDUP
IF (car.bIsPlayerIn = TRUE)
UPDATE_CABLE_CAR_CAMERA(car)
ENDIF
IF NOT(car.bIsPlayerOnTop)
car.fSpeed += (fCableCarAcceleration * TIMESTEP() * fTimeStepFactor)
IF (car.fSpeed >= fCableCarMaxSpeed)
car.fSpeed = fCableCarMaxSpeed
car.carState = CABLECAR_MOVING
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Acceleration Complete")
CPRINTLN(DEBUG_AMBIENT, " Departure Time:", car.iDepartTime, " Dist Travelled:", car.fDistTravelled)
car.fDoorValue = 0.0
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
ENDIF
ENDIF
BREAK
CASE CABLECAR_MOVING
IF (car.bIsPlayerIn = TRUE)
UPDATE_CABLE_CAR_CAMERA(car)
ENDIF
IF NOT(car.bIsPlayerOnTop) AND (car.bIsMoving)
IF (car.iRunningSound = -1)
car.iRunningSound = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(car.iRunningSound, "Running", car.cablecarID, "CABLE_CAR_SOUNDS")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " has started moving again - play running sound")
ENDIF
ENDIF
IF (!car.bIsPaused)
car.fSpeed += (fCableCarAcceleration * TIMESTEP() * fTimeStepFactor)
IF (car.fSpeed >= fCableCarMaxSpeed)
car.fSpeed = fCableCarMaxSpeed
ENDIF
ENDIF
IF ((cableWire[car.iWireIndex].fRopeLength - car.fDistTravelled) < 75.0)
car.carState = CABLECAR_SLOWDOWN
IF (car.bIsPlayerIn = TRUE)
IF (bFPSMode = TRUE)
DISABLE_CABLE_CAR_FIRST_PERSON()
IF (GET_CABLE_CAR_DIRECTION_ENUM(car) = CABLECAR_MOVEUP)
ENABLE_CAMERA_STRUCT(externalCamera, cameraID)
ELSE
ENABLE_CAMERA_STRUCT_REVERSE_INTERPOLATE(externalCamera, cameraID)
ENDIF
ENDIF
ATTACH_PLAYER_TO_CABLE_CAR_ARRIVAL(car)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Slowing Down")
ENDIF
IF NOT (car.bIsMoving) OR (car.fDistTravelled >= cableWire[car.iWireIndex].fRopeLength)
car.carState = CABLECAR_ARRIVING
ENDIF
IF (car.bIsPaused) AND (car.bIsPlayerIn = TRUE)
car.fSpeed -= (fCableCarAcceleration * TIMESTEP() * fTimeStepFactor * 2.0)
IF (car.fSpeed <= 0.0)
car.fSpeed = 0.0
car.carState = CABLECAR_PAUSESTART
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_OPEN", car.cablecarID, "CABLE_CAR_SOUNDS")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Pause")
ENDIF
ENDIF
BREAK
CASE CABLECAR_PAUSESTART
car.fDoorValue += TIMESTEP()
IF (car.fDoorValue > CABLE_CAR_DOOR_OPEN_LIMIT)
car.fDoorValue = CABLE_CAR_DOOR_OPEN_LIMIT
car.bIsPaused = TRUE
car.carState = CABLECAR_PAUSED
END_CABLE_CAR_CUTSCENE(car)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Doors Open")
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
BREAK
CASE CABLECAR_PAUSED
IF IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
RC_START_CUTSCENE_MODE(<<0, 0, 0>>)
car.carState = CABLECAR_PAUSEEND
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_CLOSE", car.cablecarID, "CABLE_CAR_SOUNDS")
ENDIF
ELIF NOT IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car, 1.1)
car.carState = CABLECAR_PAUSEEND
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_CLOSE", car.cablecarID, "CABLE_CAR_SOUNDS")
car.bIsPlayerIn = FALSE
ENDIF
BREAK
CASE CABLECAR_PAUSEEND
car.fDoorValue -= TIMESTEP()
IF (car.fDoorValue <= 0.0)
car.fDoorValue = 0.0
car.carState = CABLECAR_MOVING
IF (car.bIsPlayerIn = TRUE)
ATTACH_PLAYER_TO_CABLE_CAR(car)
ENABLE_CABLE_CAR_FIRST_PERSON(GET_CABLE_CAR_DIRECTION_ENUM(car))
ENDIF
car.bIsPaused = FALSE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Moving Again")
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
BREAK
CASE CABLECAR_SLOWDOWN
IF (car.bIsPlayerIn = TRUE)
UPDATE_CABLE_CAR_CAMERA(car)
ENDIF
IF NOT (car.bIsPlayerOnTop)
car.fSpeed -= (fCableCarAcceleration * TIMESTEP() * fTimeStepFactor)
IF (car.fSpeed <= 1.0)
car.fSpeed = 1.0
ENDIF
IF NOT (car.bIsMoving)
car.carState = CABLECAR_ARRIVING
car.fSpeed = 0.0
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Slowing Complete")
PLAY_SOUND_FROM_ENTITY(-1, "Arrive_Station", car.cablecarID, "CABLE_CAR_SOUNDS")
PLAY_SOUND_FROM_ENTITY(-1, "DOOR_OPEN", car.cablecarID, "CABLE_CAR_SOUNDS")
SAFE_STOP_AND_RELEASE_SOUND_ID(car.iRunningSound)
ENDIF
ENDIF
BREAK
CASE CABLECAR_ARRIVING
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Arrived")
car.fDoorValue += TIMESTEP()
IF (car.fDoorValue > CABLE_CAR_DOOR_OPEN_LIMIT)
car.fDoorValue = CABLE_CAR_DOOR_OPEN_LIMIT
CABLE_CAR_ARRIVED(car)
ENDIF
SET_CABLE_CAR_DOOR_OFFSET(car, car.fDoorValue)
BREAK
CASE CABLECAR_ARRIVED
IF NOT IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car, 1.125)
car.carState = CABLECAR_WAITING
car.iDepartTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iCableCarDockWaitTime - 8000, iCableCarDockWaitTime + 8000)
car.fSpdSgn *= -1.0
ENDIF
BREAK
CASE CABLECAR_DEAD
// we do this on purpose just incase things player wasn't flagged for some reason
IF IS_ENTITY_IN_CABLE_CAR(PLAYER_PED_ID(), car)
car.bIsPlayerIn = TRUE
ENDIF
IF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED_ID(), car.cablecarID)
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
DETACH_STORED_VEHICLES_IN_CABLE_CAR(car)
SET_ENTITY_HAS_GRAVITY(car.cablecarID, TRUE)
FREEZE_ENTITY_POSITION(car.cablecarID, FALSE)
car.iDiedTime = GET_GAME_TIMER()
//ADD_EXPLOSION(GET_ENTITY_COORDS(car.cablecarID) + <<0, 0, CABLE_CAR_WIRE_OFFSET>>, EXP_TAG_CAR)
CLEAR_HELP()
IF (car.bIsPlayerIn = TRUE)
END_CABLE_CAR_CUTSCENE(car)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Emergency abort player is still in it")
CLEAR_HELP()
CLEANUP_CABLE_CAR(car)
EXIT
//PRINT_HELP("U_BROKE_CABLECAR")
ELSE
IF STREAMVOL_IS_VALID(streamVolCam)
STREAMVOL_DELETE(streamVolCam)
ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Entering Regen State")
car.carState = CABLECAR_REGEN
EXIT
CASE CABLECAR_REGEN
// wait till sphere isn't visible for 10 meters
v = GET_ENTITY_COORDS(car.cablecarID, FALSE)
IF NOT IS_SPHERE_VISIBLE(v, 10.0)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Is Clear To Regenerate")
CLEANUP_CABLE_CAR(car)
//CLEAR_AREA_OF_VEHICLES(v, 1.0)
EXIT
ENDIF
BREAK
ENDSWITCH
IF (car.bIsPlayerIn)
UPDATE_CABLE_CAR_PLAYER_CONTROLS(car)
ENDIF
// update movement
IF (car.bIsMoving)
IF (car.fSpdSgn >= 0.0)
UPDATE_CABLE_CAR_FORWARD(car)
ELSE
UPDATE_CABLE_CAR_BACKWARD(car)
ENDIF
ENDIF
ENDPROC
PROC UPDATE_CABLE_CAR_REGENERATION(CABLE_CAR &car)
VECTOR v
FLOAT t = 0.0
IF IS_ENTITY_ALIVE(car.cablecarID)
EXIT
ENDIF
IF (car.carState <= CABLECAR_DEAD)
EXIT
ENDIF
IF NOT IS_SCREEN_FADED_OUT()
IF (GET_GAME_TIMER() < (car.iDiedTime + iCableCarRegenTime))
EXIT
ENDIF
V = GET_WIRE_POSITION(cableWire[car.iWireIndex], 0, t)
v += <<0, 0, CABLE_CAR_WIRE_OFFSET>>
IF IS_SPHERE_VISIBLE(v, 30.0)
EXIT
ENDIF
ENDIF
LOAD_CABLE_CAR_ASSETS()
CREATE_CABLE_CAR(car, car.iWireIndex, 0, t, 1) // low dock
_UNLOAD_ASSET_FROM_REQUESTER(asRequest, CABLECAR_ASSET_SLOT)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car:", car.iWireIndex, " Regenerated")
ENDPROC
PROC UPDATE_WAIT_MESSAGE()
INT iCheck
#IF IS_DEBUG_BUILD
IF (cableWire[0].bShowWire OR cableWire[1].bShowWire)
DRAW_DEBUG_AREA(<<446.258179,5582.625488,780.189209>>, <<446.300507,5560.007813,786.939209>>, 12.250000)
DRAW_DEBUG_AREA(<<-742.347656,5587.018555,40.665493>>, <<-742.146118,5602.772461,49.847099>>, 12.250000)
ENDIF
#ENDIF
IF ((cableCarLeft.bIsPlayerIn = TRUE) OR (cableCarRight.bIsPlayerIn = TRUE))
EXIT
ENDIF
IF bNoCarMsgShown = TRUE
EXIT
ENDIF
// high dock check
iCheck = 0
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<446.258179,5582.625488,780.189209>>, <<446.300507,5560.007813,786.939209>>, 12.250000)
IF (cableCarLeft.bIsMoving)
iCheck ++
ENDIF
IF (cableCarRight.bIsMoving)
iCheck ++
ENDIF
ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-742.347656,5587.018555,40.665493>>, <<-742.146118,5602.772461,49.847099>>, 12.250000)
IF (cableCarLeft.bIsMoving)
iCheck ++
ENDIF
IF (cableCarRight.bIsMoving)
iCheck ++
ENDIF
ENDIF
IF (iCheck = 2)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR] - Pahahaha - you have to wait like everyone else")
PRINT_HELP("WAIT_CABLE")
bNoCarMsgShown = TRUE
ENDIF
ENDPROC
//----------------------
// DEBUG VARIABLES
//----------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID m_WidgetGroup
#ENDIF
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Initializes Wire Debug Widgets
PROC SETUP_CABLECAR_WIRE_DEBUG_WIDGETS(STRING str, CABLECAR_WIRE &wire)
START_WIDGET_GROUP(str)
ADD_WIDGET_BOOL("Show Wire", wire.bShowWire)
ADD_WIDGET_INT_SLIDER("Show Point", wire.iDebugPoint, 0, COUNT_OF(wire.vPoints) - 1, 1)
ADD_WIDGET_FLOAT_SLIDER("Show IValue", wire.fDebugInterpolate, 0, 1, 0.000625)
ADD_WIDGET_BOOL("Warp Car To Debug", wire.bWarpCarToDebugPoint)
ADD_WIDGET_INT_READ_ONLY("Points Used", wire.iPointsUsed)
ADD_WIDGET_FLOAT_READ_ONLY("Wire Length", wire.fRopeLength)
ADD_WIDGET_VECTOR_SLIDER("Wire Start", wire.vPoints[0], -8000.0, 8000.0, 0.05)
ADD_WIDGET_VECTOR_SLIDER("Wire End", wire.vPoints[wire.iPointsUsed - 1], -8000.0, 8000.0, 0.05)
ADD_WIDGET_READ_ONLY_VECTOR("Wire Debug Pos", wire.vWireDebugPoint)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Initializes Debug Widgets
PROC SETUP_CABLECAR_DEBUG_WIDGETS(STRING str, CABLE_CAR &car)
START_WIDGET_GROUP(str)
ADD_WIDGET_BOOL("Is Moving", car.bIsMoving)
ADD_WIDGET_INT_READ_ONLY("Journey Timer", car.iJourneyTimer)
ADD_WIDGET_FLOAT_READ_ONLY("Dist Travelled", car.fDistTravelled)
ADD_WIDGET_FLOAT_SLIDER("Spd Sgn", car.fSpdSgn, -1, 1, 1)
ADD_WIDGET_BOOL("Debug Pause", car.bDebugPause)
START_WIDGET_GROUP("Read Only")
ADD_WIDGET_BOOL("Help Shown", car.bHelpShown)
ADD_WIDGET_INT_READ_ONLY("Halo Debug", car.iHaloStateDebug)
ADD_WIDGET_INT_READ_ONLY("State Debug", car.iCarStateDebug)
ADD_WIDGET_INT_READ_ONLY("Depart Time", car.iDepartTime)
ADD_WIDGET_INT_READ_ONLY("Current Index", car.iWireSegment)
ADD_WIDGET_FLOAT_READ_ONLY("Interpolate Value", car.fTValue)
ADD_WIDGET_READ_ONLY_VECTOR("Position", car.vPosition)
ADD_WIDGET_FLOAT_READ_ONLY("Speed", car.fSpeed)
ADD_WIDGET_BOOL("Paused", car.bIsPaused)
ADD_WIDGET_BOOL("PlayerOnTop", car.bIsPlayerOnTop)
ADD_WIDGET_BOOL("PlayerIn", car.bIsPlayerIn)
ADD_WIDGET_BOOL("PlayerRiding", car.bIsPlayerRiding)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Initializes Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
SET_PROFILING_OF_THIS_SCRIPT(FALSE)
m_WidgetGroup = START_WIDGET_GROUP("Cable Car System")
START_WIDGET_GROUP("Configuration")
ADD_WIDGET_BOOL("Quit Script", bExitScript)
ADD_WIDGET_BOOL("Warp To Low Dock", bWarpToLowDock)
ADD_WIDGET_BOOL("Warp To High Dock", bWarpToHighDock)
ADD_WIDGET_BOOL("No Car Msg Shown", bNoCarMsgShown)
ADD_WIDGET_FLOAT_SLIDER("Time Step Factor", fTimeStepFactor, 0, 100, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Imran Factor", fImranFactor, 1.0, 5.0, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Camera Hack", fCamShiftHack, -180.0, 180.0, 0.25)
ADD_WIDGET_BOOL("Use SRLS", bUseSRLS)
ADD_WIDGET_BOOL("Use Focus Point", bUseFocusChange)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Camera Debug")
ADD_WIDGET_INT_SLIDER("FPS X Look Limit", FPSCam.iLookXLimit, 0, 180, 1)
ADD_WIDGET_INT_SLIDER("FPS Y Look Limit", FPSCam.iLookYLimit, 0, 180, 1)
ADD_WIDGET_BOOL("External Cam On", bExternalCamOn)
ADD_WIDGET_BOOL("External Cam Off", bExternalCamOff)
ADD_WIDGET_BOOL("R Interpolate", bInterpolateBackwards)
ADD_WIDGET_BOOL("Alt Mode", bExternalCamAlternate)
ADD_WIDGET_INT_SLIDER("Camera Index", iExternalCameraTest, 0, 24, 1)
ADD_WIDGET_INT_SLIDER("Cam Interptime", iTestInterptime, 0, 15000, 1000)
ADD_WIDGET_INT_READ_ONLY("Camera Index", iCameraPointIndex)
ADD_WIDGET_INT_READ_ONLY("ActiveCamera", iActiveCamera)
ADD_WIDGET_BOOL("Is Cam Static", bIsCamStatic)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Car Debug")
ADD_WIDGET_BOOL("Blip Cars", bBlipCars)
SETUP_CABLECAR_DEBUG_WIDGETS("Left Car", cableCarLeft)
SETUP_CABLECAR_DEBUG_WIDGETS("Right Car", cableCarRight)
ADD_WIDGET_FLOAT_SLIDER("Max Speed", fCableCarMaxSpeed, 0, 100, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Acceleration", fCableCarAcceleration, 0, 20, 0.005)
ADD_WIDGET_INT_SLIDER("Car Regen Time", iCableCarRegenTime, 250, 600000, 1000)
ADD_WIDGET_INT_SLIDER("Car Wait Time", iCableCarDockWaitTime, 250, 600000, 1000)
ADD_WIDGET_BOOL("Create Left Low Car", bCreateAtLowDock[0])
ADD_WIDGET_BOOL("Create Right Low Car", bCreateAtLowDock[1])
ADD_WIDGET_BOOL("Create Left High Car", bCreateAtHighDock[0])
ADD_WIDGET_BOOL("Create Right High Car", bCreateAtHighDock[1])
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Wire Debug")
SETUP_CABLECAR_WIRE_DEBUG_WIDGETS("Left Wire", cableWire[CABLE_WIRE_LEFT])
SETUP_CABLECAR_WIRE_DEBUG_WIDGETS("Right Wire", cableWire[CABLE_WIRE_RIGHT])
ADD_WIDGET_FLOAT_SLIDER("Vert Size", fDebugWireVertexSize, 0, 1, 0.005)
ADD_WIDGET_FLOAT_SLIDER("Vert Height", fDebugWireVertexHeight, 0, 30, 0.25)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Door Debug")
ADD_WIDGET_BOOL("Test Doors", bDoorSlideTest)
ADD_WIDGET_FLOAT_SLIDER("Door Slide", fDoorSlideValue, -5, 5, 0.05)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
PROC UPDATE_DEBUG_WIDGETS()
IF (bWarpToLowDock)
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
RC_END_CUTSCENE_MODE()
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vLowDockPosition)
bWarpToLowDock = FALSE
ENDIF
IF (bWarpToHighDock)
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
RC_END_CUTSCENE_MODE()
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vHighDockPosition)
bWarpToHighDock = FALSE
ENDIF
IF (bCreateAtLowDock[0])
DELETE_CABLE_CAR(cableCarLeft)
CREATE_CABLE_CAR(cableCarLeft, CABLE_WIRE_LEFT, 0)
bCreateAtLowDock[0] = FALSE
bBlipCars = TRUE
ENDIF
IF (bCreateAtHighDock[0])
DELETE_CABLE_CAR(cableCarLeft)
CREATE_CABLE_CAR(cableCarLeft, CABLE_WIRE_LEFT, cableWire[CABLE_WIRE_LEFT].iPointsUsed - 1, 0, -1)
bCreateAtHighDock[0] = FALSE
bBlipCars = TRUE
ENDIF
IF (bCreateAtLowDock[1])
DELETE_CABLE_CAR(cableCarRight)
CREATE_CABLE_CAR(cableCarRight, CABLE_WIRE_RIGHT, 0)
bCreateAtLowDock[1] = FALSE
bBlipCars = TRUE
ENDIF
IF (bCreateAtHighDock[1])
DELETE_CABLE_CAR(cableCarRight)
CREATE_CABLE_CAR(cableCarRight, CABLE_WIRE_RIGHT, cableWire[CABLE_WIRE_RIGHT].iPointsUsed - 2, 1.0, -1)
bCreateAtHighDock[1] = FALSE
bBlipCars = TRUE
ENDIF
IF (bBlipCars)
SAFE_REMOVE_BLIP(blipID[0])
SAFE_REMOVE_BLIP(blipID[1])
IF IS_ENTITY_OK(cableCarLeft.cablecarID)
blipID[0] = CREATE_BLIP_FOR_OBJECT(cableCarLeft.cablecarID)
ENDIF
IF IS_ENTITY_OK(cableCarRight.cablecarID)
blipID[1] = CREATE_BLIP_FOR_OBJECT(cableCarRight.cablecarID)
ENDIF
bBlipCars = FALSE
ENDIF
IF (bExternalCamOn)
bIsCamStatic = FALSE
SET_EXTERNAL_CAMERA(externalCamera, iExternalCameraTest, bExternalCamAlternate)
IF (externalCamera.iInterpolateTime = 0)
iTestInterptime = 0
bIsCamStatic = TRUE
ENDIF
externalCamera.iInterpolateTime = iTestInterptime
IF (bIsCamStatic = FALSE) AND (bInterpolateBackwards)
ENABLE_CAMERA_STRUCT_REVERSE_INTERPOLATE(externalCamera, cameraID)
ELSE
ENABLE_CAMERA_STRUCT(externalCamera, cameraID)
ENDIF
bExternalCamOn = FALSE
ENDIF
IF (bExternalCamOff)
SHUTDOWN_CAMERA(cameraID)
bExternalCamOff = FALSE
ENDIF
IF (bDoorSlideTest)
SET_CABLE_CAR_DOOR_OFFSET(cableCarLeft, fDoorSlideValue)
SET_CABLE_CAR_DOOR_OFFSET(cableCarRight, fDoorSlideValue)
ENDIF
IF (cableWire[CABLE_WIRE_LEFT].bWarpCarToDebugPoint)
cableCarLeft.iWireSegment = cableWire[CABLE_WIRE_LEFT].iDebugPoint
cableCarLeft.fTValue = cableWire[CABLE_WIRE_LEFT].fDebugInterpolate
cableCarLeft.vPosition = GET_WIRE_POSITION(cableWire[CABLE_WIRE_LEFT], cableCarLeft.iWireSegment, cableCarLeft.fTValue)
cableCarLeft.bIsMoving = FALSE
IF IS_ENTITY_OK(cableCarLeft.cablecarID)
SET_ENTITY_COORDS(cableCarLeft.cablecarID, cableCarLeft.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
ENDIF
cableWire[CABLE_WIRE_LEFT].bWarpCarToDebugPoint = FALSE
ENDIF
IF (cableWire[CABLE_WIRE_RIGHT].bWarpCarToDebugPoint)
cableCarRight.iWireSegment = cableWire[CABLE_WIRE_RIGHT].iDebugPoint
cableCarRight.fTValue = cableWire[CABLE_WIRE_RIGHT].fDebugInterpolate
cableCarRight.vPosition = GET_WIRE_POSITION(cableWire[CABLE_WIRE_RIGHT], cableCarRight.iWireSegment, cableCarRight.fTValue)
cableCarRight.bIsMoving = FALSE
IF IS_ENTITY_OK(cableCarRight.cablecarID)
SET_ENTITY_COORDS(cableCarRight.cablecarID, cableCarRight.vPosition + <<0, 0, CABLE_CAR_WIRE_OFFSET>>)
ENDIF
cableWire[CABLE_WIRE_RIGHT].bWarpCarToDebugPoint = FALSE
ENDIF
ENDPROC
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup)
DELETE_WIDGET_GROUP(m_WidgetGroup)
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Cleanups Script and terminates thread - this should be the last function called
PROC SCRIPT_CLEANUP(BOOL bDelete = FALSE)
VECTOR v
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup")
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup")
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
SAFE_REMOVE_BLIP(blipID[0])
SAFE_REMOVE_BLIP(blipID[1])
#ENDIF
IF IS_PLAYER_RIDING_ANY_CABLE_CAR()
CLEAR_FOCUS()
ENDIF
IF bSRLOK = TRUE
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car System SRL Ended")
bSRLOK = FALSE
END_SRL()
ENDIF
SET_AMBIENT_ZONE_STATE_PERSISTENT("AZ_COUNTRYSIDE_CHILEAD_CABLE_CAR_LINE", FALSE, TRUE)
RC_END_CUTSCENE_MODE() // for some reason going to into multiplayer but not freezes controls
g_bIsOnCableCar = FALSE
SHUTDOWN_CAMERA(cameraID)
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
IS_ENTITY_OK(PLAYER_PED_ID())
IF GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() = FORCE_CLEANUP_FLAG_SP_TO_MP
IF IS_PLAYER_RIDING_ANY_CABLE_CAR()
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup For MP - Emergency Teleport")
DETACH_PED_FROM_CABLE_CAR(PLAYER_PED_ID(), cableCarLeft)
DETACH_PED_FROM_CABLE_CAR(PLAYER_PED_ID(), cableCarRight)
IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vLowDockPosition) < 200)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vLowDockPosition)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup For MP - Player warped to Low Dock")
ELIF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vHighDockPosition) < 200)
SET_ENTITY_COORDS(PLAYER_PED_ID(), vHighDockPosition)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup For MP - Player warped to High Dock")
ELSE
v = GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<0, 0, 5.0>>
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Cable Car - Script Cleanup For MP - Not sure what to do here put the player on the floor?")
SET_ENTITY_COORDS(PLAYER_PED_ID(), v)
v.z = INVALID_WORLD_Z
SET_ENTITY_COORDS(PLAYER_PED_ID(), v)
ENDIF
ENDIF
bDelete = TRUE
ENDIF
IF (bDelete)
DELETE_CABLE_CAR(cableCarLeft)
DELETE_CABLE_CAR(cableCarRight)
ELSE
CLEANUP_CABLE_CAR(cableCarLeft)
CLEANUP_CABLE_CAR(cableCarRight)
ENDIF
IF NOT IS_ENTITY_VISIBLE(PLAYER_PED_ID())
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
ENDIF
UNLOAD_REQUESTED_ASSETS(asRequest)
// Fix for 2018293: Clearing a streaming volume at an arbitrary moment in a background script is
// considered dangerous as it could clash with new load scenes in other scripts. Moved stream vol
// delete to be our last cleanup step and then we hang this thread until we are sure new load scenes
// are cleared. Note: this should only ever happen behind a black screen and all other cleanup has
// already completed. -Ben R
WHILE IS_NEW_LOAD_SCENE_ACTIVE()
CDEBUG1LN(DEBUG_AMBIENT, "[CABLECAR]: Waiting for NEW_LOAD_SCENE to end before deleting steaming volume.")
WAIT(0)
ENDWHILE
IF STREAMVOL_IS_VALID(streamVolCam)
STREAMVOL_DELETE(streamVolCam)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Terminating cable car script.")
TERMINATE_THIS_THREAD()
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
VECTOR v
VECTOR vLastFinalCamPos = GET_FINAL_RENDERED_CAM_COORD()
// Register script to launch after reload
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("cablecar")) > 1
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:CableCar is attempting to launch with an instance already active.")
TERMINATE_THIS_THREAD()
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Initializing")
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_MAGDEMO | FORCE_CLEANUP_FLAG_REPEAT_PLAY | FORCE_CLEANUP_FLAG_DIRECTOR))
RC_END_CUTSCENE_MODE()
g_bIsOnCableCar = FALSE
SCRIPT_CLEANUP()
ENDIF
// wait till player is within area
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Player is within cable car area - Start Script Proper")
IS_ENTITY_OK(PLAYER_PED_ID())
LOAD_CABLE_CAR_ASSETS()
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Setting Up Cables")
SETUP_CABLE_CAR_WIRE_LEFT(cableWire[CABLE_WIRE_LEFT])
SETUP_CABLE_CAR_WIRE_RIGHT_FLIPPED(cableWire[CABLE_WIRE_RIGHT])
SET_AMBIENT_ZONE_STATE_PERSISTENT("AZ_COUNTRYSIDE_CHILEAD_CABLE_CAR_LINE", TRUE, TRUE)
#IF IS_DEBUG_BUILD
SETUP_DEBUG_WIDGETS()
#ENDIF
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Creating Cable Cars")
CREATE_CABLE_CAR(cableCarLeft, CABLE_WIRE_LEFT)
CREATE_CABLE_CAR(cableCarRight, CABLE_WIRE_RIGHT)
UNLOAD_CABLE_CAR_MODEL_ASSETS()
cableCarLeft.iDepartTime = GET_GAME_TIMER() + iCableCarDockWaitTime
cableCarRight.iDepartTime = GET_GAME_TIMER() + iCableCarDockWaitTime
DUMMY_REFERENCE_BOOL(bLoadSceneOK)
DUMMY_REFERENCE_FLOAT(fSceneLoadFarClip)
IS_VECTOR_ZERO(vSceneLoadDirection)
IS_VECTOR_ZERO(vSceneLoadPosition)
#IF IS_DEBUG_BUILD
DUMMY_REFERENCE_BOOL(bshowLoadSceneArea)
#ENDIF
WHILE (TRUE)
IF (g_bForceNoCableCar = TRUE)
REPAIR_CABLE_CAR_DOORS(cableCarLeft)
REPAIR_CABLE_CAR_DOORS(cableCarRight)
ENDIF
IF (NOT IS_ENTITY_OK(PLAYER_PED_ID())) OR (g_bForceNoCableCar = TRUE)
RC_END_CUTSCENE_MODE()
g_bIsOnCableCar = FALSE
SHUTDOWN_CAMERA(cameraID)
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
// CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) // SamH: Removing as requested in b*1776373. Problem is fixed in code now.
SCRIPT_CLEANUP()
ENDIF
#IF IS_DEBUG_BUILD
IF (bExitScript)
RC_END_CUTSCENE_MODE()
// CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) // SamH: Removing as requested in b*1776373. Problem is fixed in code now.
SCRIPT_CLEANUP(TRUE)
ENDIF
#ENDIF
/*
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
*/
#IF IS_DEBUG_BUILD
DRAW_DEBUG_CABLE_CAR_WIRE(cableWire[CABLE_WIRE_LEFT], 255, 0, 0, 255)
DRAW_DEBUG_CABLE_CAR_WIRE(cableWire[CABLE_WIRE_RIGHT], 0, 0, 255, 255)
/*
IF (bShowLoadSceneArea)
IF (bLoadSceneOK = FALSE)
DRAW_DEBUG_SPHERE(vSceneLoadPosition, fSceneLoadFarClip, 255, 0, 0, 128)
ELSE
DRAW_DEBUG_SPHERE(vSceneLoadPosition, fSceneLoadFarClip, 0, 255, 0, 128)
ENDIF
DRAW_DEBUG_SPHERE(vSceneLoadPosition, 0.0625, 255, 0, 0, 128)
DRAW_DEBUG_LINE_WITH_TWO_COLOURS(vSceneLoadPosition, vSceneLoadPosition + (vSceneLoadDirection) * 10.0, 255, 0, 0, 255)
ENDIF
*/
#ENDIF
v = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF (v.x <= CABLE_CAR_SHUTDOWN_MIN_X) OR (v.x >= CABLE_CAR_SHUTDOWN_MAX_X) OR (v.y <= CABLE_CAR_SHUTDOWN_MIN_Y) OR (v.y >= CABLE_CAR_SHUTDOWN_MAX_Y)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]: Player going out of Range - Terminate the script")
SCRIPT_CLEANUP()
ENDIF
UPDATE_CABLE_CAR(cableCarLeft)
UPDATE_CABLE_CAR(cableCarRight)
UPDATE_CABLE_CAR_REGENERATION(cableCarLeft)
UPDATE_CABLE_CAR_REGENERATION(cableCarRight)
IF bFPSMode = TRUE
UPDATE_FIRST_PERSON_CAMERA(fpsCam, FALSE)
ELSE
UPDATE_WAIT_MESSAGE()
ENDIF
IF IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_SCREEN_FADED_IN() AND (bSkipped = FALSE)
IF IS_PLAYER_RIDING_ANY_CABLE_CAR()
v = GET_FINAL_RENDERED_CAM_COORD()
IF bUseFocusChange
SET_FOCUS_POS_AND_VEL(v, GET_FINAL_RENDERED_CAM_COORD() - vLastFinalCamPos)
vLastFinalCamPos = v
ENDIF
IF GET_GAME_TIMER() > iRevealCounter
v = GET_ENTITY_COORDS(PLAYER_PED_ID())
SET_MINIMAP_FOW_REVEAL_COORDINATE(v)
iRevealCounter = GET_GAME_TIMER() + 5000
CPRINTLN(DEBUG_AMBIENT, "[CABLE CAR]: REVEAL MAP AT:", v)
ENDIF
ENDIF
ENDIF
ENDIF
IF (bIsOnMission = FALSE) AND GET_MISSION_FLAG() AND (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("bailbond3")) = 0)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:On Mission - Seal up the Cable Car")
REPAIR_CABLE_CAR_DOORS(cableCarLeft)
REPAIR_CABLE_CAR_DOORS(cableCarRight)
SAFE_STOP_AND_RELEASE_SOUND_ID(cableCarLeft.iRunningSound)
SAFE_STOP_AND_RELEASE_SOUND_ID(cableCarRight.iRunningSound)
/*
IF STREAMVOL_IS_VALID(cameraStreamVol)
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:On Mission - Delete Streamvol")
STREAMVOL_DELETE(cameraStreamVol)
ENDIF
*/
bIsOnMission = TRUE
ENDIF
IF (bIsOnMission = TRUE) AND NOT GET_MISSION_FLAG()
CPRINTLN(DEBUG_AMBIENT, "[CABLECAR]:On Mission - Reopen up the Cable Car")
FORCE_BREAK_CABLE_CAR_DOORS(cableCarLeft)
FORCE_BREAK_CABLE_CAR_DOORS(cableCarRight)
bIsOnMission = FALSE
ENDIF
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS()
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT