Scripts/resources/[qb]/[qb_jobs]/qb-policejob/client/objects.lua

301 lines
11 KiB
Lua
Raw Normal View History

2024-12-29 20:06:22 +00:00
-- Variables
local ObjectList = {}
local SpawnedSpikes = {}
local spikemodel = `P_ld_stinger_s`
local ClosestSpike = nil
-- Functions
local function GetClosestPoliceObject()
local pos = GetEntityCoords(PlayerPedId(), true)
local current = nil
local dist = nil
for id, _ in pairs(ObjectList) do
local dist2 = #(pos - ObjectList[id].coords)
if current then
if dist2 < dist then
current = id
dist = dist2
end
else
dist = dist2
current = id
end
end
return current, dist
end
function GetClosestSpike()
local pos = GetEntityCoords(PlayerPedId(), true)
local current = nil
local dist = nil
for id, _ in pairs(SpawnedSpikes) do
if current then
if #(pos - vector3(SpawnedSpikes[id].coords.x, SpawnedSpikes[id].coords.y, SpawnedSpikes[id].coords.z)) < dist then
current = id
end
else
dist = #(pos - vector3(SpawnedSpikes[id].coords.x, SpawnedSpikes[id].coords.y, SpawnedSpikes[id].coords.z))
current = id
end
end
ClosestSpike = current
end
local function DrawText3D(x, y, z, text)
SetTextScale(0.35, 0.35)
SetTextFont(4)
SetTextProportional(1)
SetTextColour(255, 255, 255, 215)
SetTextEntry("STRING")
SetTextCentre(true)
AddTextComponentString(text)
SetDrawOrigin(x,y,z, 0)
DrawText(0.0, 0.0)
local factor = (string.len(text)) / 370
DrawRect(0.0, 0.0+0.0125, 0.017+ factor, 0.03, 0, 0, 0, 75)
ClearDrawOrigin()
end
-- Events
RegisterNetEvent('police:client:spawnCone', function()
QBCore.Functions.Progressbar("spawn_object", Lang:t("progressbar.place_object"), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "anim@narcotics@trash",
anim = "drop_front",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
TriggerServerEvent("police:server:spawnObject", "cone")
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end)
RegisterNetEvent('police:client:spawnBarrier', function()
QBCore.Functions.Progressbar("spawn_object", Lang:t("progressbar.place_object"), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "anim@narcotics@trash",
anim = "drop_front",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
TriggerServerEvent("police:server:spawnObject", "barrier")
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end)
RegisterNetEvent('police:client:spawnRoadSign', function()
QBCore.Functions.Progressbar("spawn_object", Lang:t("progressbar.place_object"), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "anim@narcotics@trash",
anim = "drop_front",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
TriggerServerEvent("police:server:spawnObject", "roadsign")
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end)
RegisterNetEvent('police:client:spawnTent', function()
QBCore.Functions.Progressbar("spawn_object", Lang:t("progressbar.place_object"), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "anim@narcotics@trash",
anim = "drop_front",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
TriggerServerEvent("police:server:spawnObject", "tent")
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end)
RegisterNetEvent('police:client:spawnLight', function()
QBCore.Functions.Progressbar("spawn_object", Lang:t("progressbar.place_object"), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "anim@narcotics@trash",
anim = "drop_front",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
TriggerServerEvent("police:server:spawnObject", "light")
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "anim@narcotics@trash", "drop_front", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end)
RegisterNetEvent('police:client:deleteObject', function()
local objectId, dist = GetClosestPoliceObject()
if dist < 5.0 then
QBCore.Functions.Progressbar("remove_object", Lang:t('progressbar.remove_object'), 2500, false, true, {
disableMovement = true,
disableCarMovement = true,
disableMouse = false,
disableCombat = true,
}, {
animDict = "weapons@first_person@aim_rng@generic@projectile@thermal_charge@",
anim = "plant_floor",
flags = 16,
}, {}, {}, function() -- Done
StopAnimTask(PlayerPedId(), "weapons@first_person@aim_rng@generic@projectile@thermal_charge@", "plant_floor", 1.0)
TriggerServerEvent("police:server:deleteObject", objectId)
end, function() -- Cancel
StopAnimTask(PlayerPedId(), "weapons@first_person@aim_rng@generic@projectile@thermal_charge@", "plant_floor", 1.0)
QBCore.Functions.Notify(Lang:t("error.canceled"), "error")
end)
end
end)
RegisterNetEvent('police:client:removeObject', function(objectId)
NetworkRequestControlOfEntity(ObjectList[objectId].object)
DeleteObject(ObjectList[objectId].object)
ObjectList[objectId] = nil
end)
RegisterNetEvent('police:client:spawnObject', function(objectId, type, player)
local coords = GetEntityCoords(GetPlayerPed(GetPlayerFromServerId(player)))
local heading = GetEntityHeading(GetPlayerPed(GetPlayerFromServerId(player)))
local forward = GetEntityForwardVector(PlayerPedId())
local x, y, z = table.unpack(coords + forward * 0.5)
local spawnedObj = CreateObject(Config.Objects[type].model, x, y, z, true, false, false)
PlaceObjectOnGroundProperly(spawnedObj)
SetEntityHeading(spawnedObj, heading)
FreezeEntityPosition(spawnedObj, Config.Objects[type].freeze)
ObjectList[objectId] = {
id = objectId,
object = spawnedObj,
coords = vector3(x, y, z - 0.3),
}
end)
RegisterNetEvent('police:client:SpawnSpikeStrip', function()
if #SpawnedSpikes + 1 < Config.MaxSpikes then
if PlayerJob.name == "police" and PlayerJob.onduty then
local spawnCoords = GetOffsetFromEntityInWorldCoords(PlayerPedId(), 0.0, 2.0, 0.0)
local spike = CreateObject(spikemodel, spawnCoords.x, spawnCoords.y, spawnCoords.z, 1, 1, 1)
local netid = NetworkGetNetworkIdFromEntity(spike)
SetNetworkIdExistsOnAllMachines(netid, true)
SetNetworkIdCanMigrate(netid, false)
SetEntityHeading(spike, GetEntityHeading(PlayerPedId()))
PlaceObjectOnGroundProperly(spike)
SpawnedSpikes[#SpawnedSpikes+1] = {
coords = vector3(spawnCoords.x, spawnCoords.y, spawnCoords.z),
netid = netid,
object = spike,
}
TriggerServerEvent('police:server:SyncSpikes', SpawnedSpikes)
end
else
QBCore.Functions.Notify(Lang:t("error.no_spikestripe"), 'error')
end
end)
RegisterNetEvent('police:client:SyncSpikes', function(table)
SpawnedSpikes = table
end)
-- Threads
CreateThread(function()
while true do
if LocalPlayer.state.isLoggedIn then
GetClosestSpike()
end
Wait(500)
end
end)
CreateThread(function()
while true do
if LocalPlayer.state.isLoggedIn then
if ClosestSpike then
local tires = {
{bone = "wheel_lf", index = 0},
{bone = "wheel_rf", index = 1},
{bone = "wheel_lm", index = 2},
{bone = "wheel_rm", index = 3},
{bone = "wheel_lr", index = 4},
{bone = "wheel_rr", index = 5}
}
for a = 1, #tires do
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local tirePos = GetWorldPositionOfEntityBone(vehicle, GetEntityBoneIndexByName(vehicle, tires[a].bone))
local spike = GetClosestObjectOfType(tirePos.x, tirePos.y, tirePos.z, 15.0, spikemodel, 1, 1, 1)
local spikePos = GetEntityCoords(spike, false)
local distance = #(tirePos - spikePos)
if distance < 1.8 then
if not IsVehicleTyreBurst(vehicle, tires[a].index, true) or IsVehicleTyreBurst(vehicle, tires[a].index, false) then
SetVehicleTyreBurst(vehicle, tires[a].index, false, 1000.0)
end
end
end
end
end
Wait(3)
end
end)
CreateThread(function()
while true do
local sleep = 1000
if LocalPlayer.state.isLoggedIn then
if ClosestSpike then
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)
local dist = #(pos - SpawnedSpikes[ClosestSpike].coords)
if dist < 4 then
if not IsPedInAnyVehicle(PlayerPedId()) then
if PlayerJob.name == "police" and PlayerJob.onduty then
sleep = 0
DrawText3D(pos.x, pos.y, pos.z, Lang:t('info.delete_spike'))
if IsControlJustPressed(0, 38) then
local spike = NetToEnt(SpawnedSpikes[ClosestSpike].netid)
NetworkRegisterEntityAsNetworked(spike)
NetworkRequestControlOfEntity(spike)
SetEntityAsMissionEntity(spike)
Wait(500)
DeleteEntity(spike)
SpawnedSpikes[ClosestSpike] = nil
ClosestSpike = nil
TriggerServerEvent('police:server:SyncSpikes', SpawnedSpikes)
end
end
end
end
end
end
Wait(sleep)
end
end)