Files
2025-09-29 00:52:08 +02:00

1139 lines
35 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Barry1.sc
// AUTHOR : Aaron Gandaa
// DESCRIPTION : First Barry Mission
//
// *****************************************************************************************
// *****************************************************************************************
//----------------------
// INCLUDES
//----------------------
USING "rgeneral_include.sch"
USING "rc_helper_functions.sch"
USING "RC_launcher_public.sch"
USING "RC_asset_public.sch"
USING "RC_Setup_public.sch"
USING "net_fps_cam.sch"
#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
#IF IS_DEBUG_BUILD
//----------------------
// ENUM
//----------------------
ENUM eCableCarState
CABLECAR_NULLSTATE,
CABLECAR_WAITING,
CABLECAR_DEPARTING, // close the doors
CABLECAR_SPEEDUP,
CABLECAR_MOVING,
CABLECAR_SLOWDOWN,
CABLECAR_ARRIVING, // open the doors
CABLECAR_CLEANUP
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
//----------------------
// STRUCTS
//----------------------
STRUCT CABLECAR_WIRE
VECTOR vPoints[MAX_CABLEWIRE_POINTS]
INT iPointsUsed
INT iDebugPoint
BOOL bShowWire = FALSE
FLOAT fRopeLength
ENDSTRUCT
STRUCT CABLE_CAR
eCableCarState carState
BOOL bIsMoving = FALSE
BOOL bIsPlayerIn = FALSE
BOOL bHelpShown = FALSE
INT iWireIndex = 0
INT iWireSegment = 0
FLOAT fSpeed = 0.0
FLOAT fInterpolateValue = 0.0
FLOAT fDistanceTravelled = 0.0
INT iDepartTime = 0
INT iDiedTime = 0
VECTOR vPosition
VEHICLE_INDEX vehicleID
FLOAT fTDelta = 0.0
FLOAT fSpeedSgn = 0.0
VEHICLE_INDEX carryVehicleID
INT iFrameCounter = 0
#IF IS_DEBUG_BUILD
BOOL bReAttach = FALSE
INT iState
#ENDIF
ENDSTRUCT
//----------------------
// VARIABLES
//----------------------
FLOAT fDebugWireVertexSize = 0.0625
FLOAT fDebugWireVertexHeight = 10.0
FLOAT fCableCarMaxSpeed = 10.0
FLOAT fCableCarAcceleration = 0.65
FLOAT fCableCarAttachHeightOffset = -7.0
VECTOR vCableCarPlayerAttachOffset = <<0, 2.750, -5.850>>
VECTOR vCableCarBikeAttachOffset = <<-1.5, 2.5, -5.850>>
VECTOR vLowDockPosition = <<-740.3, 5594.5, 41.7>>
VECTOR vHighDockPosition = <<446.8, 5571.1, 781.2>>
CABLECAR_WIRE cableWire[MAX_CABLEWIRES] // this assumes there are only 2 cable car wires in the entire game
CABLE_CAR cableCarLeft
CABLE_CAR cableCarRight
MODEL_NAMES cableCarModel = CABLECAR
FIRST_PERSON_CAM_STRUCT fpsCam
BOOL bFPSMode = FALSE
BOOL bIsOnMission = FALSE
BOOL bSkipped = FALSE
BOOL bNoWait = FALSE
#IF IS_DEBUG_BUILD
BOOL bExitScript = FALSE
BOOL bWarpToLowDock = FALSE
BOOL bWarpToHighDock = FALSE
#ENDIF
//----------------------
// CAMERA FUNCTIONS
//----------------------
/// PURPOSE:
/// Enable First Person Camera
PROC ENABLE_CABLE_CAR_FIRST_PERSON()
VECTOR v = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, -0.25, 0>>)
fpsCam.iLookXLimit = 60
fpsCam.iLookYLimit = 20
INIT_FIRST_PERSON_CAMERA(fpsCam, v, GET_ENTITY_ROTATION(PLAYER_PED_ID()), 50.0, fpsCam.iLookXLimit, fpsCam.iLookYLimit)
ATTACH_CAM_TO_ENTITY(fpsCam.theCam, PLAYER_PED_ID(), <<0, 0, 0.5>>)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
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)
bFPSMode = FALSE
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
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, "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, -742.064, 5599.458, 47.419)
ADD_CABLE_CAR_WIRE_POINT(wire, -739.557, 5599.467, 47.424)
ADD_CABLE_CAR_WIRE_POINT(wire, -581.128, 5596.517, 77.151)
ADD_CABLE_CAR_WIRE_POINT(wire, -575.717, 5596.388, 79.157)
ADD_CABLE_CAR_WIRE_POINT(wire, -273.275, 5590.844, 240.828)
ADD_CABLE_CAR_WIRE_POINT(wire, -268.111, 5590.745, 243.45)
ADD_CABLE_CAR_WIRE_POINT(wire, 6.483, 5585.668, 414.761)
ADD_CABLE_CAR_WIRE_POINT(wire, 11.361, 5585.591, 417.735)
ADD_CABLE_CAR_WIRE_POINT(wire, 236.82, 5581.446, 599.642)
ADD_CABLE_CAR_WIRE_POINT(wire, 241.365, 5581.370, 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.953, 5577.573, 786.893)
ADD_CABLE_CAR_WIRE_POINT(wire, 447.458, 5577.576, 786.917)
CPRINTLN(DEBUG_AMBIENT, "SETUP_CABLE_CAR_WIRE_LEFT() - MCable 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(CABLECAR_WIRE &wire)
wire.iPointsUsed = 0
ADD_CABLE_CAR_WIRE_POINT(wire, -742.156, 5590.682, 47.419)
ADD_CABLE_CAR_WIRE_POINT(wire, -739.646, 5590.677, 47.433)
ADD_CABLE_CAR_WIRE_POINT(wire, -581.321, 5587.400, 77.318)
ADD_CABLE_CAR_WIRE_POINT(wire, -575.898, 5587.286, 79.285)
ADD_CABLE_CAR_WIRE_POINT(wire, -273.600, 5581.125, 240.85)
ADD_CABLE_CAR_WIRE_POINT(wire, -268.571, 5580.997, 243.428)
ADD_CABLE_CAR_WIRE_POINT(wire, 6.575, 5575.391, 414.584)
ADD_CABLE_CAR_WIRE_POINT(wire, 11.350, 5575.298, 417.618)
ADD_CABLE_CAR_WIRE_POINT(wire, 236.82, 5570.664, 599.561)
ADD_CABLE_CAR_WIRE_POINT(wire, 241.31, 5570.594, 603.137)
ADD_CABLE_CAR_WIRE_POINT(wire, 412.661, 5567.086, 774.439)
ADD_CABLE_CAR_WIRE_POINT(wire, 417.371, 5567.001, 777.708)
ADD_CABLE_CAR_WIRE_POINT(wire, 444.937, 5566.384, 786.879)
ADD_CABLE_CAR_WIRE_POINT(wire, 447.445, 5566.373, 786.924)
CPRINTLN(DEBUG_AMBIENT, "SETUP_CABLE_CAR_WIRE_RIGHT() - Cable Car Right 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, 447.445, 5566.373, 786.924)
ADD_CABLE_CAR_WIRE_POINT(wire, 444.937, 5566.384, 786.879)
ADD_CABLE_CAR_WIRE_POINT(wire, 417.371, 5567.001, 777.708)
ADD_CABLE_CAR_WIRE_POINT(wire, 412.661, 5567.086, 774.439)
ADD_CABLE_CAR_WIRE_POINT(wire, 241.31, 5570.594, 603.137)
ADD_CABLE_CAR_WIRE_POINT(wire, 236.82, 5570.664, 599.561)
ADD_CABLE_CAR_WIRE_POINT(wire, 11.350, 5575.298, 417.618)
ADD_CABLE_CAR_WIRE_POINT(wire, 6.575, 5575.391, 414.584)
ADD_CABLE_CAR_WIRE_POINT(wire, -268.571, 5580.997, 243.428)
ADD_CABLE_CAR_WIRE_POINT(wire, -273.600, 5581.125, 240.85)
ADD_CABLE_CAR_WIRE_POINT(wire, -575.898, 5587.286, 79.285)
ADD_CABLE_CAR_WIRE_POINT(wire, -581.321, 5587.400, 77.318)
ADD_CABLE_CAR_WIRE_POINT(wire, -739.646, 5590.677, 47.433)
ADD_CABLE_CAR_WIRE_POINT(wire, -742.156, 5590.682, 47.419)
CPRINTLN(DEBUG_AMBIENT, "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 (wire.iDebugPoint > (wire.iPointsUsed - 1))
wire.iDebugPoint = (wire.iPointsUsed - 1)
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
DRAW_DEBUG_LINE(wire.vPoints[wire.iDebugPoint] + <<0, 0, fDebugWireVertexHeight>>, wire.vPoints[wire.iDebugPoint] - <<0, 0, fDebugWireVertexHeight>>, 0, 255, 0, 255)
DRAW_DEBUG_SPHERE(wire.vPoints[wire.iDebugPoint], fDebugWireVertexSize)
DRAW_DEBUG_CIRCLE(wire.vPoints[wire.iDebugPoint], 1.0)
ENDPROC
//----------------------
// CAR FUNCTIONS
//----------------------
/// PURPOSE:
/// Zeros out variables
/// PARAMS:
/// car -
PROC ZERO_CABLE_CAR(CABLE_CAR &car)
car.iDepartTime = GET_GAME_TIMER() + 20000
car.iDiedTime = 0
car.fDistanceTravelled = 0
car.bIsMoving = FALSE
car.bIsPlayerIn = FALSE
car.bHelpShown = FALSE
car.carState = CABLECAR_NULLSTATE
car.fTDelta = 0.0
car.fSpeed = 0.0
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 f = 0.0, FLOAT fSpdSgn = 0.0)
ZERO_CABLE_CAR(car)
car.iWireIndex = wire
car.iWireSegment = seg
car.fInterpolateValue = f
car.vPosition = INTERPOLATE_VECTOR(cableWire[car.iWireIndex].vPoints[car.iWireSegment],
cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1], car.fInterpolateValue)
car.vehicleID = CREATE_VEHICLE(cableCarModel, car.vPosition)
car.fSpeedSgn = fSpdSgn
FREEZE_ENTITY_POSITION(car.vehicleID, TRUE)
// break the doors for the time being
SET_VEHICLE_DOOR_BROKEN(car.vehicleID, SC_DOOR_FRONT_LEFT, TRUE)
SET_VEHICLE_DOOR_BROKEN(car.vehicleID, SC_DOOR_FRONT_RIGHT, TRUE)
IF IS_ENTITY_OK(car.vehicleID)
SET_ENTITY_COORDS(car.vehicleID, car.vPosition + <<0, 0, fCableCarAttachHeightOffset>>)
SET_ENTITY_HEADING(car.vehicleID, GET_HEADING_FROM_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1]))
ENDIF
car.iFrameCounter = car.iWireIndex
CPRINTLN(DEBUG_AMBIENT, "CREATE_CABLE_CAR() - Cable Car Created On Wire:", wire, " Segment:", seg)
ENDPROC
/// PURPOSE:
/// Check if ped is in cable car
/// PARAMS:
/// ped - ped index
/// car - cable car index
/// RETURNS:
/// cable car
FUNC BOOL IS_PED_IN_CABLE_CAR(PED_INDEX ped, CABLE_CAR car, FLOAT ex = 0.0)
//VECTOR vmin, vmax
ANGLED_AREA area
ANGLED_AREA areaex
SET_ANGLED_AREA(area,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.vehicleID, <<0, 2.750, -5.850>>) + <<0, 0, 1>>,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car.vehicleID, <<0, -2.750, -5.850>>) - <<0, 0, 1>>,
3.0)
IF (ex > 0.0)
areaex = EXPAND_ANGLED_AREA(area, ex)
//DEBUG_DRAW_ANGLED_AREA_EX(areaex)
RETURN IS_ENTITY_IN_ANGLED_AREA(ped, areaex.vPosition[0], areaex.vPosition[1], areaex.fWidth)
ENDIF
//DEBUG_DRAW_ANGLED_AREA_EX(area)
RETURN IS_ENTITY_IN_ANGLED_AREA(ped, 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_PED_IN_CABLE_CAR_VEHICLE_INDEX(PED_INDEX ped, VEHICLE_INDEX car)
//VECTOR vmin, vmax
ANGLED_AREA area
SET_ANGLED_AREA(area,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car, <<0, 2.750, -5.850>>) + <<0, 0, 1>>,
GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(car, <<0, -2.750, -5.850>>) - <<0, 0, 1>>,
3.0)
RETURN IS_ENTITY_IN_ANGLED_AREA(ped, area.vPosition[0], area.vPosition[1], area.fWidth)
ENDFUNC
/// PURPOSE:
/// Cleans up a cable car
/// PARAMS:
/// car - car reference
PROC CLEANUP_CABLE_CAR(CABLE_CAR &car)
IF IS_ENTITY_OK(car.vehicleID)
FREEZE_ENTITY_POSITION(car.vehicleID, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(car.vehicleID)
SET_VEHICLE_AS_NO_LONGER_NEEDED(car.vehicleID)
car.vehicleID = NULL
ENDIF
CPRINTLN(DEBUG_AMBIENT, "CLEANUP_CABLE_CAR() - Cable Car Cleaned Up")
ENDPROC
/// PURPOSE:
/// Cleans up a cable car
/// PARAMS:
/// car - car reference
PROC DELETE_CABLE_CAR(CABLE_CAR &car)
IF IS_ENTITY_OK(car.vehicleID)
FREEZE_ENTITY_POSITION(car.vehicleID, TRUE)
ENDIF
IF DOES_ENTITY_EXIST(car.vehicleID)
DELETE_VEHICLE(car.vehicleID)
car.vehicleID = NULL
ENDIF
CPRINTLN(DEBUG_AMBIENT, "DELETE_CABLE_CAR() - Cable Car Deleted")
ENDPROC
PROC FORCE_BREAK_CABLE_CAR_DOORS(CABLE_CAR &car)
IF IS_ENTITY_OK(car.vehicleID)
SET_VEHICLE_DOOR_BROKEN(car.vehicleID, SC_DOOR_FRONT_LEFT, TRUE)
SET_VEHICLE_DOOR_BROKEN(car.vehicleID, SC_DOOR_FRONT_RIGHT, TRUE)
ENDIF
ENDPROC
PROC REPAIR_CABLE_CAR_DOORS(CABLE_CAR &car)
IF IS_ENTITY_OK(car.vehicleID)
SET_VEHICLE_FIXED(car.vehicleID)
ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_PED_TO_CABLE_CAR(PED_INDEX ped, CABLE_CAR &car)
IF NOT IS_ENTITY_OK(ped)
EXIT
ENDIF
VECTOR v = vCableCarPlayerAttachOffset
IF IS_ENTITY_ATTACHED(ped)
DETACH_ENTITY(ped)
ENDIF
v.y *= car.fSpeedSgn
IF (car.fSpeedSgn = -1.0)
ATTACH_ENTITY_TO_ENTITY(ped, car.vehicleID, 0, v, <<0, 0, 180.0>>)
ELSE
ATTACH_ENTITY_TO_ENTITY(ped, car.vehicleID, 0, v, <<0, 0, 0>>)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "ATTACH_PED_TO_CABLE_CAR() - Ped Attached")
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// car -
PROC ATTACH_VEHICLE_TO_CABLE_CAR(VEHICLE_INDEX ped, CABLE_CAR &car)
IF NOT IS_ENTITY_OK(ped)
EXIT
ENDIF
VECTOR v = vCableCarBikeAttachOffset
IF IS_ENTITY_ATTACHED(ped)
DETACH_ENTITY(ped)
ENDIF
v.y *= car.fSpeedSgn
ATTACH_ENTITY_TO_ENTITY(ped, car.vehicleID, 0, v, <<0, 0, 0>>)
CPRINTLN(DEBUG_AMBIENT, "ATTACH_VEHICLE_TO_CABLE_CAR() - Vehicle Attached")
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_FORCES(CABLE_CAR &car)
BOOL bFinished = FALSE
VECTOR vNorm = NORMALISE_VECTOR(cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1] - cableWire[car.iWireIndex].vPoints[car.iWireSegment])
IF (car.bIsMoving)
FREEZE_ENTITY_POSITION(car.vehicleID, FALSE)
SET_ENTITY_VELOCITY(car.vehicleID, vNorm * car.fSpeed)
IF GET_PLANE_SIDE(vNorm, GET_ENTITY_COORDS(car.vehicleID), cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1]) = BEHIND_PLANE
car.iWireSegment ++
IF (car.iWireSegment >= (cableWire[car.iWireIndex].iPointsUsed - 1))
car.iWireSegment = (cableWire[car.iWireIndex].iPointsUsed - 1)
car.fSpeed = 0.0
car.bIsMoving = FALSE
bFinished = TRUE
SET_ENTITY_VELOCITY(car.vehicleID, vNorm * car.fSpeed)
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_FORWARD() - Cable Car:", car.iWireIndex, " Finished")
ELSE
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_FORWARD() - Cable Car:", car.iWireIndex, " At Segment:", car.iWireSegment)
SET_ENTITY_COORDS(car.vehicleID, cableWire[car.iWireIndex].vPoints[car.iWireSegment] + <<0, 0, fCableCarAttachHeightOffset>>)
SET_ENTITY_HEADING(car.vehicleID, GET_HEADING_FROM_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1]))
ENDIF
ENDIF
ENDIF
RETURN bFinished
ENDFUNC
PROC UPDATE_CABLE_CAR_POSITION(CABLE_CAR &car)
IF IS_SPHERE_VISIBLE(car.vPosition + <<0, 0, fCableCarAttachHeightOffset>>, 5.0) OR (car.bIsPlayerIn)
OR (VDIST2(car.vPosition + <<0, 0, fCableCarAttachHeightOffset>>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < (60 * 60))
SET_ENTITY_COORDS(car.vehicleID, car.vPosition + <<0, 0, fCableCarAttachHeightOffset>>)
//SET_ENTITY_HEADING(car.vehicleID, GET_HEADING_FROM_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1]))
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)
BOOL bFinished = FALSE
FLOAT fDist = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
// zero divide defense
IF (fDist != 0.0)
car.fTDelta = (car.fSpeedSgn * car.fSpeed) / fDist
ELSE
car.fTDelta = 0.0
ENDIF
// only bother to update if we have told car to move
IF (car.bIsMoving) AND (car.fTDelta != 0.0)
//car.fDistanceTravelled += (car.fSpeed * TIMESTEP())
car.fInterpolateValue += (car.fTDelta * TIMESTEP())
IF (car.fInterpolateValue >= 1.0)
car.fInterpolateValue = 0.0
car.iWireSegment ++
IF (car.iWireSegment >= (cableWire[car.iWireIndex].iPointsUsed - 1))
car.iWireSegment = (cableWire[car.iWireIndex].iPointsUsed - 1)
car.fSpeed = 0.0
car.bIsMoving = FALSE
bFinished = TRUE
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_FORWARD() - Cable Car:", car.iWireIndex, " Finished")
ENDIF
ENDIF
// check no bounds are broken
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.fInterpolateValue)
car.fDistanceTravelled += GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(car.vehicleID) - <<0, 0, fCableCarAttachHeightOffset>>, car.vPosition)
UPDATE_CABLE_CAR_POSITION(car)
ENDIF
ENDIF
RETURN bFinished
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)
BOOL bFinished = FALSE
FLOAT fDist = GET_DISTANCE_BETWEEN_COORDS(cableWire[car.iWireIndex].vPoints[car.iWireSegment], cableWire[car.iWireIndex].vPoints[car.iWireSegment + 1])
// zero divide defense
IF (fDist != 0.0)
car.fTDelta = (car.fSpeedSgn * car.fSpeed) / fDist
ELSE
car.fTDelta = 0.0
ENDIF
// only bother to update if we have told car to move
IF (car.bIsMoving) AND (car.fTDelta != 0.0)
//car.fDistanceTravelled += (car.fSpeed * TIMESTEP())
car.fInterpolateValue += (car.fTDelta * TIMESTEP())
IF (car.fInterpolateValue < 0.0)
car.fInterpolateValue = 1.0
car.iWireSegment --
IF (car.iWireSegment < 0)
car.iWireSegment = 0
car.fInterpolateValue = 0.0
car.bIsMoving = FALSE
car.fSpeed = 0.0
bFinished = TRUE
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_BACKWARD() - Cable Car:", car.iWireIndex, " Finished")
ENDIF
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.fInterpolateValue)
car.fDistanceTravelled += GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(car.vehicleID) - <<0, 0, fCableCarAttachHeightOffset>>, car.vPosition)
UPDATE_CABLE_CAR_POSITION(car)
ENDIF
ENDIF
RETURN bFinished
ENDFUNC
PROC UPDATE_CABLE_CAR_WAITING(CABLE_CAR &car)
// but force the cable to wait if the player is around the area (as in trying to load stuff)
IF (car.bIsPlayerIn = FALSE) AND IS_PED_IN_CABLE_CAR(PLAYER_PED_ID(), car, 1.5)
car.iDepartTime = GET_GAME_TIMER() + 5000
ENDIF
//CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player In Area:", car.bIsPlayerIn, " Help:", car.bHelpShown)
// wait for the player to be in the area before going
IF (car.bIsPlayerIn = TRUE)
IF (GET_CURRENT_PLAYER_PED_ACCOUNT_BALANCE() < COST_CABLECAR)
IF (car.bHelpShown = FALSE)
PRINT_HELP_FOREVER("PLAY_CABLE_NO_CASH")
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player Can't Afford It")
car.bHelpShown = TRUE
ENDIF
ELSE
IF (car.bHelpShown = FALSE)
PRINT_HELP_FOREVER("PLAY_CABLE")
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Player Ride Help Shown")
car.bHelpShown = TRUE
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Is Ready To Depart With Player")
CLEAR_THIS_FLOATING_HELP("PLAY_CABLE")
car.iDepartTime = 0
ENDIF
ENDIF
ELSE
IF (car.bHelpShown = TRUE)
CLEAR_HELP()
car.bHelpShown = FALSE
ENDIF
ENDIF
// set the cable car going
IF (GET_GAME_TIMER() > car.iDepartTime) AND (car.bIsMoving = FALSE)
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR_WAITING() - Cable Car:", car.iWireIndex, " Departing")
car.carState = CABLECAR_DEPARTING
car.fDistanceTravelled = 0
IF (car.bHelpShown = TRUE)
car.bHelpShown = FALSE
CLEAR_HELP()
ENDIF
IF (car.bIsPlayerIn = TRUE)
RC_START_CUTSCENE_MODE(<<0, 0, 0>>)
DISABLE_CELLPHONE(TRUE)
ENDIF
ENDIF
ENDPROC
PROC PLAYER_END_CABLE_CAR(CABLE_CAR &car, BOOL skip = FALSE)
IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
IF IS_AUDIO_SCENE_ACTIVE("CABLE_CAR_RIDE_UP_SCENE")
CPRINTLN(DEBUG_AMBIENT, "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, "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
DISABLE_CABLE_CAR_FIRST_PERSON()
RC_END_CUTSCENE_MODE()
DISABLE_CELLPHONE(FALSE)
IF (skip)
CPRINTLN(DEBUG_AMBIENT, "PLAYER_END_CABLE_CAR() - Cable Car:", car.iWireIndex, " Skipped Re-Spotting Player")
IF ((car.iWireIndex = CABLE_WIRE_LEFT) AND (car.fSpeedSgn = 1.0)) OR ((car.iWireIndex = CABLE_WIRE_RIGHT) AND (car.fSpeedSgn = -1.0))
WAIT_FOR_WORLD_TO_LOAD(vHighDockPosition)
IF IS_ENTITY_OK(PLAYER_PED_ID())
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vHighDockPosition)
ENDIF
ENDIF
IF ((car.iWireIndex = CABLE_WIRE_LEFT) AND (car.fSpeedSgn = -1.0)) OR ((car.iWireIndex = CABLE_WIRE_RIGHT) AND (car.fSpeedSgn = 1.0))
WAIT_FOR_WORLD_TO_LOAD(vHighDockPosition)
IF IS_ENTITY_OK(PLAYER_PED_ID())
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vLowDockPosition)
ENDIF
ENDIF
car.carState = CABLECAR_CLEANUP
DELETE_CABLE_CAR(car)
ZERO_CABLE_CAR(car)
// regenerate cable car at end
IF (car.fSpeedSgn = 1.0)
CREATE_CABLE_CAR(car, car.iWireIndex, cableWire[car.iWireIndex].iPointsUsed - 1, 1.0, -car.fSpeedSgn)
ELSE
CREATE_CABLE_CAR(car, car.iWireIndex, 0, 0.0, -car.fSpeedSgn)
ENDIF
WAIT(250)
bSkipped = FALSE
ENDIF
DO_SCREEN_FADE_IN(500)
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_UNLOGGED_SMALL_ACTION, COST_CABLECAR)
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
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
IF NOT bFPSMode
ENABLE_CABLE_CAR_FIRST_PERSON()
ENDIF
/*
IF NOT bFPSMode
ENABLE_CABLE_CAR_FIRST_PERSON()
ELSE
DISABLE_CABLE_CAR_FIRST_PERSON()
ENDIF
*/
ENDIF
// skipping
IF (bSkipped = FALSE)
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
SAFE_FADE_SCREEN_OUT_TO_BLACK(500, FALSE)
bSkipped = TRUE
ENDIF
ELIF IS_SCREEN_FADED_OUT()
PLAYER_END_CABLE_CAR(car, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Update the cable car
/// PARAMS:
/// car - car reference
/// RETURNS:
/// We return true if the ride is finished
FUNC BOOL UPDATE_CABLE_CAR(CABLE_CAR &car)
FLOAT s
// if vehicle doesn't exist quit
car.iFrameCounter ++
IF NOT DOES_ENTITY_EXIST(car.vehicleID)
RETURN FALSE
ENDIF
// make vehicle drop when dead
IF IS_ENTITY_DEAD(car.vehicleID)
SET_ENTITY_HAS_GRAVITY(car.vehicleID, TRUE)
EXPLODE_VEHICLE(car.vehicleID)
IF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED_ID(), car.vehicleID)
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
FREEZE_ENTITY_POSITION(car.vehicleID, FALSE)
SET_VEHICLE_AS_NO_LONGER_NEEDED(car.vehicleID)
car.vehicleID = NULL
car.iDiedTime = GET_GAME_TIMER()
RETURN FALSE
ENDIF
// disable switching and weapons if player is attached
car.bIsPlayerIn = IS_PED_IN_CABLE_CAR(PLAYER_PED_ID(), car)
IF (car.bIsPlayerIn)
RC_DISABLE_CONTROL_ACTIONS_FOR_LEAD_IN()
DISABLE_SELECTOR_THIS_FRAME()
UPDATE_CABLE_CAR_PLAYER_CONTROLS(car)
ENDIF
SWITCH (car.carState)
CASE CABLECAR_NULLSTATE
CASE CABLECAR_WAITING
UPDATE_CABLE_CAR_WAITING(car)
BREAK
CASE CABLECAR_DEPARTING
IF (car.bIsPlayerIn)
bSkipped = FALSE
ATTACH_PED_TO_CABLE_CAR(PLAYER_PED_ID(), car)
ENABLE_CABLE_CAR_FIRST_PERSON()
ENDIF
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Accelerating")
//SET_ENTITY_COLLISION(car.vehicleID, FALSE)
SET_ENTITY_HAS_GRAVITY(car.vehicleID, FALSE)
car.carState = CABLECAR_SPEEDUP
car.bIsMoving = TRUE
BREAK
CASE CABLECAR_SPEEDUP
car.fSpeed += (fCableCarAcceleration * TIMESTEP())
IF (car.fSpeed > fCableCarMaxSpeed)
car.fSpeed = fCableCarMaxSpeed
car.carState = CABLECAR_MOVING
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Acceleration Complete")
ENDIF
BREAK
CASE CABLECAR_MOVING
s = (fCableCarMaxSpeed * CABLE_CAR_SLOW_TIME) + (0.5 * (fCableCarAcceleration * (CABLE_CAR_SLOW_TIME * CABLE_CAR_SLOW_TIME)))
IF (car.fDistanceTravelled >= (cableWire[car.iWireIndex].fRopeLength - s))
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Slowdown Start")
car.carState = CABLECAR_SLOWDOWN
ENDIF
BREAK
CASE CABLECAR_SLOWDOWN
car.fSpeed -= (fCableCarAcceleration * TIMESTEP())
IF (car.fSpeed < 0.0)
car.fSpeed = 0.0
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Slowdown Complete")
car.carState = CABLECAR_ARRIVING
ENDIF
BREAK
CASE CABLECAR_ARRIVING
//SET_ENTITY_COLLISION(car.vehicleID, TRUE)
// turn off 1st person camera and get ready to detach the player
IF IS_ENTITY_ATTACHED_TO_ENTITY(PLAYER_PED_ID(), car.vehicleID)
DETACH_ENTITY(PLAYER_PED_ID())
/*
IF ((car.iWireIndex = CABLE_WIRE_LEFT) AND (car.fSpeedSgn = 1.0)) OR ((car.iWireIndex = CABLE_WIRE_RIGHT) AND (car.fSpeedSgn = -1.0))
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Finished - Collision bust - Warp Player")
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), vHighDockPosition)
ENDIF
*/
PLAYER_END_CABLE_CAR(car)
ENDIF
// wait for the player to be at least a couple of meters away
IF NOT (bNoWait)
IF IS_PED_IN_CABLE_CAR(PLAYER_PED_ID(), car, 1.5)
RETURN TRUE
ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "UPDATE_CABLE_CAR() - Cable Car:", car.iWireIndex, " Waiting 20 Seconds to Depart")
car.carState = CABLECAR_WAITING
car.iDepartTime = GET_GAME_TIMER() + 20000
car.fSpeedSgn *= -1.0
car.fDistanceTravelled = 0
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF (car.bReAttach)
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), car.vehicleID, 0, vCableCarPlayerAttachOffset, <<0, 0, 0>>)
car.bReAttach = FALSE
ENDIF
car.iState = ENUM_TO_INT(car.carState)
#ENDIF
IF (car.fSpeedSgn > 0.0)
RETURN UPDATE_CABLE_CAR_FORWARD(car)
ELSE
RETURN UPDATE_CABLE_CAR_BACKWARD(car)
ENDIF
RETURN FALSE
ENDFUNC
//----------------------
// DEBUG VARIABLES
//----------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID m_WidgetGroup
#ENDIF
#IF IS_DEBUG_BUILD
/// 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_BOOL("Is Player In", car.bIsPlayerIn)
ADD_WIDGET_INT_SLIDER("Current Index", car.iWireSegment, 0, MAX_CABLEWIRE_POINTS - 1, 1)
ADD_WIDGET_FLOAT_SLIDER("Interpolate Value", car.fInterpolateValue, -1, 1, 0.000625)
ADD_WIDGET_INT_READ_ONLY("State", car.iState)
ADD_WIDGET_INT_READ_ONLY("Depart Time", car.iDepartTime)
ADD_WIDGET_FLOAT_READ_ONLY("T Delta", car.fTDelta)
ADD_WIDGET_FLOAT_READ_ONLY("Speed", car.fSpeed)
ADD_WIDGET_FLOAT_READ_ONLY("Speed Sign", car.fSpeedSgn)
ADD_WIDGET_FLOAT_READ_ONLY("Distance Travelled", car.fDistanceTravelled)
ADD_WIDGET_BOOL("Attach Player", car.bReAttach)
STOP_WIDGET_GROUP()
ENDPROC
/// 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_INT_READ_ONLY("Points Used", wire.iPointsUsed)
ADD_WIDGET_FLOAT_READ_ONLY("Wire Length", wire.fRopeLength)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Initializes Wire Debug Widgets
PROC SETUP_CABLECAR_SYSTEM_DEBUG_WIDGETS()
START_WIDGET_GROUP("Cable Car System")
ADD_WIDGET_BOOL("Quit Script", bExitScript)
ADD_WIDGET_BOOL("Don't Wait", bNoWait)
ADD_WIDGET_BOOL("Warp To Low Dock", bWarpToLowDock)
ADD_WIDGET_BOOL("Warp To High Dock", bWarpToHighDock)
ADD_WIDGET_FLOAT_SLIDER("Max Speed", fCableCarMaxSpeed, 0, 30, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Acceleration", fCableCarAcceleration, 0, 5, 0.005)
ADD_WIDGET_VECTOR_SLIDER("Player Attach", vCableCarPlayerAttachOffset, -15, 15, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Wire Attach Offset", fCableCarAttachHeightOffset, -10, 10, 0.25)
ADD_WIDGET_FLOAT_SLIDER("Vert Size", fDebugWireVertexSize, 0, 1, 0.005)
ADD_WIDGET_FLOAT_SLIDER("Vert Height", fDebugWireVertexHeight, 0, 30, 0.25)
ADD_WIDGET_BOOL("On Mission", bIsOnMission)
ADD_WIDGET_BOOL("FPS Mode", bFPSMode)
ADD_WIDGET_BOOL("Skipped", bSkipped)
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Initializes Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
SET_PROFILING_OF_THIS_SCRIPT(TRUE)
m_WidgetGroup = START_WIDGET_GROUP("Cable Car Test")
SETUP_CABLECAR_SYSTEM_DEBUG_WIDGETS()
SETUP_CABLECAR_DEBUG_WIDGETS("Left Car", cableCarLeft)
SETUP_CABLECAR_DEBUG_WIDGETS("Right Car", cableCarRight)
SETUP_CABLECAR_WIRE_DEBUG_WIDGETS("Left Wire", cableWire[CABLE_WIRE_LEFT])
SETUP_CABLECAR_WIRE_DEBUG_WIDGETS("Right Wire", cableWire[CABLE_WIRE_RIGHT])
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
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()
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
DELETE_CABLE_CAR(cableCarLeft)
DELETE_CABLE_CAR(cableCarRight)
SET_MODEL_AS_NO_LONGER_NEEDED(cableCarModel)
REACTIVATE_ALL_WORLD_BRAINS_THAT_ARE_WAITING_TILL_OUT_OF_RANGE()
CPRINTLN(DEBUG_AMBIENT, "New Cable Car - Cleanup")
TERMINATE_THIS_THREAD()
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
VECTOR v
// Setup callback when player is killed, arrested or goes to multiplayer
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS))
SCRIPT_CLEANUP()
ENDIF
CPRINTLN(DEBUG_AMBIENT, "New Cable Car - Initializing - Version:", 1109)
//SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), <<-741.5, 5595.5, 41.7>>)
#IF IS_DEBUG_BUILD
SETUP_DEBUG_WIDGETS()
#ENDIF
IS_ENTITY_OK(PLAYER_PED_ID())
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
CPRINTLN(DEBUG_AMBIENT, "New Cable Car - Fade Done")
SECURE_REQUEST_AND_LOAD_MODEL(cableCarModel)
SETUP_CABLE_CAR_WIRE_LEFT(cableWire[CABLE_WIRE_LEFT])
SETUP_CABLE_CAR_WIRE_RIGHT_FLIPPED(cableWire[CABLE_WIRE_RIGHT])
CREATE_CABLE_CAR(cableCarLeft, CABLE_WIRE_LEFT, 0, 0.460, 1)
UPDATE_CABLE_CAR(cableCarLeft)
CREATE_CABLE_CAR(cableCarRight, CABLE_WIRE_RIGHT, 0, 0.460, 1)
UPDATE_CABLE_CAR(cableCarRight)
WHILE (TRUE)
IS_ENTITY_OK(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) OR (bExitScript)
RC_END_CUTSCENE_MODE()
SCRIPT_CLEANUP()
ENDIF
#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)
#ENDIF
v = GET_ENTITY_COORDS(PLAYER_PED_ID())
IF (v.y > 4500.0)
UPDATE_CABLE_CAR(cableCarLeft)
UPDATE_CABLE_CAR(cableCarRight)
ENDIF
IF (bIsOnMission = FALSE) AND GET_MISSION_FLAG()
CPRINTLN(DEBUG_AMBIENT, "On Mission - Seal up the Cable Car")
REPAIR_CABLE_CAR_DOORS(cableCarLeft)
REPAIR_CABLE_CAR_DOORS(cableCarRight)
bIsOnMission = TRUE
ENDIF
IF (bIsOnMission = TRUE) AND NOT GET_MISSION_FLAG()
CPRINTLN(DEBUG_AMBIENT, "On Mission - Reopen up the Cable Car")
FORCE_BREAK_CABLE_CAR_DOORS(cableCarLeft)
FORCE_BREAK_CABLE_CAR_DOORS(cableCarRight)
bIsOnMission = FALSE
ENDIF
IF bFPSMode = TRUE
UPDATE_FIRST_PERSON_CAMERA(fpsCam)
ENDIF
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS()
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT
#ENDIF