diff --git a/client/main.lua b/client/main.lua index 066d6761..d8dedfc6 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,4 +1,5 @@ ESX = nil +local Vehicles = {} Citizen.CreateThread(function() while ESX == nil do @@ -11,8 +12,16 @@ local lsMenuIsShowed = false local isInLSMarker = false local myCar = {} +RegisterNetEvent('esx:playerLoaded') +AddEventHandler('esx:playerLoaded', function() + ESX.TriggerServerCallback('esx_lscustom:getVehiclesPrices', function(vehicles) + Vehicles = vehicles + end) +end) + RegisterNetEvent('esx_lscustom:installMod') AddEventHandler('esx_lscustom:installMod', function() + --Citizen.Trace('installMod') local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) myCar = ESX.Game.GetVehicleProperties(vehicle) TriggerServerEvent('esx_lscustom:refreshOwnedVehicle', myCar) @@ -20,6 +29,9 @@ end) RegisterNetEvent('esx_lscustom:cancelInstallMod') AddEventHandler('esx_lscustom:cancelInstallMod', function() + --Citizen.Trace('cancelInstallMod') + --Citizen.Trace('myCar: ' .. json.encode(myCar)) + local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) ESX.Game.SetVehicleProperties(vehicle, myCar) end) @@ -38,17 +50,34 @@ function OpenLSMenu(elems, menuname, menutitle, parent) if data.current.modType == "modFrontWheels" then isRimMod = true end + local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) local found = false for k,v in pairs(Config.Menus) do if k == data.current.modType or isRimMod then if data.current.label == _U('by_default') or string.match(data.current.label, _U('installed')) then ESX.ShowNotification(_U('already_own') .. data.current.label) + TriggerEvent('esx_lscustom:installMod') else - if isRimMod then - TriggerServerEvent("esx_lscustom:buyMod", data.current.price) - else - TriggerServerEvent("esx_lscustom:buyMod", v.price) + local vehiclePrice = 0 + + for i=1, #Vehicles, 1 do + if GetEntityModel(vehicle) == GetHashKey(Vehicles[i].model) then + vehiclePrice = Vehicles[i].price + break + end end + + if isRimMod then + price = math.floor(vehiclePrice * data.current.price / 100) + TriggerServerEvent("esx_lscustom:buyMod", price) + elseif v.modType == 11 or v.modType == 12 or v.modType == 13 or v.modType == 15 or v.modType == 16 or v.modType == 17 then + price = math.floor(vehiclePrice * v.price[data.current.modNum + 1] / 100) + TriggerServerEvent("esx_lscustom:buyMod", price) + else + price = math.floor(vehiclePrice * v.price / 100) + TriggerServerEvent("esx_lscustom:buyMod", price) + end + end menu.close() found = true @@ -62,11 +91,17 @@ function OpenLSMenu(elems, menuname, menutitle, parent) function(data, menu) -- on cancel menu.close() TriggerEvent('esx_lscustom:cancelInstallMod') + + local playerPed = GetPlayerPed(-1) + local vehicle = GetVehiclePedIsIn(playerPed, false) + + SetVehicleDoorsShut(vehicle, false) + if parent == nil then lsMenuIsShowed = false local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) FreezeEntityPosition(vehicle, false) - myCar = nil + myCar = {} end end, function(data, menu) -- on change @@ -76,9 +111,11 @@ function OpenLSMenu(elems, menuname, menutitle, parent) end function UpdateMods(data) - if data.modType ~= nil then - local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) - local props = {} + + local vehicle = GetVehiclePedIsIn(GetPlayerPed(-1), false) + + if data.modType ~= nil then + local props = {} --Citizen.Trace('modType: ' .. data.modType) --Citizen.Trace('modNum: ' .. json.encode(data.modNum)) @@ -111,6 +148,33 @@ function GetAction(data) local vehicle = GetVehiclePedIsIn(playerPed, false) local currentMods = ESX.Game.GetVehicleProperties(vehicle) + if data.value == 'modSpeakers' or + data.value == 'modTrunk' or + data.value == 'modHydrolic' or + data.value == 'modEngineBlock' or + data.value == 'modAirFilter' or + data.value == 'modStruts' or + data.value == 'modTank' then + SetVehicleDoorOpen(vehicle, 4, false) + SetVehicleDoorOpen(vehicle, 5, false) + elseif data.value == 'modDoorSpeaker' then + SetVehicleDoorOpen(vehicle, 0, false) + SetVehicleDoorOpen(vehicle, 1, false) + SetVehicleDoorOpen(vehicle, 2, false) + SetVehicleDoorOpen(vehicle, 3, false) + else + SetVehicleDoorsShut(vehicle, false) + end + + local vehiclePrice = 0 + + for i=1, #Vehicles, 1 do + if GetEntityModel(vehicle) == GetHashKey(Vehicles[i].model) then + vehiclePrice = Vehicles[i].price + break + end + end + for k,v in pairs(Config.Menus) do if data.value == k then @@ -120,7 +184,7 @@ function GetAction(data) parent = v.parent if v.modType ~= nil then - + if v.modType == 22 then table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = false}) elseif v.modType == 'color1' or v.modType == 'color2' or v.modType == 'pearlescentColor' or v.modType == 'wheelColor' then @@ -129,10 +193,6 @@ function GetAction(data) else table.insert(elements, {label = " " .. _U('by_default'), modType = k, modNum = -1}) end - - if v.modType == 17 then - table.insert(elements, {label = " " .. _U('no_turbo'), modType = k, modNum = false}) - end if v.modType == 14 then -- HORNS for j = 0, 51, 1 do @@ -140,7 +200,8 @@ function GetAction(data) if j == currentMods.modHorns then _label = GetHornName(j) .. ' - '.. _U('installed') ..'' else - _label = GetHornName(j) .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = GetHornName(j) .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = j}) end @@ -150,7 +211,8 @@ function GetAction(data) if j == currentMods.plateIndex then _label = GetPlatesName(j) .. ' - '.. _U('installed') ..'' else - _label = GetPlatesName(j) .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = GetPlatesName(j) .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = j}) end @@ -159,15 +221,17 @@ function GetAction(data) if currentMods.modXenon then _label = 'Xénon - '.. _U('installed') ..'' else - _label = 'Xénon - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = 'Xénon - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = true}) elseif v.modType == 'neonColor' or v.modType == 'tyreSmokeColor' then -- NEON & SMOKE COLOR - local neons = GetNeons() + local neons = GetNeons() + price = math.floor(vehiclePrice * v.price / 100) for i=1, #neons, 1 do table.insert(elements, { - label = '' .. neons[i].label .. ' ', + label = '' .. neons[i].label .. ' - $' .. price .. '', modType = k, modNum = { neons[i].r, neons[i].g, neons[i].b } } @@ -177,7 +241,8 @@ function GetAction(data) local colors = GetColors(data.color) for j = 1, #colors, 1 do local _label = '' - _label = colors[j].label .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = colors[j].label .. ' - $' .. price .. ' ' table.insert(elements, {label = _label, modType = k, modNum = colors[j].index}) end elseif v.modType == 'windowTint' then -- WINDOWS TINT @@ -186,7 +251,8 @@ function GetAction(data) if j == currentMods.modHorns then _label = GetWindowName(j) .. ' - '.. _U('installed') ..'' else - _label = GetWindowName(j) .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = GetWindowName(j) .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = j}) end @@ -204,30 +270,27 @@ function GetAction(data) if j == currentMods.modFrontWheels then _label = GetLabelText(modName) .. ' - '.. _U('installed') ..'' else - _label = GetLabelText(modName) .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = GetLabelText(modName) .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = 'modFrontWheels', modNum = j, wheelType = v.wheelType, price = v.price}) end end - elseif v.modType == 11 or v.modType == 12 or v.modType == 13 or v.modType == 15 or v.modType == 16 then + elseif v.modType == 11 or v.modType == 12 or v.modType == 13 or v.modType == 15 or v.modType == 16 or v.modType == 18 then local modCount = GetNumVehicleMods(vehicle, v.modType) -- UPGRADES - for j = 0, modCount-1, 1 do + for j = 0, modCount, 1 do local _label = '' if j == currentMods[k] then - _label = _U('level') .. j .. ' - '.. _U('installed') ..'' + _label = 'Niveau ' .. j+1 .. ' - '.. _U('installed') ..'' else - _label = _U('level') .. j .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price[j+1] / 100) + _label = 'Niveau ' .. j+1 .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = j}) + if j == modCount-1 then + break + end end - elseif v.modType == 17 then -- TURBO - local _label = '' - if currentMods.modTurbo then - _label = 'Turbo - '.. _U('installed') ..'' - else - _label = 'Turbo - $' .. v.price .. ' ' - end - table.insert(elements, {label = _label, modType = k, modNum = true}) else local modCount = GetNumVehicleMods(vehicle, v.modType) -- BODYPARTS for j = 0, modCount, 1 do @@ -237,7 +300,8 @@ function GetAction(data) if j == currentMods[k] then _label = GetLabelText(modName) .. ' - '.. _U('installed') ..'' else - _label = GetLabelText(modName) .. ' - $' .. v.price .. ' ' + price = math.floor(vehiclePrice * v.price / 100) + _label = GetLabelText(modName) .. ' - $' .. price .. ' ' end table.insert(elements, {label = _label, modType = k, modNum = j}) end @@ -251,7 +315,7 @@ function GetAction(data) elseif data.value == 'secondaryRespray' then table.insert(elements, {label = Config.Colors[i].label, value = 'color2', color = Config.Colors[i].value}) elseif data.value == 'pearlescentRespray' then - table.insert(elements, {label = Config.Colors[i].label, value = 'pearlescentColor', color = Config.Colors[i].value}) + table.insert(elements, {label = Config.Colors[i].label, value = 'pearlescentColor', color = Config.Colors[i].value}) elseif data.value == 'modFrontWheelsColor' then table.insert(elements, {label = Config.Colors[i].label, value = 'wheelColor', color = Config.Colors[i].value}) end @@ -313,12 +377,10 @@ Citizen.CreateThread(function() end end - if IsControlJustReleased(0, 38) and not lsMenuIsShowed and isInLSMarker then + if IsControlJustReleased(0, 38) and not lsMenuIsShowed and isInLSMarker then lsMenuIsShowed = true local vehicle = GetVehiclePedIsIn(playerPed, false) - - --SetVehicleUndriveable(vehicle, true) FreezeEntityPosition(vehicle, true) myCar = ESX.Game.GetVehicleProperties(vehicle) @@ -333,21 +395,8 @@ Citizen.CreateThread(function() if not isInLSMarker and hasAlreadyEnteredMarker then hasAlreadyEnteredMarker = false - --lsMenuIsShowed = false - --ESX.UI.Menu.CloseAll() end end end -end) - ---char GET_MOD_SLOT_NAME(Vehicle vehicle, int modType) - ---int GET_NUM_VEHICLE_MODS(Vehicle vehicle, int modType) - ---char *GET_MOD_TEXT_LABEL(Vehicle vehicle, int modType, int modValue) - - --_GET_LABEL_TEXT to get the part name in the games language - ---local Veh = GetVehiclePedIsIn(GetPlayerPed(-1), true) ---local VehType = GetLabelText(GetDisplayNameFromVehicleModel(GetEntityModel(Veh))) +end) \ No newline at end of file diff --git a/config.lua b/config.lua index 8238e092..626c9454 100644 --- a/config.lua +++ b/config.lua @@ -452,37 +452,37 @@ Config.Menus = { label = _U('engine'), parent = 'upgrades', modType = 11, - price = 500 + price = {13.95, 32.56, 65.12, 139.53} }, modBrakes = { label = _U('brakes'), parent = 'upgrades', modType = 12, - price = 500 + price = {4.65, 9.3, 18.6, 13.95} }, modTransmission = { label = _U('transmission'), parent = 'upgrades', modType = 13, - price = 500 + price = {13.95, 20.93, 46.51} }, modSuspension = { label = _U('suspension'), parent = 'upgrades', modType = 15, - price = 500 + price = {3.72, 7.44, 14.88, 29.77, 40.2} }, modArmor = { label = _U('armor'), parent = 'upgrades', modType = 16, - price = 500 + price = {69.77, 116.28, 6666666.6, 6666666.6, 6666666.6, 6666666.6} }, modTurbo = { label = _U('turbo'), parent = 'upgrades', modType = 17, - price = 500 + price = {55.81} }, cosmetics = { label = _U('cosmetics'), @@ -494,8 +494,171 @@ Config.Menus = { resprays = _U('respray'), modXenon = _U('headlights'), plateIndex = _U('licenseplates'), - wheels = _U('wheels') + wheels = _U('wheels'), + modPlateHolder = 'Plaque - Contour', + modVanityPlate = 'Plaque - Avant', + modTrimA = 'Intérieur', + modOrnaments = 'Ornements', + modDashboard = 'Tableau de bord', + modDial = 'Compteur de vitesse', + modDoorSpeaker = 'Sono portière', + modSeats = 'Sièges', + modSteeringWheel = 'Volant', + modShifterLeavers = 'Levier de vitesse', + modAPlate = 'Plage arrière', + modSpeakers = 'Sono', + modTrunk = 'Coffre', + modHydrolic = 'Hydrolique', + modEngineBlock = 'Bloc moteur', + modAirFilter = 'Filtre à air', + modStruts = 'Struts', + modArchCover = 'Cache-roues', + modAerials = 'Antennes', + modTrimB = 'Ailes', + modTank = 'Réservoir', + modWindows = 'Fenêtres', + modLivery = 'Stickers' }, + + modPlateHolder = { + label = 'Plaque - Contour', + parent = 'cosmetics', + modType = 25, + price = 3.49 + }, + modVanityPlate = { + label = 'Plaque - Avant', + parent = 'cosmetics', + modType = 26, + price = 1.1 + }, + modTrimA = { + label = 'Intérieur', + parent = 'cosmetics', + modType = 27, + price = 6.98 + }, + modOrnaments = { + label = 'Ornements', + parent = 'cosmetics', + modType = 28, + price = 0.9 + }, + modDashboard = { + label = 'Tableau de bord', + parent = 'cosmetics', + modType = 29, + price = 4.65 + }, + modDial = { + label = 'Compteur de vitesse', + parent = 'cosmetics', + modType = 30, + price = 4.19 + }, + modDoorSpeaker = { + label = 'Sono portière', + parent = 'cosmetics', + modType = 31, + price = 5.58 + }, + modSeats = { + label = 'Siège', + parent = 'cosmetics', + modType = 32, + price = 4.65 + }, + modSteeringWheel = { + label = 'Volant', + parent = 'cosmetics', + modType = 33, + price = 4.19 + }, + modShifterLeavers = { + label = 'Levier de vitesse', + parent = 'cosmetics', + modType = 34, + price = 3.26 + }, + modAPlate = { + label = 'Plage arrière', + parent = 'cosmetics', + modType = 35, + price = 4.19 + }, + modSpeakers = { + label = 'Sono', + parent = 'cosmetics', + modType = 36, + price = 6.98 + }, + modTrunk = { + label = 'Coffre', + parent = 'cosmetics', + modType = 37, + price = 5.58 + }, + modHydrolic = { + label = 'Hydrolique', + parent = 'cosmetics', + modType = 38, + price = 5.12 + }, + modEngineBlock = { + label = 'Bloc moteur', + parent = 'cosmetics', + modType = 39, + price = 5.12 + }, + modAirFilter = { + label = 'Filtre a air', + parent = 'cosmetics', + modType = 40, + price = 3.72 + }, + modStruts = { + label = 'Struts', + parent = 'cosmetics', + modType = 41, + price = 6.51 + }, + modArchCover = { + label = 'Cache-roues', + parent = 'cosmetics', + modType = 42, + price = 4.19 + }, + modAerials = { + label = 'Antennes', + parent = 'cosmetics', + modType = 43, + price = 1.12 + }, + modTrimB = { + label = 'Ailes', + parent = 'cosmetics', + modType = 44, + price = 6.05 + }, + modTank = { + label = 'Réservoir', + parent = 'cosmetics', + modType = 45, + price = 4.19 + }, + modWindows = { + label = 'Fenêtres', + parent = 'cosmetics', + modType = 46, + price = 4.19 + }, + modLivery = { + label = 'Stickers', + parent = 'cosmetics', + modType = 48, + price = 9.3 + }, + wheels = { label = _U('wheels'), parent = 'cosmetics', @@ -520,56 +683,56 @@ Config.Menus = { parent = 'modFrontWheelsTypes', modType = 23, wheelType = 0, - price = 500 + price = 4.65 }, modFrontWheelsType1 = { label = _U('muscle'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 1, - price = 500 + price = 4.19 }, modFrontWheelsType2 = { label = _U('lowrider'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 2, - price = 500 + price = 4.65 }, modFrontWheelsType3 = { label = _U('suv'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 3, - price = 500 + price = 4.19 }, modFrontWheelsType4 = { label = _U('allterrain'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 4, - price = 500 + price = 4.19 }, modFrontWheelsType5 = { label = _U('tuning'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 5, - price = 500 + price = 5.12 }, modFrontWheelsType6 = { label = _U('motorcycle'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 6, - price = 500 + price = 3.26 }, modFrontWheelsType7 = { label = _U('highend'), parent = 'modFrontWheelsTypes', modType = 23, wheelType = 7, - price = 500 + price = 5.12 }, modFrontWheelsColor = { label = 'Peinture Jantes', @@ -579,13 +742,13 @@ Config.Menus = { label = 'Peinture Jantes', parent = 'modFrontWheelsColor', modType = 'wheelColor', - price = 500 + price = 0.66 }, plateIndex = { label = _U('licenseplates'), parent = 'cosmetics', modType = 'plateIndex', - price = 500 + price = 1.1 }, resprays = { label = _U('respray'), @@ -610,25 +773,25 @@ Config.Menus = { label = _U('primary'), parent = 'primaryRespray', modType = 'color1', - price = 500 + price = 1.12 }, color2 = { label = _U('secondary'), parent = 'secondaryRespray', modType = 'color2', - price = 500 + price = 0.66 }, pearlescentColor = { label = _U('pearlescent'), parent = 'pearlescentRespray', modType = 'pearlescentColor', - price = 500 + price = 0.88 }, modXenon = { label = _U('headlights'), parent = 'cosmetics', modType = 22, - price = 500 + price = 3.72 }, bodyparts = { label = _U('bodyparts'), @@ -649,91 +812,91 @@ Config.Menus = { label = _U('spoilers'), parent = 'bodyparts', modType = 0, - price = 500 + price = 4.65 }, modFrontBumper = { label = _U('frontbumper'), parent = 'bodyparts', modType = 1, - price = 500 + price = 5.12 }, modRearBumper = { label = _U('rearbumper'), parent = 'bodyparts', modType = 2, - price = 500 + price = 5.12 }, modSideSkirt = { label = _U('sideskirt'), parent = 'bodyparts', modType = 3, - price = 500 + price = 4.65 }, modExhaust = { label = _U('exhaust'), parent = 'bodyparts', modType = 4, - price = 500 + price = 5.12 }, modFrame = { label = _U('cage'), parent = 'bodyparts', modType = 5, - price = 500 + price = 5.12 }, modGrille = { label = _U('grille'), parent = 'bodyparts', modType = 6, - price = 500 + price = 3.72 }, modHood = { label = _U('hood'), parent = 'bodyparts', modType = 7, - price = 500 + price = 4.88 }, modFender = { label = _U('leftfender'), parent = 'bodyparts', modType = 8, - price = 500 + price = 5.12 }, modRightFender = { label = _U('rightfender'), parent = 'bodyparts', modType = 9, - price = 500 + price = 5.12 }, modRoof = { label = _U('roof'), parent = 'bodyparts', modType = 10, - price = 500 + price = 5.58 }, windowTint = { label = _U('windowtint'), parent = 'cosmetics', modType = 'windowTint', - price = 500 + price = 1.12 }, modHorns = { label = _U('horns'), parent = 'cosmetics', modType = 14, - price = 500 + price = 1.12 }, neonColor = { label = _U('neons'), parent = 'cosmetics', modType = 'neonColor', - price = 500 + price = 1.12 }, tyreSmokeColor = { label = _U('tiresmoke'), parent = 'wheels', modType = 'tyreSmokeColor', - price = 500 + price = 1.12 } } diff --git a/server/main.lua b/server/main.lua index de331d01..45c410b2 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,5 +1,6 @@ ESX = nil TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +local Vehicles = nil RegisterServerEvent('esx_lscustom:buyMod') AddEventHandler('esx_lscustom:buyMod', function(price) @@ -25,4 +26,27 @@ AddEventHandler('esx_lscustom:refreshOwnedVehicle', function(myCar) ['@vehicle'] = json.encode(myCar) } ) +end) + +ESX.RegisterServerCallback('esx_lscustom:getVehiclesPrices', function(source, cb) + + if Vehicles == nil then + MySQL.Async.fetchAll( + 'SELECT * FROM vehicles', + {}, + function(result) + local vehicles = {} + for i=1, #result, 1 do + table.insert(vehicles,{ + model = result[i].model, + price = result[i].price + }) + end + Vehicles = vehicles + cb(Vehicles) + end + ) + else + cb(Vehicles) + end end) \ No newline at end of file