forked from Simnation/Main
fixes
This commit is contained in:
parent
fb68aaa337
commit
35451d0d0f
71 changed files with 3 additions and 6158 deletions
BIN
resources/[jobs]/[police]/gs_trackerdart/.fxap
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/.fxap
Normal file
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,159 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<AudioWaveContainer>
|
||||
<Version value="1" />
|
||||
<ChunkIndices value="True" />
|
||||
<MultiChannelEncrypt value="True" />
|
||||
<WholeFileEncrypt value="True" />
|
||||
<Streams>
|
||||
<Item>
|
||||
<Name>shoot01</Name>
|
||||
<FileName>shoot01.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="13467" />
|
||||
<SampleRate value="32001" />
|
||||
<Headroom value="-200" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name>shoot02</Name>
|
||||
<FileName>shoot02.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="12238" />
|
||||
<SampleRate value="32001" />
|
||||
<Headroom value="-198" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name>shoot03</Name>
|
||||
<FileName>shoot03.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="13425" />
|
||||
<SampleRate value="32000" />
|
||||
<Headroom value="-200" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name>shoot04</Name>
|
||||
<FileName>shoot04.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="14191" />
|
||||
<SampleRate value="32000" />
|
||||
<Headroom value="-200" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name>shoot05</Name>
|
||||
<FileName>shoot05.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="14457" />
|
||||
<SampleRate value="32000" />
|
||||
<Headroom value="-200" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
<Item>
|
||||
<Name>shoot06</Name>
|
||||
<FileName>shoot06.wav</FileName>
|
||||
<Chunks>
|
||||
<Item>
|
||||
<Type>peak</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>data</Type>
|
||||
</Item>
|
||||
<Item>
|
||||
<Type>format</Type>
|
||||
<Codec>PCM</Codec>
|
||||
<Samples value="11436" />
|
||||
<SampleRate value="32001" />
|
||||
<Headroom value="-64" />
|
||||
<PlayBegin value="0" />
|
||||
<PlayEnd value="0" />
|
||||
<LoopBegin value="0" />
|
||||
<LoopEnd value="0" />
|
||||
<LoopPoint value="-1" />
|
||||
<Peak unk="0" />
|
||||
</Item>
|
||||
</Chunks>
|
||||
</Item>
|
||||
</Streams>
|
||||
</AudioWaveContainer>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
201
resources/[jobs]/[police]/gs_trackerdart/bridge/cl_bridge.lua
Normal file
201
resources/[jobs]/[police]/gs_trackerdart/bridge/cl_bridge.lua
Normal file
|
@ -0,0 +1,201 @@
|
|||
ESX = nil
|
||||
QBCore = nil
|
||||
|
||||
if (GetResourceState('es_extended') == 'started') then
|
||||
ESX = exports['es_extended']:getSharedObject()
|
||||
elseif (GetResourceState('qb-core') == 'started') then
|
||||
QBCore = exports['qb-core']:GetCoreObject()
|
||||
end
|
||||
|
||||
Functions = {}
|
||||
|
||||
Functions.Notify = function(message)
|
||||
if ESX then
|
||||
ESX.ShowNotification(message, 'info', 5000)
|
||||
elseif QBCore then
|
||||
QBCore.Functions.Notify(message, 'primary', 5000)
|
||||
end
|
||||
end
|
||||
|
||||
Functions.CanVehicleHaveDartSystem = function(vehicle)
|
||||
local vehicleModel = GetEntityModel(vehicle)
|
||||
if not Config.allowedVehicles[vehicleModel] then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.CanVehicleShootDart = function(vehicle)
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.CanPlayerShootDart = function()
|
||||
-- For example: Add a job check if you wish
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
-- Called every frame when the vehicle is in 'sight' of the tracker system
|
||||
Functions.OnVehicleHit = function(targetVehicle, hitCoords)
|
||||
|
||||
end
|
||||
|
||||
Functions.CanOpenOverlay = function()
|
||||
local playerPed = PlayerPedId()
|
||||
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
||||
|
||||
if (vehicle == 0) then
|
||||
return false
|
||||
end
|
||||
|
||||
-- Check if the ped is the driver
|
||||
local driverPed = GetPedInVehicleSeat(vehicle, -1)
|
||||
if (driverPed ~= playerPed) then
|
||||
return false
|
||||
end
|
||||
|
||||
if IsPedDeadOrDying(playerPed, true) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.HasJob = function()
|
||||
if not Config.allowedJobs then
|
||||
return true
|
||||
end
|
||||
|
||||
local playerJob = 'unemployed'
|
||||
if ESX then
|
||||
playerJob = ESX.GetPlayerData()?.job?.name or 'unemployed'
|
||||
elseif QBCore then
|
||||
playerJob = QBCore.Functions.GetPlayerData()?.job?.name or 'unemployed'
|
||||
end
|
||||
|
||||
return (Config.allowedJobs[playerJob] ~= nil)
|
||||
end
|
||||
|
||||
Functions.ShouldDisplayBlips = function()
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.RemoveDartMinigame = function()
|
||||
local areaSize = 40
|
||||
local speedMultiplier = 1.5
|
||||
|
||||
for i = 1, 5 do
|
||||
local success = lib.skillCheck({ areaSize = areaSize, speedMultiplier = speedMultiplier }, { 'E' })
|
||||
if not success then
|
||||
return false
|
||||
end
|
||||
|
||||
areaSize -= 2
|
||||
speedMultiplier += 0.05
|
||||
|
||||
Wait(300)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.CanInteract = function(entity)
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
if IsPedDeadOrDying(playerPed, true) then
|
||||
return false
|
||||
end
|
||||
|
||||
if IsPedInAnyVehicle(playerPed, false) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.CreateRemoveTarget = function(canInteract, onSelect)
|
||||
if (GetResourceState('ox_target') == 'started') then
|
||||
exports.ox_target:addGlobalVehicle({ {
|
||||
icon = 'fa-solid fa-xmark',
|
||||
label = Config.Locales['remove_target'],
|
||||
canInteract = function(entity)
|
||||
return canInteract(entity)
|
||||
end,
|
||||
onSelect = function(data)
|
||||
onSelect(data.entity)
|
||||
end,
|
||||
distance = Config.interactDistance,
|
||||
} })
|
||||
return
|
||||
end
|
||||
|
||||
if (GetResourceState('qb-target') == 'started') then
|
||||
exports['qb-target']:AddGlobalVehicle({
|
||||
options = {
|
||||
{
|
||||
icon = 'fa-solid fa-xmark',
|
||||
label = Config.Locales['remove_target'],
|
||||
action = function(entity)
|
||||
onSelect(entity)
|
||||
end,
|
||||
canInteract = function(entity)
|
||||
return canInteract(entity)
|
||||
end,
|
||||
},
|
||||
},
|
||||
distance = Config.interactDistance,
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
print('[ERROR] No target interaction defined. Please implement your own target interaction.')
|
||||
end
|
||||
|
||||
Functions.InstallingTrackerSystem = function(entity)
|
||||
-- Called while installing the tracker system.
|
||||
-- For example: Add an animation or progress bar
|
||||
|
||||
-- Return 'false' to cancel the installation
|
||||
return true
|
||||
end
|
||||
|
||||
Functions.CreateInstallTarget = function(canInteract, onSelect)
|
||||
if (GetResourceState('ox_target') == 'started') then
|
||||
exports.ox_target:addGlobalVehicle({ {
|
||||
icon = 'fa-solid fa-location-crosshairs',
|
||||
label = Config.Locales['install_target'],
|
||||
distance = Config.interactDistance,
|
||||
items = Config.itemName,
|
||||
canInteract = function(entity)
|
||||
return canInteract(entity)
|
||||
end,
|
||||
onSelect = function(data)
|
||||
onSelect(data.entity)
|
||||
end,
|
||||
} })
|
||||
return
|
||||
end
|
||||
|
||||
if (GetResourceState('qb-target') == 'started') then
|
||||
exports['qb-target']:AddGlobalVehicle({
|
||||
options = {
|
||||
{
|
||||
icon = 'fa-solid fa-location-crosshairs',
|
||||
label = Config.Locales['install_target'],
|
||||
item = Config.itemName,
|
||||
action = function(entity)
|
||||
onSelect(entity)
|
||||
end,
|
||||
canInteract = function(entity)
|
||||
return canInteract(entity)
|
||||
end,
|
||||
},
|
||||
},
|
||||
distance = Config.interactDistance,
|
||||
})
|
||||
return
|
||||
end
|
||||
|
||||
print('[ERROR] No target interaction defined. Please implement your own target interaction.')
|
||||
end
|
|
@ -0,0 +1,84 @@
|
|||
---@diagnostic disable: undefined-field
|
||||
ESX = nil
|
||||
QBCore = nil
|
||||
|
||||
if (GetResourceState('es_extended') == 'started') then
|
||||
ESX = exports['es_extended']:getSharedObject()
|
||||
elseif (GetResourceState('qb-core') == 'started') then
|
||||
QBCore = exports['qb-core']:GetCoreObject()
|
||||
end
|
||||
|
||||
Functions = {}
|
||||
|
||||
Functions.HasItem = function(playerId, itemName)
|
||||
if ESX then
|
||||
local xPlayer = ESX.GetPlayerFromId(playerId)
|
||||
return xPlayer.getInventoryItem(itemName).count > 0
|
||||
elseif QBCore then
|
||||
local Player = QBCore.Functions.GetPlayer(playerId)
|
||||
return Player.Functions.GetItemByName(itemName).amount > 0
|
||||
end
|
||||
end
|
||||
|
||||
Functions.RemoveItem = function(playerId, itemName, amount)
|
||||
if ESX then
|
||||
local xPlayer = ESX.GetPlayerFromId(playerId)
|
||||
xPlayer.removeInventoryItem(itemName, amount)
|
||||
elseif QBCore then
|
||||
local Player = QBCore.Functions.GetPlayer(playerId)
|
||||
Player.Functions.RemoveItem(itemName, amount)
|
||||
end
|
||||
end
|
||||
|
||||
Functions.GetPolicePlayers = function()
|
||||
if not Config.allowedJobs then
|
||||
return { -1 }
|
||||
end
|
||||
|
||||
local jobs = {}
|
||||
for jobName, _ in pairs(Config.allowedJobs) do
|
||||
jobs[#jobs + 1] = jobName
|
||||
end
|
||||
|
||||
local playerIds = {}
|
||||
|
||||
if ESX then
|
||||
local result = ESX.GetExtendedPlayers('job', jobs)
|
||||
for key, xPlayers in pairs(result) do
|
||||
for i = 1, #xPlayers do
|
||||
playerIds[#playerIds + 1] = xPlayers[i].source
|
||||
end
|
||||
end
|
||||
elseif QBCore then
|
||||
for jobName, _ in pairs(Config.allowedJobs) do
|
||||
local players = QBCore.Functions.GetPlayersOnDuty(jobName)
|
||||
for i = 1, #players do
|
||||
playerIds[#playerIds + 1] = players[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return playerIds
|
||||
end
|
||||
|
||||
--[[
|
||||
-- If you are using an older version of ESX, and the blips are not showing up, you can use this function instead of the one above.
|
||||
Functions.GetPolicePlayers = function()
|
||||
local jobs = {}
|
||||
for jobName, _ in pairs(Config.allowedJobs) do
|
||||
jobs[#jobs + 1] = jobName
|
||||
end
|
||||
|
||||
local playerIds = {}
|
||||
|
||||
for i = 1, #jobs do
|
||||
local jobName = jobs[i]
|
||||
local result = ESX.GetExtendedPlayers('job', jobName)
|
||||
for key, xPlayer in pairs(result) do
|
||||
playerIds[#playerIds + 1] = xPlayer.source
|
||||
end
|
||||
end
|
||||
|
||||
return playerIds
|
||||
end
|
||||
]]
|
BIN
resources/[jobs]/[police]/gs_trackerdart/client/cl_functions.lua
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/client/cl_functions.lua
Normal file
Binary file not shown.
BIN
resources/[jobs]/[police]/gs_trackerdart/client/cl_main.lua
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/client/cl_main.lua
Normal file
Binary file not shown.
96
resources/[jobs]/[police]/gs_trackerdart/config.lua
Normal file
96
resources/[jobs]/[police]/gs_trackerdart/config.lua
Normal file
|
@ -0,0 +1,96 @@
|
|||
Config = {
|
||||
debug = false,
|
||||
dartModel = `trackerdart`,
|
||||
fireCooldown = 3000, -- Time in milliseconds between each dart shot
|
||||
|
||||
singeDart = true, -- If enabled, only one dart can be deployed at a time. As a result, this will also create a blip route to the target.
|
||||
destroyOldDart = true, -- If enabled, the old dart will be destroyed when a new one is deployed. (Must have singleDart on true)
|
||||
|
||||
shootKey = 22, -- Key used to shoot the dart (Default 22 / Spacebar)
|
||||
disabledControls = { -- Controls that are disabled when the overlay is open
|
||||
22, 76
|
||||
},
|
||||
overlayKey = 58, -- Key used to open the overlay (Default 58 / G)
|
||||
toggleOverlay = true, -- If set to true, the overlay will be toggled on/off when the key is pressed instead of holding it down
|
||||
overlayPosition = {
|
||||
vertical = '2.5%',
|
||||
horizontal = '50%',
|
||||
},
|
||||
|
||||
allowedJobs = { -- Jobs that are allowed to install and/or use the tracker system. Set to nil to disable job restrictions.
|
||||
['police'] = 0,
|
||||
['sheriff'] = 0
|
||||
},
|
||||
|
||||
installWithTarget = false, -- If set to true, it requires the player to install the tracker system using a target system and an item before it can be used
|
||||
itemName = 'trackersystem', -- The name of the item used to install the tracker system (If you don't want to use an item, set this to nil)
|
||||
removeItem = true, -- If set to true, the item will be removed from the player's inventory when the tracker system is installed
|
||||
onlyAllowedVehicles = true, -- If set to true, only vehicles that are in the allowedVehicles list can have the tracker system installed
|
||||
dartsPerVehicle = 5, -- The amount of darts a vehicle can 'carry'
|
||||
|
||||
selfDestructTime = 900, -- Time in seconds before a tracker dart self destructs (Default: 900 sec / 15 minutes)
|
||||
|
||||
interactDistance = 3.0, -- The distance for the target interactions
|
||||
|
||||
blipUpdateInterval = 2000, -- The interval in milliseconds to update the blips from server to clients
|
||||
|
||||
vehicleBlip = {
|
||||
sprite = 225,
|
||||
scale = 0.8,
|
||||
color = 1,
|
||||
shortRange = false,
|
||||
label = 'Tracker Dart',
|
||||
},
|
||||
|
||||
shootPtfx = {
|
||||
dict = 'core',
|
||||
name = 'bul_glass_shotgun',
|
||||
rot = vector3(-90.0, 0.0, 0.0),
|
||||
scale = 1.5,
|
||||
},
|
||||
|
||||
explodePtfx = {
|
||||
dict = 'core',
|
||||
name = 'ent_brk_sparking_wires',
|
||||
rot = vector3(0.0, 0.0, 0.0),
|
||||
scale = 1.5,
|
||||
},
|
||||
|
||||
removeAnim = {
|
||||
dict = 'mp_arresting',
|
||||
anim = 'a_uncuff',
|
||||
flag = 51,
|
||||
},
|
||||
|
||||
allowedVehicles = {
|
||||
[`police`] = 5, -- Override the default amount of darts a vehicle model can carry
|
||||
[`polgauntlet`] = 5,
|
||||
[`police2`] = 5,
|
||||
[`police3`] = 5,
|
||||
[`police4`] = 5,
|
||||
[`police5`] = 5,
|
||||
[`policet`] = 5,
|
||||
[`sheriff`] = 5,
|
||||
[`sheriff2`] = 5,
|
||||
[`fbi`] = 5,
|
||||
[`fbi2`] = 5,
|
||||
},
|
||||
}
|
||||
|
||||
Config.Locales = {
|
||||
['target_missed'] = 'You missed the target',
|
||||
['install_system'] = 'You need to install the tracker system first',
|
||||
['no_darts_left'] = 'You do not have any darts left',
|
||||
['target_has_dart'] = 'There is already a dart on the target',
|
||||
['dart_attached'] = 'You have attached a dart to the target',
|
||||
['already_installed'] = 'This vehicle already has a tracker system installed',
|
||||
['dart_system_installed'] = 'You have installed the tracker system on this vehicle',
|
||||
['not_allowed_vehicle'] = 'You cannot install the tracker system on this vehicle',
|
||||
['remove_target'] = 'Remove tracker dart',
|
||||
['failed_remove_dart'] = 'Failed to remove tracker dart',
|
||||
['removed_dart'] = 'You have removed the tracker dart',
|
||||
['only_one_dart'] = 'You can only deploy one dart at a time',
|
||||
['old_dart_destroyed'] = 'The old dart has been destroyed',
|
||||
['no_item'] = 'You do not have the item',
|
||||
['install_target'] = 'Install tracker system',
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,109 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Dat54>
|
||||
<Version value="7314721" />
|
||||
<ContainerPaths>
|
||||
<Item>audiodirectory\custom_sounds</Item>
|
||||
</ContainerPaths>
|
||||
<Items>
|
||||
<!-- SimpleSounds -->
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_01_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot01</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_02_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot02</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_03_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot03</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_04_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot04</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_05_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot05</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<Item type="SimpleSound">
|
||||
<Name>dartshoot_06_sp</Name>
|
||||
<Header>
|
||||
<Flags value="0x00008004" />
|
||||
<Volume value="200" />
|
||||
<Category>scripted</Category>
|
||||
</Header>
|
||||
<ContainerName>audiodirectory/custom_sounds</ContainerName>
|
||||
<FileName>shoot06</FileName>
|
||||
<WaveSlotNum value="0" />
|
||||
</Item>
|
||||
<!-- SoundSets -->
|
||||
<Item type="SoundSet">
|
||||
<Name>trackerdart_soundset</Name>
|
||||
<Header>
|
||||
<Flags value="0xAAAAAAAA" />
|
||||
</Header>
|
||||
<SoundSets>
|
||||
<Item>
|
||||
<ScriptName>dartshoot01</ScriptName>
|
||||
<ChildSound>dartshoot_01_sp</ChildSound>
|
||||
</Item>
|
||||
<Item>
|
||||
<ScriptName>dartshoot02</ScriptName>
|
||||
<ChildSound>dartshoot_02_sp</ChildSound>
|
||||
</Item>
|
||||
<Item>
|
||||
<ScriptName>dartshoot03</ScriptName>
|
||||
<ChildSound>dartshoot_03_sp</ChildSound>
|
||||
</Item>
|
||||
<Item>
|
||||
<ScriptName>dartshoot04</ScriptName>
|
||||
<ChildSound>dartshoot_04_sp</ChildSound>
|
||||
</Item>
|
||||
<Item>
|
||||
<ScriptName>dartshoot05</ScriptName>
|
||||
<ChildSound>dartshoot_05_sp</ChildSound>
|
||||
</Item>
|
||||
<Item>
|
||||
<ScriptName>dartshoot06</ScriptName>
|
||||
<ChildSound>dartshoot_06_sp</ChildSound>
|
||||
</Item>
|
||||
</SoundSets>
|
||||
</Item>
|
||||
</Items>
|
||||
</Dat54>
|
47
resources/[jobs]/[police]/gs_trackerdart/fxmanifest.lua
Normal file
47
resources/[jobs]/[police]/gs_trackerdart/fxmanifest.lua
Normal file
|
@ -0,0 +1,47 @@
|
|||
fx_version 'cerulean'
|
||||
games { 'gta5' }
|
||||
|
||||
author 'Gamzky'
|
||||
description 'Police Tracker Dart System'
|
||||
version '1.0.5'
|
||||
|
||||
ui_page 'ui/index.html'
|
||||
|
||||
lua54 'yes'
|
||||
|
||||
shared_scripts {
|
||||
'@ox_lib/init.lua',
|
||||
'config.lua',
|
||||
}
|
||||
|
||||
client_scripts {
|
||||
'bridge/cl_bridge.lua',
|
||||
'client/cl_functions.lua',
|
||||
'client/cl_main.lua',
|
||||
}
|
||||
|
||||
server_scripts {
|
||||
'bridge/sv_bridge.lua',
|
||||
'server/sv_main.lua',
|
||||
}
|
||||
|
||||
escrow_ignore {
|
||||
'audiodirectory/*',
|
||||
'bridge/*.lua',
|
||||
'data/*',
|
||||
'stream/*',
|
||||
'config.lua',
|
||||
}
|
||||
|
||||
files {
|
||||
'ui/index.html',
|
||||
'data/audioexample_sounds.dat54.rel',
|
||||
'audiodirectory/custom_sounds.awc',
|
||||
'stream/trackerdart.ytyp',
|
||||
}
|
||||
|
||||
data_file 'AUDIO_WAVEPACK' 'audiodirectory'
|
||||
data_file 'AUDIO_SOUNDDATA' 'data/audioexample_sounds.dat'
|
||||
data_file 'DLC_ITYP_REQUEST' 'stream/trackerdart.ytyp'
|
||||
|
||||
dependency '/assetpacks'
|
BIN
resources/[jobs]/[police]/gs_trackerdart/server/sv_main.lua
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/server/sv_main.lua
Normal file
Binary file not shown.
BIN
resources/[jobs]/[police]/gs_trackerdart/stream/trackerdart.ydr
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/stream/trackerdart.ydr
Normal file
Binary file not shown.
BIN
resources/[jobs]/[police]/gs_trackerdart/stream/trackerdart.ytyp
Normal file
BIN
resources/[jobs]/[police]/gs_trackerdart/stream/trackerdart.ytyp
Normal file
Binary file not shown.
121
resources/[jobs]/[police]/gs_trackerdart/ui/index.html
Normal file
121
resources/[jobs]/[police]/gs_trackerdart/ui/index.html
Normal file
|
@ -0,0 +1,121 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Tracker Dart</title>
|
||||
<style>
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
font-family: 'Orbitron', sans-serif;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hud-container {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
background: linear-gradient(135deg, #111, #333);
|
||||
border: 2px solid #333;
|
||||
border-radius: 12px;
|
||||
padding: 15px 30px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
color: white;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.target-status {
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
margin-bottom: 10px;
|
||||
transition: color 0.3s, text-shadow 0.3s;
|
||||
}
|
||||
|
||||
.target-status.active {
|
||||
color: #00ff00;
|
||||
text-shadow: 0 0 10px #00ff00, 0 0 20px #00ff00;
|
||||
}
|
||||
|
||||
.target-status.inactive {
|
||||
color: #ff0000;
|
||||
text-shadow: 0 0 10px #ff0000, 0 0 20px #ff0000;
|
||||
}
|
||||
|
||||
.darts-left {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap" rel="stylesheet" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="hud-container">
|
||||
<div id="targetStatus" class="target-status inactive">TARGET</div>
|
||||
<div id="dartsLeft" class="darts-left">Darts Left: 5</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
window.addEventListener('message', (event) => {
|
||||
const action = event.data.action;
|
||||
switch (action) {
|
||||
case 'setOverlayStatus':
|
||||
toggleOverlay(event.data.active, event.data.options);
|
||||
break;
|
||||
case 'setTargetStatus':
|
||||
updateTargetStatus(event.data.active);
|
||||
break;
|
||||
case 'setDartsLeft':
|
||||
updateDartsLeft(event.data.count);
|
||||
break;
|
||||
default:
|
||||
console.log(`Unknown action: ${action}`);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
const toggleOverlay = (open, options = {}) => {
|
||||
const overlay = document.querySelector('.hud-container');
|
||||
if (open) {
|
||||
overlay.style.opacity = 1;
|
||||
overlay.style.pointerEvents = 'auto';
|
||||
|
||||
overlay.style.bottom = options?.vertical ?? '20px';
|
||||
overlay.style.left = options?.horizontal ?? '50%';
|
||||
} else {
|
||||
overlay.style.opacity = 0;
|
||||
overlay.style.pointerEvents = 'none';
|
||||
}
|
||||
};
|
||||
|
||||
let dartsLeft = 0;
|
||||
let hasTarget = false;
|
||||
|
||||
const targetStatusElement = document.getElementById('targetStatus');
|
||||
const dartsLeftElement = document.getElementById('dartsLeft');
|
||||
|
||||
const updateTargetStatus = (active) => {
|
||||
hasTarget = active;
|
||||
if (hasTarget) {
|
||||
targetStatusElement.textContent = 'TARGET';
|
||||
targetStatusElement.className = 'target-status active';
|
||||
} else {
|
||||
targetStatusElement.textContent = 'TARGET';
|
||||
targetStatusElement.className = 'target-status inactive';
|
||||
}
|
||||
};
|
||||
|
||||
const updateDartsLeft = (count) => {
|
||||
dartsLeft = count;
|
||||
dartsLeftElement.textContent = `Darts Left: ${dartsLeft}`;
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Add a link
Reference in a new issue