Files
wk_wars2x/old_cl_radar.lua
2019-11-07 18:44:24 +00:00

619 lines
20 KiB
Lua

--[[------------------------------------------------------------------------
Wraith Radar System - v1.0.3
Created by WolfKnight
------------------------------------------------------------------------]]--
--[[------------------------------------------------------------------------
Resource Rename Fix
------------------------------------------------------------------------]]--
Citizen.CreateThread( function()
Citizen.Wait( 1000 )
local resourceName = GetCurrentResourceName()
SendNUIMessage( { resourcename = resourceName } )
end )
--[[-----------------------------------------------------------------------
Test
-----------------------------------------------------------------------]]--
local entityEnumerator = {
__gc = function(enum)
if enum.destructor and enum.handle then
enum.destructor(enum.handle)
end
enum.destructor = nil
enum.handle = nil
end
}
local function EnumerateEntities(initFunc, moveFunc, disposeFunc)
return coroutine.wrap(function()
local iter, id = initFunc()
if not id or id == 0 then
disposeFunc(iter)
return
end
local enum = {handle = iter, destructor = disposeFunc}
setmetatable(enum, entityEnumerator)
local next = true
repeat
coroutine.yield(id)
next, id = moveFunc(iter)
until not next
enum.destructor, enum.handle = nil, nil
disposeFunc(iter)
end)
end
function EnumerateObjects()
return EnumerateEntities(FindFirstObject, FindNextObject, EndFindObject)
end
function EnumeratePeds()
return EnumerateEntities(FindFirstPed, FindNextPed, EndFindPed)
end
function EnumerateVehicles()
return EnumerateEntities(FindFirstVehicle, FindNextVehicle, EndFindVehicle)
end
function EnumeratePickups()
return EnumerateEntities(FindFirstPickup, FindNextPickup, EndFindPickup)
end
--[[------------------------------------------------------------------------
Utils
------------------------------------------------------------------------]]--
function round( num )
return tonumber( string.format( "%.0f", num ) )
end
function oppang( ang )
return ( ang + 180 ) % 360
end
function FormatSpeed( speed )
return string.format( "%03d", speed )
end
function GetVehicleInDirectionSphere( entFrom, coordFrom, coordTo )
local rayHandle = StartShapeTestCapsule( coordFrom.x, coordFrom.y, coordFrom.z, coordTo.x, coordTo.y, coordTo.z, 2.0, 10, entFrom, 7 )
local _, _, _, _, vehicle = GetShapeTestResult( rayHandle )
return vehicle
end
function IsEntityInMyHeading( myAng, tarAng, range )
local rangeStartFront = myAng - ( range / 2 )
local rangeEndFront = myAng + ( range / 2 )
local opp = oppang( myAng )
local rangeStartBack = opp - ( range / 2 )
local rangeEndBack = opp + ( range / 2 )
if ( ( tarAng > rangeStartFront ) and ( tarAng < rangeEndFront ) ) then
return true
elseif ( ( tarAng > rangeStartBack ) and ( tarAng < rangeEndBack ) ) then
return false
else
return nil
end
end
--[[------------------------------------------------------------------------
Police Vehicle Radar
------------------------------------------------------------------------]]--
local radarEnabled = false
local hidden = false
local radarInfo =
{
patrolSpeed = "000",
speedType = "mph",
fwdPrevVeh = 0,
fwdXmit = true,
fwdMode = "same",
fwdSpeed = "000",
fwdFast = "000",
fwdFastLocked = false,
fwdDir = nil,
fwdFastSpeed = 0,
bwdPrevVeh = 0,
bwdXmit = false,
bwdMode = "none",
bwdSpeed = "OFF",
bwdFast = "OFF",
bwdFastLocked = false,
bwdDir = nil,
bwdFastSpeed = 0,
fastResetLimit = 150,
fastLimit = 60,
angles = { [ "same" ] = { x = 0.0, y = 70.0, z = 0.0 }, [ "opp" ] = { x = -10.0, y = 50.0, z = 0.0 } },
lockBeep = true
}
RegisterNetEvent( 'wk:toggleRadar' )
AddEventHandler( 'wk:toggleRadar', function()
local ped = GetPlayerPed( -1 )
if ( IsPedSittingInAnyVehicle( ped ) ) then
local vehicle = GetVehiclePedIsIn( ped, false )
if ( GetVehicleClass( vehicle ) == 18 ) then
radarEnabled = not radarEnabled
if ( radarEnabled ) then
Notify( "~b~Radar enabled." )
else
Notify( "~b~Radar disabled." )
end
ResetFrontAntenna()
ResetRearAntenna()
SendNUIMessage({
toggleradar = true,
fwdxmit = radarInfo.fwdXmit,
fwdmode = radarInfo.fwdMode,
bwdxmit = radarInfo.bwdXmit,
bwdmode = radarInfo.bwdMode
})
else
Notify( "~r~You must be in a police vehicle." )
end
else
Notify( "~r~You must be in a vehicle." )
end
end )
RegisterNetEvent( 'wk:changeRadarLimit' )
AddEventHandler( 'wk:changeRadarLimit', function( speed )
radarInfo.fastLimit = speed
end )
function Radar_SetLimit()
Citizen.CreateThread( function()
DisplayOnscreenKeyboard( false, "", "", "", "", "", "", 4 )
while true do
if ( UpdateOnscreenKeyboard() == 1 ) then
local speedStr = GetOnscreenKeyboardResult()
if ( string.len( speedStr ) > 0 ) then
local speed = tonumber( speedStr )
if ( speed < 999 and speed > 1 ) then
TriggerEvent( 'wk:changeRadarLimit', speed )
end
break
else
DisplayOnscreenKeyboard( false, "", "", "", "", "", "", 4 )
end
elseif ( UpdateOnscreenKeyboard() == 2 ) then
break
end
Citizen.Wait( 0 )
end
end )
end
function ResetFrontAntenna()
if ( radarInfo.fwdXmit ) then
radarInfo.fwdSpeed = "000"
radarInfo.fwdFast = "000"
else
radarInfo.fwdSpeed = "OFF"
radarInfo.fwdFast = " "
end
radarInfo.fwdDir = nil
radarInfo.fwdFastSpeed = 0
radarInfo.fwdFastLocked = false
end
function ResetRearAntenna()
if ( radarInfo.bwdXmit ) then
radarInfo.bwdSpeed = "000"
radarInfo.bwdFast = "000"
else
radarInfo.bwdSpeed = "OFF"
radarInfo.bwdFast = " "
end
radarInfo.bwdDir = nil
radarInfo.bwdFastSpeed = 0
radarInfo.bwdFastLocked = false
end
function ResetFrontFast()
if ( radarInfo.fwdXmit ) then
radarInfo.fwdFast = "000"
radarInfo.fwdFastSpeed = 0
radarInfo.fwdFastLocked = false
SendNUIMessage( { lockfwdfast = false } )
end
end
function ResetRearFast()
if ( radarInfo.bwdXmit ) then
radarInfo.bwdFast = "000"
radarInfo.bwdFastSpeed = 0
radarInfo.bwdFastLocked = false
SendNUIMessage( { lockbwdfast = false } )
end
end
function CloseRadarRC()
SendNUIMessage({
toggleradarrc = true
})
TriggerEvent( 'wk:toggleMenuControlLock', false )
SetNuiFocus( false )
end
function ToggleSpeedType()
if ( radarInfo.speedType == "mph" ) then
radarInfo.speedType = "kmh"
Notify( "~b~Speed type set to Km/h." )
else
radarInfo.speedType = "mph"
Notify( "~b~Speed type set to MPH." )
end
end
function ToggleLockBeep()
if ( radarInfo.lockBeep ) then
radarInfo.lockBeep = false
Notify( "~b~Radar fast lock beep disabled." )
else
radarInfo.lockBeep = true
Notify( "~b~Radar fast lock beep enabled." )
end
end
function GetVehSpeed( veh )
if ( radarInfo.speedType == "mph" ) then
return GetEntitySpeed( veh ) * 2.236936
else
return GetEntitySpeed( veh ) * 3.6
end
end
function ManageVehicleRadar()
if ( radarEnabled ) then
local ped = GetPlayerPed( -1 )
if ( IsPedSittingInAnyVehicle( ped ) ) then
local vehicle = GetVehiclePedIsIn( ped, false )
if ( GetPedInVehicleSeat( vehicle, -1 ) == ped and GetVehicleClass( vehicle ) == 18 ) then
-- Patrol speed
local vehicleSpeed = round( GetVehSpeed( vehicle ), 0 )
radarInfo.patrolSpeed = FormatSpeed( vehicleSpeed )
-- Rest of the radar options
local vehiclePos = GetEntityCoords( vehicle, true )
local h = round( GetEntityHeading( vehicle ), 0 )
-- Front Antenna
if ( radarInfo.fwdXmit ) then
local newPos = GetOffsetFromEntityInWorldCoords( vehicle, 0.0, 5.0, 0.0 )
local forwardPosition = GetOffsetFromEntityInWorldCoords( vehicle, radarInfo.angles[ radarInfo.fwdMode ].x, radarInfo.angles[ radarInfo.fwdMode ].y, radarInfo.angles[ radarInfo.fwdMode ].z )
local fwdPos = { x = forwardPosition.x, y = forwardPosition.y, z = forwardPosition.z }
local _, fwdZ = GetGroundZFor_3dCoord( fwdPos.x, fwdPos.y, fwdPos.z + 500.0 )
if ( fwdPos.z < fwdZ and not ( fwdZ > vehiclePos.z + 1.0 ) ) then
fwdPos.z = fwdZ + 0.5
end
-- Draw line for debug
--DrawLine( newPos.x, newPos.y, newPos.z, fwdPos.x, fwdPos.y, fwdPos.z, 255, 255, 255, 255 )
--DrawDText( 0.015, 0.25, 0.65, false, "Vehicle X: " .. vehiclePos.x .. "\nVehicle Y: " .. vehiclePos.y .. "\nVehicle Z: " .. vehiclePos.z, 255, 255, 255, 255 )
--DrawDText( 0.2, 0.25, 0.65, false, "New X: " .. newPos.x .. "\nNew Y: " .. newPos.y .. "\nNew Z: " .. newPos.z, 255, 255, 255, 255 )
--DrawDText( 0.015, 0.42, 0.65, false, "End X: " .. fwdPos.x .. "\nEnd Y: " .. fwdPos.y .. "\nEnd Z: " .. fwdPos.z, 255, 255, 255, 255 )
local packedFwdPos = vector3( fwdPos.x, fwdPos.y, fwdPos.z )
local newVehiclePos = vector3( newPos.x, newPos.y, newPos.z )
local fwdVeh = GetVehicleInDirectionSphere( vehicle, newVehiclePos, packedFwdPos )
--DrawDText( 0.015, 0.65, 0.65, false, "Ray entity: " .. tostring( fwdVeh ) .. "\nType: " .. GetEntityType( fwdVeh ), 255, 255, 255, 255 )
if ( DoesEntityExist( fwdVeh ) and IsEntityAVehicle( fwdVeh ) ) then
local fwdVehSpeed = round( GetVehSpeed( fwdVeh ), 0 )
local fwdVehHeading = round( GetEntityHeading( fwdVeh ), 0 )
local dir = IsEntityInMyHeading( h, fwdVehHeading, 100 )
-- Draw line for debug to car
local pos = GetEntityCoords( fwdVeh, true )
-- DrawLine( vehiclePos.x, vehiclePos.y, vehiclePos.z, pos.x, pos.y, pos.z, 255, 255, 255, 255 )
DrawMarker(2, pos.x, pos.y, pos.z + 6, 0.0, 0.0, 0.0, 0.0, 180.0, 0.0, 2.0, 2.0, 2.0, 255, 128, 0, 50, false, true, 2, nil, nil, false)
radarInfo.fwdSpeed = FormatSpeed( fwdVehSpeed )
radarInfo.fwdDir = dir
if ( fwdVehSpeed > radarInfo.fastLimit and not radarInfo.fwdFastLocked ) then
if ( radarInfo.lockBeep ) then
PlaySoundFrontend( -1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS", 1 )
end
radarInfo.fwdFastSpeed = fwdVehSpeed
radarInfo.fwdFastLocked = true
SendNUIMessage( { lockfwdfast = true } )
end
radarInfo.fwdFast = FormatSpeed( radarInfo.fwdFastSpeed )
radarInfo.fwdPrevVeh = fwdVeh
--[[ Test
local plate = GetVehicleNumberPlateText( fwdVeh )
local colourPrimary, colourSecondary = GetVehicleColours( fwdVeh )
local name = GetLabelText( GetDisplayNameFromVehicleModel( GetEntityModel( fwdVeh ) ) )
local class = GetLabelText( "VEH_CLASS_" .. tostring( GetVehicleClass( fwdVeh ) ) )
Notify( "Name: " .. name .. "\nClass: " .. class .. "\nPlate: " .. plate .. "\nColour: " .. CAR_COLOURS[ tostring( colourPrimary ) ] .. " / " .. CAR_COLOURS[ tostring( colourSecondary ) ] )
]]
end
end
-- Rear Antenna
if ( radarInfo.bwdXmit ) then
local backwardPosition = GetOffsetFromEntityInWorldCoords( vehicle, radarInfo.angles[ radarInfo.bwdMode ].x, -radarInfo.angles[ radarInfo.bwdMode ].y, radarInfo.angles[ radarInfo.bwdMode ].z )
local bwdPos = { x = backwardPosition.x, y = backwardPosition.y, z = backwardPosition.z }
local _, bwdZ = GetGroundZFor_3dCoord( bwdPos.x, bwdPos.y, bwdPos.z + 500.0 )
if ( bwdPos.z < bwdZ and not ( bwdZ > vehiclePos.z + 1.0 ) ) then
bwdPos.z = bwdZ + 0.5
end
local packedBwdPos = vector3( bwdPos.x, bwdPos.y, bwdPos.z )
local bwdVeh = GetVehicleInDirectionSphere( vehicle, vehiclePos, packedBwdPos )
if ( DoesEntityExist( bwdVeh ) and IsEntityAVehicle( bwdVeh ) ) then
local bwdVehSpeed = round( GetVehSpeed( bwdVeh ), 0 )
local bwdVehHeading = round( GetEntityHeading( bwdVeh ), 0 )
local dir = IsEntityInMyHeading( h, bwdVehHeading, 100 )
radarInfo.bwdSpeed = FormatSpeed( bwdVehSpeed )
radarInfo.bwdDir = dir
if ( bwdVehSpeed > radarInfo.fastLimit and not radarInfo.bwdFastLocked ) then
if ( radarInfo.lockBeep ) then
PlaySoundFrontend( -1, "Beep_Red", "DLC_HEIST_HACKING_SNAKE_SOUNDS", 1 )
end
radarInfo.bwdFastSpeed = bwdVehSpeed
radarInfo.bwdFastLocked = true
SendNUIMessage( { lockbwdfast = true } )
end
radarInfo.bwdFast = FormatSpeed( radarInfo.bwdFastSpeed )
radarInfo.bwdPrevVeh = bwdVeh
end
end
SendNUIMessage({
patrolspeed = radarInfo.patrolSpeed,
fwdspeed = radarInfo.fwdSpeed,
fwdfast = radarInfo.fwdFast,
fwddir = radarInfo.fwdDir,
bwdspeed = radarInfo.bwdSpeed,
bwdfast = radarInfo.bwdFast,
bwddir = radarInfo.bwdDir
})
end
end
end
end
RegisterNetEvent( 'wk:radarRC' )
AddEventHandler( 'wk:radarRC', function()
Citizen.Wait( 10 )
TriggerEvent( 'wk:toggleMenuControlLock', true )
SendNUIMessage({
toggleradarrc = true
})
SetNuiFocus( true, true )
end )
RegisterNUICallback( "debug", function( data, cb )
TriggerEvent( "chat:addMessage", {
color = { 255, 255, 255 },
multiline = true,
args = { "WraithRS DEBUG", data }
})
end )
RegisterNUICallback( "RadarRC", function( data, cb )
-- Toggle Radar
if ( data == "radar_toggle" ) then
TriggerEvent( 'wk:toggleRadar' )
-- Front Antenna
elseif ( data == "radar_frontopp" and radarInfo.fwdXmit ) then
radarInfo.fwdMode = "opp"
SendNUIMessage( { fwdmode = radarInfo.fwdMode } )
elseif ( data == "radar_frontxmit" ) then
radarInfo.fwdXmit = not radarInfo.fwdXmit
ResetFrontAntenna()
SendNUIMessage( { fwdxmit = radarInfo.fwdXmit } )
if ( radarInfo.fwdXmit == false ) then
radarInfo.fwdMode = "none"
else
radarInfo.fwdMode = "same"
end
SendNUIMessage( { fwdmode = radarInfo.fwdMode } )
elseif ( data == "radar_frontsame" and radarInfo.fwdXmit ) then
radarInfo.fwdMode = "same"
SendNUIMessage( { fwdmode = radarInfo.fwdMode } )
-- Rear Antenna
elseif ( data == "radar_rearopp" and radarInfo.bwdXmit ) then
radarInfo.bwdMode = "opp"
SendNUIMessage( { bwdmode = radarInfo.bwdMode } )
elseif ( data == "radar_rearxmit" ) then
radarInfo.bwdXmit = not radarInfo.bwdXmit
ResetRearAntenna()
SendNUIMessage( { bwdxmit = radarInfo.bwdXmit } )
if ( radarInfo.bwdXmit == false ) then
radarInfo.bwdMode = "none"
else
radarInfo.bwdMode = "same"
end
SendNUIMessage( { bwdmode = radarInfo.bwdMode } )
elseif ( data == "radar_rearsame" and radarInfo.bwdXmit ) then
radarInfo.bwdMode = "same"
SendNUIMessage( { bwdmode = radarInfo.bwdMode } )
-- Set Fast Limit
elseif ( data == "radar_setlimit" ) then
CloseRadarRC()
Radar_SetLimit()
-- Speed Type
elseif ( data == "radar_speedtype" ) then
ToggleSpeedType()
elseif ( data == "radar_lockbeep" ) then
ToggleLockBeep()
-- Close
elseif ( data == "close" ) then
CloseRadarRC()
end
if ( cb ) then cb( 'ok' ) end
end )
Citizen.CreateThread( function()
SetNuiFocus( false )
while true do
ManageVehicleRadar()
-- Only run 10 times a second, more realistic, also prevents spam
Citizen.Wait( 100 )
-- Citizen.Wait( 0 )
end
end )
Citizen.CreateThread( function()
while true do
local ped = GetPlayerPed( -1 )
-- These control pressed natives must be the disabled check ones.
-- LCtrl is pressed and M has just been pressed
if ( IsDisabledControlPressed( 1, 36 ) and IsDisabledControlJustPressed( 1, 244 ) and IsPedSittingInAnyVehicle( ped ) ) then
TriggerEvent( 'wk:radarRC' )
end
-- LCtrl is not being pressed and M has just been pressed
if ( not IsDisabledControlPressed( 1, 36 ) and IsDisabledControlJustPressed( 1, 244 ) ) then
ResetFrontFast()
ResetRearFast()
end
local inVeh = IsPedSittingInAnyVehicle( ped )
local veh = nil
if ( inVeh ) then
veh = GetVehiclePedIsIn( ped, false )
end
if ( ( (not inVeh or (inVeh and GetVehicleClass( veh ) ~= 18)) and radarEnabled and not hidden) or IsPauseMenuActive() and radarEnabled ) then
hidden = true
SendNUIMessage( { hideradar = true } )
elseif ( inVeh and GetVehicleClass( veh ) == 18 and radarEnabled and hidden ) then
hidden = false
SendNUIMessage( { hideradar = false } )
end
Citizen.Wait( 0 )
end
end )
--[[------------------------------------------------------------------------
Menu Control Lock - Prevents certain actions
Thanks to the authors of the ES Banking script.
------------------------------------------------------------------------]]--
local locked = false
RegisterNetEvent( 'wk:toggleMenuControlLock' )
AddEventHandler( 'wk:toggleMenuControlLock', function( lock )
locked = lock
end )
Citizen.CreateThread( function()
while true do
if ( locked ) then
local ped = GetPlayerPed( -1 )
DisableControlAction( 0, 1, true ) -- LookLeftRight
DisableControlAction( 0, 2, true ) -- LookUpDown
DisableControlAction( 0, 24, true ) -- Attack
DisablePlayerFiring( ped, true ) -- Disable weapon firing
DisableControlAction( 0, 142, true ) -- MeleeAttackAlternate
DisableControlAction( 0, 106, true ) -- VehicleMouseControlOverride
SetPauseMenuActive( false )
end
Citizen.Wait( 0 )
end
end )
--[[------------------------------------------------------------------------
Notify
------------------------------------------------------------------------]]--
function Notify( text )
SetNotificationTextEntry( "STRING" )
AddTextComponentSubstringPlayerName( text )
DrawNotification( false, true )
end
function DrawDText( x, y, scale, centre, text, r, g, b, a )
SetTextFont(4)
SetTextProportional(0)
SetTextScale(scale, scale)
SetTextColour(r, g, b, a)
SetTextDropShadow(0, 0, 0, 0,255)
SetTextEdge(2, 0, 0, 0, 255)
SetTextCentre( centre )
SetTextDropShadow()
SetTextOutline()
SetTextEntry("STRING")
AddTextComponentString(text)
DrawText( x, y )
end