diff --git a/resources/[carscripts]/nordi_fuelinfo/fxmanifest.lua b/resources/[carscripts]/nordi_fuelinfo/fxmanifest.lua new file mode 100644 index 000000000..6cec24893 --- /dev/null +++ b/resources/[carscripts]/nordi_fuelinfo/fxmanifest.lua @@ -0,0 +1,9 @@ +fx_version 'cerulean' +game 'gta5' + +author 'YourName' +description 'Fuel info command for lc_fuel system' + +server_script 'server/server.lua' + +dependency 'lc_fuel' -- Ensures lc_fuel loads first diff --git a/resources/[carscripts]/nordi_fuelinfo/server/server.lua b/resources/[carscripts]/nordi_fuelinfo/server/server.lua new file mode 100644 index 000000000..2ab1d14fc --- /dev/null +++ b/resources/[carscripts]/nordi_fuelinfo/server/server.lua @@ -0,0 +1,21 @@ +QBCore.Commands.Add("fuel", "Check current vehicle fuel level", {}, false, function(source, args) + local player = QBCore.Functions.GetPlayer(source) + if not player then return end + + local ped = GetPlayerPed(source) + local vehicle = GetVehiclePedIsIn(ped, false) + + if vehicle == 0 then + TriggerClientEvent('QBCore:Notify', source, "You must be in a vehicle", "error") + return + end + + local plate = QBCore.Functions.GetPlate(vehicle) + + -- lc_fuel stores fuel in vehicle metadata + local fuel = exports['lc_fuel']:GetFuel(vehicle) or 0 + local roundedFuel = math.floor(fuel + 0.5) + + TriggerClientEvent('QBCore:Notify', source, "Fuel: "..roundedFuel.."%", "success") +end, "user") + diff --git a/resources/[jobs]/[weapons]/force-sling/fxmanifest.lua b/resources/[jobs]/[weapons]/force-sling/fxmanifest.lua index 40e591114..659dba278 100644 --- a/resources/[jobs]/[weapons]/force-sling/fxmanifest.lua +++ b/resources/[jobs]/[weapons]/force-sling/fxmanifest.lua @@ -24,7 +24,9 @@ server_scripts { "server/events.lua", "server/functions.lua", "server/main.lua", - "server/misc/*.lua" + "server/misc/*.lua", + "server/callbacks.lua" + } client_scripts { diff --git a/resources/[jobs]/[weapons]/force-sling/server/main.lua b/resources/[jobs]/[weapons]/force-sling/server/main.lua index dc7bbf6df..073eda6b5 100644 --- a/resources/[jobs]/[weapons]/force-sling/server/main.lua +++ b/resources/[jobs]/[weapons]/force-sling/server/main.lua @@ -1,6 +1,43 @@ +local positions = {} +local presets = {} +local positionsFile = 'positions.json' +local presetsFile = 'presets.json' + +-- Load saved positions from JSON file +local function LoadPositions() + local file = LoadResourceFile(GetCurrentResourceName(), 'json/' .. positionsFile) + if file then + positions = json.decode(file) or {} + end +end + +-- Load saved presets from JSON file +local function LoadPresets() + local file = LoadResourceFile(GetCurrentResourceName(), 'json/' .. presetsFile) + if file then + presets = json.decode(file) or {} + end +end + +-- Save positions to JSON file +local function SavePositions() + SaveResourceFile(GetCurrentResourceName(), 'json/' .. positionsFile, json.encode(positions), -1) +end + +-- Save presets to JSON file +local function SavePresets() + SaveResourceFile(GetCurrentResourceName(), 'json/' .. presetsFile, json.encode(presets), -1) +end + +-- Load data when resource starts +CreateThread(function() + LoadPositions() + LoadPresets() +end) + +-- Weapon sync local attachedWeapons = {} --- Track player weapons RegisterNetEvent('force-sling:server:syncWeapons') AddEventHandler('force-sling:server:syncWeapons', function(weaponData, action) local src = source @@ -13,11 +50,59 @@ AddEventHandler('force-sling:server:syncWeapons', function(weaponData, action) end end - -- Broadcast to all players except source TriggerClientEvent('force-sling:client:syncWeapons', -1, src, weaponData, action) end) --- Clean up when player disconnects +-- Callbacks +lib.callback.register('force-sling:callback:getCachedPositions', function(source) + return positions +end) + +lib.callback.register('force-sling:callback:getCachedPresets', function(source) + return presets +end) + +lib.callback.register('force-sling:callback:isPlayerAdmin', function(source) + local src = source + -- Add your admin check logic here + -- Example for QBCore: + -- local Player = QBCore.Functions.GetPlayer(src) + -- return Player.PlayerData.admin or false + + -- For testing, returning true + return {isAdmin = true} +end) + +lib.callback.register('force-sling:callback:resetWeaponPositions', function(source, weapon) + local src = source + if weapon then + positions[weapon] = nil + else + positions = {} + end + SavePositions() + return positions +end) + +RegisterNetEvent('force-sling:server:saveWeaponPosition') +AddEventHandler('force-sling:server:saveWeaponPosition', function(position, rotation, weapon, weaponName, boneId, isPreset) + local src = source + local data = { + coords = position, + rot = rotation, + boneId = boneId + } + + if isPreset then + presets[weaponName] = data + SavePresets() + else + positions[weaponName] = data + SavePositions() + end +end) + +-- Cleanup on player drop AddEventHandler('playerDropped', function() local src = source if attachedWeapons[src] then