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

360 lines
11 KiB
Python
Executable File

#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
#IF IS_DEBUG_BUILD
//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Train Tester //
// AUTHOR : Fraser Morgan //
// DESCRIPTION : Tool for creating trains moving, stopping etc. for Audio // //
// //
//////////////////////////////////////////////////////////////////////////////////////////
// including the most common script headers
USING "rage_builtins.sch"
USING "globals.sch"
USING "brains.sch"
USING "script_player.sch"
USING "script_buttons.sch"
USING "commands_script.sch"
USING "commands_pad.sch"
USING "commands_graphics.sch"
USING "commands_camera.sch"
USING "commands_streaming.sch"
USING "commands_interiors.sch"
USING "commands_object.sch"
USING "commands_vehicle.sch"
USING "commands_physics.sch"
USING "shared_debug.sch"
VEHICLE_INDEX missionTrain
CAMERA_INDEX trainCam
INT iTrainCam = -30
INT iCarriage
VECTOR vCreate = <<613, 6438, 31>>
VECTOR vCamPoint
VECTOR vTrainPOSITION
VECTOR vTrainCam
VECTOR vStoppingArea
VECTOR vStopZone
VECTOR vFront, vSide, vUp, vPos
VECTOR vTrainFront, vTrainSide, vTrainUp, vTrainPos
VECTOR vPointForward
INT iCreate = 0
INT iDistance = 60
FLOAT fStop
FLOAT fSpeed = 0.0
FLOAT fPadSpeed
FLOAT fTrainDist
BOOL bDirection = TRUE
BOOL bDoCreate = FALSE
BOOL bTerminate = FALSE
BOOL bAllowStops = FALSE
BOOL bPadControl = FALSE
BOOL bStopAtPlayer = FALSE
BOOL bReturningToPlayer = FALSE
BOOL bSkipToStop = FALSE
BOOL bTrainCam
BOOL bTurnTrain
BOOL bLookForward
BOOL bPlayerControl = TRUE
BOOL bWarpToCity
BOOL bWarpToCountry
BOOL bInCity
WIDGET_GROUP_ID createTrainWidgets
// cleanup the mission
PROC MISSION_CLEANUP()
SET_RANDOM_TRAINS(TRUE)
IF DOES_WIDGET_GROUP_EXIST(createTrainWidgets)
DELETE_WIDGET_GROUP(createTrainWidgets)
ENDIF
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), TRUE)
CLEAR_FOCUS()
DESTROY_CAM(trainCam, TRUE)
TERMINATE_THIS_THREAD()
ENDPROC
PROC TRAIN_CAMERA()
IF bTrainCam = TRUE
IF DOES_ENTITY_EXIST(missionTrain)
SET_FOCUS_POS_AND_VEL((GET_ENTITY_COORDS(missionTrain, FALSE)), <<0,0,0>>)
RENDER_SCRIPT_CAMS(TRUE, TRUE)
ENDIF
ELSE RENDER_SCRIPT_CAMS(FALSE, TRUE)
CLEAR_FOCUS()
ENDIF
ENDPROC
PROC CREATE_TRAIN_WIDGETS()
createTrainWidgets = START_WIDGET_GROUP("Train Creation")
ADD_WIDGET_INT_SLIDER("Carriage Configuration", iCreate, 0, 23, 1)
ADD_WIDGET_FLOAT_SLIDER("Speed", fSpeed, 0, 50, 1)
ADD_WIDGET_BOOL("Direction", bDirection)
ADD_WIDGET_BOOL("Create Train", bDoCreate)
ADD_WIDGET_BOOL("Warp Player to City", bWarpToCity)
ADD_WIDGET_BOOL("Warp Player to Country", bWarpToCountry)
ADD_WIDGET_STRING("Pad: RT for speed, Y for direction change")
ADD_WIDGET_BOOL("Pad Enabled", bPadControl)
ADD_WIDGET_FLOAT_READ_ONLY("pad value", fPadSpeed)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("Camera Options")
ADD_WIDGET_INT_SLIDER("Camera Distance", iTrainCam, -100, 100, 1)
ADD_WIDGET_INT_SLIDER("Carriage to View", iCarriage, 0, 100, 1)
ADD_WIDGET_BOOL("Camera on Train", bTrainCam)
ADD_WIDGET_BOOL("Point Camera Forward", bLookForward)
ADD_WIDGET_BOOL("Stops At Stations", bAllowStops)
ADD_WIDGET_BOOL("Jump To Next Station", bSkipToStop)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("'Train Fly-By' makes the train constantly drive past player's position.")
ADD_WIDGET_STRING("The train will turn around at your set distance and return.")
ADD_WIDGET_BOOL("Train Fly-By", bTurnTrain)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("'Stop Train at Player' will make the train travel out to your set distance,")
ADD_WIDGET_STRING("turn around, then travel back and stop at your location.")
ADD_WIDGET_STRING("NOTES: Player needs to be facing tracks. Train may stop short if it hasn't")
ADD_WIDGET_STRING("been given long enough to reach full speed.")
ADD_WIDGET_BOOL("Stop Train at Player", bStopAtPlayer)
ADD_WIDGET_INT_SLIDER("Distance to go", iDistance, 60, 1000, 1)
ADD_WIDGET_FLOAT_READ_ONLY("Train's current dist.", fTrainDist)
ADD_WIDGET_STRING("")
ADD_WIDGET_STRING("")
ADD_WIDGET_BOOL("Lock player control", bPlayerControl)
ADD_WIDGET_BOOL("End Script", bTerminate)
STOP_WIDGET_GROUP()
ENDPROC
// main script
SCRIPT
SET_MISSION_FLAG(TRUE)
IF HAS_FORCE_CLEANUP_OCCURRED()
MISSION_CLEANUP()
ENDIF
CREATE_TRAIN_WIDGETS()
SET_RANDOM_TRAINS(FALSE)
DELETE_ALL_TRAINS()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<626.68, 6442.31, 30.88>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -177)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
ENDIF
REQUEST_MODEL(FREIGHT)
REQUEST_MODEL(FREIGHTCAR)
REQUEST_MODEL(FREIGHTGRAIN)
REQUEST_MODEL(FREIGHTCONT1)
REQUEST_MODEL(FREIGHTCONT2)
REQUEST_MODEL(TANKERCAR)
REQUEST_MODEL(METROTRAIN)
WHILE NOT HAS_MODEL_LOADED(FREIGHT)
OR NOT HAS_MODEL_LOADED(FREIGHTCAR)
OR NOT HAS_MODEL_LOADED(FREIGHTGRAIN)
OR NOT HAS_MODEL_LOADED(FREIGHTCONT1)
OR NOT HAS_MODEL_LOADED(FREIGHTCONT2)
OR NOT HAS_MODEL_LOADED(TANKERCAR)
OR NOT HAS_MODEL_LOADED(METROTRAIN)
WAIT(0)
ENDWHILE
WHILE TRUE
// main loop
WAIT(0)
TRAIN_CAMERA()
INVALIDATE_IDLE_CAM()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF bDoCreate
IF DOES_ENTITY_EXIST(missionTrain)
DELETE_MISSION_TRAIN(missionTrain)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(trainCam)
ENDIF
IF bInCity = TRUE
missionTrain = CREATE_MISSION_TRAIN(iCreate, <<519.2, -1127.4, 29.6>>, bDirection)
ELSE missionTrain = CREATE_MISSION_TRAIN(iCreate, vCreate, bDirection)
ENDIF
trainCam = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
CLEAR_FOCUS()
bDoCreate = FALSE
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
vCamPoint = <<0, 0, 2>>
IF GET_TRAIN_DIRECTION(missionTrain) = TRUE
vTrainCam = <<iTrainCam, 0, 5>>
ELSE vTrainCam = <<-iTrainCam, 0, 5>>
ENDIF
IF bLookForward = TRUE
GET_ENTITY_MATRIX(missionTrain, vTrainFront, vTrainSide, vTrainUp, vTrainPos)
vPointForward = vTrainPos + vTrainFront + vTrainUp * 1.880
ATTACH_CAM_TO_ENTITY(trainCam, missionTrain, <<0, 0, 4>>)
POINT_CAM_AT_COORD(trainCam, vPointForward)
ELSE POINT_CAM_AT_ENTITY(trainCam, (GET_TRAIN_CARRIAGE(missionTrain, iCarriage)), vCamPoint)
ATTACH_CAM_TO_ENTITY(trainCam, (GET_TRAIN_CARRIAGE(missionTrain, iCarriage)), vTrainCam)
ENDIF
SET_CAM_FOV(trainCam, 30)
fTrainDist = GET_DISTANCE_BETWEEN_COORDS((GET_ENTITY_COORDS(missionTrain, TRUE)), (GET_ENTITY_COORDS(PLAYER_PED_ID())))
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, TRIANGLE)
IF DOES_ENTITY_EXIST(missionTrain)
IF bDirection = TRUE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, FALSE)
bDirection = FALSE
ELSE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, TRUE)
bDirection = TRUE
ENDIF
ENDIF
ENDIF
IF IS_VEHICLE_DRIVEABLE(missionTrain)
IF bPadControl = TRUE
fPadSpeed = TO_FLOAT(GET_BUTTON_VALUE(PAD1, RIGHTSHOULDER2)) / 5.1
SET_TRAIN_CRUISE_SPEED(missionTrain, fPadSpeed)
ENDIF
ENDIF
IF bWarpToCity
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<514.2, -1127.1, 29.3>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -95)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
bInCity = TRUE
bWarpToCity = FALSE
ENDIF
ENDIF
IF bWarpToCountry
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<626.68, 6442.31, 30.88>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), -177)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
bInCity = FALSE
bWarpToCountry = FALSE
ENDIF
ENDIF
IF bTurnTrain = TRUE
bStopAtPlayer = FALSE
IF GET_DISTANCE_BETWEEN_COORDS((GET_ENTITY_COORDS(PLAYER_PED_ID(), TRUE)), (GET_ENTITY_COORDS(missionTrain, TRUE)), FALSE) > iDistance
IF bDirection = TRUE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, FALSE)
WAIT(500)
bDirection = FALSE
ELSE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, TRUE)
WAIT(500)
bDirection = TRUE
ENDIF
ENDIF
ENDIF
IF bStopAtPlayer = TRUE
bPadControl = FALSE
bTurnTrain = FALSE
IF GET_DISTANCE_BETWEEN_COORDS((GET_ENTITY_COORDS(PLAYER_PED_ID(), TRUE)), (GET_ENTITY_COORDS(missionTrain, TRUE)), FALSE) > iDistance
IF bReturningToPlayer = FALSE
IF bDirection = TRUE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, FALSE)
SET_TRAIN_CRUISE_SPEED(missionTrain, fSpeed)
bDirection = FALSE
bReturningToPlayer = TRUE
WAIT(500)
ELSE
vTrainPOSITION = GET_ENTITY_COORDS(missionTrain, TRUE)
DELETE_MISSION_TRAIN(missionTrain)
missionTrain = CREATE_MISSION_TRAIN(iCreate, vTrainPOSITION, TRUE)
SET_TRAIN_CRUISE_SPEED(missionTrain, fSpeed)
bDirection = TRUE
bReturningToPlayer = TRUE
WAIT(500)
ENDIF
ENDIF
ELSE IF bReturningToPlayer = FALSE
SET_TRAIN_CRUISE_SPEED(missionTrain, fSpeed)
ENDIF
ENDIF
IF bReturningToPlayer = TRUE
GET_ENTITY_MATRIX(PLAYER_PED_ID(), vFront, vSide, vUp, vPos)
vStopZone = vPos + vFront * 5.6
fStop = (fSpeed*fSpeed / 16.66) - 10
IF bDirection = TRUE
vStoppingArea = vStopZone + fStop * vSide
ELSE vStoppingArea = vStopZone - fStop * vSide
ENDIF
IF IS_ENTITY_AT_COORD(missionTrain, vStoppingArea, <<10, 10, 10>>)
SET_TRAIN_CRUISE_SPEED(missionTrain, 0)
SET_TRAIN_IS_STOPPED_AT_STATION(missionTrain)
ENDIF
ENDIF
ELSE bReturningToPlayer = FALSE
ENDIF
IF DOES_ENTITY_EXIST(missionTrain)
IF bAllowStops
SET_TRAIN_STOPS_FOR_STATIONS(missionTrain, TRUE)
SET_TRAIN_CRUISE_SPEED(missionTrain, fSpeed)
ELSE IF bPadControl = FALSE
AND bReturningToPlayer = FALSE
SET_TRAIN_CRUISE_SPEED(missionTrain, fSpeed)
SET_TRAIN_STOPS_FOR_STATIONS(missionTrain, FALSE)
ENDIF
ENDIF
ENDIF
IF bSkipToStop
SKIP_TO_NEXT_ALLOWED_STATION(missionTrain)
bSkipToStop = FALSE
ENDIF
IF bPlayerControl
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), FALSE)
ELSE
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), TRUE)
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
OR bTerminate
MISSION_CLEANUP()
ENDIF
IF bTerminate
MISSION_CLEANUP()
ENDIF
ENDIF
ENDWHILE
ENDSCRIPT
#ENDIF