From d6fe06d9f5726ce9ecf99fcfab3546c71a38cdf9 Mon Sep 17 00:00:00 2001 From: Csoki Date: Sun, 22 Jan 2023 13:02:06 +0100 Subject: [PATCH 1/6] feat(modules): add npwd support --- [SQL]/legacy.sql | 3 +- [core]/es_extended/client/modules/npwd.lua | 55 ++++++++++++++++++++++ [core]/es_extended/fxmanifest.lua | 17 +++---- [core]/es_extended/server/modules/npwd.lua | 49 +++++++++++++++++++ 4 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 [core]/es_extended/client/modules/npwd.lua create mode 100644 [core]/es_extended/server/modules/npwd.lua diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index 39e24040..2ba76874 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -402,7 +402,8 @@ CREATE TABLE `users` ( `disabled` TINYINT(1) NULL DEFAULT '0', `last_property` varchar(255) DEFAULT NULL, `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, - `last_seen` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP + `last_seen` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `phone_number` VARCHAR(20) DEFAULT NULL ) ENGINE=InnoDB; -- -------------------------------------------------------- diff --git a/[core]/es_extended/client/modules/npwd.lua b/[core]/es_extended/client/modules/npwd.lua new file mode 100644 index 00000000..fb04f356 --- /dev/null +++ b/[core]/es_extended/client/modules/npwd.lua @@ -0,0 +1,55 @@ +local npwd = GetResourceState('npwd'):find('start') and exports.npwd or nil + +local function checkPhone() + if not npwd then + return + end + + npwd:setPhoneDisabled((ESX.SearchInventory('phone').count or 0) <= 0) +end +RegisterNetEvent('esx:playerLoaded', checkPhone) + +AddEventHandler('onClientResourceStart', function(resource) + if resource ~= 'npwd' then + return + end + + npwd = GetResourceState('npwd'):find('start') and exports.npwd or nil + + if ESX.PlayerLoaded then + checkPhone() + end +end) + +AddEventHandler('onClientResourceStop', function(resource) + if resource == 'npwd' then + npwd = nil + end +end) + +RegisterNetEvent('esx:onPlayerLogout', function() + if not npwd then + return + end + + npwd:setPhoneVisible(false) + npwd:setPhoneDisabled(true) +end) + +RegisterNetEvent('esx:removeInventoryItem', function(item, count) + if not npwd then + return + end + + if item == 'phone' and count == 0 then + npwd:setPhoneDisabled(true) + end +end) + +RegisterNetEvent('esx:addInventoryItem', function(item) + if not npwd or item ~= 'phone' then + return + end + + npwd:setPhoneDisabled(false) +end) \ No newline at end of file diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua index 1c9c63be..0f5ca570 100644 --- a/[core]/es_extended/fxmanifest.lua +++ b/[core]/es_extended/fxmanifest.lua @@ -27,9 +27,9 @@ server_scripts { 'server/main.lua', 'server/commands.lua', - 'common/modules/math.lua', - 'common/modules/table.lua', - 'common/functions.lua' + 'common/modules/*.lua', + 'common/functions.lua', + 'server/modules/*.lua' } client_scripts { @@ -37,14 +37,11 @@ client_scripts { 'client/functions.lua', 'client/wrapper.lua', 'client/main.lua', + + 'common/modules/*.lua', + 'common/functions.lua', - 'client/modules/death.lua', - 'client/modules/scaleform.lua', - 'client/modules/streaming.lua', - - 'common/modules/math.lua', - 'common/modules/table.lua', - 'common/functions.lua' + 'client/modules/*.lua' } ui_page { diff --git a/[core]/es_extended/server/modules/npwd.lua b/[core]/es_extended/server/modules/npwd.lua new file mode 100644 index 00000000..3e0c1ffc --- /dev/null +++ b/[core]/es_extended/server/modules/npwd.lua @@ -0,0 +1,49 @@ +local npwd = GetResourceState('npwd'):find('start') and exports.npwd or nil + +AddEventHandler('onServerResourceStart', function(resource) + if resource ~= 'npwd' then + return + end + + npwd = GetResourceState('npwd'):find('start') and exports.npwd or nil + + for _, xPlayer in pairs(ESX.Players) do + npwd:newPlayer({ + source = xPlayer.source, + identifier = xPlayer.identifier, + firstname = xPlayer.get('firstName'), + lastname = xPlayer.get('lastName') + }) + end +end) + +AddEventHandler('onServerResourceStop', function(resource) + if resource == 'npwd' then + npwd = nil + end +end) + +AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) + if not npwd then + return + end + + if not xPlayer then + xPlayer = ESX.GetPlayerFromId(playerId) + end + + npwd:newPlayer({ + source = playerId, + identifier = xPlayer.identifier, + firstname = xPlayer.get('firstName'), + lastname = xPlayer.get('lastName') + }) +end) + +AddEventHandler('esx:playerLogout', function(playerId) + if not npwd then + return + end + + npwd:unloadPlayer(playerId) +end) \ No newline at end of file From 5e5c3020690da33d64dd059c6c81762b3c364b72 Mon Sep 17 00:00:00 2001 From: TheFarFantomas Date: Mon, 23 Jan 2023 23:02:54 +0100 Subject: [PATCH 2/6] ESX.OneSync.SpawnVehicle and Command rewrite --- [core]/es_extended/config.lua | 2 +- [core]/es_extended/server/commands.lua | 56 +++++++++++++++++--------- [core]/es_extended/server/onesync.lua | 42 +++++++++---------- 3 files changed, 60 insertions(+), 40 deletions(-) diff --git a/[core]/es_extended/config.lua b/[core]/es_extended/config.lua index 50c57ea3..177a64d7 100644 --- a/[core]/es_extended/config.lua +++ b/[core]/es_extended/config.lua @@ -60,7 +60,7 @@ Config.RemoveHudCommonents = { [22] = false, --HUD_WEAPONS } -Config.MaxAdminVehicles = false -- admin vehicles spawn with max vehcle settings +Config.MaxAdminVehicles = true -- admin vehicles spawn with max vehcle settings Config.CustomAIPlates = 'ESX.A111' -- Custom plates for AI vehicles -- Pattern string format --1 will lead to a random number from 0-9. diff --git a/[core]/es_extended/server/commands.lua b/[core]/es_extended/server/commands.lua index 1ebe1754..7028b6d2 100644 --- a/[core]/es_extended/server/commands.lua +++ b/[core]/es_extended/server/commands.lua @@ -23,29 +23,49 @@ end, true, {help = TranslateCap('command_setjob'), validate = true, arguments = {name = 'grade', help = TranslateCap('command_setjob_grade'), type = 'number'} }}) +local upgrades = Config.MaxAdminVehicles and + { + plate = "ADMINCAR", + modEngine = 3, + modBrakes = 2, + modTransmission = 2, + modSuspension = 3, + modArmor = true, + windowTint = 1 + } or {} + ESX.RegisterCommand('car', 'admin', function(xPlayer, args, showError) - local GameBuild = tonumber(GetConvar("sv_enforceGameBuild", 1604)) - if not args.car then args.car = GameBuild >= 2699 and "draugur" or "prototipo" end + local playerPed = GetPlayerPed(xPlayer.source) + local playerCoords = GetEntityCoords(playerPed) + local playerHeading = GetEntityHeading(playerPed) + local playerVehicle = GetVehiclePedIsIn(playerPed) + + if not args.car or type(args.car) ~= 'string' then + args.car = 'adder' + end + + if playerVehicle then + DeleteEntity(playerVehicle) + end + ESX.DiscordLogFields("UserActions", "/car Triggered", "pink", { {name = "Player", value = xPlayer.name, inline = true}, {name = "ID", value = xPlayer.source, inline = true}, - {name = "Vehicle", value = args.car, inline = true} + {name = "Vehicle", value = args.car, inline = true} }) - local upgrades = Config.MaxAdminVehicles and { - plate = "ADMINCAR", - modEngine = 3, - modBrakes = 2, - modTransmission = 2, - modSuspension = 3, - modArmor = true, - windowTint = 1, - } or {} - local coords = xPlayer.getCoords(true) - local PlayerPed = GetPlayerPed(xPlayer.source) - ESX.OneSync.SpawnVehicle(args.car, coords - vector3(0,0, 0.9), GetEntityHeading(PlayerPed), upgrades, function(networkId) - local vehicle = NetworkGetEntityFromNetworkId(networkId) - Wait(250) - TaskWarpPedIntoVehicle(PlayerPed, vehicle, -1) + + ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) + if networkId then + local vehicle = NetworkGetEntityFromNetworkId(networkId) + for i = 1, 20 do + Wait(0) + SetPedIntoVehicle(playerPed, vehicle, -1) + + if GetVehiclePedIsIn(playerPed, false) == vehicle then + break + end + end + end end) end, false, {help = TranslateCap('command_car'), validate = false, arguments = { {name = 'car',validate = false, help = TranslateCap('command_car_car'), type = 'string'} diff --git a/[core]/es_extended/server/onesync.lua b/[core]/es_extended/server/onesync.lua index 2ede0ff2..21e979c9 100644 --- a/[core]/es_extended/server/onesync.lua +++ b/[core]/es_extended/server/onesync.lua @@ -61,29 +61,29 @@ end ---@param heading number ---@param Properties table ---@param cb function - function ESX.OneSync.SpawnVehicle(model, coords, heading, Properties, cb) - local veh_model = type(model) == 'string' and joaat(model) or model - Properties = Properties or {} - local vector = type(coords) == "vector3" and coords or vec(coords.x, coords.y, coords.z) - TriggerClientEvent("esx:requestModel", -1, model) - CreateThread(function() - local xPlayer = ESX.OneSync.GetClosestPlayer(vector, 300) - ESX.GetVehicleType(veh_model, xPlayer.id, function(Type) - if Type then - local SpawnedEntity = CreateVehicleServerSetter(veh_model, Type, vector, heading) - local NetworkId = NetworkGetNetworkIdFromEntity(SpawnedEntity) - while not DoesEntityExist(SpawnedEntity) do - Wait(100) - end - Properties.NetId = NetworkId - Entity(SpawnedEntity).state:set('VehicleProperties', Properties, true) - cb(NetworkId) - else - print(('[^1ERROR^7] Tried to spawn invalid vehicle - ^5%s^7!'):format(model)) +function ESX.OneSync.SpawnVehicle(model, coords, heading, properties, cb) + local vehicleModel = joaat(model) + local vehicleProperties = properties + + CreateThread(function() + local xPlayer = ESX.OneSync.GetClosestPlayer(coords, 300) + ESX.GetVehicleType(vehicleModel, xPlayer.id, function(vehicleType) + if vehicleType then + local createdVehicle = CreateVehicleServerSetter(vehicleModel, vehicleType, coords, heading) + if DoesEntityExist(createdVehicle) then + local networkId = NetworkGetNetworkIdFromEntity(createdVehicle) + vehicleProperties.NetId = networkId + Entity(createdVehicle).state:set('VehicleProperties', vehicleProperties, true) + cb(networkId) + else + print('[^1ERROR^7] Unfortunately, this vehicle has not spawned') end - end) + else + print(('[^1ERROR^7] Tried to spawn invalid vehicle - ^5%s^7!'):format(model)) + end end) - end + end) +end ---@param model number|string From 3e549be14c2062af702cb121518a2de66b140fe0 Mon Sep 17 00:00:00 2001 From: TheFarFantomas Date: Mon, 23 Jan 2023 23:17:27 +0100 Subject: [PATCH 3/6] Change variable name --- [core]/es_extended/config.lua | 2 +- [core]/es_extended/server/commands.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/config.lua b/[core]/es_extended/config.lua index 177a64d7..46daa5dd 100644 --- a/[core]/es_extended/config.lua +++ b/[core]/es_extended/config.lua @@ -60,7 +60,7 @@ Config.RemoveHudCommonents = { [22] = false, --HUD_WEAPONS } -Config.MaxAdminVehicles = true -- admin vehicles spawn with max vehcle settings +Config.SpawnVehMaxUpgrades = true -- admin vehicles spawn with max vehcle settings Config.CustomAIPlates = 'ESX.A111' -- Custom plates for AI vehicles -- Pattern string format --1 will lead to a random number from 0-9. diff --git a/[core]/es_extended/server/commands.lua b/[core]/es_extended/server/commands.lua index 7028b6d2..79925ec3 100644 --- a/[core]/es_extended/server/commands.lua +++ b/[core]/es_extended/server/commands.lua @@ -23,7 +23,7 @@ end, true, {help = TranslateCap('command_setjob'), validate = true, arguments = {name = 'grade', help = TranslateCap('command_setjob_grade'), type = 'number'} }}) -local upgrades = Config.MaxAdminVehicles and +local upgrades = Config.SpawnVehMaxUpgrades and { plate = "ADMINCAR", modEngine = 3, From ab6dc52f5a76ec3f95aa83651bda5b8ac05531e7 Mon Sep 17 00:00:00 2001 From: TheFarFantomas Date: Mon, 23 Jan 2023 23:19:36 +0100 Subject: [PATCH 4/6] Generic error message --- [core]/es_extended/server/commands.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/[core]/es_extended/server/commands.lua b/[core]/es_extended/server/commands.lua index 79925ec3..e3c63e0e 100644 --- a/[core]/es_extended/server/commands.lua +++ b/[core]/es_extended/server/commands.lua @@ -65,6 +65,9 @@ ESX.RegisterCommand('car', 'admin', function(xPlayer, args, showError) break end end + if GetVehiclePedIsIn(playerPed, false) ~= vehicle then + print('[^1ERROR^7] The player could not be seated in the vehicle') + end end end) end, false, {help = TranslateCap('command_car'), validate = false, arguments = { From df51c5215143a7e1b8e0f9e29befb52990cf61e5 Mon Sep 17 00:00:00 2001 From: TheFarFantomas Date: Mon, 23 Jan 2023 23:20:34 +0100 Subject: [PATCH 5/6] xPlayer value check --- [core]/es_extended/server/commands.lua | 62 ++++++++++++++------------ 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/[core]/es_extended/server/commands.lua b/[core]/es_extended/server/commands.lua index e3c63e0e..3b8f42b9 100644 --- a/[core]/es_extended/server/commands.lua +++ b/[core]/es_extended/server/commands.lua @@ -35,41 +35,45 @@ local upgrades = Config.SpawnVehMaxUpgrades and } or {} ESX.RegisterCommand('car', 'admin', function(xPlayer, args, showError) - local playerPed = GetPlayerPed(xPlayer.source) - local playerCoords = GetEntityCoords(playerPed) - local playerHeading = GetEntityHeading(playerPed) - local playerVehicle = GetVehiclePedIsIn(playerPed) + if xPlayer then + local playerPed = GetPlayerPed(xPlayer.source) + local playerCoords = GetEntityCoords(playerPed) + local playerHeading = GetEntityHeading(playerPed) + local playerVehicle = GetVehiclePedIsIn(playerPed) - if not args.car or type(args.car) ~= 'string' then - args.car = 'adder' - end + if not args.car or type(args.car) ~= 'string' then + args.car = 'adder' + end - if playerVehicle then - DeleteEntity(playerVehicle) - end + if playerVehicle then + DeleteEntity(playerVehicle) + end - ESX.DiscordLogFields("UserActions", "/car Triggered", "pink", { - {name = "Player", value = xPlayer.name, inline = true}, - {name = "ID", value = xPlayer.source, inline = true}, - {name = "Vehicle", value = args.car, inline = true} - }) + ESX.DiscordLogFields("UserActions", "/car Triggered", "pink", { + {name = "Player", value = xPlayer.name, inline = true}, + {name = "ID", value = xPlayer.source, inline = true}, + {name = "Vehicle", value = args.car, inline = true} + }) - ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) - if networkId then - local vehicle = NetworkGetEntityFromNetworkId(networkId) - for i = 1, 20 do - Wait(0) - SetPedIntoVehicle(playerPed, vehicle, -1) - - if GetVehiclePedIsIn(playerPed, false) == vehicle then - break + ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) + if networkId then + local vehicle = NetworkGetEntityFromNetworkId(networkId) + for i = 1, 20 do + Wait(0) + SetPedIntoVehicle(playerPed, vehicle, -1) + + if GetVehiclePedIsIn(playerPed, false) == vehicle then + break + end + end + if GetVehiclePedIsIn(playerPed, false) ~= vehicle then + print('[^1ERROR^7] The player could not be seated in the vehicle') end end - if GetVehiclePedIsIn(playerPed, false) ~= vehicle then - print('[^1ERROR^7] The player could not be seated in the vehicle') - end - end - end) + end) + else + print('[^1ERROR^7] The xplayer value is nil') + end end, false, {help = TranslateCap('command_car'), validate = false, arguments = { {name = 'car',validate = false, help = TranslateCap('command_car_car'), type = 'string'} }}) From a75b6257164501ce127fa1245d7f2df1c9233f70 Mon Sep 17 00:00:00 2001 From: TheFarFantomas Date: Mon, 23 Jan 2023 23:43:26 +0100 Subject: [PATCH 6/6] Reverse notify logic --- [core]/es_extended/server/commands.lua | 64 +++++++++++++------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/[core]/es_extended/server/commands.lua b/[core]/es_extended/server/commands.lua index 3b8f42b9..b89ae36a 100644 --- a/[core]/es_extended/server/commands.lua +++ b/[core]/es_extended/server/commands.lua @@ -35,45 +35,45 @@ local upgrades = Config.SpawnVehMaxUpgrades and } or {} ESX.RegisterCommand('car', 'admin', function(xPlayer, args, showError) - if xPlayer then - local playerPed = GetPlayerPed(xPlayer.source) - local playerCoords = GetEntityCoords(playerPed) - local playerHeading = GetEntityHeading(playerPed) - local playerVehicle = GetVehiclePedIsIn(playerPed) + if not xPlayer then + return print('[^1ERROR^7] The xPlayer value is nil') + end + + local playerPed = GetPlayerPed(xPlayer.source) + local playerCoords = GetEntityCoords(playerPed) + local playerHeading = GetEntityHeading(playerPed) + local playerVehicle = GetVehiclePedIsIn(playerPed) - if not args.car or type(args.car) ~= 'string' then - args.car = 'adder' - end + if not args.car or type(args.car) ~= 'string' then + args.car = 'adder' + end - if playerVehicle then - DeleteEntity(playerVehicle) - end + if playerVehicle then + DeleteEntity(playerVehicle) + end - ESX.DiscordLogFields("UserActions", "/car Triggered", "pink", { - {name = "Player", value = xPlayer.name, inline = true}, - {name = "ID", value = xPlayer.source, inline = true}, - {name = "Vehicle", value = args.car, inline = true} - }) + ESX.DiscordLogFields("UserActions", "/car Triggered", "pink", { + {name = "Player", value = xPlayer.name, inline = true}, + {name = "ID", value = xPlayer.source, inline = true}, + {name = "Vehicle", value = args.car, inline = true} + }) - ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) - if networkId then - local vehicle = NetworkGetEntityFromNetworkId(networkId) - for i = 1, 20 do - Wait(0) - SetPedIntoVehicle(playerPed, vehicle, -1) + ESX.OneSync.SpawnVehicle(args.car, playerCoords, playerHeading, upgrades, function(networkId) + if networkId then + local vehicle = NetworkGetEntityFromNetworkId(networkId) + for i = 1, 20 do + Wait(0) + SetPedIntoVehicle(playerPed, vehicle, -1) - if GetVehiclePedIsIn(playerPed, false) == vehicle then - break - end - end - if GetVehiclePedIsIn(playerPed, false) ~= vehicle then - print('[^1ERROR^7] The player could not be seated in the vehicle') + if GetVehiclePedIsIn(playerPed, false) == vehicle then + break end end - end) - else - print('[^1ERROR^7] The xplayer value is nil') - end + if GetVehiclePedIsIn(playerPed, false) ~= vehicle then + print('[^1ERROR^7] The player could not be seated in the vehicle') + end + end + end) end, false, {help = TranslateCap('command_car'), validate = false, arguments = { {name = 'car',validate = false, help = TranslateCap('command_car_car'), type = 'string'} }})