From 90ab97febcc1d71f40ab1656894aa8927d8c69d7 Mon Sep 17 00:00:00 2001 From: aj <66404074+ihyajb@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:00:20 -0400 Subject: [PATCH] feat(client/server): Object re-work Objects are now non-networked and synced via statebags. Allowing for less issues and more objects in the world at once (if you so want to) --- client/cl_main.lua | 64 +++++++++++++++++++++++++++++++++------------- server/sv_main.lua | 60 ++++++++++++------------------------------- shared/config.lua | 5 ++-- 3 files changed, 65 insertions(+), 64 deletions(-) diff --git a/client/cl_main.lua b/client/cl_main.lua index d07d5a9..d85ac0c 100644 --- a/client/cl_main.lua +++ b/client/cl_main.lua @@ -1,4 +1,5 @@ local Config = require'shared.config' +local Objects = {} local Seats = { 'seat_pside_f', @@ -16,40 +17,60 @@ local function GetValidSeats(entity) return count end -RegisterNetEvent('aj-veh-package:client:StartRandomPackage', function(vNetID) +lib.callback.register('aj-veh-package:client:ValidateVehicle', function(vNetID) local entity = lib.waitFor(function() if NetworkDoesEntityExistWithNetworkId(vNetID) then return NetworkGetEntityFromNetworkId(vNetID) end - end, 'Failed to get vehicle NetworkID', 10000) + end, 'Failed to get vehicle NetworkID', 5000) + if not entity then return false end local validSeats = GetValidSeats(entity) if validSeats == 0 then lib.print.error(string.format('Vehicle "%s" failed to generare any valid seats!', GetEntityArchetypeName(entity))) - return + return false end local selectedSeat = Seats[math.random(1, validSeats)] local boneID = GetEntityBoneIndexByName(entity, selectedSeat) - local oNetID = lib.callback.await('aj-veh-package:server:CreatePackage', false, vNetID) - local package = lib.waitFor(function() - if NetworkDoesEntityExistWithNetworkId(oNetID) then return NetworkGetEntityFromNetworkId(oNetID) end - end, 'Failed to get object NetworkID', 10000) - - --! This is prob bad code but ¯\_(ツ)_/¯ - while DoesEntityExist(entity) and not NetworkHasControlOfEntity(entity) do - NetworkRequestControlOfEntity(entity) - Wait(0) - end - while DoesEntityExist(package) and not NetworkHasControlOfEntity(package) do - NetworkRequestControlOfEntity(package) - Wait(0) + if boneID == 0 or not boneID then + return false end + return true, boneID +end) + +AddStateBagChangeHandler('loadPackage', nil, function(bagName, key, value, reserved, replicated) + if replicated then return end + if not value then return end + local vehicle = lib.waitFor(function() + local e = GetEntityFromStateBagName(bagName) + if e > 0 and DoesEntityExist(e) then + return e + end + end) + if not vehicle then return end + lib.requestModel(value.model) + local coords = GetEntityCoords(vehicle) + local package = CreateObjectNoOffset(value.model, coords.x, coords.y, coords.z - 5, false, true, false) + SetModelAsNoLongerNeeded(value.model) if Config.debug then SetEntityDrawOutline(package, true) SetEntityDrawOutlineShader(1) end SetDisableFragDamage(package, true) SetEntityCollision(package, false, false) + SetEntityNoCollisionEntity(package, vehicle, false) ---@diagnostic disable-next-line: redundant-parameter - AttachEntityToEntity(package, entity, boneID, 0.0, 0.0, 0.0, 0.0, 0.0, math.random(0, 359) + 0.0, 0.0, false, false, false, false, 2, true, false) + AttachEntityToEntity(package, vehicle, value.boneID, 0.0, 0.0, 0.0, 0.0, 0.0, value.rotation, 0.0, false, false, false, false, 2, true, false) + Objects[package] = true + CreateThread(function() + while DoesEntityExist(vehicle) do + local state = Entity(vehicle).state + if not state.hasPackage then + break + end + Wait(1000) + end + DeleteEntity(package) + Objects[package] = nil + end) end) lib.onCache('vehicle', function(veh) @@ -70,10 +91,17 @@ lib.onCache('vehicle', function(veh) }, label = Config.searchLabel }) then - TriggerServerEvent('aj-veh-package:server:SearchedPackage', Entity(cache.vehicle).state.hasPackage, NetworkGetNetworkIdFromEntity(cache.vehicle)) + TriggerServerEvent('aj-veh-package:server:SearchedPackage') break end end end end +end) + +AddEventHandler('onResourceStop', function(r) + if cache.resource ~= r then return end + for object in pairs(Objects) do + DeleteEntity(object) + end end) \ No newline at end of file diff --git a/server/sv_main.lua b/server/sv_main.lua index b56952c..8ff8cce 100644 --- a/server/sv_main.lua +++ b/server/sv_main.lua @@ -1,5 +1,4 @@ lib.versionCheck('ihyajb/aj-veh-package') -local Packages = {} local Config = require'shared.config' local DoesEntityExist = DoesEntityExist @@ -10,7 +9,6 @@ local GetEntityModel = GetEntityModel local GetPedInVehicleSeat = GetPedInVehicleSeat local ox_inventory = exports.ox_inventory AddEventHandler('entityCreated', function(handle) - if #Packages == Config.maxPackages then return end if not DoesEntityExist(handle) then return end if GetEntityPopulationType(handle) ~= 2 then return end if GetEntityType(handle) ~= 2 then return end @@ -20,46 +18,24 @@ AddEventHandler('entityCreated', function(handle) if Config.blacklistedModels[GetEntityModel(handle)] then return end if math.random(1, Config.percent) ~= 1 then return end - TriggerClientEvent('aj-veh-package:client:StartRandomPackage', NetworkGetEntityOwner(handle), NetworkGetNetworkIdFromEntity(handle)) + local success, boneID = lib.callback.await('aj-veh-package:client:ValidateVehicle', NetworkGetEntityOwner(handle), NetworkGetNetworkIdFromEntity(handle)) + if not success then return end + local data = { + model = Config.packageProps[math.random(#Config.packageProps)], + boneID = boneID, + rotation = math.random(0, 360) + 0.0 + } + Entity(handle).state:set('loadPackage', data, true) + Entity(handle).state:set('hasPackage', true, true) + lib.print.debug('Adding Package to vehicle!') end) -local function FindAndDelete(object) - if not DoesEntityExist(object) then return end - DeleteEntity(object) - for i = 1, #Packages do - if Packages[i] == object then - table.remove(Packages, i) - break - end - end -end - -lib.callback.register('aj-veh-package:server:CreatePackage', function(source, vNetID) - local vehicle = NetworkGetEntityFromNetworkId(vNetID) - local coords = GetEntityCoords(vehicle) - local object = CreateObjectNoOffset(Config.packageProps[math.random(#Config.packageProps)], coords.x, coords.y, coords.z - 5, true, true, false) - Packages[#Packages+1] = object - while not DoesEntityExist(object) do Wait(0) end - Entity(vehicle).state:set('hasPackage', object, true) - CreateThread(function() - while DoesEntityExist(object) do - Wait(1000) - if not DoesEntityExist(vehicle) then - lib.print.debug('Vehicle poofed, Deleting Object!') - FindAndDelete(object) - break - end - end - end) - return NetworkGetNetworkIdFromEntity(object) -end) - -RegisterNetEvent('aj-veh-package:server:SearchedPackage', function(object, vNetID) +RegisterNetEvent('aj-veh-package:server:SearchedPackage', function() local src = source - local veh = NetworkGetEntityFromNetworkId(vNetID) + local veh = GetVehiclePedIsIn(GetPlayerPed(src), false) + if veh == 0 or not DoesEntityExist(veh) then return end if not Entity(veh).state.hasPackage then return end - if not DoesEntityExist(object) then return end - FindAndDelete(object) + Entity(veh).state:set('loadPackage', nil, true) Entity(veh).state:set('hasPackage', nil, true) local rewardItem = Config.rewardItems[math.random(#Config.rewardItems)] ox_inventory:AddItem(src, Config.rewardItems[rewardItem].item, math.random(Config.rewardItems[rewardItem].minAmount, Config.rewardItems[rewardItem].maxAmount)) @@ -67,16 +43,12 @@ end) AddEventHandler('onResourceStop', function(r) if cache.resource ~= r then return end - for i = 1, #Packages do - if DoesEntityExist(Packages[i]) then - DeleteEntity(Packages[i]) - end - end local vehicles = GetAllVehicles() for i = 1, #vehicles do if DoesEntityExist(vehicles[i]) then + Entity(vehicles[i]).state:set('loadPackage', nil, true) Entity(vehicles[i]).state:set('hasPackage', nil, true) - -- DeleteEntity(vehicles[i]) + -- DeleteEntity(vehicles[i]) --! Use for debug to refresh parked vehicle pool end end end) \ No newline at end of file diff --git a/shared/config.lua b/shared/config.lua index fc59af7..4022463 100644 --- a/shared/config.lua +++ b/shared/config.lua @@ -1,13 +1,14 @@ return { debug = false, - maxPackages = 20, --Max amount of packages in the world at once - percent = 10, -- A 1 in x % for a package to spawn + percent = 25, -- A 1 in x % for a package to spawn searchTime = 5000, -- How long the progress bar is searchLabel = 'Searching', -- Label of the progress bar blacklistedModels = { --All Models you dont want the script to spawn packages in [`caddy`] = true, -- Classed as a "automobile" [`forklift`] = true, -- Classed as a "automobile" [`blazer`] = true, -- Classed as a "automobile" + [`mlue`] = true, -- Classed as a "automobile" + [`mlue2`] = true, -- Classed as a "automobile" }, packageProps = { -- The model of the objects that can spawn in the seat `prop_drug_package_02`,