Skip to content

Commit 4e53d08

Browse files
authored
Merge pull request #19 from peSuperSam/main
fix(vehicle): refatoração da lógica de quebra de rodas para dano por …
2 parents 061fe48 + 4ed5628 commit 4e53d08

2 files changed

Lines changed: 119 additions & 56 deletions

File tree

config.lua

Lines changed: 50 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cfg = {}
33
-----------------------------------------------------------------------------------------
44
---- UTILITIES-MODULES
55
-----------------------------------------------------------------------------------------
6-
cfg.printidentifiers = true -- true para mostrar os identificadores no console
6+
cfg.printidentifiers = true -- true para mostrar os identificadores no console
77

88
cfg.vipmenu = {
99
Enable = true,
@@ -19,14 +19,14 @@ cfg.vipmenu = {
1919
tier1 = {
2020
label = "Tier 1",
2121
payment = 5000,
22-
inventory = 200 , -- 200 KG
22+
inventory = 200, -- 200 KG
2323
}
2424
}
2525
}
2626

27-
cfg.indestructibleProps = true -- true para ativar as props indestrutíveis
27+
cfg.indestructibleProps = true -- true para ativar as props indestrutíveis
2828

29-
cfg.dropitems = true -- true para ativar o drop de items como props
29+
cfg.dropitems = true -- true para ativar o drop de items como props
3030
cfg.dropitems_table = {
3131
money = 'prop_cash_pile_02',
3232
burger = 'prop_cs_burger_01',
@@ -40,122 +40,127 @@ cfg.dropitems_table = {
4040
}
4141

4242
cfg.SqlBackup = {
43-
Active = false, -- Ativa o backup
44-
Debug = false, -- Mostra informações sobre debug
45-
BackupCommand = 'backupdb', -- Nome do comando para execução manual
46-
BackupOnStart = false, -- Backup ao iniciar mri_Qbox(esse resource)
43+
Active = false, -- Ativa o backup
44+
Debug = false, -- Mostra informações sobre debug
45+
BackupCommand = 'backupdb', -- Nome do comando para execução manual
46+
BackupOnStart = false, -- Backup ao iniciar mri_Qbox(esse resource)
4747
-- ExecuteOnTime = { -- Executar backup automaticamente no horário
4848
-- hour = 3,
4949
-- min = 40
5050
-- }
5151
}
5252

5353
cfg.AutoUpdater = {
54-
Debug = true, -- Mostra informações sobre debug
55-
WebHook = nil, -- Enviar os avisos de atualizações para um WebHook(discord,...)
56-
KeepOnConsole = false -- Manter os avisos no console mesmo ao enviar para um WebHook
54+
Debug = true, -- Mostra informações sobre debug
55+
WebHook = nil, -- Enviar os avisos de atualizações para um WebHook(discord,...)
56+
KeepOnConsole = false -- Manter os avisos no console mesmo ao enviar para um WebHook
5757
}
5858
-----------------------------------------------------------------------------------------
5959
---- TARGET-MODULES
6060
-----------------------------------------------------------------------------------------
6161

6262
cfg.entervehicle = {
63-
toggle = true, -- true para ativar entrar na porta que você estiver olhando pelo target
63+
toggle = true, -- true para ativar entrar na porta que você estiver olhando pelo target
6464
}
6565

6666
cfg.dumpsters = {
67-
toggle = true, -- true para ativar as lixeiras para abrir no olhinho
68-
HideProps = { -- props para esconder-se
69-
Model = {218085040, 666561306, -58485588, -206690185, 1511880420, 682791951 }, -- modelo da lixeira
67+
toggle = true, -- true para ativar as lixeiras para abrir no olhinho
68+
HideProps = { -- props para esconder-se
69+
Model = { 218085040, 666561306, -58485588, -206690185, 1511880420, 682791951 }, -- modelo da lixeira
7070
},
71-
TrashProps = { -- props para vasculhar
72-
Model = {218085040, 666561306, -58485588, -206690185, 1511880420, 682791951, -1426008804}, -- modelo da lixeira
71+
TrashProps = { -- props para vasculhar
72+
Model = { 218085040, 666561306, -58485588, -206690185, 1511880420, 682791951, -1426008804 }, -- modelo da lixeira
7373
}
7474
}
7575

7676
-----------------------------------------------------------------------------------------
7777
---- COMBAT-MODULES
7878
-----------------------------------------------------------------------------------------
7979
cfg.disablefreepunch = {
80-
toggle = false, -- true para desativar o soco se não estiver mirando com o botão direito (corrige bug da galera iniciante se bater sem querer usando o olhinho em tarefas aleatórias)
80+
toggle = false, -- true para desativar o soco se não estiver mirando com o botão direito (corrige bug da galera iniciante se bater sem querer usando o olhinho em tarefas aleatórias)
8181
}
8282

8383
cfg.forcedfirstperson = {
84-
twopov = false, -- true para forçar apenas 2 tipos de VISÕES (PRIMEIRA PESSOA E TERCEIRA PESSOA) - ao invés daquelas 4 opções de câmera padrão
84+
twopov = false, -- true para forçar apenas 2 tipos de VISÕES (PRIMEIRA PESSOA E TERCEIRA PESSOA) - ao invés daquelas 4 opções de câmera padrão
8585
invehicle = {
86-
ativar = false, -- true se quiser ativar forçar primeira pessoa no carro
87-
hold = false, -- true se quiser que só fique em primeira pessoa se estiver segurando a arma
86+
ativar = false, -- true se quiser ativar forçar primeira pessoa no carro
87+
hold = false, -- true se quiser que só fique em primeira pessoa se estiver segurando a arma
8888
}
8989
}
9090

9191
cfg.disablecombatroll = {
92-
toggle = false, -- true para desativar o rolamento e não ser uma cidade Pvpas
92+
toggle = false, -- true para desativar o rolamento e não ser uma cidade Pvpas
9393
}
9494

9595
cfg.damageragdoll = {
96-
toggle = false, -- true para ativar cair/tropeçar ao tomar tiro na perna
96+
toggle = false, -- true para ativar cair/tropeçar ao tomar tiro na perna
9797
}
9898

9999
cfg.disableblindfiring = {
100-
toggle = false, -- true para desativar o tiro cego quando estiver pegando cover em paredes
100+
toggle = false, -- true para desativar o tiro cego quando estiver pegando cover em paredes
101101
}
102102

103103
cfg.realisticrecoil = {
104-
hideCrosshair = false, -- Hide builtin GTA crosshair while aiming?
105-
drunkAiming = false, -- Enable "drunk" aiming?
106-
verticalRecoil = false, -- Enable realistic vertical recoil while shooting?
107-
disableAimPunching = false, -- Disables punching with [R] and other keys while aiming
108-
disableHeadshots = false, -- Disables one-shots to head
109-
drunkAimingPower = 0.20, -- Higher number = Higher screen shake
110-
whitelistedWeapons = { -- Table of weapons with no recoil
104+
hideCrosshair = false, -- Hide builtin GTA crosshair while aiming?
105+
drunkAiming = false, -- Enable "drunk" aiming?
106+
verticalRecoil = false, -- Enable realistic vertical recoil while shooting?
107+
disableAimPunching = false, -- Disables punching with [R] and other keys while aiming
108+
disableHeadshots = false, -- Disables one-shots to head
109+
drunkAimingPower = 0.20, -- Higher number = Higher screen shake
110+
whitelistedWeapons = { -- Table of weapons with no recoil
111111
["WEAPON_SNIPERRIFLE"] = true,
112112
["WEAPON_HEAVYSNIPER"] = true,
113113
["WEAPON_HEAVYSNIPER_MK2"] = true,
114114
["WEAPON_MARKSMANRIFLE"] = true,
115115
["WEAPON_MARKSMANRIFLE_MK2"] = true,
116-
-- Add more weapons if needed
116+
-- Add more weapons if needed
117117
},
118-
recoilMultipliers = { -- [ONLY FOR VERTICAL RECOIL] Edit the power of the recoil for each weapon type
119-
-- 0.0 = none (default)
118+
recoilMultipliers = { -- [ONLY FOR VERTICAL RECOIL] Edit the power of the recoil for each weapon type
119+
-- 0.0 = none (default)
120120
["PISTOL"] = 0.3,
121121
["SMG"] = 0.8,
122122
["RIFLE"] = 1.3,
123123
["LMG"] = 1.6,
124124
["SHOTGUN"] = 2.3,
125125
["SNIPER"] = 5.5,
126-
["VEHICLE"] = 0.8 -- Recoil while in vehicle
126+
["VEHICLE"] = 0.8 -- Recoil while in vehicle
127127
},
128128
}
129129

130130
-----------------------------------------------------------------------------------------
131131
---- VEHICLES-MODULES
132132
-----------------------------------------------------------------------------------------
133133
cfg.wheelbreak = {
134-
toggle = false, -- true para ativar as rodas quebrarem/soltarem ao bater o veículo
135-
speed = 150, -- velocidade em km/h que a roda vai quebrar/soltar (100 = hardcore)
134+
toggle = false, -- true para ativar o sistema de quebra/soltura de roda em colisão
135+
mode = "impact", -- "impact" = usa força do impacto (perda brusca de lataria) | "speed" = usa velocidade mínima de colisão
136+
impactDamage = 80.0, -- (somente mode "impact") dano mínimo de lataria perdido de uma vez para quebrar roda (quanto menor, mais sensível)
137+
minImpactSpeed = 20.0, -- (somente mode "impact") velocidade mínima em km/h para validar impacto quando o native de colisão falhar
138+
impactDeltaSpeed = 35.0, -- (somente mode "impact") perda mínima de velocidade (km/h) em um instante para considerar colisão forte
139+
cooldown = 5000, -- tempo em ms entre uma quebra e outra no mesmo veículo (evita spam em batidas seguidas)
140+
speed = 85, -- (somente mode "speed") velocidade mínima em km/h para quebrar roda ao colidir
136141
}
137142

138143
cfg.savewheelpos = {
139-
toggle = false, -- true para ativar a roda ficar parada em um ângulo específico ao sair do veículo
144+
toggle = false, -- true para ativar a roda ficar parada em um ângulo específico ao sair do veículo
140145
}
141146

142147
cfg.disableaircontrol = {
143-
toggle = false, -- true para ativar a roda ficar parada em um ângulo específico ao sair do veículo
148+
toggle = false, -- true para ativar a roda ficar parada em um ângulo específico ao sair do veículo
144149
}
145150

146151
cfg.carexplosion = {
147-
toggle = false, -- true para ativar a Explosão de veículos ao cair de uma certa altura
148-
height = 40, -- qual altura você quer para ativar a explosão
152+
toggle = false, -- true para ativar a Explosão de veículos ao cair de uma certa altura
153+
height = 40, -- qual altura você quer para ativar a explosão
149154
}
150155

151156
cfg.drift = {
152-
toggle = true, -- ativar drift usando shift
153-
points = false, -- ativar drift points nui
154-
speed = 80, -- velocidade máxima que pode usar o drift
157+
toggle = true, -- ativar drift usando shift
158+
points = false, -- ativar drift points nui
159+
speed = 80, -- velocidade máxima que pode usar o drift
155160
}
156161

157162
cfg.mercosulplates = {
158-
toggle = false, -- (deprecated, use a versão do gordela: mri_Qcarplates) true para ativar placas do mercosul nos veículos
163+
toggle = false, -- (deprecated, use a versão do gordela: mri_Qcarplates) true para ativar placas do mercosul nos veículos
159164
}
160165

161166
return cfg

modules/mri/client-side/vehicles-modules/wheelbreak.lua

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
1-
local wheelBreakSpeed = cfg.wheelbreak.speed -- Speed at which the wheel breaks
1+
local wheelBreakSpeed = cfg.wheelbreak.speed
2+
local wheelBreakMode = cfg.wheelbreak.mode or "impact"
3+
local wheelBreakImpactDamage = cfg.wheelbreak.impactDamage or 120.0
4+
local wheelBreakCooldown = cfg.wheelbreak.cooldown or 5000
5+
local wheelBreakMinImpactSpeed = cfg.wheelbreak.minImpactSpeed or 20.0
6+
local wheelBreakImpactDeltaSpeed = cfg.wheelbreak.impactDeltaSpeed or 35.0
7+
local vehicleBodyHealthCache = {}
8+
local vehicleCooldownCache = {}
9+
local vehicleSpeedCache = {}
10+
local setVehicleWheelsCanBreakOff = SetVehicleWheelsCanBreakOff
211

312
--[[ Vehicle classes:
413
0: Compacts 1: Sedans 2: SUVs 3: Coupes 4: Muscle
@@ -14,27 +23,76 @@ local excludedClasses = {
1423
[16] = true
1524
}
1625

17-
---@param class string Vehicle class
26+
---@param class string Vehicle class
1827
---@return boolean
1928
local function isVehicleClassValid(class)
2029
return not excludedClasses[class]
2130
end
2231

32+
local function getRandomWheelIndex(vehicle)
33+
local numWheels = GetVehicleNumberOfWheels(vehicle)
34+
if numWheels == 2 then
35+
return (math.random(2) - 1) * 4
36+
end
37+
if numWheels == 4 then
38+
local index = math.random(4) - 1
39+
if index > 1 then
40+
index = index + 2
41+
end
42+
return index
43+
end
44+
if numWheels == 6 then
45+
return math.random(6) - 1
46+
end
47+
return 0
48+
end
49+
2350
CreateThread(function()
24-
while cfg.wheelbreak.toogle do
51+
while cfg.wheelbreak and cfg.wheelbreak.toggle do
2552
local waitLoop = 5000
2653
local playerPed = PlayerPedId()
2754
if IsPedInAnyVehicle(playerPed, false) then
28-
local vehicle = GetVehiclePedIsIn(playerPed,false)
29-
if GetPedInVehicleSeat(vehicle, -1) ~= 0 and isVehicleClassValid(GetVehicleClass(vehicle)) then
30-
waitLoop = 10
31-
local vehicleSpeed = math.ceil(GetEntitySpeed(vehicle) * 3.6)
32-
if HasEntityCollidedWithAnything(vehicle) and vehicleSpeed >= wheelBreakSpeed then
33-
local randomWheelIndex = math.random(0,3) -- Wheel index to break off
34-
---@see https://github.com/citizenfx/fivem/commit/46205c9ff15bdc9e19d81dd126500a854c8547e9
55+
local vehicle = GetVehiclePedIsIn(playerPed, false)
56+
if GetPedInVehicleSeat(vehicle, -1) == playerPed and isVehicleClassValid(GetVehicleClass(vehicle)) then
57+
waitLoop = 100
58+
local gameTimer = GetGameTimer()
59+
local canBreakWheel = (vehicleCooldownCache[vehicle] or 0) <= gameTimer
60+
local hasCollision = HasEntityCollidedWithAnything(vehicle)
61+
local shouldBreakWheel = false
62+
local currentSpeed = GetEntitySpeed(vehicle) * 3.6
63+
local previousSpeed = vehicleSpeedCache[vehicle] or currentSpeed
64+
vehicleSpeedCache[vehicle] = currentSpeed
65+
66+
if wheelBreakMode == "impact" then
67+
local currentBodyHealth = GetVehicleBodyHealth(vehicle)
68+
local previousBodyHealth = vehicleBodyHealthCache[vehicle] or currentBodyHealth
69+
local bodyHealthLoss = previousBodyHealth - currentBodyHealth
70+
local speedLoss = math.max(0.0, previousSpeed - currentSpeed)
71+
vehicleBodyHealthCache[vehicle] = currentBodyHealth
72+
local hasStrongImpact = bodyHealthLoss >= wheelBreakImpactDamage or speedLoss >= wheelBreakImpactDeltaSpeed
73+
if canBreakWheel and hasStrongImpact and (hasCollision or previousSpeed >= wheelBreakMinImpactSpeed) then
74+
shouldBreakWheel = true
75+
end
76+
else
77+
local vehicleSpeed = math.ceil(currentSpeed)
78+
if hasCollision and canBreakWheel and vehicleSpeed >= wheelBreakSpeed then
79+
shouldBreakWheel = true
80+
end
81+
end
82+
83+
if shouldBreakWheel then
84+
local randomWheelIndex = getRandomWheelIndex(vehicle)
85+
if setVehicleWheelsCanBreakOff then
86+
setVehicleWheelsCanBreakOff(vehicle, true)
87+
end
3588
BreakOffVehicleWheel(vehicle, randomWheelIndex, true, false, true, false)
36-
waitLoop = 5000
89+
SetVehicleTyreBurst(vehicle, randomWheelIndex, false, 1000.0)
90+
vehicleCooldownCache[vehicle] = gameTimer + wheelBreakCooldown
91+
waitLoop = wheelBreakCooldown
3792
end
93+
else
94+
vehicleBodyHealthCache[vehicle] = GetVehicleBodyHealth(vehicle)
95+
vehicleSpeedCache[vehicle] = GetEntitySpeed(vehicle) * 3.6
3896
end
3997
end
4098
Wait(waitLoop)

0 commit comments

Comments
 (0)