Scripts/resources/[qb]/[qb_extras]/qb-wheel/client/client.lua

480 lines
21 KiB
Lua
Raw Normal View History

2024-12-29 20:07:10 +00:00
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)