Skip to content

Commit

Permalink
feat(client/server): Object re-work
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
ihyajb committed Aug 28, 2024
1 parent 2b6aab0 commit 90ab97f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 64 deletions.
64 changes: 46 additions & 18 deletions client/cl_main.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local Config = require'shared.config'
local Objects = {}

local Seats = {
'seat_pside_f',
Expand All @@ -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)
Expand All @@ -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)
60 changes: 16 additions & 44 deletions server/sv_main.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
lib.versionCheck('ihyajb/aj-veh-package')
local Packages = {}
local Config = require'shared.config'

local DoesEntityExist = DoesEntityExist
Expand All @@ -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
Expand All @@ -20,63 +18,37 @@ 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))
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)
5 changes: 3 additions & 2 deletions shared/config.lua
Original file line number Diff line number Diff line change
@@ -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`,
Expand Down

0 comments on commit 90ab97f

Please sign in to comment.