1139 lines
35 KiB
Python
Executable File
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
|
|
|
|
|
|
|