Skip to content

Commit d0afdf6

Browse files
authored
Merge pull request YimMenu-Lua#131 from YimMenu-Lua/cwheel_fix
fix(classes): fix CWheel offsets
2 parents fd183c2 + 1c6961b commit d0afdf6

7 files changed

Lines changed: 193 additions & 155 deletions

File tree

SSV2/includes/classes/gta/CWheel.lua

Lines changed: 102 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -18,89 +18,111 @@ local VEC3_ZERO <const> = vec3:zero()
1818
---@class CWheel : CStructBase<CWheel>
1919
---@field protected m_ptr pointer
2020
---@field private m_size uint16_t
21-
---@field m_y_rotation pointer<float> //0x008
22-
---@field m_y_rotation_inv pointer<float> //0x010
23-
---@field m_offset_from_body pointer<float> //0x020
24-
---@field m_x_offset pointer<float> // 0x030 same as offset from body?
25-
---@field m_last_ground_pos pointer<vec3> // 0x03C
26-
---@field m_wheel_transform array<pointer<fMatrix44>> // 0x090 - 0x0BC `rage::fMatrix44` -- TODO: this is wrong; fix it
27-
---@field m_unk_flags pointer<uint32_t> //0x0C8
28-
---@field m_tyre_radius pointer<float> //0xF4
29-
---@field m_rim_radius pointer<float> //0xF6
30-
---@field m_old_rim_radius pointer<float> //0xFA
31-
---@field m_tyre_width pointer<float> //0xFE
32-
---@field m_handling_data pointer<CHandlingData> //0x102
33-
---@field m_vehicle pointer<CVehicle> //0x106
34-
---@field m_suspension_length pointer<float> //0x110
35-
---@field m_max_suspension_travel pointer<float> //0x114
36-
---@field m_suspension_forward_offset pointer<float> //0x13C // prefer this to raise/lower individual wheels
37-
---@field m_suspension_compression pointer<float> // 0x164
38-
---@field m_suspension_compression_2 pointer<float> // 0x168
39-
---@field m_wheel_compression pointer<float> // 0x16C
40-
---@field m_rotation_speed pointer // 0x170
41-
---@field m_unk0190 pointer // ?? 0x190
42-
---@field m_unk0194 pointer // ?? 0x194
43-
---@field m_tire_drag_coeff pointer<float> // 0x198
44-
---@field m_top_speed_mult pointer<float> // 0x19C
45-
---@field m_steering_angle pointer<float> // 0x1CC
46-
---@field m_brake_force pointer<float> // 0x1D0
47-
---@field m_drive_force pointer<float> // 0x1D4
48-
---@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
49-
---@field m_tyre_health pointer<float> // 0x1EC // <= 500.0f: flat tyre // 0.0f: no tyre
50-
---@field m_tyre_wear_mult pointer<float> // 0x1F0 // 0.0f: tyres won't burst from long burnout
51-
---@field m_tyre_wear_unk pointer<float> // 0x1F8 // similar?
52-
---@field m_wheel_flags pointer<eWheelDynamicFlags> // 0x200
53-
---@field m_wheel_config_flags pointer<eWheelConfigFlags> // 0x204
54-
---@field m_unk_u16 pointer<uint16_t> // 0x208
55-
---@field m_unk_u8 pointer<uint8_t> // 0x20A
56-
---@field m_tyre_is_burst pointer<bool> // 0x20B
57-
---@field m_unk_byte pointer<byte> // 0x20C
58-
---@field m_has_hydraulics pointer<bool> // 0x20D // true for cars with DONK mod
59-
---@overload fun(addr: pointer): CWheel|nil
21+
---@field m_y_rotation pointer<float>
22+
---@field m_y_rotation_inv pointer<float>
23+
---@field m_offset_from_body pointer<float>
24+
---@field m_x_offset pointer<float> // same as offset from body?
25+
---@field m_last_ground_pos pointer<vec3>
26+
---@field m_wheel_transform array<pointer<fMatrix44>> // TODO: this is wrong; fix it // NOTE: these seem to be a bunch of vector3s, not a 4x4 matrix
27+
---@field m_parallel_wheel_index pointer<int8_t>
28+
---@field m_tyre_radius pointer<float> -- these now work but I had no patience to figure out how to reset them. wheel width/radius changes and sticks but the value in memory immediately reverses back to default
29+
---@field m_rim_radius pointer<float> -- //
30+
---@field m_unk_rim_radius pointer<float> -- // I have no idea what this is for. Its the exact same as 0x0114
31+
---@field m_tyre_width pointer<float>
32+
---@field m_handling_data pointer<CHandlingData>
33+
---@field m_vehicle pointer<CVehicle>
34+
---@field m_suspension_length pointer<float>
35+
---@field m_max_suspension_travel pointer<float>
36+
---@field m_rest_position pointer<float>
37+
---@field m_rest_position_2 pointer<float> prefer this to raise/lower individual wheels
38+
---@field m_unk0140 pointer<float>
39+
---@field m_accel_mass_mult pointer<float>
40+
---@field m_unk_0148 pointer<float>
41+
---@field m_suspension_raise pointer<float>
42+
---@field m_unk_suspension_raise pointer<float>
43+
---@field m_suspension_fwd_offset pointer<float>
44+
---@field m_hydraulic_state pointer<int32_t> some enum related to hydraulic state. can't find any refs online. where's Yimura when you need to skid from him? :(
45+
---@field m_hydraulic_state_2 pointer<int32_t> -- ??
46+
---@field m_suspension_compression pointer<float>
47+
---@field m_suspension_compression_2 pointer<float>
48+
---@field m_wheel_compression pointer<float>
49+
---@field m_rotation_angle pointer -- radians?
50+
---@field m_rotation_speed pointer -- velocity
51+
---@field m_unk_0174 pointer -- ??
52+
---@field m_tyre_temperature pointer<float> -- don't want to admit how long it took to figure out what this little shit is. are we playing Assetto Corsa now? it seems to only be relevant for F1 vehicles
53+
---@field m_unk_0194 pointer -- ??
54+
---@field m_tire_drag_coeff pointer<float>
55+
---@field m_top_speed_mult pointer<float>
56+
---@field m_steering_angle pointer<float>
57+
---@field m_brake_force pointer<float>
58+
---@field m_drive_force pointer<float>
59+
---@field m_unk_01E4 pointer<float>
60+
---@field m_suspension_health pointer<float> -- 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
61+
---@field m_tyre_health pointer<float> -- <= 500.0f: flat tyre // 0.0f: no tyre
62+
---@field m_tyre_wear_mult pointer<float> -- 0.0f: tyres won't burst from long burnout
63+
---@field m_tyre_wear_unk pointer<float> -- similar? // looks like a wear rate not current tyre wear
64+
---@field m_wheel_dynamic_flags pointer<eWheelDynamicFlags>
65+
---@field m_wheel_config_flags pointer<eWheelConfigFlags>
66+
---@field m_tyre_is_burst pointer<bool>
67+
---@field m_unk_020C pointer<byte>
68+
---@field m_has_donk_hydraulics pointer<bool> -- true for cars with DONK mod
69+
---@overload fun(addr: pointer): CWheel
6070
local CWheel = CStructView("CWheel", 0x020E)
6171

6272
---@param ptr pointer
6373
---@return CWheel
6474
function CWheel.new(ptr)
6575
return setmetatable({
66-
m_ptr = ptr,
67-
m_y_rotation = ptr:add(0x008),
68-
m_y_rotation_inv = ptr:add(0x010),
69-
m_offset_from_body = ptr:add(0x020),
70-
m_x_offset = ptr:add(0x030),
71-
m_last_ground_pos = ptr:add(0x03C),
72-
m_wheel_transform = { ptr:add(0x090), ptr:add(0x0A0), ptr:add(0x0B0), ptr:add(0x0C0) },
73-
m_unk_flags = ptr:add(0x0C8),
74-
m_tyre_radius = ptr:add(0x0F4),
75-
m_rim_radius = ptr:add(0x0F6),
76-
m_old_rim_radius = ptr:add(0x0FA),
77-
m_tyre_width = ptr:add(0x0FE),
78-
m_handling_data = ptr:add(0x102),
79-
m_vehicle = ptr:add(0x106),
80-
m_suspension_length = ptr:add(0x110),
81-
m_max_suspension_travel = ptr:add(0x114),
82-
m_suspension_forward_offset = ptr:add(0x13C),
83-
m_suspension_compression_2 = ptr:add(0x168),
84-
m_wheel_compression = ptr:add(0x16C),
85-
m_rotation_speed = ptr:add(0x170),
86-
m_unk0190 = ptr:add(0x190),
87-
m_unk0194 = ptr:add(0x194),
88-
m_tire_drag_coeff = ptr:add(0x198),
89-
m_top_speed_mult = ptr:add(0x19C),
90-
m_steering_angle = ptr:add(0x1CC),
91-
m_brake_force = ptr:add(0x1D0),
92-
m_drive_force = ptr:add(0x1D4),
93-
m_suspension_health = ptr:add(0x1E8),
94-
m_tyre_health = ptr:add(0x1EC),
95-
m_tyre_wear_mult = ptr:add(0x1F0),
96-
m_tyre_wear_unk = ptr:add(0x1F8),
97-
m_wheel_flags = ptr:add(0x200),
98-
m_wheel_config_flags = ptr:add(0x204),
99-
m_unk_u16 = ptr:add(0x208),
100-
m_unk_u8 = ptr:add(0x20A),
101-
m_tyre_is_burst = ptr:add(0x20B),
102-
m_unk_byte = ptr:add(0x20C),
103-
m_has_hydraulics = ptr:add(0x20D),
76+
m_ptr = ptr,
77+
m_y_rotation = ptr:add(0x0008),
78+
m_y_rotation_inv = ptr:add(0x0010),
79+
m_offset_from_body = ptr:add(0x0020),
80+
m_x_offset = ptr:add(0x0030),
81+
m_last_ground_pos = ptr:add(0x003C),
82+
m_wheel_transform = { ptr:add(0x090), ptr:add(0x0A0), ptr:add(0x0B0), ptr:add(0x0C0) },
83+
m_parallel_wheel_index = ptr:add(0x010F),
84+
m_tyre_radius = ptr:add(0x0110),
85+
m_rim_radius = ptr:add(0x0114),
86+
m_unk_rim_radius = ptr:add(0x0118),
87+
m_tyre_width = ptr:add(0x011C),
88+
m_handling_data = ptr:add(0x0120),
89+
m_vehicle = ptr:add(0x0128),
90+
m_suspension_length = ptr:add(0x0130),
91+
m_max_suspension_travel = ptr:add(0x0134),
92+
m_rest_position = ptr:add(0x0138),
93+
m_rest_position_2 = ptr:add(0x013C),
94+
m_unk_0140 = ptr:add(0x0140),
95+
m_accel_mass_mult = ptr:add(0x0144),
96+
m_unk_0148 = ptr:add(0x0148),
97+
m_suspension_raise = ptr:add(0x014C),
98+
m_unk_suspension_raise = ptr:add(0x0150),
99+
m_suspension_fwd_offset = ptr:add(0x0154),
100+
m_hydraulic_state = ptr:add(0x0158),
101+
m_hydraulic_state_2 = ptr:add(0x015C),
102+
m_suspension_compression = ptr:add(0x0160),
103+
m_suspension_compression_2 = ptr:add(0x0164),
104+
m_wheel_compression = ptr:add(0x0168),
105+
m_rotation_angle = ptr:add(0x016C),
106+
m_rotation_speed = ptr:add(0x0170),
107+
m_unk_0174 = ptr:add(0x0174),
108+
m_tyre_temperature = ptr:add(0x0178),
109+
m_unk_0194 = ptr:add(0x0194),
110+
m_tire_drag_coeff = ptr:add(0x0198),
111+
m_top_speed_mult = ptr:add(0x019C),
112+
m_steering_angle = ptr:add(0x01CC),
113+
m_brake_force = ptr:add(0x01DC),
114+
m_drive_force = ptr:add(0x01E0),
115+
m_unk_01E4 = ptr:add(0x01E4),
116+
m_suspension_health = ptr:add(0x01E8),
117+
m_tyre_health = ptr:add(0x01EC),
118+
m_tyre_wear_mult = ptr:add(0x01F0),
119+
m_tyre_wear_unk = ptr:add(0x01F4),
120+
m_unk_01F8 = ptr:add(0x01F8),
121+
m_wheel_dynamic_flags = ptr:add(0x0200),
122+
m_wheel_config_flags = ptr:add(0x0204),
123+
m_tyre_is_burst = ptr:add(0x020B),
124+
m_unk_020C = ptr:add(0x020C),
125+
m_has_donk_hydraulics = ptr:add(0x020D),
104126
---@diagnostic disable-next-line: param-type-mismatch
105127
}, CWheel)
106128
end
@@ -164,7 +186,7 @@ end
164186
---@return boolean
165187
function CWheel:GetDynamicFlag(flag)
166188
return self:__safecall(false, function()
167-
return Bit.IsBitSet(self.m_wheel_flags:get_dword(), flag)
189+
return Bit.IsBitSet(self.m_wheel_dynamic_flags:get_dword(), flag)
168190
end)
169191
end
170192

@@ -181,9 +203,9 @@ end
181203
---@return boolean
182204
function CWheel:SetDynamicFlag(flag, toggle)
183205
return self:__safecall(false, function()
184-
local dwFlags = self.m_wheel_flags:get_dword()
206+
local dwFlags = self.m_wheel_dynamic_flags:get_dword()
185207
local newBits = Bit.Toggle(dwFlags, flag, toggle)
186-
self.m_wheel_flags:set_dword(newBits)
208+
self.m_wheel_dynamic_flags:set_dword(newBits)
187209
return true
188210
end)
189211
end

SSV2/includes/data/enums/__init__.lua

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,31 @@
1111
--
1212
-- All enums are stored here to avoid polluting the global namespace.
1313
local Enums <const> = {
14-
eActionType = require("includes.data.enums.action_type"),
15-
eAnimFlags = require("includes.data.enums.anim_flags"),
16-
eDrivingFlags = require("includes.data.enums.driving_flags"),
17-
eGameState = require("includes.data.enums.game_state"),
18-
eGameLanguage = require("includes.data.enums.game_language"),
19-
eHandlingType = require("includes.data.enums.handling_type"),
20-
eLandingGearState = require("includes.data.enums.landing_gear_state"),
21-
eModelType = require("includes.data.enums.model_type"),
22-
ePedCombatAttributes = require("includes.data.enums.ped_combat_attributes"),
23-
ePedComponents = require("includes.data.enums.ped_components"),
24-
ePedConfigFlags = require("includes.data.enums.ped_config_flags"),
25-
ePedGender = require("includes.data.enums.ped_gender"),
26-
ePedResetFlags = require("includes.data.enums.ped_reset_flags"),
27-
ePedTaskIndex = require("includes.data.enums.ped_task_index"),
28-
ePedType = require("includes.data.enums.ped_type"),
29-
eRagdollBlockingFlags = require("includes.data.enums.ragdoll_blocking_flags"),
30-
eVehicleAdvancedFlags = require("includes.data.enums.vehicle_advanced_flags"),
31-
eVehicleClass = require("includes.data.enums.vehicle_classes"),
32-
eVehicleHandlingFlags = require("includes.data.enums.vehicle_handling_flags"),
33-
eVehicleModelFlags = require("includes.data.enums.vehicle_model_flags"),
34-
eVehicleModelInfoFlags = require("includes.data.enums.vehicle_model_info_flags"),
35-
eVehicleTask = require("includes.data.enums.vehicle_task"),
36-
eVehicleType = require("includes.data.enums.vehicle_type"),
37-
eWheelConfigFlags = require("includes.data.enums.wheel_config_flags"),
38-
eWheelDynamicFlags = require("includes.data.enums.wheel_dynamic_flags"),
14+
eActionType = require("action_type"),
15+
eAnimFlags = require("anim_flags"),
16+
eDrivingFlags = require("driving_flags"),
17+
eGameState = require("game_state"),
18+
eGameLanguage = require("game_language"),
19+
eHandlingType = require("handling_type"),
20+
eLandingGearState = require("landing_gear_state"),
21+
eModelType = require("model_type"),
22+
ePedCombatAttributes = require("ped_combat_attributes"),
23+
ePedComponents = require("ped_components"),
24+
ePedConfigFlags = require("ped_config_flags"),
25+
ePedGender = require("ped_gender"),
26+
ePedResetFlags = require("ped_reset_flags"),
27+
ePedTaskIndex = require("ped_task_index"),
28+
ePedType = require("ped_type"),
29+
eRagdollBlockingFlags = require("ragdoll_blocking_flags"),
30+
eVehicleAdvancedFlags = require("vehicle_advanced_flags"),
31+
eVehicleClass = require("vehicle_classes"),
32+
eVehicleHandlingFlags = require("vehicle_handling_flags"),
33+
eVehicleModelFlags = require("vehicle_model_flags"),
34+
eVehicleModelInfoFlags = require("vehicle_model_info_flags"),
35+
eVehicleTask = require("vehicle_task"),
36+
eVehicleType = require("vehicle_type"),
37+
eWheelConfigFlags = require("cwheel_config_flags"),
38+
eWheelDynamicFlags = require("cwheel_dynamic_flags"),
3939
}
4040

4141
return Enums
File renamed without changes.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
-- Copyright (C) 2026 SAMURAI (xesdoog) & Contributors.
2+
-- This file is part of Samurai's Scripts.
3+
--
4+
-- Permission is hereby granted to copy, modify, and redistribute
5+
-- this code as long as you respect these conditions:
6+
-- * Credit the owner and contributors.
7+
-- * Provide a copy of or a link to the original license (GPL-3.0 or later); see LICENSE.md or <https://www.gnu.org/licenses/>.
8+
9+
10+
---@enum eWheelDynamicFlags
11+
local eWheelDynamicFlags <const> = {
12+
HIT = 0,
13+
HIT_LAST = 1,
14+
ON_GAS = 2,
15+
ON_FIRE = 3,
16+
CHEAT_TC = 4,
17+
CHEAT_SC = 5,
18+
CHEAT_GRIP_1 = 6,
19+
CHEAT_GRIP_2 = 7,
20+
BURNOUT = 8,
21+
BURNOUT_2 = 9,
22+
IN_WATER = 10,
23+
SUBMERGED = 11,
24+
TYRES_HEAT_UP = 12,
25+
ABS_ACTIVE = 13,
26+
ABS_UNK = 14,
27+
ABS_ALT = 15,
28+
CRUSHING_PED = 16,
29+
REDUCE_GRIP = 17,
30+
TELEPORTED = 18,
31+
RESET = 19,
32+
BROKEN_OFF = 20,
33+
FULL_THROTTLE = 21,
34+
SIDE_IMPACT = 22,
35+
UNK_23 = 23,
36+
UNK_24 = 24,
37+
NO_LATERAL_SPRING = 25,
38+
WITHIN_DAMAGE_REGION = 26,
39+
WITHIN_DAMAGE_REGION_2 = 27,
40+
ON_PAVEMENT = 28,
41+
UNK_29 = 29,
42+
FORCE_NO_SLEEP = 30,
43+
SLEEPING_ON_DEBRIS = 31
44+
}
45+
46+
return eWheelDynamicFlags

SSV2/includes/data/enums/wheel_dynamic_flags.lua

Lines changed: 0 additions & 46 deletions
This file was deleted.

SSV2/includes/data/stancer_data.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ return {
3737
key = "m_susp_comp",
3838
axle = Enums.eWheelAxle.FRONT,
3939
side_dont_care = true,
40-
read = function(w) return w.m_suspension_forward_offset:get_float() end,
41-
write = function(w, v) w.m_suspension_forward_offset:set_float(v) end
40+
read = function(w) return w.m_rest_position_2:get_float() end,
41+
write = function(w, v) w.m_rest_position_2:set_float(v) end
4242
},
4343
{
4444
key = "m_wheel_width",
@@ -85,8 +85,8 @@ return {
8585
key = "m_susp_comp",
8686
axle = Enums.eWheelAxle.REAR,
8787
side_dont_care = true,
88-
read = function(w) return w.m_suspension_forward_offset:get_float() end,
89-
write = function(w, v) w.m_suspension_forward_offset:set_float(v) end
88+
read = function(w) return w.m_rest_position_2:get_float() end,
89+
write = function(w, v) w.m_rest_position_2:set_float(v) end
9090
},
9191
}
9292
}

0 commit comments

Comments
 (0)