API Reference GE Extensions gameplay drag Drag Racing Manager Reference for `gameplay_drag_general`, which is the central state manager for the entire drag racing subsystem. Owns `dragData`, manages extension loading/unloading, racer setup, race lifecycle, times
Reference for gameplay_drag_general, which is the central state manager for the entire drag racing subsystem. Owns dragData, manages extension loading/unloading, racer setup, race lifecycle, timeslips, and freeroam POI integration.
gameplay_drag_saveSystem, gameplay_drag_dragBridge
| Function | Signature | Description |
|------
| M.dependencies | table | {'gameplay_drag_saveSystem', 'gameplay_drag_dragBridge'} |
| M.dependencies | table | {'gameplay_drag_saveSystem', 'gameplay_drag_dragBridge'} |
| M.dependencies | table | {'gameplay_drag_saveSystem', 'gameplay_drag_dragBridge'} |----|
| M.onExtensionLoaded | onExtensionLoaded handler |-----------
| M.setExtension | (ext) | nil | setExtension |
| M.getExtension | () | any | getExtension |
| M.getDebugMenu | () | any | getDebugMenu |
| M.setDebugMenu | (enabled) | nil | setDebugMenu |
| M.drawDebugMenu | () | nil | drawDebugMenu |
| M.createTimeslipPanelData | () | any | createTimeslipPanelData |
| M.setCareerRewrads | () | nil | setCareerRewrads ||
| M.onCareerActive | onCareerActive handler |-------------|
| onExtensionLoaded | () | Clears all state |
| onVehicleResetted | (vehicleId) | Clears if player reset during freeroam race |
| onVehicleSwitched | (oldId, newId) | Clears if switching vehicles during freeroam race |
| onVehicleDestroyed | (vehicleId) | Clears if vehicle destroyed during freeroam race |
| onAnyMissionChanged | (status, mission) | Clears on mission stop (non-activity context) |
Function Signature Description loadDragStripData(filepath) → tableLoad strip from JSON via save system setDragRaceData(data)Set dragData and ensure all extensions loaded getData() → table|nilGet current drag data getRacerData(vehicleId) → tableGet a specific racer getTimers(vehicleId) → tableGet racer timers getDragIsStarted() → boolRace started flag getGameplayContext() → string"freeroam" / "activity" clearDragData()Full clear: unload extensions, reset UI
Function Signature Description setupRacer(vehicleId, lane)Create racer with timers, phases, wheel offsets setPlayableVehicle(vehicleId)Mark racer as player-controlled setRacerDial(vehicleId, dialValue) → boolSet individual dial setRacersDial(dials) → boolBatch set [{racerId, value}] clearRacers()Empty the racers table
Function Signature Description startDragRaceActivity(lane) → boolVerify extensions, set up freeroam, start activity resetDragRace()Reset phases/flags without clearing data
Function Signature Description createTimeslipData() → tableFull timeslip with strip info, env, racer details sendTimeslipDataToUi()Save + push timeslip to UI screenshotTimeslip()Save screenshot to screenshots/timeslips/ clearTimeslip()Clear timeslip UI
Function Signature Description saveDialTimes(timeslip?)Save dial times via save system saveDialFile(dir)Save dial file to directory getCurrentSavePath() → stringCareer save path onSaveCurrentSaveSlot(currentSavePath)Hook to persist dial data
Function Signature Description getDragDataForLevel(levelId) → tableScan level's dragstrips/ for settings files onGetRawPoiListForLevel(levelId, elements)Inject invisible trigger POIs at stage positions
racer = {
vehId = vehicleId,
lane = 1 ,
isPlayable = true ,
isDesqualified = false ,
desqualifiedReason = "None" ,
isFinished = false ,
treeStarted = false ,
timersStarted = false ,
currentPhase = 1 ,
damage = 0 ,
phases = {{name = "stage" , started = false , completed = false , dependency = true }, ... },
timers = {
dial = {type = "dialTimer" , value = 10 },
reactionTime = {type = "distanceTimer" , value = 0 , distance = 0.178 },
time_60 = {type = "distanceTimer" , value = 0 , distance = 18.288 },
time_330 = {type = "distanceTimer" , value = 0 , distance = 100.584 },
time_1_8 = {type = "distanceTimer" , value = 0 , distance = 201.168 },
time_1000 = {type = "distanceTimer" , value = 0 , distance = 304.8 },
time_1_4 = {type = "distanceTimer" , value = 0 , distance = 402.336 },
velAt_1_8 = {type = "velocity" , value = 0 , distance = 201.168 },
velAt_1_4 = {type = "velocity" , value = 0 , distance = 402.336 },
time_0_60 = {type = "timeToVelocity" , value = 0 , velocity = 26.8224 },
brakingG = {type = "brakingG" , value = 0 , deltaTime = 1 },
},
-- Computed per frame:
vehPos, vehSpeed, vehDirectionVector, wheelsCenter, allWheelsOffsets, ...
}
-- Freeroam trigger flow:
-- 1. Player drives into stage position trigger (6m radius)
-- 2. onGetRawPoiListForLevel creates invisible POI
-- 3. POI.onInside → setDragRaceData(deepcopy(data)) → startDragRaceActivity(lane)
-- 4. startDragRaceActivity ensures extensions, sets up racer, starts activity
-- Mission flow:
-- 1. dragBridge.loadDragDataForMission(filepath)
-- 2. dragBridge.setVehicles(vehicleIds)
-- 3. dragBridge.startDragRaceActivity(lane)
ensureAllExtensionsLoaded() dynamically loads utils, times, display, and the drag type extension based on dragData.dragType
Wheel offsets are calculated from actual node positions, grouped by "frontness" (distance along vehicle forward axis)
Career rewards: 5 BMRA per completed drag race (non-activity context)
Freeroam context auto-clears on vehicle reset, switch, or destruction
The _ prefixed internal accessors (_getDragData, _setupRacer, etc.) are used by dragBridge
Function Signature Description setCareerRewrads()Sets career reward amounts (sic - typo in source) createTimeslipPanelData() → tableBuilds panel-format timeslip for UI drawDebugMenu()Renders ImGui debug menu setDebugMenu(enabled)Enables/disables debug menu getDebugMenu() → boolReturns debug menu state getExtension() → tableReturns the current drag type extension setExtension(ext)Sets the drag type extension reference
Function Description onExtensionLoadedClears all drag state on load onVehicleResettedClears if player reset during freeroam race onVehicleSwitchedClears if switching vehicles during freeroam race onVehicleDestroyedClears if vehicle destroyed during freeroam race onAnyMissionChangedClears on mission stop (non-activity context) onSaveCurrentSaveSlotPersists dial data to career save onCareerActiveLoads career-specific save data
Function Signature Description _getDragData()Returns internal dragData table _setDragData(data)Sets internal dragData table _getGameplayContext()Returns current gameplay context string _setGameplayContext(context)Sets gameplay context ("freeroam"/"activity") _getDragExtension()Returns current drag type extension ref _setDragExtension(ext)Sets current drag type extension ref _setupRacer(vehicleId, lane)Direct alias to setupRacer
Variable Type Description M.dependenciestable{'gameplay_drag_saveSystem', 'gameplay_drag_dragBridge'}M._clear()- M._getDragData()- M._getDragExtension()- M._getGameplayContext()- M._loadDragStripData(filepath)- M._loadPrefabs(data)- M._setDragData(data)- M._setDragExtension(ext)- M._setGameplayContext(context)- M._setupRacer(vehicleId, lane)- M.clearDragData()- M.clearRacers()- M.clearTimeslip()- M.createTimeslipData()- M.getCurrentSavePath()- M.getData()- M.getDragDataForLevel(levelIdentifier)- M.getDragIsStarted()- M.getGameplayContext()- M.getRacerData(vehicleId)- M.getTimers(vehicleId)- M.loadDragStripData(filepath)- M.onAnyMissionChanged(status, mission)- M.onGetRawPoiListForLevel(levelIdentifier, elements)- M.onSaveCurrentSaveSlot(currentSavePath)- M.onVehicleDestroyed(vehicleId)- M.onVehicleResetted(vehicleId)- M.onVehicleSwitched(oldId, newId)- M.resetDragRace()- M.saveDialFile(dir)- M.saveDialTimes(timeslip)- M.screenshotTimeslip()- M.sendTimeslipDataToUi()- M.setDragRaceData(data)- M.setPlayableVehicle(vehicleId)- M.setRacerDial(vehicleId, dialValue)- M.setRacersDial(dials)- M.setupRacer(vehicleId, lane)- M.startDragRaceActivity(lane)-