480 lines
21 KiB
Lua
480 lines
21 KiB
Lua
Config.InitFrameWork()
|
|
|
|
local WheelAlreadyBroken = {}
|
|
local objroue = {}
|
|
table.insert(WheelAlreadyBroken, {index = 'none', vehicule = 'none'})
|
|
|
|
local RouePos = {
|
|
[0] = {bone = 'wheel_lf', props = 'prop_wheel_01'},
|
|
[1] = {bone = 'wheel_rf', props = 'prop_wheel_01'},
|
|
[2] = {bone = 'wheel_lr', props = 'prop_wheel_01'},
|
|
[3] = {bone = 'wheel_rr', props = 'prop_wheel_01'},
|
|
}
|
|
|
|
startcheck = true
|
|
local havefind = false
|
|
local havefind2 = false
|
|
local havefind3 = false
|
|
local havefind4 = false
|
|
Citizen.CreateThread(function()
|
|
while startcheck do
|
|
local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false)
|
|
local wait = 1000
|
|
if vehicle ~= 0 and GetPedInVehicleSeat(GetVehiclePedIsIn(PlayerPedId()), -1) == PlayerPedId() then
|
|
local classveh = GetVehicleClass(vehicle)
|
|
local classwheel = GetVehicleWheelType(vehicle)
|
|
if classveh == 14 or classveh == 15 or classveh == 16 or classveh == 8 or classwheel == 4 then
|
|
else
|
|
wait = 0
|
|
local roue = GetVehicleNumberOfWheels(vehicle) - 1
|
|
for i = 0, roue, 1 do
|
|
if tonumber(GetVehicleWheelSuspensionCompression(vehicle, i)) == 0.00 and not injump and GetVehicleWheelXOffset(vehicle, i) ~= '-nan' then
|
|
injump = true
|
|
Citizen.SetTimeout(Config.TimeToDetachWheel, function()
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i then
|
|
havefind = true
|
|
end
|
|
end
|
|
if not havefind then
|
|
ChechIfDetach(vehicle, i)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 1 then
|
|
havefind2 = true
|
|
end
|
|
end
|
|
if not havefind2 then
|
|
ChechIfDetach(vehicle, i + 1)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 2 then
|
|
havefind3 = true
|
|
end
|
|
end
|
|
if not havefind3 then
|
|
ChechIfDetach(vehicle, i + 2)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 3 then
|
|
havefind4 = true
|
|
end
|
|
end
|
|
if not havefind4 then
|
|
ChechIfDetach(vehicle, i + 3)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Citizen.Wait(wait)
|
|
end
|
|
end)
|
|
local inchek = false
|
|
Citizen.CreateThread(function()
|
|
lastkm = nil
|
|
oldcompteurlaunch = false
|
|
local wait = 1000
|
|
while startcheck do
|
|
local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false)
|
|
if vehicle ~= 0 and GetPedInVehicleSeat(GetVehiclePedIsIn(PlayerPedId()), -1) == PlayerPedId() then
|
|
local classveh = GetVehicleClass(vehicle)
|
|
if classveh == 14 or classveh == 15 or classveh == 16 or classveh == 8 then
|
|
else
|
|
wait = 0
|
|
if not oldcompteurlaunch then
|
|
oldcompteurlaunch = true
|
|
Citizen.SetTimeout(1000, function()
|
|
lastkm = math.ceil(GetEntitySpeed(vehicle) * 3.6)
|
|
oldcompteurlaunch = false
|
|
end)
|
|
end
|
|
if lastkm then
|
|
if HasEntityCollidedWithAnything(vehicle) and lastkm >= Config.KmMax then
|
|
if not inchek and GetVehicleWheelXOffset(vehicle, i) ~= '-nan' then
|
|
inchek = true
|
|
local roue = GetVehicleNumberOfWheels(vehicle) - 1
|
|
for i = 0, roue, 1 do
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i then
|
|
havefind = true
|
|
end
|
|
end
|
|
if not havefind then
|
|
ChechIfDetachGround(vehicle, i)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 1 then
|
|
havefind2 = true
|
|
end
|
|
end
|
|
if not havefind2 then
|
|
ChechIfDetachGround(vehicle, i + 1)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 2 then
|
|
havefind3 = true
|
|
end
|
|
end
|
|
if not havefind3 then
|
|
ChechIfDetachGround(vehicle, i + 2)
|
|
else
|
|
if i < 3 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i + 3 then
|
|
havefind4 = true
|
|
end
|
|
end
|
|
if not havefind4 then
|
|
ChechIfDetachGround(vehicle, i + 3)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Citizen.Wait(wait)
|
|
end
|
|
end)
|
|
|
|
local wheelpickup = false
|
|
|
|
if Config.CommandFix then
|
|
RegisterCommand("startfix", function()
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
local playercoords = GetEntityCoords(GetPlayerPed(-1))
|
|
local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false)
|
|
if vehicle ~= 0 then
|
|
if vehicle == v.vehicule then
|
|
wheelpickup = true
|
|
SetCurrentPedWeapon(GetPlayerPed(-1), 0xA2719263)
|
|
AttachEntityToEntity(v.obj, GetPlayerPed(-1), GetPedBoneIndex(GetPlayerPed(-1), 28422), 0.0, 0.0, 0.0, 135.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1)
|
|
Config.SendNotification(Config.Lang["StartFixWheel"])
|
|
Citizen.Wait(5000)
|
|
startdistancevehiclevar = true
|
|
Startdistancevehicle(v.vehicule, v.obj, v.index)
|
|
end
|
|
else
|
|
Config.SendNotification(Config.Lang["EnterInVehicleToFix"])
|
|
end
|
|
end
|
|
end, false)
|
|
end
|
|
|
|
if Config.TriggerFix then
|
|
RegisterNetEvent('qb-wheel:fixvehicle')
|
|
AddEventHandler('qb-wheel:fixvehicle', function()
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
local playercoords = GetEntityCoords(GetPlayerPed(-1))
|
|
local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false)
|
|
if vehicle ~= 0 then
|
|
if vehicle == v.vehicule then
|
|
wheelpickup = true
|
|
SetCurrentPedWeapon(GetPlayerPed(-1), 0xA2719263)
|
|
AttachEntityToEntity(v.obj, GetPlayerPed(-1), GetPedBoneIndex(GetPlayerPed(-1), 28422), 0.0, 0.0, 0.0, 135.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1)
|
|
Config.SendNotification(Config.Lang["StartFixWheel"])
|
|
Citizen.Wait(5000)
|
|
startdistancevehiclevar = true
|
|
Startdistancevehicle(v.vehicule, v.obj, v.index)
|
|
end
|
|
else
|
|
Config.SendNotification(Config.Lang["EnterInVehicleToFix"])
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
local wait = 1000
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
local playercoords = GetEntityCoords(GetPlayerPed(-1))
|
|
local coordsroue = GetEntityCoords(v.obj)
|
|
if GetDistanceBetweenCoords(playercoords, coordsroue, true) < 2 then
|
|
wait = 0
|
|
if not wheelpickup then
|
|
DrawText3Ds(coordsroue.x, coordsroue.y, coordsroue.z + 0.50, Config.Lang["PressToPickWheel"])
|
|
end
|
|
if IsControlJustReleased(0, 38) and not wheelpickup then
|
|
exports['ps-ui']:Circle(function(success)
|
|
if success then
|
|
print("success")
|
|
wheelpickup = true
|
|
SetCurrentPedWeapon(GetPlayerPed(-1), 0xA2719263)
|
|
AttachEntityToEntity(v.obj, GetPlayerPed(-1), GetPedBoneIndex(GetPlayerPed(-1), 28422), 0.0, 0.0, 0.0, 135.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1)
|
|
startdistancevehiclevar = true
|
|
Startdistancevehicle(v.vehicule, v.obj, v.index)
|
|
else
|
|
print("fail")
|
|
wheelpickup = false
|
|
end
|
|
end, 2, 10) -- NumberOfCircles, MS
|
|
end
|
|
end
|
|
end
|
|
Citizen.Wait(wait)
|
|
end
|
|
end)
|
|
|
|
local sendtoserver = false
|
|
function Startdistancevehicle(vehicule, obj, index)
|
|
local wait = 1000
|
|
local draw3dtext = false
|
|
Citizen.CreateThread(function()
|
|
while startdistancevehiclevar do
|
|
local vehiclecoords = GetEntityCoords(vehicule)
|
|
local playercoords = GetEntityCoords(GetPlayerPed(-1))
|
|
local vehicleheading = GetEntityHeading(vehicule)
|
|
if GetDistanceBetweenCoords(playercoords, vehiclecoords, true) < 3 then
|
|
wait = 0
|
|
if not draw3dtext then
|
|
DrawText3Ds(vehiclecoords.x, vehiclecoords.y, vehiclecoords.z, Config.Lang["PressToFixWheel"])
|
|
end
|
|
if IsControlJustReleased(0, 38) then
|
|
exports['ps-ui']:Circle(function(success)
|
|
if success then
|
|
local findplayerin = false
|
|
for l = 0, 5, 1 do
|
|
if GetPedInVehicleSeat(vehicule, l - 1) ~= 0 then
|
|
findplayerin = true
|
|
end
|
|
end
|
|
if not findplayerin then
|
|
draw3dtext = true
|
|
Citizen.SetTimeout(5000, function()
|
|
sendtoserver = false
|
|
end)
|
|
local phantomveh = CreateVehicle(GetHashKey("baller"), vehiclecoords, vehicleheading, false, false)
|
|
FreezeEntityPosition(phantomveh, true)
|
|
SetEntityCollision(phantomveh, false, false)
|
|
SetEntityVisible(phantomveh, false, false)
|
|
for k, v in pairs(RouePos) do
|
|
if k == index then
|
|
local roueposition = GetWorldPositionOfEntityBone(phantomveh, GetEntityBoneIndexByName(phantomveh, v.bone))
|
|
TaskStartScenarioInPlace(GetPlayerPed(-1), "CODE_HUMAN_MEDIC_KNEEL", 0, true)
|
|
Citizen.Wait(Config.TimeToAttachWheel)
|
|
ClearPedTasksImmediately(GetPlayerPed(-1))
|
|
if not sendtoserver then
|
|
sendtoserver = true
|
|
TriggerServerEvent('qb-wheel:updatewheel', VehToNet(vehicule), index, GetVehicleWheelXOffset(phantomveh, index), ObjToNet(obj))
|
|
end
|
|
DeleteEntity(phantomveh)
|
|
end
|
|
end
|
|
Citizen.SetTimeout(2500, function()
|
|
wheelpickup = false
|
|
if index == 0 then
|
|
if havefind then
|
|
havefind = false
|
|
end
|
|
elseif index == 1 then
|
|
if havefind2 then
|
|
havefind2 = false
|
|
end
|
|
elseif index == 2 then
|
|
if havefind3 then
|
|
havefind3 = false
|
|
end
|
|
elseif index == 3 then
|
|
if havefind4 then
|
|
havefind4 = false
|
|
end
|
|
end
|
|
end)
|
|
startdistancevehiclevar = false
|
|
else
|
|
Config.SendNotification(Config.Lang["PlayerInVeh"])
|
|
end
|
|
else
|
|
wheelpickup = false
|
|
end
|
|
end, 2, 10)
|
|
end
|
|
end
|
|
Citizen.Wait(wait)
|
|
end
|
|
end)
|
|
end
|
|
|
|
function DrawText3Ds(x,y,z, text)
|
|
local onScreen,_x,_y=World3dToScreen2d(x,y,z)
|
|
local px,py,pz=table.unpack(GetGameplayCamCoords())
|
|
|
|
SetTextScale(0.32, 0.32)
|
|
SetTextFont(4)
|
|
SetTextProportional(1)
|
|
SetTextColour(255, 255, 255, 255)
|
|
SetTextEntry("STRING")
|
|
SetTextCentre(1)
|
|
AddTextComponentString(text)
|
|
DrawText(_x,_y)
|
|
local factor = (string.len(text)) / 500
|
|
DrawRect(_x,_y+0.0125, 0.015+ factor, 0.03, 0, 0, 0, 80)
|
|
end
|
|
|
|
function ChechIfDetachGround(vehicle, i)
|
|
if not incooldowncheckground then
|
|
local findwheel = false
|
|
local havefind = false
|
|
local inground = false
|
|
incooldowncheckground = true
|
|
Citizen.SetTimeout(1000, function()
|
|
incooldowncheckground = false
|
|
inchek = false
|
|
end)
|
|
if GetVehicleWheelXOffset(vehicle, i) ~= '-nan' then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i then
|
|
havefind = true
|
|
end
|
|
if v.obj == objroue[i] then
|
|
havefind = true
|
|
end
|
|
end
|
|
if not havefind then
|
|
for k, v in pairs(RouePos) do
|
|
if k == i then
|
|
if objroue[i] == nil then
|
|
local roueposition = GetWorldPositionOfEntityBone(vehicle, GetEntityBoneIndexByName(vehicle, v.bone))
|
|
if not HasModelLoaded(v.props) then
|
|
RequestModel(v.props)
|
|
while not HasModelLoaded(v.props) do
|
|
Citizen.Wait(1)
|
|
end
|
|
end
|
|
objroue[i] = CreateObject(v.props, roueposition, false)
|
|
TriggerServerEvent('qb-wheel:setoffsetserver', VehToNet(vehicle), i, -math.random(1000, 1025), objroue[i])
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if i < 3 then
|
|
ChechIfDetachGround(vehicle, i + 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ChechIfDetach(vehicle, i)
|
|
if not incooldowncheck then
|
|
local havefind = false
|
|
local inground = false
|
|
local hauteur = 0
|
|
incooldowncheck = true
|
|
Citizen.SetTimeout(1000, function()
|
|
incooldowncheck = false
|
|
injump = false
|
|
if inchek then
|
|
inchek = false
|
|
end
|
|
end)
|
|
if tonumber(GetVehicleWheelSuspensionCompression(vehicle, i)) == 0.00 and GetVehicleWheelXOffset(vehicle, i) ~= '-nan' then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index == i then
|
|
havefind = true
|
|
end
|
|
if v.obj and v.obj ~= nil then
|
|
if v.obj == objroue[i] then
|
|
havefind = true
|
|
end
|
|
end
|
|
end
|
|
if not havefind then
|
|
while not inground do
|
|
for n = 0, 4, 1 do
|
|
hauteur = hauteur + tonumber(GetVehicleWheelSuspensionCompression(vehicle, i))
|
|
if hauteur > 0 then
|
|
inground = true
|
|
end
|
|
end
|
|
Citizen.Wait(0)
|
|
end
|
|
for k, v in pairs(RouePos) do
|
|
if k == i then
|
|
if objroue[i] == nil then
|
|
local roueposition = GetWorldPositionOfEntityBone(vehicle, GetEntityBoneIndexByName(vehicle, v.bone))
|
|
if not HasModelLoaded(v.props) then
|
|
RequestModel(v.props)
|
|
while not HasModelLoaded(v.props) do
|
|
Citizen.Wait(1)
|
|
end
|
|
end
|
|
objroue[i] = CreateObject(v.props, roueposition, false)
|
|
TriggerServerEvent('qb-wheel:setoffsetserver', VehToNet(vehicle), i, -math.random(1000, 1025), objroue[i])
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if i < 3 then
|
|
ChechIfDetach(vehicle, i + 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
RegisterNetEvent('qb-wheel:setoffset')
|
|
AddEventHandler('qb-wheel:setoffset', function(veh, index, offset, obj)
|
|
if index and veh and offset then
|
|
table.insert(WheelAlreadyBroken, {index = index, vehicule = NetToVeh(veh), obj = obj})
|
|
SetVehicleWheelXOffset(NetToVeh(veh), index, offset)
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qb-wheel:updatewheelclient')
|
|
AddEventHandler('qb-wheel:updatewheelclient', function(veh, index, offset, obj)
|
|
if index and veh and offset and obj then
|
|
SetVehicleWheelXOffset(NetToVeh(veh), index, offset)
|
|
for z, w in pairs(WheelAlreadyBroken) do
|
|
if w.obj == obj and w.index == index then
|
|
WheelAlreadyBroken[z] = nil
|
|
end
|
|
end
|
|
DeleteEntity(obj)
|
|
for k, v in pairs(objroue) do
|
|
if v == obj then
|
|
objroue[k] = nil
|
|
end
|
|
end
|
|
Citizen.Wait(5000)
|
|
end
|
|
end)
|
|
|
|
Citizen.CreateThread(function()
|
|
while true do
|
|
local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false)
|
|
if vehicle ~= 0 then
|
|
if #WheelAlreadyBroken > 0 then
|
|
for k, v in pairs(WheelAlreadyBroken) do
|
|
if v.index and v.index ~= nil and v.vehicule and v.vehicule ~= 'none' then
|
|
if v.vehicule == vehicle then
|
|
SetEntityCollision(v.vehicule, true, true)
|
|
SetVehicleWheelXOffset(v.vehicule, v.index, -math.random(1000, 1025))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Citizen.Wait(0)
|
|
end
|
|
end) |