--[[------------------------------------------------------------------------ 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