Trying to optimise trace system, dynamic wait time, speed setting

This commit is contained in:
Dan
2019-12-03 14:09:38 +00:00
parent 3373d57410
commit 4ae2fe41b1

View File

@@ -57,7 +57,9 @@ RADAR.vars =
["alert"] = true, ["alert"] = true,
["beep"] = 0.6 ["beep"] = 0.6,
["speedType"] = "mph"
}, },
menuActive = false, menuActive = false,
@@ -66,7 +68,8 @@ RADAR.vars =
{ displayText = { "¦¦¦", "FAS" }, optionsText = { "On¦", "Off" }, options = { true, false }, optionIndex = 1, settingText = "fastDisplay" }, { displayText = { "¦¦¦", "FAS" }, optionsText = { "On¦", "Off" }, options = { true, false }, optionIndex = 1, settingText = "fastDisplay" },
{ displayText = { "¦SL", "SEn" }, optionsText = { "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 3, settingText = "same" }, { displayText = { "¦SL", "SEn" }, optionsText = { "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 3, settingText = "same" },
{ displayText = { "¦OP", "SEn" }, optionsText = { "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 3, settingText = "opp" }, { displayText = { "¦OP", "SEn" }, optionsText = { "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 3, settingText = "opp" },
{ displayText = { "¦¦b", "EEP" }, optionsText = { "Off", "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 4, settingText = "beep" } { displayText = { "BEE", "P¦¦" }, optionsText = { "Off", "¦1¦", "¦2¦", "¦3¦", "¦4¦", "¦5¦" }, options = { 0.0, 0.2, 0.4, 0.6, 0.8, 1.0 }, optionIndex = 4, settingText = "beep" },
{ displayText = { "Uni", "tS¦" }, optionsText = { "USA", "INT" }, options = { "mph", "kmh" }, optionIndex = 1, settingText = "speedType" }
}, },
-- Player's vehicle speed, this is used to update the patrol vehicle speed on the radar -- Player's vehicle speed, this is used to update the patrol vehicle speed on the radar
@@ -74,10 +77,6 @@ RADAR.vars =
patrolLocked = false, patrolLocked = false,
psBlank = false, psBlank = false,
-- The speed type, this is used when converting speeds to a readable format
-- Either "mph" or "kmh", can be toggle in-game
speedType = "mph",
-- Antennas, this table contains all of the data needed for operation of the front and rear antennas -- Antennas, this table contains all of the data needed for operation of the front and rear antennas
antennas = { antennas = {
-- Variables for the front antenna -- Variables for the front antenna
@@ -107,7 +106,7 @@ RADAR.vars =
}, },
-- The maximum distance that the radar system's ray traces can go -- The maximum distance that the radar system's ray traces can go
maxCheckDist = 300.0, maxCheckDist = 400.0,
-- Cached dynamic vehicle sphere sizes, automatically populated when the system is running -- Cached dynamic vehicle sphere sizes, automatically populated when the system is running
sphereSizes = {}, sphereSizes = {},
@@ -137,7 +136,9 @@ RADAR.vars =
rayTraceState = 0, rayTraceState = 0,
-- Number of ray traces, automatically cached when the system first runs -- Number of ray traces, automatically cached when the system first runs
numberOfRays = 0 numberOfRays = 0,
threadWaitTime = 500
} }
-- These vectors are used in the custom ray tracing system -- These vectors are used in the custom ray tracing system
@@ -145,10 +146,10 @@ RADAR.rayTraces = {
-- { startVec = { x = 0.0 }, endVec = { x = 0.0, y = 200.0 }, rayType = "same" }, -- { startVec = { x = 0.0 }, endVec = { x = 0.0, y = 200.0 }, rayType = "same" },
-- { startVec = { x = -5.0 }, endVec = { x = -5.0, y = 200.0 }, rayType = "same" }, -- { startVec = { x = -5.0 }, endVec = { x = -5.0, y = 200.0 }, rayType = "same" },
-- { startVec = { x = 5.0 }, endVec = { x = 5.0, y = 200.0 }, rayType = "same" }, -- { startVec = { x = 5.0 }, endVec = { x = 5.0, y = 200.0 }, rayType = "same" },
{ startVec = { x = 3.0 }, endVec = { x = 3.0, y = 0.0, baseY = 300.0 }, rayType = "same" }, { startVec = { x = 3.0 }, endVec = { x = 3.0, y = 0.0, baseY = 400.0 }, rayType = "same" },
{ startVec = { x = -3.0 }, endVec = { x = -3.0, y = 0.0, baseY = 300.0 }, rayType = "same" }, { startVec = { x = -3.0 }, endVec = { x = -3.0, y = 0.0, baseY = 400.0 }, rayType = "same" },
{ startVec = { x = -10.0 }, endVec = { x = -10.0, y = 0.0, baseY = 300.0 }, rayType = "opp" }, { startVec = { x = -10.0 }, endVec = { x = -10.0, y = 0.0, baseY = 400.0 }, rayType = "opp" },
{ startVec = { x = -16.0 }, endVec = { x = -16.0, y = 0.0, baseY = 300.0 }, rayType = "opp" } { startVec = { x = -16.0 }, endVec = { x = -16.0, y = 0.0, baseY = 400.0 }, rayType = "opp" }
} }
-- Each of these are used for sorting the captured vehicle data, the 'strongest' filter is used for the main -- Each of these are used for sorting the captured vehicle data, the 'strongest' filter is used for the main
@@ -223,6 +224,18 @@ function RADAR:SendSettingUpdate()
SendNUIMessage( { _type = "settingUpdate", antennaData = antennas, fast = fast } ) SendNUIMessage( { _type = "settingUpdate", antennaData = antennas, fast = fast } )
end end
function RADAR:CanPerformMainTask()
return self:IsPowerOn() and not self:IsPoweringUp() and not self:IsMenuOpen()
end
function RADAR:GetThreadWaitTime()
return self.vars.threadWaitTime
end
function RADAR:SetThreadWaitTime( time )
self.vars.threadWaitTime = time
end
--[[------------------------------------------------------------------------ --[[------------------------------------------------------------------------
Radar menu functions Radar menu functions
@@ -372,9 +385,9 @@ function RADAR:ResetRayTraceState()
end end
function RADAR:GetIntersectedVehIsFrontOrRear( t ) function RADAR:GetIntersectedVehIsFrontOrRear( t )
if ( t > 10.0 ) then if ( t > 8.0 ) then
return 1 -- vehicle is in front return 1 -- vehicle is in front
elseif ( t < -10.0 ) then elseif ( t < -8.0 ) then
return -1 -- vehicle is behind return -1 -- vehicle is behind
end end
@@ -661,7 +674,7 @@ function RADAR:InsertCapturedVehicleData( t, rt )
end end
function RADAR:HasVehicleAlreadyBeenHit( key ) function RADAR:HasVehicleAlreadyBeenHit( key )
return self.vars.tempVehicleIDs[key] == true return self.vars.tempVehicleIDs[key]
end end
function RADAR:SetVehicleHasBeenHit( key ) function RADAR:SetVehicleHasBeenHit( key )
@@ -727,10 +740,12 @@ end
Radar functions Radar functions
------------------------------------------------------------------------]]-- ------------------------------------------------------------------------]]--
function RADAR:GetVehSpeedFormatted( speed ) function RADAR:GetVehSpeedFormatted( speed )
if ( self.vars.speedType == "mph" ) then if ( self:GetSettingValue( "speedType" ) == "mph" ) then
return UTIL:Round( math.ceil( speed * 2.236936 ), 0 ) -- return UTIL:Round( math.ceil( speed * 2.236936 ), 0 )
return UTIL:Round( speed * 2.236936, 0 )
else else
return UTIL:Round( math.ceil( speed * 3.6 ), 0 ) -- return UTIL:Round( math.ceil( speed * 3.6 ), 0 )
return UTIL:Round( speed * 3.6, 0 )
end end
end end
@@ -828,18 +843,18 @@ function RADAR:RunControlManager()
UTIL:Notify( "Radar power toggled." ) UTIL:Notify( "Radar power toggled." )
end end
if ( IsDisabledControlJustPressed( 1, 118 ) ) then --[[ if ( IsDisabledControlJustPressed( 1, 118 ) ) then
self:ToggleFastDisplay() self:ToggleFastDisplay()
UTIL:Notify( "Fast display toggled." ) UTIL:Notify( "Fast display toggled." )
end end ]]
-- 'Num8' key, locks speed from front antenna -- 'Num8' key, locks speed from front antenna
if ( IsDisabledControlJustReleased( 1, 111 ) ) then if ( IsDisabledControlJustPressed( 1, 111 ) ) then
self:LockAntennaSpeed( "front" ) self:LockAntennaSpeed( "front" )
end end
-- 'Num5' key, locks speed from rear antenna -- 'Num5' key, locks speed from rear antenna
if ( IsDisabledControlJustReleased( 1, 112 ) ) then if ( IsDisabledControlJustPressed( 1, 112 ) ) then
self:LockAntennaSpeed( "rear" ) self:LockAntennaSpeed( "rear" )
end end
end end
@@ -897,27 +912,71 @@ end )
--[[------------------------------------------------------------------------ --[[------------------------------------------------------------------------
Main function Main function
------------------------------------------------------------------------]]-- ------------------------------------------------------------------------]]--
function RADAR:RunDynamicThreadWaitCheck()
local speed = self:GetPatrolSpeed()
if ( speed < 0.1 ) then
self:SetThreadWaitTime( 200 )
else
self:SetThreadWaitTime( 500 )
end
end
Citizen.CreateThread( function()
while ( true ) do
RADAR:RunDynamicThreadWaitCheck()
Citizen.Wait( 2500 )
end
end )
function RADAR:RunThreads()
if ( DoesEntityExist( PLY.veh ) and PLY.inDriverSeat and PLY.vehClassValid and self:CanPerformMainTask() ) then
if ( self:GetRayTraceState() == 0 ) then
local vehs = self:GetVehiclePool()
self:ResetCapturedVehicles()
self:ResetRayTraceState()
self:CreateRayThreads( PLY.veh, vehs )
Citizen.Wait( self:GetThreadWaitTime() )
elseif ( self:GetRayTraceState() == self:GetNumOfRays() ) then
-- self:IncreaseRadarStage()
self:ResetRayTraceState()
end
end
end
Citizen.CreateThread( function()
while ( true ) do
RADAR:RunThreads()
Citizen.Wait( 0 )
end
end )
function RADAR:Main() function RADAR:Main()
-- Check to make sure the player is in the driver's seat, and also that the vehicle has a class of VC_EMERGENCY (18) -- Check to make sure the player is in the driver's seat, and also that the vehicle has a class of VC_EMERGENCY (18)
if ( DoesEntityExist( PLY.veh ) and PLY.inDriverSeat and PLY.vehClassValid and self:IsPowerOn() and not self:IsPoweringUp() and not self:IsMenuOpen() ) then if ( DoesEntityExist( PLY.veh ) and PLY.inDriverSeat and PLY.vehClassValid and self:CanPerformMainTask() ) then
local plyVehPos = GetEntityCoords( PLY.veh ) -- local plyVehPos = GetEntityCoords( PLY.veh )
-- First stage of the radar - get all of the vehicles hit by the radar -- First stage of the radar - get all of the vehicles hit by the radar
--if ( self:GetRadarStage() == 0 ) then --if ( self:GetRadarStage() == 0 ) then
if ( self:GetRayTraceState() == 0 ) then --[[if ( self:GetRayTraceState() == 0 ) then
local vehs = self:GetVehiclePool() local vehs = self:GetVehiclePool()
self:ResetCapturedVehicles() self:ResetCapturedVehicles()
self:ResetRayTraceState() self:ResetRayTraceState()
self:CreateRayThreads( PLY.veh, vehs ) self:CreateRayThreads( PLY.veh, vehs )
elseif ( self:GetRayTraceState() == self:GetNumOfRays() ) then elseif ( self:GetRayTraceState() == self:GetNumOfRays() ) then
self:IncreaseRadarStage() self:IncreaseRadarStage()]]
--end --end
--elseif ( self:GetRadarStage() == 1 ) then --elseif ( self:GetRadarStage() == 1 ) then
local data = {} local data = {}
-- Get the player's vehicle speed -- Get the player's vehicle speed
local entSpeed = GetEntitySpeed( PLY.veh ) local entSpeed = GetEntitySpeed( PLY.veh )
self:SetPatrolSpeed( entSpeed )
if ( entSpeed == 0 ) then if ( entSpeed == 0 ) then
data.patrolSpeed = "¦[]" data.patrolSpeed = "¦[]"
@@ -953,7 +1012,8 @@ function RADAR:Main()
-- The vehicle data exists for this slot -- The vehicle data exists for this slot
if ( av[ant][i] ~= nil ) then if ( av[ant][i] ~= nil ) then
-- We already have the vehicle speed as we needed it earlier on for filtering -- We already have the vehicle speed as we needed it earlier on for filtering
data.antennas[ant][i].speed = UTIL:FormatSpeed( self:GetVehSpeedFormatted( av[ant][i].speed ) ) local uSpeed = GetEntitySpeed( av[ant][i].veh )
data.antennas[ant][i].speed = UTIL:FormatSpeed( self:GetVehSpeedFormatted( uSpeed ) )
-- Work out if the vehicle is closing or away -- Work out if the vehicle is closing or away
local ownH = UTIL:Round( GetEntityHeading( PLY.veh ), 0 ) local ownH = UTIL:Round( GetEntityHeading( PLY.veh ), 0 )
@@ -989,7 +1049,7 @@ function RADAR:Main()
self:ResetTempVehicleIDs() self:ResetTempVehicleIDs()
self:ResetRadarStage() self:ResetRadarStage()
self:ResetRayTraceState() self:ResetRayTraceState()
end --end
end end
end end
@@ -1046,28 +1106,32 @@ end )
-- Ray line drawing -- Ray line drawing
-- local veh = GetVehiclePedIsIn( PlayerPedId(), false ) -- local veh = GetVehiclePedIsIn( PlayerPedId(), false )
for k, v in pairs( RADAR.rayTraces ) do UTIL:DrawDebugText( 0.50, 0.20, 0.75, true, "Current thread iteration: " .. tostring( currentThreadIteration ) )
local startP = GetOffsetFromEntityInWorldCoords( PLY.veh, v.startVec.x, 0.0, 0.0 )
local endP = GetOffsetFromEntityInWorldCoords( PLY.veh, v.endVec.x, v.endVec.y, 0.0 )
UTIL:DrawDebugLine( startP, endP ) if ( RADAR.config.debug_mode ) then
end for k, v in pairs( RADAR.rayTraces ) do
local startP = GetOffsetFromEntityInWorldCoords( PLY.veh, v.startVec.x, 0.0, 0.0 )
local endP = GetOffsetFromEntityInWorldCoords( PLY.veh, v.endVec.x, v.endVec.y, 0.0 )
local av = RADAR:GetActiveVehicles() UTIL:DrawDebugLine( startP, endP )
for ant in UTIL:Values( { "front", "rear" } ) do
for i = 1, 2, 1 do
if ( av[ant] ~= nil and av[ant][i] ~= nil ) then
local pos = GetEntityCoords( av[ant][i].veh )
local r = RADAR:GetDynamicRadius( av[ant][i].veh )
if ( i == 1 ) then
UTIL:DrawDebugSphere( pos.x, pos.y, pos.z, r, { 255, 127, 0, 100 } )
else
UTIL:DrawDebugSphere( pos.x, pos.y, pos.z, r, { 255, 0, 0, 100 } )
end
end
end end
local av = RADAR:GetActiveVehicles()
for ant in UTIL:Values( { "front", "rear" } ) do
for i = 1, 2, 1 do
if ( av[ant] ~= nil and av[ant][i] ~= nil ) then
local pos = GetEntityCoords( av[ant][i].veh )
local r = RADAR:GetDynamicRadius( av[ant][i].veh )
if ( i == 1 ) then
UTIL:DrawDebugSphere( pos.x, pos.y, pos.z, r, { 255, 127, 0, 100 } )
else
UTIL:DrawDebugSphere( pos.x, pos.y, pos.z, r, { 255, 0, 0, 100 } )
end
end
end
end
end end
Citizen.Wait( 0 ) Citizen.Wait( 0 )