Skip to content

Commit 2334872

Browse files
authored
Merge pull request YimMenu-Lua#135 from YimMenu-Lua/handling_editor_rework
refactor(HandlingEditor): full rewrite
2 parents 5d0f96a + e5a5b00 commit 2334872

44 files changed

Lines changed: 3108 additions & 861 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,8 @@ max_line_length = unset
1010
[*.lua]
1111
indent_style = tab
1212

13-
[*.py]
13+
[*.{py,md,yml,json}]
1414
indent_style = space
1515

16-
[*.yml]
17-
indent_style = space
16+
[*.{yml,md}]
1817
indent_size = 2
19-
20-
[*.json]
21-
indent_style = space

SSV2/includes/classes/gta/CHandlingData.lua

Lines changed: 67 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@
1010

1111

1212
local atArray = require("includes.classes.gta.atArray")
13-
local CBaseSubHandlingData = require("includes.classes.gta.CBaseSubHandlingData")
1413
local CBikeHandlingData = require("includes.classes.gta.CBikeHandlingData")
1514
local CCarHandlingData = require("includes.classes.gta.CCarHandlingData")
1615
local CFlyingHandlingData = require("includes.classes.gta.CFlyingHandlingData")
1716
local CStructView = require("includes.classes.gta.CStructView")
1817

1918
local SubHandlingCtorMap <const> = {
20-
[Enums.eHandlingType.CAR] = function(ptr) return CCarHandlingData.new(ptr) end,
21-
[Enums.eHandlingType.BIKE] = function(ptr) return CBikeHandlingData.new(ptr) end,
22-
[Enums.eHandlingType.FLYING] = function(ptr) return CFlyingHandlingData.new(ptr) end,
19+
[Enums.eVehicleType.VEHICLE_TYPE_CAR] = function(ptr) return CCarHandlingData.new(ptr) end,
20+
[Enums.eVehicleType.VEHICLE_TYPE_BIKE] = function(ptr) return CBikeHandlingData.new(ptr) end,
21+
[Enums.eVehicleType.VEHICLE_TYPE_PLANE] = function(ptr) return CFlyingHandlingData.new(ptr) end,
2322
}
2423

2524

@@ -48,13 +47,15 @@ local SubHandlingCtorMap <const> = {
4847
---@field m_model_flags pointer<eVehicleModelFlags>
4948
---@field m_handling_flags pointer<eVehicleHandlingFlags>
5049
---@field m_damage_flags pointer<uint32_t>
51-
---@overload fun(ptr: pointer): CHandlingData
50+
---@field protected m_subhandling_data_instance CCarHandlingData|CBikeHandlingData|CCarHandlingData|CFlyingHandlingData
51+
---@overload fun(ptr: pointer, vehicleType: eVehicleType): CHandlingData
5252
local CHandlingData = CStructView("CHandlingData", 0x0048)
5353

5454
---@param ptr pointer
55+
---@param vehicleType eVehicleType
5556
---@return CHandlingData
56-
function CHandlingData.new(ptr)
57-
return setmetatable({
57+
function CHandlingData.new(ptr, vehicleType)
58+
local instance = setmetatable({
5859
m_ptr = ptr,
5960
m_mass = ptr:add(0x000C),
6061
m_initial_drag_coeff = ptr:add(0x0010),
@@ -78,6 +79,13 @@ function CHandlingData.new(ptr)
7879
m_sub_handling_data = atArray(ptr:add(0x0158)),
7980
---@diagnostic disable-next-line: param-type-mismatch
8081
}, CHandlingData)
82+
83+
local subCtor = SubHandlingCtorMap[vehicleType]
84+
if (subCtor) then
85+
instance.m_subhandling_data_instance = subCtor(instance.m_sub_handling_data[1]:deref())
86+
end
87+
88+
return instance
8189
end
8290

8391
---@return float
@@ -94,6 +102,13 @@ function CHandlingData:GetDeformMultiplier()
94102
end)
95103
end
96104

105+
---@return uint32_t
106+
function CHandlingData:GetHandlingFlags()
107+
return self:__safecall(0, function()
108+
return self.m_handling_flags:get_dword()
109+
end)
110+
end
111+
97112
---@param flag eVehicleHandlingFlags
98113
---@return boolean
99114
function CHandlingData:GetHandlingFlag(flag)
@@ -102,6 +117,13 @@ function CHandlingData:GetHandlingFlag(flag)
102117
end)
103118
end
104119

120+
---@return uint32_t
121+
function CHandlingData:GetModelFlags()
122+
return self:__safecall(0, function()
123+
return self.m_model_flags:get_dword()
124+
end)
125+
end
126+
105127
---@param flag eVehicleModelFlags
106128
---@return boolean
107129
function CHandlingData:GetModelFlag(flag)
@@ -110,36 +132,9 @@ function CHandlingData:GetModelFlag(flag)
110132
end)
111133
end
112134

113-
-- ---@param handlingType eHandlingType
114-
-- ---@return (CCarHandlingData|CBikeHandlingData|CFlyingHandlingData|)?
115-
-- function CHandlingData:GetSubHandlingData(handlingType)
116-
-- return self:__safecall(nil, function()
117-
-- local array = self.m_sub_handling_data
118-
-- for i = 1, array:Size() do
119-
-- local sub_ptr = array:At(i)
120-
-- if (sub_ptr:is_null()) then
121-
-- goto continue
122-
-- end
123-
124-
-- local base = CBaseSubHandlingData(sub_ptr)
125-
-- if (not base or base:GetHandlingType() ~= handlingType) then
126-
-- goto continue
127-
-- end
128-
129-
-- local ctor = SubHandlingCtorMap[handlingType]
130-
-- if (ctor) then return ctor(sub_ptr) end
131-
132-
-- ::continue::
133-
-- end
134-
-- return nil
135-
-- end)
136-
-- end
137-
138-
---@return pointer<(CCarHandlingData|CBikeHandlingData|CFlyingHandlingData|)?>
135+
---@return (CCarHandlingData|CBikeHandlingData|CFlyingHandlingData|)?
139136
function CHandlingData:GetSubHandlingData()
140-
return self:__safecall(nil, function()
141-
return self.m_sub_handling_data:At(1)
142-
end)
137+
return self.m_subhandling_data_instance
143138
end
144139

145140
---@param value float
@@ -160,6 +155,16 @@ function CHandlingData:SetDeformMultiplier(value)
160155
end)
161156
end
162157

158+
---@param flags uint32_t
159+
---@return boolean
160+
function CHandlingData:SetHandlingFlags(flags)
161+
return self:__safecall(false, function()
162+
if (self.m_handling_flags:is_null()) then return false end
163+
self.m_handling_flags:set_dword(flags)
164+
return true
165+
end)
166+
end
167+
163168
---@param flag eVehicleHandlingFlags
164169
---@param toggle boolean
165170
---@return boolean
@@ -176,4 +181,30 @@ function CHandlingData:SetHandlingFlag(flag, toggle)
176181
end)
177182
end
178183

184+
---@param flags uint32_t
185+
---@return boolean
186+
function CHandlingData:SetModelFlags(flags)
187+
return self:__safecall(false, function()
188+
if (self.m_model_flags:is_null()) then return false end
189+
self.m_model_flags:set_dword(flags)
190+
return true
191+
end)
192+
end
193+
194+
---@param flag eVehicleModelFlags
195+
---@param toggle boolean
196+
---@return boolean
197+
function CHandlingData:SetModelFlag(flag, toggle)
198+
if (type(flag) ~= "number" or type(toggle) ~= "boolean") then
199+
return false
200+
end
201+
202+
return self:__safecall(false, function()
203+
if (self.m_model_flags:is_null()) then return false end
204+
local dword_flags = self.m_model_flags:get_dword()
205+
self.m_model_flags:set_dword(Bit.Toggle(dword_flags, flag, toggle))
206+
return true
207+
end)
208+
end
209+
179210
return CHandlingData

SSV2/includes/classes/gta/CStructView.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ local function CStructView(name, size)
3434
cls.__index = cls
3535

3636
setmetatable(cls, {
37-
__call = function(t, ptr)
38-
return t.new(ptr)
37+
__call = function(t, ...)
38+
return t.new(...)
3939
end
4040
})
4141

SSV2/includes/classes/gta/CVehicle.lua

Lines changed: 80 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ function CVehicle:init(vehicle)
8080
instance.m_current_gear = ptr:add(0x0882)
8181
instance.m_top_gear = ptr:add(0x0886)
8282
instance.m_engine_health = ptr:add(0x0910)
83-
instance.m_handling_data = CHandlingData(ptr:add(0x0960):deref())
83+
instance.m_handling_data = CHandlingData(ptr:add(0x0960):deref(), instance.m_model_info:GetVehicleType())
8484
instance.m_deform_god = ptr:add(0x096C)
8585
instance.m_steering_input = ptr:add(0x09D4)
8686
instance.m_current_steering = ptr:add(0x09DC)
@@ -125,9 +125,11 @@ end
125125

126126
---@return pointer<(CCarHandlingData|CBikeHandlingData|CFlyingHandlingData)?>
127127
function CVehicle:GetSubHandlingData()
128-
return self:__safecall(nil, function()
129-
return self.m_handling_data:GetSubHandlingData()
130-
end)
128+
return self.m_handling_data:GetSubHandlingData()
129+
end
130+
131+
function CVehicle:GetHandlingFlags()
132+
return self.m_handling_data:GetHandlingFlags()
131133
end
132134

133135
---@param flag eVehicleHandlingFlags
@@ -138,46 +140,57 @@ function CVehicle:GetHandlingFlag(flag)
138140
end)
139141
end
140142

143+
---@return uint32_t
144+
function CVehicle:GetModelFlags()
145+
return self.m_handling_data:GetModelFlags()
146+
end
147+
141148
---@param flag eVehicleModelFlags
142149
---@return boolean
143150
function CVehicle:GetModelFlag(flag)
144-
return self:__safecall(false, function()
145-
return self.m_handling_data:GetModelFlag(flag)
146-
end)
151+
return self.m_handling_data:GetModelFlag(flag)
152+
end
153+
154+
---@return { [1]: uint32_t, [2]: uint32_t, [3]: uint32_t, [4]: uint32_t, [5]: uint32_t, [6]: uint32_t, [7]: uint32_t }
155+
function CVehicle:GetModelInfoFlags()
156+
return self.m_model_info:GetModelInfoFlags()
147157
end
148158

149159
---@param flag eVehicleModelInfoFlags
150160
---@return boolean
151161
function CVehicle:GetModelInfoFlag(flag)
152-
return self:__safecall(false, function()
153-
return self.m_model_info:GetModelInfoFlag(flag)
154-
end)
162+
return self.m_model_info:GetModelInfoFlag(flag)
155163
end
156164

157-
---@param flag eVehicleAdvancedFlags
158-
---@return boolean
159-
function CVehicle:GetAdvancedFlag(flag)
160-
if (not self:IsValid()) then
161-
return false
162-
end
165+
---@return uint32_t
166+
function CVehicle:GetAdvancedFlags()
167+
if (not self:IsValid()) then return 0 end
163168

164169
if (self:GetVehicleType() ~= Enums.eVehicleType.VEHICLE_TYPE_CAR) then
165-
return false
166-
end
167-
168-
local ptr = self:GetSubHandlingData()
169-
if (not ptr or ptr:is_null()) then
170-
return false
170+
return 0
171171
end
172172

173173
---@type CCarHandlingData?
174-
local cchd = CCarHandlingData(ptr)
174+
local cchd = self:GetSubHandlingData()
175175
if (not cchd or not cchd:IsValid()) then
176-
return false
176+
return 0
177177
end
178178

179-
local dword_flags = cchd.m_advanced_flags:get_dword()
180-
return Bit.IsBitSet(dword_flags, flag)
179+
return cchd.m_advanced_flags:get_dword()
180+
end
181+
182+
---@param flag eVehicleAdvancedFlags
183+
---@return boolean
184+
function CVehicle:GetAdvancedFlag(flag)
185+
return Bit.IsBitSet(self:GetAdvancedFlags(), flag)
186+
end
187+
188+
---@param flags uint32_t
189+
---@return boolean
190+
function CVehicle:SetHandlingFlags(flags)
191+
return self:__safecall(false, function()
192+
return self.m_handling_data:SetHandlingFlags(flags)
193+
end)
181194
end
182195

183196
---@param flag eVehicleHandlingFlags
@@ -189,19 +202,33 @@ function CVehicle:SetHandlingFlag(flag, toggle)
189202
end
190203

191204
---@param value float
192-
---@return boolean
205+
---@return boolean success
193206
function CVehicle:SetAcceleration(value)
194-
return self:__safecall(false, function()
195-
return self.m_handling_data:SetAcceleration(value)
196-
end)
207+
return self.m_handling_data:SetAcceleration(value)
197208
end
198209

199210
---@param value float
200-
---@return boolean
211+
---@return boolean success
201212
function CVehicle:SetDeformMultiplier(value)
202-
return self:__safecall(false, function()
203-
return self.m_handling_data:SetDeformMultiplier(value)
204-
end)
213+
return self.m_handling_data:SetDeformMultiplier(value)
214+
end
215+
216+
---@param flags uint32_t
217+
---@return boolean success
218+
function CVehicle:SetModelFlags(flags)
219+
return self.m_handling_data:SetModelFlags(flags)
220+
end
221+
222+
---@param flag eVehicleModelInfoFlags
223+
---@param toggle boolean
224+
---@return boolean success
225+
function CVehicle:SetModelFlag(flag, toggle)
226+
return self.m_handling_data:SetModelFlag(flag, toggle)
227+
end
228+
229+
---@param flags uint32_t
230+
function CVehicle:SetModelInfoFlags(flags)
231+
self.m_model_info:SetModelInfoFlags(flags)
205232
end
206233

207234
---@param flag eVehicleModelInfoFlags
@@ -210,9 +237,8 @@ function CVehicle:SetModelInfoFlag(flag, toggle)
210237
self.m_model_info:SetModelInfoFlag(flag, toggle)
211238
end
212239

213-
---@param flag eVehicleAdvancedFlags
214-
---@param toggle boolean
215-
function CVehicle:SetAdvancedFlag(flag, toggle)
240+
---@param flags uint32_t
241+
function CVehicle:SetAdvancedFlags(flags)
216242
if (not self:IsValid()) then
217243
return
218244
end
@@ -221,19 +247,31 @@ function CVehicle:SetAdvancedFlag(flag, toggle)
221247
return
222248
end
223249

224-
local ptr = self:GetSubHandlingData()
225-
if (not ptr or ptr:is_null()) then
250+
---@type CCarHandlingData?
251+
local cchd = self:GetSubHandlingData()
252+
if (not cchd or not cchd:IsValid()) then
253+
return false
254+
end
255+
256+
cchd.m_advanced_flags:set_dword(flags)
257+
end
258+
259+
---@param flag eVehicleAdvancedFlags
260+
---@param toggle boolean
261+
function CVehicle:SetAdvancedFlag(flag, toggle)
262+
if (not self:IsValid()) then return end
263+
264+
if (self:GetVehicleType() ~= Enums.eVehicleType.VEHICLE_TYPE_CAR) then
226265
return
227266
end
228267

229268
---@type CCarHandlingData?
230-
local cchd = CCarHandlingData(ptr)
269+
local cchd = self:GetSubHandlingData()
231270
if (not cchd or not cchd:IsValid()) then
232271
return
233272
end
234273

235-
local dword_flags = cchd.m_advanced_flags:get_dword()
236-
local new_bits = Bit.Toggle(dword_flags, flag, toggle)
274+
local new_bits = Bit.Toggle(self:GetAdvancedFlags(), flag, toggle)
237275
cchd.m_advanced_flags:set_dword(new_bits)
238276
end
239277

0 commit comments

Comments
 (0)