Skip to content

Commit 2b051f1

Browse files
authored
race: add new settings to control vehicle physics behavior (#655)
* race: add vehicle_physics_mode and vehicle_physics_fps settings * Change default physics mode to legacy vehicle_physics_mode: "fixed" or "legacy" (restores old physics behavior). vehicle_physics_fps: sets the FPS limit when using "legacy" mode.
1 parent a30a731 commit 2b051f1

File tree

4 files changed

+82
-1
lines changed

4 files changed

+82
-1
lines changed

[gamemodes]/[race]/race/edf/race.edf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
<setting name="respawntime" friendlyname="Respawn delay" type="natural" description="Time from death to respawn in seconds. Default is 5." default="5" required="true"/>
88
<setting name="autopimp" friendlyname="Auto pimp" type="selection:true,false" default="true" description="Whether to apply a selection of visual upgrades to vehicles." required="false"/>
99
<setting name="firewater" friendlyname="Fire water" type="selection:true,false" default="false" description="Whether to explode the player when entering the water." required="false"/>
10+
<setting name="vehicle_physics_mode" friendlyname="Vehicle physics mode" type="selection:fixed,legacy" description="Sets the vehicle physics mode. Use fixed (recommended) for FPS-independent physics, or legacy to use FPS-dependent physics." required="false"/>
11+
<setting name="vehicle_physics_fps" friendlyname="Vehicle physics FPS" type="string" description="FPS limit to use when vehicle physics mode is set to legacy. This setting changes the limit: -1 = leave unchanged, 0 = unlimited, 25+ = specific limit." required="false"/>
1012

1113
<element name="spawnpoint" friendlyname="Spawnpoint" icon="edf/spawnpoint.png">
1214
<data name="position" type="coord3d" default="0,0,0" />

[gamemodes]/[race]/race/meta.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,20 @@
319319
desc="Set to true to show the map author name on the travelling screen."
320320
/>
321321

322+
<setting name="*vehicle_physics_mode" value="legacy"
323+
friendlyname="Vehicle physics mode"
324+
group="Gameplay"
325+
accept="fixed,legacy"
326+
desc="Sets the vehicle physics mode. Use fixed (recommended) for FPS-independent physics, or legacy to use FPS-dependent physics."
327+
/>
328+
329+
<setting name="*vehicle_physics_fps" value="-1"
330+
friendlyname="Vehicle physics FPS"
331+
group="Gameplay"
332+
accept="-1,0,25-32767"
333+
desc="FPS limit to use when vehicle physics mode is set to legacy. This setting changes the limit: -1 = leave unchanged, 0 = unlimited, 25+ = specific limit."
334+
/>
335+
322336
<setting name="*ghostmode_map_can_override" friendlyname="Ghost mode map override" group="Gameplay" value="true" accept="false,true" desc="Set to true to allow the map to override this setting"/>
323337
<setting name="*skins_map_can_override" friendlyname="Driver skin map override" group="Graphics" value="true" accept="false,true" desc="Set to true to allow the map to override this setting"/>
324338
<setting name="*vehicleweapons_map_can_override" friendlyname="Vehicle weapons map override" group="Gameplay" value="true" accept="false,true" desc="Set to true to allow the map to override this setting"/>
@@ -329,6 +343,9 @@
329343

330344
<setting name="*ghostmode_warning_if_map_override" friendlyname="Ghost mode override warning" group="Gameplay" value="true" accept="false,true" desc="Set to true to issue a warning to players in the chatbox, if the map overrides this setting"/>
331345
<setting name="*vehicleweapons_warning_if_map_override" friendlyname="Vehicle weapons override warning" group="Gameplay" value="true" accept="false,true" desc="Set to true to issue a warning to players in the chatbox, if the map overrides this setting"/>
346+
347+
<setting name="*vehicle_physics_mode_map_can_override" friendlyname="Vehicle physics mode map override" group="Gameplay" value="true" accept="false,true" desc="Set to true to allow the map to override this setting"/>
348+
<setting name="*vehicle_physics_fps_map_can_override" friendlyname="Vehicle physics FPS map override" group="Gameplay" value="true" accept="false,true" desc="Set to true to allow the map to override this setting"/>
332349
</settings>
333350

334351

[gamemodes]/[race]/race/race_server.lua

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ g_VehicleClothes = {
99

1010
g_CurrentRaceMode = nil
1111

12+
g_OriginalFPSLimit = nil
13+
g_OriginalVehiclePhysicsGlitchState = nil
14+
1215
g_Spawnpoints = {} -- { i = { position={x, y, z}, rotation={x, y, z}, vehicle=vehicleID, paintjob=paintjob, upgrades={...} } }
1316
g_Checkpoints = {} -- { i = { position={x, y, z}, size=size, color={r, g, b}, type=type, vehicle=vehicleID, paintjob=paintjob, upgrades={...} } }
1417
g_Objects = {} -- { i = { position={x, y, z}, rotation={x, y, z}, model=modelID } }
@@ -121,6 +124,10 @@ function cacheGameOptions()
121124
g_GameOptions.vehicleweapons_warning_if_map_override = getBool('race.vehicleweapons_warning_if_map_override',true)
122125
g_GameOptions.hunterminigun_map_can_override = getBool('race.hunterminigun_map_can_override',true)
123126
g_GameOptions.endmapwhenonlyspectators = getBool('race.endmapwhenonlyspectators',true)
127+
g_GameOptions.vehicle_physics_mode = getString('race.vehicle_physics_mode','legacy')
128+
g_GameOptions.vehicle_physics_fps = getNumber('race.vehicle_physics_fps',-1)
129+
g_GameOptions.vehicle_physics_mode_map_can_override = getBool('race.vehicle_physics_mode_map_can_override',true)
130+
g_GameOptions.vehicle_physics_fps_map_can_override = getBool('race.vehicle_physics_fps_map_can_override',true)
124131
if g_GameOptions.statskey ~= 'name' and g_GameOptions.statskey ~= 'serial' then
125132
outputWarning( "statskey is not set to 'name' or 'serial'" )
126133
g_GameOptions.statskey = 'name'
@@ -149,6 +156,8 @@ function cacheMapOptions(map)
149156
g_MapOptions.firewater = map.firewater == 'true'
150157
g_MapOptions.classicchangez = map.classicchangez == 'true'
151158
g_MapOptions.hunterminigun = map.hunterminigun == 'true'
159+
g_MapOptions.vehicle_physics_mode = map.vehicle_physics_mode or g_GameOptions.vehicle_physics_mode
160+
g_MapOptions.vehicle_physics_fps = tonumber(map.vehicle_physics_fps) or g_GameOptions.vehicle_physics_fps
152161

153162
outputDebug("MISC", "duration = "..g_MapOptions.duration.." respawn = "..g_MapOptions.respawn.." respawntime = "..tostring(g_MapOptions.respawntime).." time = "..g_MapOptions.time.." weather = "..g_MapOptions.weather)
154163

@@ -205,6 +214,47 @@ function cacheMapOptions(map)
205214
if not map.hunterminigun or not g_GameOptions.hunterminigun_map_can_override then
206215
g_MapOptions.hunterminigun = g_GameOptions.hunterminigun
207216
end
217+
218+
-- Set vehicle_physics_mode from g_GameOptions if not defined in the map, or map override not allowed
219+
if not map.vehicle_physics_mode or not g_GameOptions.vehicle_physics_mode_map_can_override then
220+
g_MapOptions.vehicle_physics_mode = g_GameOptions.vehicle_physics_mode
221+
end
222+
223+
-- Set vehicle_physics_fps from g_GameOptions if not defined in the map, or map override not allowed
224+
if not map.vehicle_physics_fps or not g_GameOptions.vehicle_physics_fps_map_can_override then
225+
g_MapOptions.vehicle_physics_fps = g_GameOptions.vehicle_physics_fps
226+
end
227+
228+
if g_MapOptions.vehicle_physics_mode == "fixed" then
229+
if g_OriginalVehiclePhysicsGlitchState == nil then
230+
g_OriginalVehiclePhysicsGlitchState = isGlitchEnabled("vehicle_rapid_stop")
231+
end
232+
233+
setGlitchEnabled("vehicle_rapid_stop", false)
234+
235+
if g_OriginalFPSLimit ~= nil then
236+
setFPSLimit(g_OriginalFPSLimit)
237+
g_OriginalFPSLimit = nil
238+
end
239+
else
240+
if g_OriginalVehiclePhysicsGlitchState == nil then
241+
g_OriginalVehiclePhysicsGlitchState = isGlitchEnabled("vehicle_rapid_stop")
242+
end
243+
244+
setGlitchEnabled("vehicle_rapid_stop", true)
245+
246+
if g_MapOptions.vehicle_physics_fps >= 0 then
247+
if g_OriginalFPSLimit == nil then
248+
g_OriginalFPSLimit = getFPSLimit()
249+
end
250+
setFPSLimit(g_MapOptions.vehicle_physics_fps)
251+
else
252+
if g_OriginalFPSLimit ~= nil then
253+
setFPSLimit(g_OriginalFPSLimit)
254+
g_OriginalFPSLimit = nil
255+
end
256+
end
257+
end
208258
end
209259

210260

@@ -238,6 +288,8 @@ function loadMap(res)
238288
g_SavedMapSettings.classicchangez = map.classicchangez
239289
g_SavedMapSettings.firewater = map.firewater
240290
g_SavedMapSettings.hunterminigun = map.hunterminigun
291+
g_SavedMapSettings.vehicle_physics_mode = map.vehicle_physics_mode
292+
g_SavedMapSettings.vehicle_physics_fps = map.vehicle_physics_fps
241293

242294
cacheMapOptions(g_SavedMapSettings)
243295

@@ -728,6 +780,16 @@ function unloadAll()
728780
end
729781
TimerManager.destroyTimersFor("map")
730782

783+
if g_OriginalFPSLimit ~= nil then
784+
setFPSLimit(g_OriginalFPSLimit)
785+
g_OriginalFPSLimit = nil
786+
end
787+
788+
if g_OriginalVehiclePhysicsGlitchState ~= nil then
789+
setGlitchEnabled("vehicle_rapid_stop", g_OriginalVehiclePhysicsGlitchState)
790+
g_OriginalVehiclePhysicsGlitchState = nil
791+
end
792+
731793
Countdown.destroyAll()
732794

733795
for i,player in pairs(g_Players) do

[gamemodes]/[race]/race/racemap.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ g_MapObjAttrs = {
77
g_MapSettingNames = table.create(
88
{'time', 'weather', 'respawn', 'respawntime', 'duration', 'skins', 'bikehats', 'bikehatchance', 'carhats', 'carhatchance',
99
'hairstyles', 'glasses', 'glasseschance', 'shirts', 'trousers', 'shoes',
10-
'ghostmode', 'vehicleweapons', 'autopimp', 'firewater', 'classicchangez', 'hunterminigun'},
10+
'ghostmode', 'vehicleweapons', 'autopimp', 'firewater', 'classicchangez', 'hunterminigun', 'vehicle_physics_mode', 'vehicle_physics_fps'},
1111
true
1212
)
1313

0 commit comments

Comments
 (0)