Skip to content

Commit 2801764

Browse files
committed
fix(stancer): fix suspension
- Use suspension length for individual axles instead of compression: This allows us to set different heights without blocking suspension compression animations. - Fix Reset function setting front wheel defaults to rear wheels. - Move Serializer disabled flag outside of state enum.
1 parent 811a0f8 commit 2801764

9 files changed

Lines changed: 326 additions & 113 deletions

File tree

SSV2/includes/backend.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ function Backend:RegisterEventCallback(event, callback)
346346
local evnt = self.EventCallbacks[event]
347347

348348
if ((type(callback) ~= "function") or not evnt) then
349-
log.fdebug("Failed to register event: %s", EnumTostring(Enums.eBackendEvent, event))
349+
log.fdebug("Failed to register event: %s", EnumToString(Enums.eBackendEvent, event))
350350
return
351351
end
352352

@@ -393,7 +393,7 @@ function Backend:TriggerEventCallbacks(event)
393393
if (type(fn) == "function") then
394394
local ok, err = pcall(fn)
395395
if (not ok) then
396-
log.fwarning("[Backend]: Callback error for event %s: %s", EnumTostring(Enums.eBackendEvent, event), err)
396+
log.fwarning("[Backend]: Callback error for event %s: %s", EnumToString(Enums.eBackendEvent, event), err)
397397
end
398398
end
399399
end

SSV2/includes/classes/CWheel.lua

Lines changed: 175 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,71 @@
11
---@diagnostic disable: param-type-mismatch
22

3+
---@enum eWheelFlags
4+
Enums.eWheelFlags = {
5+
HIT = 0,
6+
HIT_PREV = 1,
7+
ON_GAS = 2,
8+
ON_FIRE = 3,
9+
CHEAT_TC = 4,
10+
CHEAT_SC = 5,
11+
CHEAT_GRIP1 = 6,
12+
CHEAT_GRIP2 = 7,
13+
BURNOUT = 8,
14+
BURNOUT_NON_DRIVEN_WHEEL = 9,
15+
INSHALLOWWATER = 10,
16+
INDEEPWATER = 11,
17+
TYRES_HEAT_UP = 12,
18+
ABS_ACTIVE = 13,
19+
ABS = 14,
20+
ABS_ALT = 15,
21+
SQUASHING_PED = 16,
22+
REDUCE_GRIP = 17,
23+
TELEPORTED_NO_VFX = 18,
24+
RESET = 19,
25+
BROKEN_OFF = 20,
26+
FULL_THROTTLE = 21,
27+
SIDE_IMPACT = 22,
28+
DUMMY_TRANSITION = 23,
29+
DUMMY_TRANSITION_PREV = 24,
30+
NO_LATERAL_SPRING = 25,
31+
WITHIN_DAMAGE_REGION = 26,
32+
WITHIN_HEAVYDAMAGE_REGION = 27,
33+
TOUCHING_PAVEMENT = 28,
34+
DUMMY = 29,
35+
FORCE_NO_SLEEP = 30,
36+
SLEEPING_ON_DEBRIS = 31
37+
}
38+
39+
---@enum eWheelConfigFlags
40+
Enums.eWheelConfigFlags = {
41+
BIKE_WHEEL = 0,
42+
LEFTWHEEL = 1,
43+
REARWHEEL = 2,
44+
STEER = 3,
45+
POWERED = 4,
46+
TILT_INDEP = 5,
47+
TILT_SOLID = 6,
48+
BIKE_CONSTRAINED_COLLIDER = 7,
49+
BIKE_FALLEN_COLLIDER = 8,
50+
INSTANCED = 9,
51+
DONT_RENDER_STEER = 10,
52+
UPDATE_SUSPENSION = 11,
53+
QUAD_WHEEL = 12,
54+
HIGH_FRICTION_WHEEL = 13,
55+
DONT_REDUCE_GRIP_ON_BURNOUT = 14,
56+
IS_PHYSICAL = 15,
57+
BICYCLE_WHEEL = 16,
58+
TRACKED_WHEEL = 17,
59+
PLANE_WHEEL = 18,
60+
DONT_RENDER_HUB = 19,
61+
SPOILER = 20, -- vehicle has a spoiler mod (increased grip)
62+
ROTATE_BOUNDS = 21,
63+
EXTEND_ON_UPDATE_SUSPENSION = 22, -- force wheels to extend on suspension update
64+
CENTRE_WHEEL = 23, -- for three wheeled cars
65+
AMPHIBIOUS_WHEEL = 24,
66+
RENDER_WITH_ZERO_COMPRESSION = 25
67+
}
68+
369
--------------------------------------
470
-- Class: CWheel
571
--------------------------------------
@@ -12,23 +78,39 @@
1278
---@field m_offset_from_body pointer<float> //0x020
1379
---@field m_x_offset pointer<float> // 0x030 same as offset from body?
1480
---@field m_last_ground_pos pointer<vec3> // 0x03C
15-
---@field m_wheel_transform array<pointer<fMatrix44>> // 0x090 - 0x0BC `rage::fMatrix44`
81+
---@field m_wheel_transform array<pointer<fMatrix44>> // 0x090 - 0x0BC `rage::fMatrix44` -- TODO: this is wrong; fix it
1682
---@field m_unk_flags pointer<uint32_t> //0x0C8
17-
---@field m_tire_radius pointer<float> //0x110
18-
---@field m_tire_width pointer<float> //0x118
19-
---@field m_suspension_compression pointer<float> // 0x168 `radians`
20-
---@field m_traction_loss pointer<float> // 0x16C
83+
---@field m_tyre_radius pointer<float> //0xF4
84+
---@field m_rim_radius pointer<float> //0xF6
85+
---@field m_old_rim_radius pointer<float> //0xFA
86+
---@field m_tyre_width pointer<float> //0xFE
87+
---@field m_handling_data pointer<CHandlingData> //0x102
88+
---@field m_vehicle pointer<CVehicle> //0x106
89+
---@field m_suspension_length pointer<float> //0x110
90+
---@field m_max_suspension_travel pointer<float> //0x114
91+
---@field m_suspension_forward_offset pointer<float> //0x13C // prefer this to raise/lower individual wheels
92+
---@field m_suspension_compression pointer<float> // 0x164 `radians`
93+
---@field m_suspension_compression_2 pointer<float> // 0x168 `radians`
94+
---@field m_wheel_compression pointer<float> // 0x16C
2195
---@field m_rotation_speed pointer // 0x170
2296
---@field m_unk0190 pointer // ?? 0x190
2397
---@field m_unk0194 pointer // ?? 0x194
2498
---@field m_tire_drag_coeff pointer<float> // 0x198
2599
---@field m_top_speed_mult pointer<float> // 0x19C
26100
---@field m_steering_angle pointer<float> // 0x1CC `radians`
27-
---@field m_brake_pressure pointer<float> // 0x1D0
28-
---@field m_power pointer<float> // 0x1D4
29-
---@field m_health pointer<float> // 0x1E8
30-
---@field m_surface_id pointer<uint16_t> // 0x1EC
31-
---@field unk_flags_1F0 pointer<uint32_t> // 0x1F0
101+
---@field m_brake_force pointer<float> // 0x1D0
102+
---@field m_drive_force pointer<float> // 0x1D4
103+
---@field m_suspension_health pointer<float> // 0x1E8 // 100.0f: car gets slammed (old method of shooting your suspension to stance your car) // 0.0f: wheel should fall off but doesn't. Something else must be set to trigger wheel detachment
104+
---@field m_tyre_health pointer<float> // 0x1EC // <= 500.0f: flat tyre // 0.0f: no tyre
105+
---@field m_tyre_wear_mult pointer<float> // 0x1F0 // 0.0f: tyres won't burst from long burnout
106+
---@field m_tyre_wear_unk pointer<float> // 0x1F8 // similar?
107+
---@field m_wheel_flags pointer<eWheelFlags> // 0x200
108+
---@field m_wheel_config_flags pointer<eWheelConfigFlags> // 0x204
109+
---@field m_unk_u16 pointer<uint16_t> // 0x208
110+
---@field m_unk_u8 pointer<uint8_t> // 0x20A
111+
---@field m_tyre_is_burst pointer<bool> // 0x20B
112+
---@field m_unk_byte pointer<byte> // 0x20C
113+
---@field m_has_hydraulics pointer<bool> // 0x20D // true for cars with DUNK mod
32114
---@overload fun(addr: pointer): CWheel|nil
33115
local CWheel = { m_size = 0x1FC }
34116
CWheel.__index = CWheel
@@ -45,30 +127,45 @@ function CWheel.new(addr)
45127
return nil
46128
end
47129

48-
local instance = setmetatable({}, CWheel)
49-
instance.m_ptr = addr
50-
instance.m_y_rotation = addr:add(0x008)
51-
instance.m_y_rotation_inv = addr:add(0x010)
52-
instance.m_offset_from_body = addr:add(0x020)
53-
instance.m_x_offset = addr:add(0x030)
54-
instance.m_last_ground_pos = addr:add(0x03C)
55-
instance.m_wheel_transform = { addr:add(0x090), addr:add(0x0A0), addr:add(0x0B0), addr:add(0x0C0) }
56-
instance.m_unk_flags = addr:add(0x0C8)
57-
instance.m_tire_radius = addr:add(0x110)
58-
instance.m_tire_width = addr:add(0x118)
59-
instance.m_suspension_compression = addr:add(0x168)
60-
instance.m_traction_loss = addr:add(0x16C)
61-
instance.m_rotation_speed = addr:add(0x170)
62-
instance.m_unk0190 = addr:add(0x190)
63-
instance.m_unk0194 = addr:add(0x194)
64-
instance.m_tire_drag_coeff = addr:add(0x198)
65-
instance.m_top_speed_mult = addr:add(0x19C)
66-
instance.m_steering_angle = addr:add(0x1CC)
67-
instance.m_brake_pressure = addr:add(0x1D0)
68-
instance.m_power = addr:add(0x1D4)
69-
instance.m_health = addr:add(0x1E8)
70-
instance.m_surface_id = addr:add(0x1EC)
71-
instance.unk_flags_1F0 = addr:add(0x1F0)
130+
local instance = setmetatable({}, CWheel)
131+
instance.m_ptr = addr
132+
instance.m_y_rotation = addr:add(0x008)
133+
instance.m_y_rotation_inv = addr:add(0x010)
134+
instance.m_offset_from_body = addr:add(0x020)
135+
instance.m_x_offset = addr:add(0x030)
136+
instance.m_last_ground_pos = addr:add(0x03C)
137+
instance.m_wheel_transform = { addr:add(0x090), addr:add(0x0A0), addr:add(0x0B0), addr:add(0x0C0) }
138+
instance.m_unk_flags = addr:add(0x0C8)
139+
instance.m_tyre_radius = addr:add(0x0F4)
140+
instance.m_rim_radius = addr:add(0x0F6)
141+
instance.m_old_rim_radius = addr:add(0x0FA)
142+
instance.m_tyre_width = addr:add(0x0FE)
143+
instance.m_handling_data = addr:add(0x102)
144+
instance.m_vehicle = addr:add(0x106)
145+
instance.m_suspension_length = addr:add(0x110)
146+
instance.m_max_suspension_travel = addr:add(0x114)
147+
instance.m_suspension_forward_offset = addr:add(0x13C)
148+
instance.m_suspension_compression_2 = addr:add(0x168)
149+
instance.m_wheel_compression = addr:add(0x16C)
150+
instance.m_rotation_speed = addr:add(0x170)
151+
instance.m_unk0190 = addr:add(0x190)
152+
instance.m_unk0194 = addr:add(0x194)
153+
instance.m_tire_drag_coeff = addr:add(0x198)
154+
instance.m_top_speed_mult = addr:add(0x19C)
155+
instance.m_steering_angle = addr:add(0x1CC)
156+
instance.m_brake_force = addr:add(0x1D0)
157+
instance.m_drive_force = addr:add(0x1D4)
158+
instance.m_suspension_health = addr:add(0x1E8)
159+
instance.m_tyre_health = addr:add(0x1EC)
160+
instance.m_tyre_wear_mult = addr:add(0x1F0)
161+
instance.m_tyre_wear_unk = addr:add(0x1F8)
162+
instance.m_wheel_flags = addr:add(0x200)
163+
instance.m_wheel_config_flags = addr:add(0x204)
164+
instance.m_unk_u16 = addr:add(0x208)
165+
instance.m_unk_u8 = addr:add(0x20A)
166+
instance.m_tyre_is_burst = addr:add(0x20B)
167+
instance.m_unk_byte = addr:add(0x20C)
168+
instance.m_has_hydraulics = addr:add(0x20D)
72169

73170
return instance
74171
end
@@ -136,4 +233,48 @@ function CWheel:GetTiltAngle()
136233
return math.deg(math.acos(dot / mag))
137234
end
138235

236+
---@param flag eWheelFlags
237+
---@return boolean
238+
function CWheel:GetWheelFlag(flag)
239+
if (not self:IsValid()) then
240+
return false
241+
end
242+
243+
return Bit.is_set(self.m_wheel_flags:get_dword(), flag)
244+
end
245+
246+
---@param flag eWheelConfigFlags
247+
---@return boolean
248+
function CWheel:GetConfigFlag(flag)
249+
if (not self:IsValid()) then
250+
return false
251+
end
252+
253+
return Bit.is_set(self.m_wheel_config_flags:get_dword(), flag)
254+
end
255+
256+
---@param flag eWheelFlags
257+
---@param toggle boolean
258+
function CWheel:SetWheelFlag(flag, toggle)
259+
if (not self:IsValid()) then
260+
return
261+
end
262+
263+
local dwFlags = self.m_wheel_flags:get_dword()
264+
local bitFunc = toggle and Bit.set or Bit.clear
265+
self.m_wheel_flags:set_dword(bitFunc(dwFlags, flag))
266+
end
267+
268+
---@param flag eWheelConfigFlags
269+
---@param toggle boolean
270+
function CWheel:SetConfigFlag(flag, toggle)
271+
if (not self:IsValid()) then
272+
return
273+
end
274+
275+
local dwFlags = self.m_wheel_config_flags:get_dword()
276+
local bitFunc = toggle and Bit.set or Bit.clear
277+
self.m_wheel_config_flags:set_dword(bitFunc(dwFlags, flag))
278+
end
279+
139280
return CWheel

0 commit comments

Comments
 (0)