1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-06-22 20:59:59 +02:00
parent fb68aaa337
commit 35451d0d0f
71 changed files with 3 additions and 6158 deletions

View file

@ -1,159 +0,0 @@
<?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>

View file

@ -1,201 +0,0 @@
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

View file

@ -1,84 +0,0 @@
---@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
]]

View file

@ -1,96 +0,0 @@
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',
}

View file

@ -1,109 +0,0 @@
<?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>

View file

@ -1,47 +0,0 @@
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'

View file

@ -1,121 +0,0 @@
<!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>