fixing vehicles

This commit is contained in:
KingMcDonalds
2026-03-13 23:31:07 -07:00
parent f919b15fcf
commit 765aa151a3
116 changed files with 2073 additions and 18256 deletions
+19 -19
View File
@@ -5,39 +5,39 @@ Config.kmh = false
-- Set Config.maxSpeed to false if you want to use same speed for all vehicles
-- Set the max speed for all vehicles on Config.maxSpeed
Config.useCategories = true
Config.maxSpeed = 190
Config.maxSpeed = 180
Config.Categories = {
-- COMPACTS
{category = 0, maxSpeed = 195},
{category = 0, maxSpeed = 165},
-- SEDANS
{category = 1, maxSpeed = 195},
{category = 1, maxSpeed = 165},
-- SUV'S
{category = 2, maxSpeed = 195},
{category = 2, maxSpeed = 165},
-- COUPES
{category = 3, maxSpeed = 195},
{category = 3, maxSpeed = 165},
-- MUSCLE
{category = 4, maxSpeed = 195},
{category = 4, maxSpeed = 165},
-- SPORT CLASSIC
{category = 5, maxSpeed = 130},
{category = 5, maxSpeed = 160},
-- SPORT
{category = 6, maxSpeed = 195},
{category = 6, maxSpeed = 165},
-- SUPER
{category = 7, maxSpeed = 195},
{category = 7, maxSpeed = 165},
-- MOTORCYCLES
{category = 8, maxSpeed = 136},
{category = 8, maxSpeed = 130},
-- OFFROAD
{category = 9, maxSpeed = 186},
{category = 9, maxSpeed = 165},
-- INDUSTRIAL
{category = 10, maxSpeed = 187},
{category = 10, maxSpeed = 125},
-- UTILITY
{category = 11, maxSpeed = 176},
{category = 11, maxSpeed = 125},
-- VANS
{category = 12, maxSpeed = 189},
{category = 12, maxSpeed = 165},
-- BICYCLES
{category = 13, maxSpeed = 110},
{category = 13, maxSpeed = 85},
-- BOATS
{category = 14, maxSpeed = 84},
{category = 14, maxSpeed = 125},
--#region PLANES AND HELIS
-- YOU MUST NOT LOCK THIS ONES OR YOU WON'T BE ABLE TO FLY THEM!!!
@@ -46,11 +46,11 @@ Config.Categories = {
--#endregion
-- SERVICE
{category = 17, maxSpeed = 180},
{category = 17, maxSpeed = 165},
-- EMERGENCY
{category = 18, maxSpeed = 580},
{category = 18, maxSpeed = 550},
-- MILITARY
{category = 19, maxSpeed = 369}
{category = 19, maxSpeed = 168}
}
-- DO NOT MODIFY
Binary file not shown.
Binary file not shown.
+289 -289
View File
@@ -12,73 +12,103 @@ if ConfigHose.Notifications.Enabled and ConfigHose.Notifications.Framework.ESX t
end
if ConfigHose.EnablePositioningCommand then
TriggerEvent('chat:addSuggestion', '/'.."findhosepositioning", "Find positioning of the hose/supply line on your fire truck")
TriggerEvent('chat:addSuggestion', '/'.."findhosepositioning", "Find rope spawn point with rotation", {
{ name="type", help="hose or hand" }
})
RegisterCommand("findhosepositioning", function(source, args)
RegisterCommand("findhosepositioning", function(source, args)
local ropeLabel = (args[1] or "hose"):lower()
local ped = PlayerPedId()
local ropeType = 4
if RopeManager.RopeTypes and RopeManager.RopeTypes[ropeLabel] then
ropeType = RopeManager.RopeTypes[ropeLabel]
end
local targetVehicle = GetVehiclePedIsIn(ped, false)
if targetVehicle == nil or targetVehicle == 0 then
Notify("No vehicle found!")
else
local model = `p_ld_soc_ball_01`
SetEntityAlpha(targetVehicle, 150, false)
RequestModel(model)
while not HasModelLoaded(model) do Wait(0) end
local ballProp = CreateObject(model, coords, false, false, false)
if targetVehicle == 0 then targetVehicle = GetClosestVehicle(GetEntityCoords(ped)) end
if targetVehicle == 0 then return Notify("No vehicle found!") end
while not DoesEntityExist(ballProp) do Wait(0) end
RopeLoadTextures()
local vehPos = GetEntityCoords(targetVehicle)
local previewRope = AddRope(vehPos.x, vehPos.y, vehPos.z, 0.0, 0.0, 0.0, 20.0, ropeType, 20.0, 0.5, 1.0, false, false, false, 5.0, false, 0)
local offSet = {x = 0.0, y = 0.0, z = 0.0}
local rotation = {x = 0.0, y = 0.0, z = 0.0}
local depth = 0.2
local mode = "MOVE"
local editing = true
SetModelAsNoLongerNeeded(model)
local offSet = {0.0, 0.0, 0.0}
local rotation = {0.0, 0.0, 0.0}
local offSetComplete = false
while not offSetComplete do
if targetVehicle ~= nil and targetVehicle ~= 0 then
DetachEntity(ballProp, true, false)
AttachEntityToEntity(ballProp, targetVehicle, -1, offSet[1], offSet[2], offSet[3], rotation[1], rotation[2], rotation[3], true, false, true, false, 1, true)
if not IsControlReleased(0, 207) then --page down
offSet = {offSet[1], offSet[2], offSet[3] - 0.01}
end
Notify("~b~POSITIONING MODE~w~\n[TAB] Toggle Move/Rotate\n[Arrows] Adjust\n[INSERT/DELETE] Depth\n[ENTER] Save")
if not IsControlReleased(0, 208) then --page up
offSet = {offSet[1], offSet[2], offSet[3] + 0.01}
end
SetEntityAlpha(targetVehicle, 150, false)
if not IsControlReleased(0, 173) then --arrow down
offSet = {offSet[1], offSet[2] - 0.01, offSet[3]}
end
if not IsControlReleased(0, 172) then --arrow up
offSet = {offSet[1], offSet[2] + 0.01, offSet[3]}
end
if not IsControlReleased(0, 174) then --arrow left
offSet = {offSet[1] - 0.01, offSet[2], offSet[3]}
end
if not IsControlReleased(0, 175) then --arrow right
offSet = {offSet[1] + 0.01, offSet[2], offSet[3]}
end
if IsControlJustPressed(0, 191) then -- enter - finish
offSetComplete = true
end
end
Wait(0)
while editing do
Wait(0)
local speed = IsControlPressed(0, 21) and 0.05 or 0.005
if IsControlJustPressed(0, 192) then
mode = (mode == "MOVE") and "ROTATE" or "MOVE"
Notify("Mode: ~y~" .. mode)
end
Notify("OffSet Values are now printed in your console")
print("OffSet: {"..offSet[1]..", "..offSet[2]..", "..offSet[3].."}")
DeleteEntity(ballProp)
ResetEntityAlpha(targetVehicle)
end
end, false)
end
if IsControlPressed(0, 121) then depth = depth + 0.005 end
if IsControlPressed(0, 178) then depth = depth - 0.005 end
local up = IsControlPressed(0, ConfigHose.PositioningControls.up)
local down = IsControlPressed(0, ConfigHose.PositioningControls.down)
local forward = IsControlPressed(0, ConfigHose.PositioningControls.forwards)
local backward = IsControlPressed(0, ConfigHose.PositioningControls.backwards)
local left = IsControlPressed(0, ConfigHose.PositioningControls.left)
local right = IsControlPressed(0, ConfigHose.PositioningControls.right)
if mode == "MOVE" then
if up then offSet.z = offSet.z + speed end
if down then offSet.z = offSet.z - speed end
if forward then offSet.y = offSet.y + speed end
if backward then offSet.y = offSet.y - speed end
if left then offSet.x = offSet.x - speed end
if right then offSet.x = offSet.x + speed end
else
local rSpeed = speed * 50.0
if up then rotation.x = rotation.x + rSpeed end
if down then rotation.x = rotation.x - rSpeed end
if left then rotation.z = rotation.z + rSpeed end
if right then rotation.z = rotation.z - rSpeed end
end
local forwardVec = RotationToDirection(rotation)
local localPortPos = vector3(offSet.x, offSet.y, offSet.z)
local localBendPosA = localPortPos - (forwardVec * depth)
local localBendPosB = localPortPos - (forwardVec * (depth * 0.5))
local worldPointC = GetOffsetFromEntityInWorldCoords(targetVehicle, localPortPos.x, localPortPos.y, localPortPos.z)
local worldPointA = GetOffsetFromEntityInWorldCoords(targetVehicle, localBendPosA.x, localBendPosA.y, localBendPosA.z)
local worldPointB = GetOffsetFromEntityInWorldCoords(targetVehicle, localBendPosB.x, localBendPosB.y, localBendPosB.z)
local handPos = GetWorldPositionOfEntityBone(ped, GetPedBoneIndex(ped, 6286))
local vertexCount = GetRopeVertexCount(previewRope)
PinRopeVertex(previewRope, 0, handPos.x, handPos.y, handPos.z)
PinRopeVertex(previewRope, vertexCount - 1, worldPointA.x, worldPointA.y, worldPointA.z)
PinRopeVertex(previewRope, vertexCount - 2, worldPointB.x, worldPointB.y, worldPointB.z)
PinRopeVertex(previewRope, vertexCount - 3, worldPointC.x, worldPointC.y, worldPointC.z)
if IsControlJustPressed(0, ConfigHose.PositioningControls.enter) then editing = false end
end
ResetEntityAlpha(targetVehicle)
print(string.format("^2--- %s RESULT ---^7", ropeLabel:upper()))
if ropeLabel == "hose" then
print(string.format('{ x = %.3f, y = %.3f, z = %.3f, rx = %.3f, ry = %.3f, rz = %.3f, depth = %.3f, type = "%s", portId = "attack1" },', offSet.x, offSet.y, offSet.z, rotation.x, rotation.y, rotation.z, depth, ropeLabel))
else
print(string.format('{ x = %.3f, y = %.3f, z = %.3f, rx = %.3f, ry = %.3f, rz = %.3f, depth = %.3f, type = "%s" },', offSet.x, offSet.y, offSet.z, rotation.x, rotation.y, rotation.z, depth, ropeLabel))
end
DeleteRope(previewRope)
Notify("Data printed to F8 console.")
end, false)
end
function Notify(text)
@@ -110,7 +140,7 @@ function showBaseNotification(message)
DrawNotification(0,1)
end
-- General Functions @GeneralFunctions
-- @GeneralFunctions
function DisplayHelpText(text)
SetTextComponentFormat("STRING")
AddTextComponentString(text)
@@ -127,272 +157,242 @@ function drawInstructionalText(msg, coords)
end
function IsFireHoseEnabled()
return (HoseManager.nozzle and not HoseManager.nozzleDropped)
return (HoseManager.hasFireHose and not HoseManager.nozzleDropped)
end
exports("IsFireHoseEnabled", IsFireHoseEnabled)
function IsFireHoseShooting()
return HoseManager.pressed
end
exports("IsFireHoseShooting", IsFireHoseShooting)
function IsFireHoseShootingWater()
return ParticleManager.isWaterDecal
end
exports("IsFireHoseShootingWater", IsFireHoseShootingWater)
function IsVehicleUsingWater(vehicleNetID)
local settings = HoseManager.vehicleSettings[vehicleNetID]
if not settings then return true end
return settings.decalType
end
exports("IsVehicleUsingWater", IsVehicleUsingWater)
function GetCurrentDecalCoords()
return ParticleManager.CurrentDecalCoords
end
exports("GetCurrentDecalCoords", GetCurrentDecalCoords)
function GetCurrentHosePressure()
return ParticleManager.particleScale
end
exports("GetCurrentHosePressure", GetCurrentHosePressure)
local vehicleModels = getVehicleModelsFromCapacities()
local interactionId = "menuId"
if ConfigHose.InteractType.TruckInteraction.Drawtext or ConfigHose.InteractType.TruckInteraction.ScreenPrompt then
if ConfigHose.InteractType.TruckInteraction.Custom then
local function _toNetId(ent)
if ent and DoesEntityExist(ent) then return ToNetId(ent) end
return nil
end
local function _neighborsFor(netId)
local list = {}
if not netId then return list end
local RM = RopeManager or {}
local cv = RM.connectedVehicles and RM.connectedVehicles[netId]
if type(cv) == 'number' then list[#list+1] = cv
elseif type(cv) == 'table' then for nid,_ in pairs(cv) do list[#list+1] = tonumber(nid) or nid end end
local ic = RM.incomingConnections and RM.incomingConnections[netId]
if type(ic) == 'number' then list[#list+1] = ic
elseif type(ic) == 'table' then for nid,_ in pairs(ic) do list[#list+1] = tonumber(nid) or nid end end
return list
end
local function _buildCtx(vehicle)
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)
local model = GetEntityModel(vehicle)
local vs = (ConfigHose.Rope.VehicleSettings[model] or {})
local useBone = vs.useBone or false
local bones = vs.bones or {}
local offsets = vs.offsets or { { x = 0.0, y = 0.0, z = 0.0 } }
local pts = getAttachmentPoints(vehicle, useBone, bones, offsets)
if type(pts) ~= 'table' or #pts == 0 then pts = { GetEntityCoords(vehicle) } end
local closest = pts[1]
local minDist = #(pos - closest)
for i = 2, #pts do
local p = pts[i]
local d = #(pos - p)
if d < minDist then closest, minDist = p, d end
end
local meId = GetPlayerServerId(PlayerId())
local vehNet = _toNetId(vehicle)
local neigh = _neighborsFor(vehNet)
return {
ped = ped,
playerServerId = meId,
vehicle = vehicle,
vehNet = vehNet,
vehModel = model,
promptCoords = closest,
vehicleDistance = minDist,
neighbors = neigh,
nozzle = HoseManager.nozzle,
nozzleDropped = HoseManager.nozzleDropped,
currentVehicle = HoseManager.currentVehicle,
handLineActive = HoseManager.handLine[meId] and true or false,
currentVehicleRelay = HoseManager.currentVehicleRelay,
supplyEnabled = IsSupplyLineEnabled(),
}
end
-- Actions you can call from your custom interactions
HoseCustomActions = {
GrabHose = function(ctx)
HoseManager.currentVehicle = ctx.vehicle
InitializeFireHose()
AttachRopeToProp()
end,
StoreHose = function(ctx)
if HoseManager.nozzle and HoseManager.currentVehicle == ctx.vehicle and not HoseManager.nozzleDropped then
UnequipFireHose()
else
Notify(ConfigHose.Translations.cannotStoreHoseWhileOnGround)
end
end,
GrabRelay = function(ctx)
HoseManager.currentVehicleRelay = ctx.vehicle
InitializeHandLine()
AttachRopeToHand()
end,
StoreRelay = function(_ctx)
DeinitializeHandLine()
end,
ConnectRelayHere = function(ctx)
DeinitializeHandLine()
ConnectRelayToVehicle(ctx.vehicle)
end,
QuickDisconnectNearest = function(ctx)
if not ctx.vehNet or #ctx.neighbors == 0 then return end
local best, bestD, myPos = nil, 1e9, GetEntityCoords(PlayerPedId())
for _, n in ipairs(ctx.neighbors) do
local ent = NetEnt(n)
if ent and DoesEntityExist(ent) then
local d = #(myPos - GetEntityCoords(ent))
if d < bestD then best, bestD = n, d end
elseif not best then
best = n
end
end
if best then
local sId, tId = canonicalPair(ctx.vehNet, best)
DisconnectRelayLine(sId, tId, ctx.vehNet)
end
end,
OpenPanel = function(_ctx)
OpenControlPanel()
end
}
-- ctx = _buildCtx(vehicle) (state for the vehicle/player)
-- A = HoseCustomActions (ready actions)
-- Draw helpers available: drawInstructionalText() / DisplayHelpText() from this file.
-- Example below mirrors the original E/G/Z flow aka ConfigHose.TruckInteraction.InteractType.Drawtext.
if not CustomInteractThink then
-- CustomInteractThink = function(ctx, A)
-- local lines = {}
-- if ctx.nozzle then
-- if ctx.currentVehicle == ctx.vehicle and not ctx.nozzleDropped then
-- lines[#lines+1] = ConfigHose.Translations.storeHoseMessage
-- if IsControlJustReleased(0, ConfigHose.Keys.Interact) then A.StoreHose(ctx) end
-- else
-- lines[#lines+1] = ConfigHose.Translations.cannotStoreHoseWhileOnGround
-- end
-- elseif ctx.handLineActive then
-- if ctx.supplyEnabled then
-- if ctx.currentVehicleRelay == ctx.vehicle then
-- if #ctx.neighbors > 0 then lines[#lines+1] = ConfigHose.Translations.disconnectLine end
-- lines[#lines+1] = ConfigHose.Translations.storeSupplyLine
-- if IsControlJustReleased(0, ConfigHose.Keys.GrabLine) then
-- if #ctx.neighbors > 0 then A.QuickDisconnectNearest(ctx) else A.StoreRelay(ctx) end
-- end
-- else
-- if #ctx.neighbors > 0 then
-- lines[#lines+1] = ConfigHose.Translations.disconnectLine
-- if IsControlJustReleased(0, ConfigHose.Keys.GrabLine) then A.QuickDisconnectNearest(ctx) end
-- else
-- lines[#lines+1] = ConfigHose.Translations.connectRelayLineMessage
-- if IsControlJustReleased(0, ConfigHose.Keys.GrabLine) then A.ConnectRelayHere(ctx) end
-- end
-- end
-- end
-- else
-- if ctx.supplyEnabled then
-- if #ctx.neighbors > 0 then
-- lines[#lines+1] = ConfigHose.Translations.grabHoseMessage
-- lines[#lines+1] = ConfigHose.Translations.disconnectLine
-- else
-- lines[#lines+1] = ConfigHose.Translations.grabHoseMessage
-- lines[#lines+1] = ConfigHose.Translations.SupplyLine
-- end
-- else
-- lines[#lines+1] = ConfigHose.Translations.grabHoseMessage
-- end
-- if IsControlJustReleased(0, ConfigHose.Keys.Interact) then A.GrabHose(ctx) end
-- if ctx.supplyEnabled and IsControlJustReleased(0, ConfigHose.Keys.GrabLine) then A.GrabRelay(ctx) end
-- end
-- -- SHS Panel
-- if not ctx.nozzle and ctx.supplyEnabled then
-- local showPanelHint = (ctx.handLineActive and ctx.currentVehicleRelay == ctx.vehicle) or (not ctx.nozzle and not ctx.handLineActive)
-- if showPanelHint then
-- lines[#lines+1] = ConfigHose.Translations.interactDisplay
-- if IsControlJustReleased(0, ConfigHose.Keys.OpenDisplayPrompt) then A.OpenPanel(ctx) end
-- end
-- end
-- if #lines > 0 then drawInstructionalText(table.concat(lines, "\n"), ctx.promptCoords) end
-- end
CustomInteractThink = function(ctx, A)
-- Write logic here
-- ctx = live state for the closest fire vehicle
-- A = actions you can call
end
end
CreateThread(function()
while true do
Wait(1)
local pos = GetEntityCoords(PlayerPedId())
local vehicle = GetClosestVehicle(pos)
local inRange = false
if vehicle and DoesEntityExist(vehicle) and IsVehicleDriveable(vehicle, false) then
local vehicleModel = GetEntityModel(vehicle)
local vehicleSettings = ConfigHose.Rope.VehicleSettings[vehicleModel] or {}
local useBone = vehicleSettings.useBone or false
local bones = vehicleSettings.bones or {}
local offsets = vehicleSettings.offsets or {{x = 0.0, y = 0.0, z = 0.0}}
local attachmentPoints = {}
if useBone then
for _, boneName in ipairs(bones) do
local boneIndex = GetEntityBoneIndexByName(vehicle, boneName)
if boneIndex ~= -1 then
local bonePos = GetWorldPositionOfEntityBone(vehicle, boneIndex)
table.insert(attachmentPoints, bonePos)
else
print("Bone " .. boneName .. " not found in vehicle model.")
end
end
else
for _, offset in ipairs(offsets) do
local offsetWorldPos = GetOffsetFromEntityInWorldCoords(vehicle, offset.x, offset.y, offset.z)
table.insert(attachmentPoints, offsetWorldPos)
end
end
local closestPoint = attachmentPoints[1]
local minDistance = #(pos - closestPoint)
for _, point in ipairs(attachmentPoints) do
local distance = #(pos - point)
if distance < minDistance then
closestPoint = point
minDistance = distance
end
end
local promptCoords = closestPoint
local vehicleDistance = #(pos - promptCoords)
if not IsPedInAnyVehicle(PlayerPedId(), false) and vehicleDistance < 3.0 then
inRange = true
local text = HoseManager.nozzle and ConfigHose.Translations.storeHoseMessage or ConfigHose.Translations.grabHoseMessage
if ConfigHose.InteractType.TruckInteraction.Drawtext then
drawInstructionalText(text, promptCoords)
elseif ConfigHose.InteractType.TruckInteraction.ScreenPrompt then
DisplayHelpText(text)
end
if IsControlJustReleased(0, ConfigHose.Keys.Interact) then
if not HoseManager.nozzle and isPermissionAllowed() then
InitializeFireHose()
AttachRopeToProp()
else
UnequipFireHose()
end
end
end
end
if not inRange then
Wait(2500)
end
end
end)
elseif ConfigHose.InteractType.TruckInteraction.ThirdEye.enabled then
if ConfigHose.InteractType.TruckInteraction.ThirdEye.oxTarget then
local VehicleOptions = {
{
label = ConfigHose.Translations.thirdEyeMessage,
icon = "fa-solid fa-water",
onSelect = function()
if not HoseManager.nozzle and isPermissionAllowed() then
InitializeFireHose()
AttachRopeToProp()
else
UnequipFireHose()
end
end,
}
}
exports.ox_target:addModel(vehicleModels, VehicleOptions)
end
if ConfigHose.InteractType.TruckInteraction.ThirdEye.qbTarget then
exports['qb-target']:AddTargetModel(vehicleModels, {
options = {
{
label = ConfigHose.Translations.thirdEyeMessage,
icon = "fa-solid fa-water",
action = function()
if not HoseManager.nozzle and isPermissionAllowed() then
InitializeFireHose()
AttachRopeToProp()
else
UnequipFireHose()
end
end,
},
},
distance = 3.0
})
end
elseif ConfigHose.InteractType.TruckInteraction.WorldInteraction then
CreateThread(function()
local interactionActive = false
local idleWait = 1000
while true do
Wait(idleWait)
if IsPedInAnyVehicle(PlayerPedId(), false) then
if interactionActive then
for _, model in ipairs(vehicleModels) do
exports.interact:RemoveModelInteraction(model, interactionId)
end
interactionActive = false
end
idleWait = 1500
local ped = PlayerPedId()
if IsPedInAnyVehicle(ped, false) then
Wait(500)
else
local pos = GetEntityCoords(PlayerPedId())
local pos = GetEntityCoords(ped)
local vehicle = GetClosestVehicle(pos)
if vehicle and DoesEntityExist(vehicle) then
local vehicleModel = GetEntityModel(vehicle)
local isAllowedModel = false
for _, model in ipairs(vehicleModels) do
if model == vehicleModel then
isAllowedModel = true
break
end
end
if isAllowedModel then
local vehicleSettings = ConfigHose.Rope.VehicleSettings[vehicleModel] or {}
local useBone = vehicleSettings.useBone or false
local bones = vehicleSettings.bones or {}
local offsets = vehicleSettings.offsets or {{x = 0.0, y = 0.0, z = 0.0}}
local attachmentPoints = {}
if useBone then
for _, boneName in ipairs(bones) do
local boneIndex = GetEntityBoneIndexByName(vehicle, boneName)
if boneIndex ~= -1 then
local bonePos = GetWorldPositionOfEntityBone(vehicle, boneIndex)
table.insert(attachmentPoints, bonePos)
else
print("Bone " .. boneName .. " not found in vehicle model.")
end
end
else
for _, offset in ipairs(offsets) do
local offsetWorldPos = GetOffsetFromEntityInWorldCoords(vehicle, offset.x, offset.y, offset.z)
table.insert(attachmentPoints, offsetWorldPos)
end
end
local closestPoint = attachmentPoints[1]
local minDistance = #(pos - closestPoint)
for _, point in ipairs(attachmentPoints) do
local distance = #(pos - point)
if distance < minDistance then
closestPoint = point
minDistance = distance
end
end
local promptCoords = closestPoint
local vehicleDistance = #(pos - promptCoords)
if vehicleDistance < 4.0 then
if not interactionActive then
exports.interact:AddModelInteraction({
model = vehicleModel,
offset = promptCoords - GetEntityCoords(vehicle),
name = 'Menu',
id = interactionId,
distance = 8.0,
interactDst = 2.5,
ignoreLos = true,
bone = 'bodyshell',
options = {
{
label = ConfigHose.Translations.grabHoseWorldInteraction,
action = function()
if not HoseManager.nozzle then
InitializeFireHose()
AttachRopeToProp()
else
UnequipFireHose()
end
end,
},
}
})
interactionActive = true
end
idleWait = 0
else
if interactionActive then
exports.interact:RemoveModelInteraction(vehicleModel, interactionId)
interactionActive = false
end
idleWait = 500
end
if vehicle and DoesEntityExist(vehicle) and IsVehicleDriveable(vehicle, false) and HasWaterTank(vehicle) then
local ctx = _buildCtx(vehicle)
if ctx.vehicleDistance < 3.0 then
local ok, err = pcall(CustomInteractThink, ctx, HoseCustomActions)
if not ok then print("^1[CustomInteract] error:^0", err) end
else
if interactionActive then
exports.interact:RemoveModelInteraction(vehicleModel, interactionId)
interactionActive = false
end
idleWait = 1000
Wait(250)
end
else
if interactionActive then
for _, model in ipairs(vehicleModels) do
exports.interact:RemoveModelInteraction(model, interactionId)
end
interactionActive = false
end
idleWait = 1500
Wait(750)
end
end
end
end)
else
warn('Invalid interaction configuration')
end
File diff suppressed because it is too large Load Diff
+8 -1
View File
@@ -7,10 +7,12 @@ lua54 'yes'
author 'London Studios'
description 'Smart Hose'
version 'Alpha'
version '2.2'
shared_script 'config.lua'
ui_page 'html/index.html'
client_scripts {
'cl_smarthose.lua',
'cl_utils.lua'
@@ -21,6 +23,10 @@ files {
'data/weaponarchetypes.meta',
'data/weapons.meta',
'data/weaponanimations.meta',
'html/index.html',
'html/assets/*.js',
'html/assets/*.css',
'locales/*.json'
}
server_scripts {
@@ -34,6 +40,7 @@ escrow_ignore {
'sv_utils.lua',
'stream/rope.ytd',
'cl_utils.lua',
'locales/*.json'
}
data_file 'WEAPONINFO_FILE' 'data/weapons.meta'
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+15
View File
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SHS Control Panel</title>
<script type="module" crossorigin src="./assets/index-e63cb1c0.js"></script>
<link rel="stylesheet" href="./assets/index-4963c99a.css">
</head>
<body>
<div id="root"></div>
</body>
</html>
+94
View File
@@ -0,0 +1,94 @@
{
"app": {
"title": "SHS Panel",
"closeEsc": "Close (ESC)",
"linkedTo": "Linked to {model}"
},
"ui": {
"alertsTitle": "ALERTS:",
"intakeSources": "Intake Sources",
"dischargeOutlets": "Discharge Outlets",
"masterControls": "Master Controls",
"systemStatus": "System Status",
"unavailable": "UNAVAILABLE",
"active": "ACTIVE",
"standby": "STANDBY",
"outlet": "Outlet",
"noDischarges": "No discharges open"
},
"intake": {
"hydrant": "Hydrant",
"draft": "Draft",
"tank": "Tank",
"transfer": "Water Transfer"
},
"discharge": {
"attack1": {
"name": "Attack Line 1",
"desc": "Front Left"
},
"attack2": {
"name": "Attack Line 2",
"desc": "Front Right"
},
"supply": {
"name": "Supply Line",
"desc": "Monitor / Transfer"
},
"ladder": {
"name": "Ladder Pipe",
"desc": "Deck Guns"
},
"foam": {
"name": "Foam Line",
"desc": "Foam Line"
}
},
"status": {
"transferring": "Transferring…",
"available": "Available",
"notAvailable": "Not Available",
"notConnected": "Not Connected"
},
"controls": {
"mainPumpOn": "Main Pump ON",
"mainPumpOff": "Main Pump OFF",
"masterValveOpen": "Master Valve OPEN",
"masterValveClosed": "Master Valve CLOSED",
"makeFoam": "MAKE FOAM",
"makingFoam": "MAKING FOAM…",
"emergencyStop": "EMERGENCY STOP",
"resetEStop": "RESET E-STOP",
"open": "OPEN",
"closed": "CLOSED"
},
"gauge": {
"intake": "Intake",
"discharge": "Discharge",
"rpm": "Pump RPM",
"flow": "Flow Rate",
"pressure": "Pressure",
"unitPSI": "PSI",
"unitRPM": "RPM",
"unitGPM": "GPM",
"tankCapacity": "Tank Capacity:"
},
"hud": {
"water": "WATER",
"foam": "FOAM"
},
"alerts": {
"highPressure": "HIGH PRESSURE",
"emergencyStop": "EMERGENCY STOP ACTIVE",
"transferring": "TRANSFERRING WATER…"
},
"messages": {
"transferFailed": "Transfer failed."
},
"transfer": {
"start": "TRANSFER",
"stop": "STOP",
"starting": "STARTING…",
"stopping": "STOPPING…"
}
}
+79
View File
@@ -0,0 +1,79 @@
{
"app": {
"title": "Painel SHS",
"closeEsc": "Fechar (ESC)",
"linkedTo": "Conectado a {model}"
},
"ui": {
"alertsTitle": "AVISOS:",
"intakeSources": "Fontes de Captação",
"dischargeOutlets": "Saídas de Descarga",
"masterControls": "Controlo Principal",
"systemStatus": "Estado do Sistema",
"unavailable": "INDISPONÍVEL",
"active": "ATIVO",
"standby": "ESPERA",
"outlet": "Saída",
"noDischarges": "Sem descargas ativas"
},
"intake": {
"hydrant": "Hidrante",
"draft": "Aspiração",
"tank": "Depósito",
"transfer": "Transferência"
},
"discharge": {
"attack1": { "name": "Linha de Ataque 1", "desc": "Frente Esquerda" },
"attack2": { "name": "Linha de Ataque 2", "desc": "Frente Direita" },
"supply": { "name": "Linha de Abastecimento", "desc": "Monitor / Transferência" },
"ladder": { "name": "Canhão de Escada", "desc": "Canhões de Convés" },
"foam": { "name": "Linha de Espuma", "desc": "Linha de Espuma" }
},
"status": {
"transferring": "A transferir…",
"available": "Disponível",
"notAvailable": "Indisponível",
"notConnected": "Não ligado"
},
"controls": {
"mainPumpOn": "Bomba LIGADA",
"mainPumpOff": "Bomba DESLIGADA",
"masterValveOpen": "Válvula ABERTA",
"masterValveClosed": "Válvula FECHADA",
"makeFoam": "FAZER ESPUMA",
"makingFoam": "A FAZER ESPUMA…",
"emergencyStop": "PARAGEM DE EMERGÊNCIA",
"resetEStop": "REPOR PARAGEM",
"open": "ABERTA",
"closed": "FECHADA"
},
"gauge": {
"intake": "Entrada",
"discharge": "Saída",
"rpm": "RPM da Bomba",
"flow": "Caudal",
"pressure": "Pressão",
"unitPSI": "PSI",
"unitRPM": "RPM",
"unitGPM": "GPM",
"tankCapacity": "Capacidade do Depósito:"
},
"hud": {
"water": "ÁGUA",
"foam": "ESPUMA"
},
"alerts": {
"highPressure": "PRESSÃO ELEVADA",
"emergencyStop": "PARAGEM DE EMERGÊNCIA ATIVA",
"transferring": "A TRANSFERIR ÁGUA…"
},
"messages": {
"transferFailed": "Falha na transferência."
},
"transfer": {
"start": "TRANSFERIR",
"stop": "PARAR",
"starting": "A INICIAR…",
"stopping": "A PARAR…"
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+505 -56
View File
@@ -11,72 +11,129 @@ if Config.Notifications.Enabled and Config.Notifications.Framework.ESX then
ESX = exports["es_extended"]:getSharedObject()
end
if Config.PlaceGeneratorCommand.Inventory.quasarInventory or Config.PlaceGeneratorCommand.Inventory.coreInventory then
function inventorySetupGenerator()
TriggerEvent("SupplyLine:Client:EquipPortableGenerator")
end
exports("inventorySetupGenerator", inventorySetupGenerator)
end
if Config.EnablePositioningCommand then
TriggerEvent('chat:addSuggestion', '/'.."findhosepositioning", "Find positioning of the hose/supply line on your fire truck")
TriggerEvent('chat:addSuggestion', '/'.."findhydrantpositioning", "Find rope spawn point and rotation for a hydrant", {
{ name="type", help="supplyLine or lppLine" }
})
RegisterCommand("findhosepositioning", function(source, args)
RegisterCommand("findhydrantpositioning", function(source, args)
local ropeLabel = args[1] or "supplyLine"
local ped = PlayerPedId()
local targetVehicle = GetVehiclePedIsIn(ped, false)
if targetVehicle == nil or targetVehicle == 0 then
Notify("No vehicle found!")
else
local model = `p_ld_soc_ball_01`
SetEntityAlpha(targetVehicle, 150, false)
RequestModel(model)
while not HasModelLoaded(model) do Wait(0) end
local ballProp = CreateObject(model, coords, false, false, false)
local pedCoords = GetEntityCoords(ped)
local targetHydrant = 0
while not DoesEntityExist(ballProp) do Wait(0) end
local ropeType = 4
if HydrantRopes and HydrantRopes.RopeTypes and HydrantRopes.RopeTypes[ropeLabel] then
ropeType = HydrantRopes.RopeTypes[ropeLabel]
end
-- Add your server's custom hydrant models to this list if you have them!
local hydrantModels = {
`prop_fire_hydrant_1`,
`prop_fire_hydrant_2`,
`prop_fire_hydrant_4`,
`bv_water_pump`
}
for _, model in ipairs(hydrantModels) do
local obj = GetClosestObjectOfType(pedCoords.x, pedCoords.y, pedCoords.z, 5.0, model, false, false, false)
if obj ~= 0 then
targetHydrant = obj
break
end
end
SetModelAsNoLongerNeeded(model)
local offSet = {0.0, 0.0, 0.0}
local rotation = {0.0, 0.0, 0.0}
local offSetComplete = false
while not offSetComplete do
if targetVehicle ~= nil and targetVehicle ~= 0 then
DetachEntity(ballProp, true, false)
AttachEntityToEntity(ballProp, targetVehicle, -1, offSet[1], offSet[2], offSet[3], rotation[1], rotation[2], rotation[3], true, false, true, false, 1, true)
if not IsControlReleased(0, 207) then --page down
offSet = {offSet[1], offSet[2], offSet[3] - 0.01}
end
if targetHydrant == 0 then return Notify("No hydrant found nearby! Stand closer.") end
if not IsControlReleased(0, 208) then --page up
offSet = {offSet[1], offSet[2], offSet[3] + 0.01}
end
RopeLoadTextures()
local hydPos = GetEntityCoords(targetHydrant)
local previewRope = AddRope(hydPos.x, hydPos.y, hydPos.z, 0.0, 0.0, 0.0, 20.0, ropeType, 20.0, 0.5, 1.0, false, false, false, 5.0, false, 0)
local offSet = {x = 0.0, y = 0.0, z = 0.0}
local rotation = {x = 0.0, y = 0.0, z = 0.0}
local depth = 0.2
local mode = "MOVE"
local editing = true
if not IsControlReleased(0, 173) then --arrow down
offSet = {offSet[1], offSet[2] - 0.01, offSet[3]}
end
Notify("~b~POSITIONING MODE~w~\n[TAB] Toggle Move/Rotate\n[Arrows] Adjust\n[INSERT/DELETE] Depth\n[ENTER] Save")
SetEntityAlpha(targetHydrant, 150, false)
local function RotationToDirection(rot)
local radZ = math.rad(rot.z)
local radX = math.rad(rot.x)
local num = math.abs(math.cos(radX))
return vector3(-math.sin(radZ) * num, math.cos(radZ) * num, math.sin(radX))
end
if not IsControlReleased(0, 172) then --arrow up
offSet = {offSet[1], offSet[2] + 0.01, offSet[3]}
end
if not IsControlReleased(0, 174) then --arrow left
offSet = {offSet[1] - 0.01, offSet[2], offSet[3]}
end
if not IsControlReleased(0, 175) then --arrow right
offSet = {offSet[1] + 0.01, offSet[2], offSet[3]}
end
if IsControlJustPressed(0, 191) then -- enter - finish
offSetComplete = true
end
end
Wait(0)
while editing do
Wait(0)
local speed = IsControlPressed(0, 21) and 0.05 or 0.005
if IsControlJustPressed(0, 192) then
mode = (mode == "MOVE") and "ROTATE" or "MOVE"
Notify("Mode: ~y~" .. mode)
end
Notify("OffSet Values are now printed in your console")
print("OffSet: {"..offSet[1]..", "..offSet[2]..", "..offSet[3].."}")
DeleteEntity(ballProp)
ResetEntityAlpha(targetVehicle)
if IsControlPressed(0, 121) then depth = depth + 0.005 end
if IsControlPressed(0, 178) then depth = depth - 0.005 end
local up = IsControlPressed(0, Config.PositioningControls.up)
local down = IsControlPressed(0, Config.PositioningControls.down)
local forward = IsControlPressed(0, Config.PositioningControls.forwards)
local backward = IsControlPressed(0, Config.PositioningControls.backwards)
local left = IsControlPressed(0, Config.PositioningControls.left)
local right = IsControlPressed(0, Config.PositioningControls.right)
if mode == "MOVE" then
if up then offSet.z = offSet.z + speed end
if down then offSet.z = offSet.z - speed end
if forward then offSet.y = offSet.y + speed end
if backward then offSet.y = offSet.y - speed end
if left then offSet.x = offSet.x - speed end
if right then offSet.x = offSet.x + speed end
else
local rSpeed = speed * 50.0
if up then rotation.x = rotation.x + rSpeed end
if down then rotation.x = rotation.x - rSpeed end
if left then rotation.z = rotation.z + rSpeed end
if right then rotation.z = rotation.z - rSpeed end
end
local forwardVec = RotationToDirection(rotation)
local localPortPos = vector3(offSet.x, offSet.y, offSet.z)
local localBendPosA = localPortPos - (forwardVec * depth)
local localBendPosB = localPortPos - (forwardVec * (depth * 0.5))
local worldPointC = GetOffsetFromEntityInWorldCoords(targetHydrant, localPortPos.x, localPortPos.y, localPortPos.z)
local worldPointA = GetOffsetFromEntityInWorldCoords(targetHydrant, localBendPosA.x, localBendPosA.y, localBendPosA.z)
local worldPointB = GetOffsetFromEntityInWorldCoords(targetHydrant, localBendPosB.x, localBendPosB.y, localBendPosB.z)
local handPos = GetWorldPositionOfEntityBone(ped, GetPedBoneIndex(ped, 6286))
local vertexCount = GetRopeVertexCount(previewRope)
PinRopeVertex(previewRope, 0, handPos.x, handPos.y, handPos.z)
PinRopeVertex(previewRope, vertexCount - 1, worldPointA.x, worldPointA.y, worldPointA.z)
PinRopeVertex(previewRope, vertexCount - 2, worldPointB.x, worldPointB.y, worldPointB.z)
PinRopeVertex(previewRope, vertexCount - 3, worldPointC.x, worldPointC.y, worldPointC.z)
if IsControlJustPressed(0, Config.PositioningControls.enter) then editing = false end
end
end, false)
ResetEntityAlpha(targetHydrant)
print(string.format("^2--- %s OFFSET RESULT ---^7", ropeLabel:upper()))
print(string.format("{ x = %.3f, y = %.3f, z = %.3f, rx = %.3f, ry = %.3f, rz = %.3f, depth = %.3f },", offSet.x, offSet.y, offSet.z, rotation.x, rotation.y, rotation.z, depth))
DeleteRope(previewRope)
Notify("Data printed to F8 console.")
end, false)
end
function Notify(text)
@@ -90,7 +147,7 @@ function Notify(text)
ESX.ShowNotification(text)
end
elseif Config.Notifications.Framework.QBCore then
TriggerEvent('QBCore:Notify', text, 'info')
TriggerEvent('QBCore:Notify', text, 'primary')
elseif Config.Notifications.Framework.QBX then
exports.qbx_core:Notify(text, 'primary')
elseif Config.Notifications.Framework.vRP then
@@ -102,6 +159,10 @@ function Notify(text)
end
end
RegisterNetEvent('SupplyLine:Client:showNotification', function(message)
Notify(message)
end)
function showBaseNotification(message)
-- Base game notifications
SetNotificationTextEntry("STRING")
@@ -139,4 +200,392 @@ function DrawTextOnScreen(text, x, y, scale, r, g, b, a, center)
end
AddTextComponentString(text)
DrawText(x, y)
end
local hydrantInteractionId = 'hydrantInteraction'
local hydrantInteractionActive = false
if Config.InteractType.HydrantInteraction.Drawtext or Config.InteractType.HydrantInteraction.ScreenPrompt then
StartHoseWaterLevelDisplayThread()
CreateThread(function()
while true do
local waitTime = 2500
local player = GetPlayerPed(PlayerId())
local playerPos = GetEntityCoords(player, false)
local fillingVehicle = nil
if not IsPedInAnyVehicle(player, false) then
local closestHydrant = GetClosestHydrant(playerPos)
if closestHydrant and DoesEntityExist(closestHydrant) then
if not NetworkGetEntityIsNetworked(closestHydrant) then
NetworkRegisterEntityAsNetworked(closestHydrant)
end
local hydrantId = NetworkGetNetworkIdFromEntity(closestHydrant)
if NetworkDoesNetworkIdExist(hydrantId) then
local hydrantPos = GetEntityCoords(closestHydrant)
local rope = HydrantRopes.currentRopes[hydrantId]
fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
if rope then
if fillingVehicle then
if Config.InteractType.HydrantInteraction.Drawtext then
drawInstructionalText(Config.Translations.stopFilling, vec3(hydrantPos.x, hydrantPos.y, hydrantPos.z + 1.0))
elseif Config.InteractType.HydrantInteraction.ScreenPrompt then
DisplayHelpText(Config.Translations.stopFilling)
end
else
if Config.InteractType.HydrantInteraction.Drawtext then
drawInstructionalText(Config.Translations.startFilling, vec3(hydrantPos.x, hydrantPos.y, hydrantPos.z + 1.0))
elseif Config.InteractType.HydrantInteraction.ScreenPrompt then
DisplayHelpText(Config.Translations.startFilling)
end
end
else
if HoseBridge.isLineEquipped and Config.InteractType.HydrantInteraction.Drawtext then
drawInstructionalText(Config.Translations.connectLine, vec3(hydrantPos.x, hydrantPos.y, hydrantPos.z + 1.0))
elseif Config.InteractType.HydrantInteraction.ScreenPrompt then
DisplayHelpText(Config.Translations.connectLine)
end
end
waitTime = 1
if IsControlJustPressed(1, Config.SupplyLineKeys.ConnectHydrant) and isPermissionAllowed() then
HandleHydrantInteraction(hydrantId, hydrantPos)
TriggerEvent('SmartHose:Client:Bridge:DeleteHandRopeS')
end
if IsControlJustPressed(1, Config.SupplyLineKeys.StartStopFilling) and rope and isPermissionAllowed() then
local fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
if fillingVehicle then
HandleStartStopFilling(hydrantId, false)
else
HandleStartStopFilling(hydrantId, true)
end
end
end
end
end
Wait(waitTime)
end
end)
elseif Config.InteractType.HydrantInteraction.ThirdEye.enabled then
local hydrantModels = {}
for _, offset in ipairs(Config.HydrantOffsets) do
table.insert(hydrantModels, offset.model)
end
StartHoseWaterLevelDisplayThread()
if Config.InteractType.HydrantInteraction.ThirdEye.oxTarget then
local jobGroups = GetAllowedJobGroups()
local HydrantOptions = {
{
name = 'connect_line',
label = Config.Translations.thirdEyeConnect,
icon = 'fa-solid fa-link',
groups = jobGroups,
canInteract = function(entity, distance, data)
if not HoseBridge.isLineEquipped then return false end
if HasObjectBeenBroken(entity) then return false end
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
if not NetworkGetEntityIsNetworked(entity) then
return false
end
end
local netId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[netId]
if rope then return false end
return true
end,
onSelect = function(data)
local hydrantEntity = data.entity
HandleHydrantInteractionEntity(hydrantEntity)
TriggerEvent('SmartHose:Client:Bridge:DeleteHandRopeS')
end,
},
{
name = 'start_filling',
label = Config.Translations.thirdEyeStartFill,
icon = 'fa-solid fa-play',
groups = jobGroups,
canInteract = function(entity, distance, data)
if HasObjectBeenBroken(entity) then return false end
if not NetworkGetEntityIsNetworked(entity) then return false end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[hydrantId]
local fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
return rope and not fillingVehicle
end,
onSelect = function(data)
local hydrantEntity = data.entity
HandleStartFillingEntity(hydrantEntity)
end,
},
{
name = 'stop_filling',
label = Config.Translations.thirdEyeStopFill,
icon = 'fa-solid fa-stop',
groups = jobGroups,
canInteract = function(entity, distance, data)
if HasObjectBeenBroken(entity) then return false end
if not NetworkGetEntityIsNetworked(entity) then return false end
local fillingVehicle = HydrantManager.fillingVehicles[NetworkGetNetworkIdFromEntity(entity)]
return fillingVehicle ~= nil
end,
onSelect = function(data)
local hydrantEntity = data.entity
HandleStopFillingEntity(hydrantEntity)
end,
},
{
name = 'disconnect_line',
label = Config.Translations.thirdEyeDisconnect,
icon = 'fa-solid fa-unlink',
groups = jobGroups,
canInteract = function(entity, distance, data)
if HasObjectBeenBroken(entity) then return false end
if not NetworkGetEntityIsNetworked(entity) then return false end
local rope = HydrantRopes.currentRopes[NetworkGetNetworkIdFromEntity(entity)]
return rope ~= nil
end,
onSelect = function(data)
local hydrantEntity = data.entity
HandleHydrantInteractionEntity(hydrantEntity)
end,
},
}
exports.ox_target:addModel(hydrantModels, HydrantOptions)
elseif Config.InteractType.HydrantInteraction.ThirdEye.qbTarget then
local allowedJobs = GetAllowedJobGroups()
exports['qb-target']:AddTargetModel(hydrantModels, {
options = {
{
label = Config.Translations.thirdEyeConnect,
icon = 'fa-solid fa-link',
job = allowedJobs,
canInteract = function(entity)
if not HoseBridge.isLineEquipped then return false end
if HasObjectBeenBroken(entity) then
return false
end
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
local rope = HydrantRopes.currentRopes[NetworkGetNetworkIdFromEntity(entity)]
return not rope
end,
action = function(entity)
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
HandleHydrantInteractionEntity(entity)
TriggerEvent('SmartHose:Client:Bridge:DeleteHandRopeS')
end,
},
{
label = Config.Translations.thirdEyeStartFill,
icon = 'fa-solid fa-play',
job = allowedJobs,
canInteract = function(entity)
if HasObjectBeenBroken(entity) then
return false
end
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[hydrantId]
local fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
return rope and not fillingVehicle
end,
action = function(entity)
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
HandleStartFillingEntity(entity)
end,
},
{
label = Config.Translations.thirdEyeStopFill,
icon = 'fa-solid fa-stop',
job = allowedJobs,
canInteract = function(entity)
if HasObjectBeenBroken(entity) then
return false
end
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
local fillingVehicle = HydrantManager.fillingVehicles[NetworkGetNetworkIdFromEntity(entity)]
return fillingVehicle ~= nil
end,
action = function(entity)
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
HandleStopFillingEntity(entity)
end,
},
{
label = Config.Translations.thirdEyeDisconnect,
icon = 'fa-solid fa-unlink',
job = allowedJobs,
canInteract = function(entity)
if HasObjectBeenBroken(entity) then
return false
end
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
local rope = HydrantRopes.currentRopes[NetworkGetNetworkIdFromEntity(entity)]
return rope ~= nil
end,
action = function(entity)
if not NetworkGetEntityIsNetworked(entity) then
NetworkRegisterEntityAsNetworked(entity)
Wait(0)
end
HandleHydrantInteractionEntity(entity)
end,
},
},
distance = 2.5,
})
end
elseif Config.InteractType.HydrantInteraction.WorldInteraction then
CreateThread(function()
local idleWait = 1000
local playerPed = PlayerPedId()
local playerPos = GetEntityCoords(playerPed)
while true do
Wait(idleWait)
playerPed = PlayerPedId()
playerPos = GetEntityCoords(playerPed)
if IsPedInAnyVehicle(playerPed, false) then
if hydrantInteractionActive then
for _, hydrantConfig in ipairs(Config.HydrantOffsets) do
exports.interact:RemoveModelInteraction(hydrantConfig.model, hydrantInteractionId)
end
hydrantInteractionActive = false
end
idleWait = 1500
else
local hydrant = GetClosestHydrant(playerPos)
if hydrant and DoesEntityExist(hydrant) and not HasObjectBeenBroken(hydrant) then
local hydrantPos = GetEntityCoords(hydrant)
local distanceToHydrant = #(playerPos - hydrantPos)
if distanceToHydrant < 4.0 then
if not hydrantInteractionActive then
for _, hydrantConfig in ipairs(Config.HydrantOffsets) do
exports.interact:AddModelInteraction({
model = hydrantConfig.model,
offset = vec3(0.0, 0.0, 0.5),
name = 'Hydrant Interaction',
id = hydrantInteractionId,
distance = 5.0,
interactDst = 1.5,
ignoreLos = true,
options = {
{
label = Config.Translations.thirdEyeConnect,
action = function(entity)
HandleHydrantInteractionEntity(entity)
end,
canInteract = function(entity)
if not isPermissionAllowed() or HasObjectBeenBroken(entity) then
return false
end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[hydrantId]
return not rope
end,
},
{
label = Config.Translations.thirdEyeStartFill,
action = function(entity)
HandleStartFillingEntity(entity)
end,
canInteract = function(entity)
if not isPermissionAllowed() or HasObjectBeenBroken(entity) then
return false
end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[hydrantId]
local fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
return rope and not fillingVehicle
end,
},
{
label = Config.Translations.thirdEyeStopFill,
action = function(entity)
HandleStopFillingEntity(entity)
end,
canInteract = function(entity)
if not isPermissionAllowed() or HasObjectBeenBroken(entity) then
return false
end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local fillingVehicle = HydrantManager.fillingVehicles[hydrantId]
return fillingVehicle ~= nil
end,
},
{
label = Config.Translations.thirdEyeDisconnect,
action = function(entity)
HandleHydrantInteractionEntity(entity)
end,
canInteract = function(entity)
if not isPermissionAllowed() or HasObjectBeenBroken(entity) then
return false
end
local hydrantId = NetworkGetNetworkIdFromEntity(entity)
local rope = HydrantRopes.currentRopes[hydrantId]
return rope ~= nil
end,
},
}
})
end
hydrantInteractionActive = true
end
idleWait = 0
else
if hydrantInteractionActive then
for _, hydrantConfig in ipairs(Config.HydrantOffsets) do
exports.interact:RemoveModelInteraction(hydrantConfig.model, hydrantInteractionId)
end
hydrantInteractionActive = false
end
idleWait = 500
end
else
if hydrantInteractionActive then
for _, hydrantConfig in ipairs(Config.HydrantOffsets) do
exports.interact:RemoveModelInteraction(hydrantConfig.model, hydrantInteractionId)
end
hydrantInteractionActive = false
end
idleWait = 1000
end
end
end
end)
else
warn('Invalid interaction configuration')
end
+215 -348
View File
@@ -4,492 +4,284 @@ Config = {
StartStopFilling = 74, -- H
},
Debug = true,
KeepEngineOnAfterPumpOff = true,
-- if useBone = true, "offsets" field will be ignored; otherwise custom offsets are enabled.
VehicleSettings = {
[`16ramcsquad`] = {
[`britishladder`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.340, y = -0.205, z = 0.000, rx = -39.000, ry = 0.000, rz = -94.750, depth = 0.335},
},
},
[`20Maxfdramsquad`] = {
[`lafdxt6700`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`20ramcsquad`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`23sierrafire`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`24rampumper`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`heavypump`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`heavyrescue`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`heavytank`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`heavywild`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`2025MAXcat`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`f550csquad`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`f550super6`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`ftanker`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofddztrk`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdeng`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`lacofdfoam`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdpat`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdrs`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`lacofdsup`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdt3`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdusartrk`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`lacofdusartrlr`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lacofdutil`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lafdcab`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`lafdtiller`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`lafdengine`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`max12gladLASD`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[` `] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`mmech`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`redf350brush21`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`Staff-EGRPf350su`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`velocity`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`x3bearcat`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`23smallboatfd`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[` `] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`brush`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`brushram`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`bulldog`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`enforcer`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
},
},
[`EnforcerEng`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`enforcerf`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
},
},
[`enforcerta`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`engine`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`enladder`] = {
[`lafdengine`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`fdgator`] = {
[`lacofdeng`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`lacofdt3`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`EnforcerEng`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`enforcer`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`enforcerta`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`enforcerf`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`brush`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`brushram`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`firef350`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`firetruk13`] = {
[`bulldog`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`foam1`] = {
[`ftanker`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`hazf350tec`] = {
[`heavypump`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`ladder6a`] = {
[`heavytank`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 0.8710, y = 0.1550, z = 0.0140 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`rescue6`] = {
[`heavywild`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`rescue6a`] = {
[`panther`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = -1.07, y = 0.9, z = -0.1 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`rescue9e`] = {
[`t3engine1`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`tender6`] = {
[`enladder`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`tender9b`] = {
[` `] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.045, y = -0.095, z = -0.060, rx = -19.000, ry = 0.000, rz = -88.500, depth = 0.525 },
{ x = -0.605, y = -4.155, z = -0.355, rx = -41.750, ry = 0.000, rz = -184.250, depth = 0.525 },
},
},
[`tower6`] = {
[`britishladderels`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.340, y = -0.205, z = 0.000, rx = -39.000, ry = 0.000, rz = -94.750, depth = 0.335},
},
},
[`mmladder`] = {
[`rearmount`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{x = -1.345, y = 1.095, z = -0.440, rx = -24.750, ry = 0.000, rz = 72.000, depth = 0.670 },
},
},
[`prescue`] = {
[`midmount`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = -1.320, y = 1.370, z = -0.595, rx = -24.250, ry = 0.000, rz = 77.500, depth = 0.860 },
},
},
[`ram20pov`] = {
[`tillertrailer`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.395, y = 0.445, z = 0.175, rx = -22.750, ry = 0.000, rz = -83.750, depth = 0.895 }
},
},
[`rescue1`] = {
[`tillertrailerels`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.395, y = 0.445, z = 0.175, rx = -22.750, ry = 0.000, rz = -83.750, depth = 0.895 }
},
},
[`walkin`] = {
[`rearmountels`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{x = -1.345, y = 1.095, z = -0.440, rx = -24.750, ry = 0.000, rz = 72.000, depth = 0.670 },
},
},
[`walkinarrow`] = {
[`midmountels`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = -1.320, y = 1.370, z = -0.595, rx = -24.250, ry = 0.000, rz = 77.500, depth = 0.860 },
},
},
[`fireboat`] = {
[`ldfoam`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.375, y = 1.160, z = 0.000, rx = -20.500, ry = 0.000, rz = -91.000, depth = 0.550 },
},
},
[`GC21F250`] = {
[`ldfoamels`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 1.375, y = 1.160, z = 0.000, rx = -20.500, ry = 0.000, rz = -91.000, depth = 0.550 },
},
},
[`Staff-Buggy`] = {
[`firerobot`] = {
useBone = false,
bones = {}, -- to add bones do "bone_name" you can have multiple by doing "bonename", "bonename_2"
offsets = {
{ x = 1.03, y = 0.1, z = -0.02 },
{ x = -0.93, y = 0.1, z = -0.52 },
{ x = 0.225, y = -1.590, z = 0.510, rx = -11.500, ry = 0.000, rz = 183.500, depth = 0.645, type = "hand"},
},
},
},
EnablePositioningCommand = false,
-- This enables the /findhosepositioning command to help you find the right vehicle offsets for either
-- the hose connection or the supply line connection point. See our documentation for more info.
EnablePositioningCommand = true,
-- This enables the /findhydrantpositioning command to help you find the right hydrant offsets for either
-- the supply connection or the lpp line connection point. See our documentation for more info.
PositioningControls = {
down = 207, -- Page Up
up = 208, -- Page Down
backwards = 173, -- Arrow Down
forwards = 172, -- Arrow Up
left = 174, -- Arrow Left
right = 175, -- Arrow Right
enter = 191, -- Enter Key
},
HydrantOffsets = {
{ model = `prop_fire_hydrant_4`, offsets = {x = 0.0, y = -0.27, z = 0.58} },
{ model = `prop_fire_hydrant_2`, offsets = {x = 0.1, y = 0.0, z = 0.4} },
{ model = `prop_fire_hydrant_1`, offsets = {x = 0.05, y = 0.0, z = 0.6} },
{ model = `prop_fire_hydrant_4`, offsets = { x = 0.000, y = -0.410, z = 0.525, rx = 28.500, ry = 0.000, rz = 0.000, depth = -0.455 } },
{ model = `prop_fire_hydrant_2`, offsets = { x = 0.030, y = -0.585, z = 0.245, rx = -35.250, ry = 0.000, rz = -173.750, depth = 0.465 } },
{ model = `prop_fire_hydrant_1`, offsets = { x = 0.540, y = 0.015, z = 0.540, rx = -13.500, ry = 0.000, rz = -86.250, depth = 0.460 } },
{ model = `bv_water_pump`, offsets = { x = -0.435, y = -0.490, z = 0.145, rx = -17.250, ry = 0.000, rz = 177.250, depth = 0.215 } }
},
Translations = {
stopFilling = "Press Z to disconnect line\nPress H to stop filling",
startFilling = "Press Z to disconnect line\nPress H to fill tank with water",
placeGenerator = "Press ~INPUT_FRONTEND_RDOWN~ to place the generator or ~INPUT_FRONTEND_RRIGHT~ to cancel.",
placePump = "Press ~INPUT_FRONTEND_RDOWN~ to place the pump or ~INPUT_FRONTEND_CANCEL~ to cancel.",
thirdEyeConnect = "Connect line to vehicle",
thirdEyeDisconnect ="Disconnect line from vehicle",
thirdEyeStartFill = "Start filling up vehicle",
@@ -499,11 +291,86 @@ Config = {
noPermission = "You do not have access to use the supply line.",
placeHydrantCommandHelp = "Place or remove a fire hydrant",
placeHydrantCommandHelpArgument = "place/remove",
placeGeneratorCommandHelp = "Place or remove a LPP",
placeGeneratorCommandHelpArgument = "place/remove",
placeHydrantCommandSuccess = "Hydrant placed successfully!",
placeHydrantCommandCancel = "Placement cancelled!",
removeHydrantCommandSuccess = "Hydrant removed!",
placeGeneratorCommandSuccess = "Hydrant placed successfully!",
placeGeneratorCommandCancel = "Placement cancelled!",
removeGeneratorCommandSuccess = "Hydrant removed!",
noVehicleNearby = "No vehicle nearby found!",
cantHoldWater = "This vehicle cannot hold water",
notInShallowWater = "You must be at the shoreline or shallow water to place the pump.",
lppEquipped = "You have equipped the portable generator. Place it near a water source.",
genAndPumpStored = "Generator and pump stored!",
noLppPlaced = "No generator is currently deployed!",
noItem = "You do not have the required item to use an LPP.",
},
PlaceGeneratorCommand = {
Enabled = true,
Inventory = {
ItemName = "lpp",
oxInventory = false,
quasarInventory = false,
coreInventory = false,
ESX = false,
vRP = false,
qbCore = false,
},
CommandName = "lpp",
PlaceArgument = "place",
RemoveArgument = "remove",
Permissions = {
EnablePermissions = false,
AcePermissions = {
Enabled = false,
-- The permission name will be command.hydrant
},
ESX = {
Enabled = false,
CheckJob = {
Enabled = false, -- Enable this to use ESX job check
Jobs = {"fireman"} -- A user can have any of the following jobs, allowing you to add multiple
}
},
-- We've added vRP integration. All you need to do is enable it below. Then, configure if you wish to check for groups or permissions, or even both
vRP = {
Enabled = false,
CheckGroup = {
Enabled = false, -- Enable this to use vRP group check
Groups = {"fireman"}, -- A user can have any of the following groups, meaning you can add different jobs
},
CheckPermission = {
Enabled = false, -- Enable this to use vRP permission check
Permissions = {"fireman.usehose"} -- A user can have any of the following permissions, allowing you to add multiple
},
},
-- We've added QBCore integration. All you need to do is enable it below. Then, configure if you wish to check for jobs or permissions, or even both
QBCore = {
Enabled = false,
CheckJob = {
Enabled = false, -- Enable this to use QBCore job check
Jobs = {"fireman"}, -- A user can have any of the following jobs, meaning you can add different jobs
},
CheckPermission = {
Enabled = false, -- Enable this to use QBCore permission check
permissions = {"fireman.usehose"}, -- A user can have any of the following permissions, allowing you to add multiple
},
},
-- We've added QBX integration. All you need to do is enable it below. Then, configure if you wish to check for jobs or permissions, or even both
QBX = {
Enabled = false,
CheckJob = {
Enabled = false, -- Enable this to use QBX job check
Jobs = {"fireman"}, -- A user can have any of the following jobs, meaning you can add different jobs
}
},
},
},
PlaceHydrantCommand = {
+7 -1
View File
@@ -7,7 +7,11 @@ lua54 'yes'
author 'London Studios'
description 'Supply-Line'
version '1.0.0'
version '2.2'
file {
'stream/bv_waterpump.ytyp'
}
shared_script 'config.lua'
@@ -26,4 +30,6 @@ escrow_ignore {
'sv_utils.lua',
'cl_utils.lua',
}
data_file 'DLC_ITYP_REQUEST' 'stream/bv_waterpump.ytyp'
dependency '/assetpacks'
Binary file not shown.
Binary file not shown.
+117 -3
View File
@@ -1,18 +1,66 @@
if Config.JobCheck.ESX.Enabled then
if Config.JobCheck.ESX.Enabled or Config.PlaceGeneratorCommand.Permissions.ESX.Enabled then
ESX = exports["es_extended"]:getSharedObject()
end
if Config.JobCheck.vRP.Enabled then
if Config.JobCheck.vRP.Enabled or Config.PlaceGeneratorCommand.Permissions.vRP.Enabled then
local Tunnel = module("vrp", "lib/Tunnel")
local Proxy = module("vrp", "lib/Proxy")
vRP = Proxy.getInterface("vRP")
vRPclient = Tunnel.getInterface("vRP","vRP")
end
if Config.JobCheck.QBCore.Enabled then
if Config.JobCheck.QBCore.Enabled or Config.PlaceGeneratorCommand.Inventory.qbCore or Config.PlaceGeneratorCommand.Permissions.QBCore.Enabled then
QBCore = exports['qb-core']:GetCoreObject()
end
local itemEnabled = Config.PlaceGeneratorCommand.Inventory.qbCore or Config.PlaceGeneratorCommand.Inventory.vRP or Config.PlaceGeneratorCommand.Inventory.ESX or Config.PlaceGeneratorCommand.Inventory.coreInventory or Config.PlaceGeneratorCommand.Inventory.oxInventory
usedGenerator = {}
if itemEnabled then
RegisterNetEvent("Server:GeneratorWithItem", function(src)
if HandleInventoryItems(src, Config.PlaceGeneratorCommand.Inventory.ItemName, false) then
usedGenerator[src] = true
TriggerClientEvent("SupplyLine:Client:EquipPortableGenerator", src)
else
TriggerClientEvent("SupplyLine:Client:showNotification", src, Config.Translations.noItem)
end
end)
end
RegisterNetEvent("Server:ReturnGenerator", function()
local source = source
if usedGenerator[source] ~= nil and usedGenerator[source] ~= false then
HandleInventoryItems(source, Config.PlaceGeneratorCommand.Inventory.ItemName, true)
usedGenerator[source] = nil
end
end)
if Config.PlaceGeneratorCommand.Inventory.qbCore then
CreateThread(function()
QBCore.Functions.CreateUseableItem(Config.PlaceGeneratorCommand.Inventory.ItemName, function(source, item)
TriggerEvent("Server:GeneratorWithItem", source)
end)
end)
end
if Config.PlaceGeneratorCommand.Inventory.ESX then
CreateThread(function()
ESX.RegisterUsableItem(Config.PlaceGeneratorCommand.Inventory.ItemName, function(playerId)
TriggerEvent("Server:GeneratorWithItem", playerId)
end)
end)
end
if Config.PlaceGeneratorCommand.Inventory.oxInventory then
exports('OxUseGenerator', function(event, item, inventory)
if event == 'usingItem' then
usedGenerator[inventory.player.source] = true
TriggerClientEvent("SupplyLine:Client:EquipPortableGenerator", inventory.player.source)
end
end)
end
function UserHasPermission(source, location)
if not location.EnablePermissions then
@@ -92,3 +140,69 @@ function UserHasPermission(source, location)
return false
end
function HandleInventoryItems(source, itemName, give)
if Config.PlaceGeneratorCommand.Inventory.vRP then
local userID = vRP.getUserId({source})
if give then
vRP.giveInventoryItem({userId, itemName, 1, false})
else
if vRP.tryGetInventoryItem({userID, itemName, 1, false}) then
return true
else
return false
end
end
elseif Config.PlaceGeneratorCommand.Inventory.qbCore then
if give then
exports['qb-inventory']:AddItem(source, itemName, 1, false, false, GetCurrentResourceName())
else
local successful = exports['qb-inventory']:RemoveItem(source, itemName, 1, false, GetCurrentResourceName())
return successful
end
elseif Config.PlaceGeneratorCommand.Inventory.ESX then
local xPlayer = ESX.GetPlayerFromId(source)
if give then
xPlayer.addInventoryItem(itemName, 1)
else
local returnedItem = xPlayer.getInventoryItem(itemName)
if returnedItem.canRemove then
xPlayer.removeInventoryItem(itemName, 1)
return true
else
return false
end
end
elseif Config.PlaceGeneratorCommand.Inventory.oxInventory then
if give then
exports.ox_inventory:AddItem(source, itemName, 1)
else
local successful = exports.ox_inventory:RemoveItem(source, itemName, 1)
return successful
end
elseif Config.PlaceGeneratorCommand.Inventory.quasarInventory then
if give then
exports['qs-inventory']:AddItem(source, itemName, 1)
else
local quantity = exports['qs-inventory']:GetItemTotalAmount(source, itemName)
if quantity > 0 then
exports['qs-inventory']:RemoveItem(source, itemName, 1)
return true
else
return false
end
end
elseif Config.PlaceGeneratorCommand.Inventory.coreInventory then
if give then
exports.core_Inventory:addItem(source, itemName, 1)
else
local successful = exports.core_Inventory:removeItem(source, itemName, 1)
return successful
end
end
end
@@ -1,778 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<CVehicleModelInfoVarGlobal>
<Lights>
</Lights>
<Sirens>
<Item>
<id value="204"/>
<name>prescue</name>
<timeMultiplier value="1.00000000"/>
<lightFalloffMax value="100.00000000"/>
<lightFalloffExponent value="100.00000000"/>
<lightInnerConeAngle value="2.29061000"/>
<lightOuterConeAngle value="70.00000000"/>
<lightOffset value="0.00000000"/>
<textureName>VehicleLight_sirenlight</textureName>
<sequencerBpm value="450"/>
<leftHeadLight>
<sequencer value="0"/>
</leftHeadLight>
<rightHeadLight>
<sequencer value="0"/>
</rightHeadLight>
<leftTailLight>
<sequencer value="0"/>
</leftTailLight>
<rightTailLight>
<sequencer value="0"/>
</rightTailLight>
<leftHeadLightMultiples value="1"/>
<rightHeadLightMultiples value="1"/>
<leftTailLightMultiples value="1"/>
<rightTailLightMultiples value="1"/>
<useRealLights value="true"/>
<sirens>
<!-- siren1 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="20.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="false"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="20.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="false"/>
</flashiness>
<corona>
<intensity value="0.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.00000000"/>
<lightGroup value="0"/>
<rotate value="true"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren2 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="20.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="false"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="20.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="false"/>
<syncToBpm value="false"/>
</flashiness>
<corona>
<intensity value="0.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000000"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.00000000"/>
<lightGroup value="0"/>
<rotate value="true"/>
<scale value="false"/>
<scaleFactor value="0"/>
<flash value="true"/>
<light value="false"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren3 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFF00"/>
<intensity value="0.10000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren4 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren5 -->
<Item>
<rotation>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren6 -->
<Item>
<rotation>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren7 -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren8 -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren9 -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren10 -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFF00"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren11 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren12 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren13 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="9739768356"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="9739768356"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren14 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="5952080662"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="5952080662"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren15 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="19479536712"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="19479536712"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren16 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="37335778699"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="37335778699"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren17 -->
<Item>
<rotation>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="-1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="2.00000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren18 -->
<Item>
<rotation>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="1.57079633"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="4294967295"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFFFFFF"/>
<intensity value="2.00000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren19 -->
<Item>
<rotation>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="3.14159265"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="1431655765"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
<!-- siren20 -->
<Item>
<rotation>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</rotation>
<flashiness>
<delta value="0.00000000"/>
<start value="0.00000000"/>
<speed value="0.00000000"/>
<sequencer value="2863311530"/>
<multiples value="1"/>
<direction value="true"/>
<syncToBpm value="true"/>
</flashiness>
<corona>
<intensity value="25.00000000"/>
<size value="0.00000000"/>
<pull value="0.00000001"/>
<faceCamera value="false"/>
</corona>
<color value="0xFFFF0000"/>
<intensity value="0.50000000"/>
<lightGroup value="0"/>
<rotate value="false"/>
<scale value="true"/>
<scaleFactor value="10"/>
<flash value="true"/>
<light value="true"/>
<spotLight value="true"/>
<castShadows value="false"/>
</Item>
</sirens>
</Item>
</Sirens>
</CVehicleModelInfoVarGlobal>
@@ -1,276 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfoVariation>
<variationData>
<Item>
<modelName>prescue</modelName>
<colors>
<Item>
<indices content="char_array">
0
0
11
156
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
<Item>
<indices content="char_array">
2
0
134
156
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
<Item>
<indices content="char_array">
75
0
157
156
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
<Item>
<indices content="char_array">
7
0
134
0
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
<Item>
<indices content="char_array">
34
0
45
0
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
<Item>
<indices content="char_array">
0
0
2
0
0
0
</indices>
<liveries>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
<Item value="false"/>
</liveries>
</Item>
</colors>
<kits>
<Item>0_default_modkit</Item>
</kits>
<windowsWithExposedEdges/>
<plateProbabilities>
<Probabilities>
<Item>
<Name>Police guv plate</Name>
<Value value="100"/>
</Item>
</Probabilities>
</plateProbabilities>
<lightSettings value="1"/>
<sirenSettings value="204"/>
</Item>
</variationData>
</CVehicleModelInfoVariation>
@@ -1,140 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CVehicleModelInfo__InitDataList>
<residentTxd>vehshare</residentTxd>
<residentAnims />
<InitDatas>
<Item>
<modelName>prescue</modelName>
<txdName>prescue</txdName>
<handlingId>riot2</handlingId>
<gameName>prescue</gameName>
<vehicleMakeName />
<expressionDictName>null</expressionDictName>
<expressionName>null</expressionName>
<animConvRoofDictName>null</animConvRoofDictName>
<animConvRoofName>null</animConvRoofName>
<animConvRoofWindowsAffected />
<ptfxAssetName>null</ptfxAssetName>
<audioNameHash>kc129powerstroke60</audioNameHash>
<layout>LAYOUT_FIRETRUCK</layout>
<coverBoundOffsets>SHERIFF_COVER_OFFSET_INFO</coverBoundOffsets>
<explosionInfo>EXPLOSION_INFO_DEFAULT</explosionInfo>
<scenarioLayout />
<cameraName>DEFAULT_FOLLOW_VEHICLE_CAMERA</cameraName>
<aimCameraName>DEFAULT_THIRD_PERSON_VEHICLE_AIM_CAMERA</aimCameraName>
<bonnetCameraName>VEHICLE_BONNET_CAMERA_MID_HIGH</bonnetCameraName>
<povCameraName>DEFAULT_POV_CAMERA</povCameraName>
<FirstPersonDriveByIKOffset x="0.000000" y="-0.060000" z="-0.060000" />
<FirstPersonDriveByUnarmedIKOffset x="0.000000" y="0.-050000" z="-0.020000" />
<FirstPersonProjectileDriveByIKOffset x="0.000000" y="-0.075000" z="-0.045000" />
<FirstPersonProjectileDriveByPassengerIKOffset x="0.000000" y="-0.075000" z="-0.045000" />
<FirstPersonProjectileDriveByRearLeftIKOffset x="0.000000" y="0.020000" z="0.030000" />
<FirstPersonProjectileDriveByRearRightIKOffset x="0.000000" y="0.020000" z="0.030000" />
<FirstPersonDriveByLeftPassengerIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByRightPassengerIKOffset x="0.000000" y="-0.060000" z="-0.060000" />
<FirstPersonDriveByRightRearPassengerIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByLeftPassengerUnarmedIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonDriveByRightPassengerUnarmedIKOffset x="0.000000" y="0.000000" z="0.000000" />
<FirstPersonMobilePhoneOffset x="0.155000" y="0.270000" z="0.508000" />
<FirstPersonPassengerMobilePhoneOffset x="0.136000" y="0.223000" z="0.405000" />
<FirstPersonMobilePhoneSeatIKOffset>
<Item>
<Offset x="0.136000" y="0.156000" z="0.425000" />
<SeatIndex value="2" />
</Item>
<Item>
<Offset x="0.136000" y="0.156000" z="0.425000" />
<SeatIndex value="3" />
</Item>
</FirstPersonMobilePhoneSeatIKOffset>
<PovCameraOffset x="0.000000" y="-0.145000" z="0.645000" />
<PovCameraVerticalAdjustmentForRollCage value="0.000000" />
<PovPassengerCameraOffset x="0.000000" y="0.000000" z="0.000000" />
<PovRearPassengerCameraOffset x="0.000000" y="0.000000" z="0.000000" />
<vfxInfoName>VFXVEHICLEINFO_CAR_GENERIC</vfxInfoName>
<shouldUseCinematicViewMode value="true" />
<shouldCameraTransitionOnClimbUpDown value="false" />
<shouldCameraIgnoreExiting value="false" />
<AllowPretendOccupants value="true" />
<AllowJoyriding value="false" />
<AllowSundayDriving value="false" />
<AllowBodyColorMapping value="true" />
<wheelScale value="0.237100" />
<wheelScaleRear value="0.237100" />
<dirtLevelMin value="0.000000" />
<dirtLevelMax value="0.850000" />
<envEffScaleMin value="0.000000" />
<envEffScaleMax value="1.000000" />
<envEffScaleMin2 value="0.000000" />
<envEffScaleMax2 value="1.000000" />
<damageMapScale value="0.600000" />
<damageOffsetScale value="1.000000" />
<diffuseTint value="0x00FFFFFF" />
<steerWheelMult value="1.000000" />
<HDTextureDist value="5.000000" />
<lodDistances content="float_array">
100.000000
200.000000
300.000000
400.000000
500.000000
500.000000
</lodDistances>
<minSeatHeight value="0.839" />
<identicalModelSpawnDistance value="20" />
<maxNumOfSameColor value="10" />
<defaultBodyHealth value="1000.000000" />
<pretendOccupantsScale value="1.000000" />
<visibleSpawnDistScale value="1.000000" />
<trackerPathWidth value="2.000000" />
<weaponForceMult value="1.000000" />
<frequency value="100" />
<swankness>SWANKNESS_1</swankness>
<maxNum value="2" />
<flags>FLAG_HAS_LIVERY FLAG_EXTRAS_REQUIRE FLAG_EXTRAS_STRONG FLAG_LAW_ENFORCEMENT FLAG_EMERGENCY_SERVICE FLAG_NO_RESPRAY FLAG_DONT_SPAWN_IN_CARGEN FLAG_REPORT_CRIME_IF_STANDING_ON FLAG_HAS_INTERIOR_EXTRAS </flags>
<type>VEHICLE_TYPE_CAR</type>
<plateType>VPT_FRONT_AND_BACK_PLATES</plateType>
<dashboardType>VDT_GENTAXI</dashboardType>
<vehicleClass>VC_EMERGENCY</vehicleClass>
<wheelType>VWT_MUSCLE</wheelType>
<trailers />
<additionalTrailers />
<drivers>
<Item>
<driverName>S_M_Y_Sheriff_01</driverName>
<npcName />
</Item>
</drivers>
<extraIncludes />
<doorsWithCollisionWhenClosed />
<driveableDoors />
<bumpersNeedToCollideWithMap value="false" />
<needsRopeTexture value="false" />
<requiredExtras />
<rewards>
<Item>REWARD_WEAPON_PUMPSHOTGUN</Item>
<Item>REWARD_AMMO_PUMPSHOTGUN_ENTER_VEHICLE</Item>
<Item>REWARD_STAT_WEAPON</Item>
</rewards>
<cinematicPartCamera>
<Item>WHEEL_FRONT_RIGHT_CAMERA</Item>
<Item>WHEEL_FRONT_LEFT_CAMERA</Item>
<Item>WHEEL_REAR_RIGHT_CAMERA</Item>
<Item>WHEEL_REAR_LEFT_CAMERA</Item>
</cinematicPartCamera>
<NmBraceOverrideSet />
<buoyancySphereOffset x="0.000000" y="0.000000" z="0.000000" />
<buoyancySphereSizeScale value="1.000000" />
<pOverrideRagdollThreshold type="NULL" />
<firstPersonDrivebyData>
<Item>STD_POLICE_FRONT_LEFT</Item>
<Item>STD_POLICE_FRONT_RIGHT</Item>
<Item>STD_POLICE_REAR_LEFT</Item>
<Item>STD_POLICE_REAR_RIGHT</Item>
</firstPersonDrivebyData>
</Item>
</InitDatas>
<txdRelationships>
</txdRelationships>
</CVehicleModelInfo__InitDataList>
@@ -555,10 +555,50 @@ data_file 'CARCOLS_FILE' 'data/lasdchrg14/carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/lasdchrg14/carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'data/lasdchrg14/dlctext.meta'
-- 2021chevy2500hd
files {
'data/2021chevy2500hd/vehicles.meta',
'data/2021chevy2500hd/carvariations.meta',
'data/2021chevy2500hd/carcols.meta',
'data/2021chevy2500hd/handling.meta',
'data/2021chevy2500hd/vehiclelayouts.meta',
}
data_file 'HANDLING_FILE' 'data/2021chevy2500hd/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/2021chevy2500hd/vehicles.meta'
data_file 'CARCOLS_FILE' 'data/2021chevy2500hd/carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/2021chevy2500hd/carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'data/2021chevy2500hd/dlctext.meta'
-- breakingbadrv
files {
'data/breakingbadrv/vehicles.meta',
'data/breakingbadrv/carvariations.meta',
'data/breakingbadrv/carcols.meta',
'data/breakingbadrv/handling.meta',
'data/breakingbadrv/vehiclelayouts.meta',
}
data_file 'HANDLING_FILE' 'data/breakingbadrv/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/breakingbadrv/vehicles.meta'
data_file 'CARCOLS_FILE' 'data/breakingbadrv/carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/breakingbadrv/carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'data/breakingbadrv/dlctext.meta'
-- GC21F250
files {
'data/GC21F250/vehicles.meta',
'data/GC21F250/carvariations.meta',
'data/GC21F250/carcols.meta',
'data/GC21F250/handling.meta',
'data/GC21F250/vehiclelayouts.meta',
}
data_file 'HANDLING_FILE' 'data/GC21F250/handling.meta'
data_file 'VEHICLE_METADATA_FILE' 'data/GC21F250/vehicles.meta'
data_file 'CARCOLS_FILE' 'data/GC21F250/carcols.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/GC21F250/carvariations.meta'
data_file 'VEHICLE_LAYOUTS_FILE' 'data/GC21F250/dlctext.meta'
client_script {
@@ -1,2 +0,0 @@
resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937'
this_is_a_map 'yes'
Binary file not shown.
Binary file not shown.
-83
View File
@@ -1,83 +0,0 @@
-- Please read our documentation before configuring
-- https://docs.londonstudios.net/
main = {
hoseCommand = {
enabled = true, -- This enables/disables the hose command
commandName = "hose", -- This is the command name for the hose
hoseModel = `weapon_hose`, -- This is the model for the hose. This must be wrapped in `` symbols
acePermissions = {
enabled = false,
-- This enables ace permissions on the hose command
},
-- We've added ESX integration. All you need to do is enable it below and configure which jobs can use the command
ESX = {
enabled = false,
checkJob = {
enabled = true, -- Enable this to use ESX job check
jobs = {"fire", "firefighter"} -- A user can have any of the following jobs, allowing you to add multiple
}
},
-- We've added vRP integration. All you need to do is enable it below. Then, configure if you wish to check for groups or permissions, or even both
vRP = {
enabled = false,
checkGroup = {
enabled = false, -- Enable this to use vRP group check
groups = {"fire", "admin"}, -- A user can have any of the following groups, meaning you can add different jobs
},
checkPermission = {
enabled = false, -- Enable this to use vRP permission check
permissions = {"player.kick"} -- A user can have any of the following permissions, allowing you to add multiple
},
},
-- We've added QBCore integration. All you need to do is enable it below. Then, configure if you wish to check for jobs or permissions, or even both
QBCore = {
enabled = false,
checkJob = {
enabled = false, -- Enable this to use QBCore job check
jobs = {"fire"}, -- A user can have any of the following jobs, meaning you can add different jobs
},
checkPermission = {
enabled = false, -- Enable this to use QBCore permission check
permissions = {"god"}, -- A user can have any of the following permissions, allowing you to add multiple
},
},
hoseCooldown = 2, -- This is the cooldown after spraying hose or foam, to prevent any glitches or particle issues
},
foamCommand = {
enabled = true, -- This enables or disables the foam command
commandName = "foam", -- This enables/disables the foam command
enableFoamEffectOnGround = true, -- This enables or disables the foam effect on the ground
foamEffectMaxDistance = 10.0, -- This is the maximum distance that the foam effect on the ground can spawn from the hose
},
}
translations = {
foamCommandHelpText = "Toggle foam mode on your fire hose",
hoseCommandHelpText = "Activate or deactivate your fire hose",
weaponName = "Hose",
hoseDisabled = "Fire hose is now ~r~disabled~w~.",
hoseEnabled = "Fire hose is now ~b~enabled~w~.",
foamModeDisabled = "Foam mode is now ~r~disabled~w~.",
foamModeEnabled = "Foam mode is now ~g~enabled~w~.",
}
developer = {
foam = {
offSet = {
0.0, -0.06, 0.6
},
rotation = {
0.0, 60.0, 0.0
},
},
hose = {
offSet = {
0.0, -0.1, 0.65
},
rotation = {
-40.0, 0.0, 90.0
},
},
}
@@ -1,44 +0,0 @@
fx_version 'bodacious'
games { 'gta5' }
author 'London Studios'
description 'Create and fight realistic fires with a host of features'
version '1.0.0'
lua54 'yes'
client_scripts {
'config.lua',
'cl_hose.lua',
}
server_scripts {
-- "@vrp/lib/utils.lua",
'config.lua',
'sv_exports.lua',
'sv_hose.lua',
}
shared_script '@es_extended/imports.lua'
escrow_ignore {
'stream/*',
'hose/*',
'config.lua',
}
files {
'hose/pedpersonality.meta',
'hose/weaponanimations.meta',
'hose/weaponarchetypes.meta',
'hose/weapons.meta',
}
data_file 'WEAPONINFO_FILE' 'hose/weapons.meta'
data_file 'WEAPON_METADATA_FILE' 'hose/weaponarchetypes.meta'
data_file 'WEAPON_ANIMATIONS_FILE' 'hose/weaponanimations.meta'
data_file 'PED_PERSONALITY_FILE' 'hose/pedpersonality.meta'
-- HoseLS created by London Studios.
-- Join our Discord server here: https://discord.gg/htyaZNaG
dependency '/assetpacks'
@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CExtraTextMetaFile>
<hasGlobalTextFile value="true"/>
<hasAdditionalText value="true"/>
<isTitleUpdate value="false"/>
</CExtraTextMetaFile>
@@ -1,372 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CPedModelInfo__PersonalityDataList>
<MovementModeUnholsterData>
<Item>
<Name>UNHOLSTER_UNARMED</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>unarmed_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_2H_MELEE</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>2h_melee_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_1H</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>1h_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_2H</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>2h_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_MINIGUN</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>mini_holster_2h_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_UNARMED_STEALTH</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>unarmed_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_2H_MELEE_STEALTH</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>unarmed_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_1H_STEALTH</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>1h_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
<Item>
<Name>UNHOLSTER_2H_STEALTH</Name>
<UnholsterClips>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<Clip>2h_holster_unarmed</Clip>
</Item>
</UnholsterClips>
</Item>
</MovementModeUnholsterData>
<MovementModes>
<Item>
<Name>DEFAULT_ACTION</Name>
<MovementModes>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_action@p_m_zero@unarmed@core</MovementClipSetId>
<WeaponClipSetId />
<WeaponClipFilterId />
<UpperBodyShadowExpressionEnabled value="false" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="true" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_ACTION@GENERIC@TRANS@UNARMED</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_ACTION@P_M_ZERO@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_stealth@p_m_zero@unarmed@core</MovementClipSetId>
<WeaponClipSetId>weapons@melee_stealth_1h</WeaponClipSetId>
<WeaponClipFilterId>UpperbodyAndIk_filter</WeaponClipFilterId>
<UpperBodyShadowExpressionEnabled value="true" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="false" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>move_stealth@generic@trans@unarmed</Item>
</IdleTransitions>
<UnholsterClipSetId>move_stealth@p_m_zero@holster</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED_STEALTH</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
</MovementModes>
</Item>
<Item>
<Name>MP_FEMALE_ACTION</Name>
<MovementModes>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>MOVE_ACTION@MP_FEMALE@UNARMED@CORE</MovementClipSetId>
<WeaponClipSetId />
<WeaponClipFilterId />
<UpperBodyShadowExpressionEnabled value="false" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="true" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_ACTION@MP_FEMALE@UNARMED@TRANS@</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_ACTION@P_M_ZERO@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_stealth@p_m_zero@unarmed@core</MovementClipSetId>
<WeaponClipSetId>weapons@melee_stealth_1h</WeaponClipSetId>
<WeaponClipFilterId>UpperbodyAndIk_filter</WeaponClipFilterId>
<UpperBodyShadowExpressionEnabled value="true" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="false" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_STEALTH@MP_FEMALE@UNARMED@TRANS</Item>
</IdleTransitions>
<UnholsterClipSetId>move_stealth@p_m_zero@holster</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED_STEALTH</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
</MovementModes>
</Item>
<Item>
<Name>MICHAEL_ACTION</Name>
<MovementModes>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_action@p_m_zero@unarmed@core</MovementClipSetId>
<WeaponClipSetId />
<WeaponClipFilterId />
<UpperBodyShadowExpressionEnabled value="false" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="true" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_ACTION@P_M_ZERO@UNARMED@TRANS@A</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_ACTION@P_M_ZERO@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_stealth@p_m_zero@unarmed@core</MovementClipSetId>
<WeaponClipSetId>weapons@melee_stealth_1h</WeaponClipSetId>
<WeaponClipFilterId>UpperbodyAndIk_filter</WeaponClipFilterId>
<UpperBodyShadowExpressionEnabled value="true" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="false" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>move_stealth@p_m_zero@unarmed@trans@a</Item>
</IdleTransitions>
<UnholsterClipSetId>move_stealth@p_m_zero@holster</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED_STEALTH</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
</MovementModes>
</Item>
<Item>
<Name>FRANKLIN_ACTION</Name>
<MovementModes>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_action@p_m_one@unarmed@core</MovementClipSetId>
<WeaponClipSetId />
<WeaponClipFilterId />
<UpperBodyShadowExpressionEnabled value="false" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="true" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_ACTION@P_M_ONE@UNARMED@TRANS@A</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_ACTION@P_M_ONE@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_stealth@p_m_one@unarmed@core</MovementClipSetId>
<WeaponClipSetId>weapons@melee_stealth_1h@p_m_one</WeaponClipSetId>
<WeaponClipFilterId>UpperbodyAndIk_filter</WeaponClipFilterId>
<UpperBodyShadowExpressionEnabled value="true" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="false" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>move_stealth@p_m_one@unarmed@trans@a</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_STEALTH@P_M_ONE@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED_STEALTH</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
</MovementModes>
</Item>
<Item>
<Name>TREVOR_ACTION</Name>
<MovementModes>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_action@p_m_two@unarmed@core</MovementClipSetId>
<WeaponClipSetId />
<WeaponClipFilterId />
<UpperBodyShadowExpressionEnabled value="false" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="true" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>MOVE_ACTION@P_M_TWO@UNARMED@TRANS@A</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_ACTION@P_M_TWO@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
<Item>
<Item>
<Weapons>
<Item>WEAPON_HOSE</Item>
</Weapons>
<ClipSets>
<Item>
<MovementClipSetId>move_stealth@p_m_two@unarmed@core</MovementClipSetId>
<WeaponClipSetId>weapons@melee_stealth_1h@p_m_two</WeaponClipSetId>
<WeaponClipFilterId>UpperbodyAndIk_filter</WeaponClipFilterId>
<UpperBodyShadowExpressionEnabled value="true" />
<UpperBodyFeatheredLeanEnabled value="false" />
<UseWeaponAnimsForGrip value="false" />
<UseLeftHandIk value="false" />
<IdleTransitionBlendOutTime value="0.500000" />
<IdleTransitions>
<Item>move_stealth@p_m_two@unarmed@trans@a</Item>
</IdleTransitions>
<UnholsterClipSetId>MOVE_STEALTH@P_M_TWO@HOLSTER</UnholsterClipSetId>
<UnholsterClipData>UNHOLSTER_UNARMED_STEALTH</UnholsterClipData>
</Item>
</ClipSets>
</Item>
</Item>
</MovementModes>
</Item>
</MovementModes>
</CPedModelInfo__PersonalityDataList>
File diff suppressed because it is too large Load Diff
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CWeaponModelInfo__InitDataList>
<InitDatas>
<!-- Battle Axe -->
<Item>
<modelName>w_am_hose</modelName>
<txdName>w_am_hose</txdName>
<ptfxAssetName>NULL</ptfxAssetName>
<lodDist value="500"/>
</Item>
</InitDatas>
</CWeaponModelInfo__InitDataList>
@@ -1,236 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<CWeaponInfoBlob>
<SlotNavigateOrder>
<Item>
<WeaponSlots>
<Item>
<OrderNumber value="104" />
<Entry>SLOT_HOSE</Entry>
</Item>
</WeaponSlots>
</Item>
<Item>
<WeaponSlots>
<Item>
<OrderNumber value="125" />
<Entry>SLOT_HOSE</Entry>
</Item>
</WeaponSlots>
</Item>
</SlotNavigateOrder>
<SlotBestOrder>
<WeaponSlots>
<Item>
<OrderNumber value="172" />
<Entry>SLOT_HOSE</Entry>
</Item>
</WeaponSlots>
</SlotBestOrder>
<Infos>
<Item>
<Infos />
</Item>
<Item>
<Infos>
<Item type="CWeaponInfo">
<Name>WEAPON_HOSE</Name>
<Model>w_am_hose</Model>
<Audio />
<Slot>SLOT_HOSE</Slot>
<DamageType>FIRE_EXTINGUISHER</DamageType>
<Explosion>
<Default>DONTCARE</Default>
<HitCar>DONTCARE</HitCar>
<HitTruck>DONTCARE</HitTruck>
<HitBike>DONTCARE</HitBike>
<HitBoat>DONTCARE</HitBoat>
<HitPlane>DONTCARE</HitPlane>
</Explosion>
<FireType>VOLUMETRIC_PARTICLE</FireType>
<WheelSlot>WHEEL_THROWABLE_SPECIAL</WheelSlot>
<Group>GROUP_FIREEXTINGUISHER</Group>
<AmmoInfo ref="AMMO_FIREEXTINGUISHER" />
<AimingInfo ref="FIRE_EXT_STRAFE" />
<ClipSize value="2000" />
<AccuracySpread value="1.000000" />
<AccurateModeAccuracyModifier value="0.500000" />
<RunAndGunAccuracyModifier value="2.000000" />
<RunAndGunAccuracyMaxModifier value="1.000000" />
<RecoilAccuracyMax value="1.000000" />
<RecoilErrorTime value="0.000000" />
<RecoilRecoveryRate value="1.000000" />
<RecoilAccuracyToAllowHeadShotAI value="1000.000000" />
<MinHeadShotDistanceAI value="1000.000000" />
<MaxHeadShotDistanceAI value="1000.000000" />
<HeadShotDamageModifierAI value="1000.000000" />
<RecoilAccuracyToAllowHeadShotPlayer value="0.175000" />
<MinHeadShotDistancePlayer value="5.000000" />
<MaxHeadShotDistancePlayer value="40.000000" />
<HeadShotDamageModifierPlayer value="18.000000" />
<Damage value="0.000000" />
<DamageTime value="0.000000" />
<DamageTimeInVehicle value="0.000000" />
<DamageTimeInVehicleHeadShot value="0.000000" />
<HitLimbsDamageModifier value="0.500000" />
<NetworkHitLimbsDamageModifier value="0.800000" />
<LightlyArmouredDamageModifier value="0.750000" />
<Force value="0.000000" />
<ForceHitPed value="0.000000" />
<ForceHitVehicle value="0.000000" />
<ForceHitFlyingHeli value="0.000000" />
<OverrideForces />
<ForceMaxStrengthMult value="1.000000" />
<ForceFalloffRangeStart value="0.000000" />
<ForceFalloffRangeEnd value="50.000000" />
<ForceFalloffMin value="1.000000" />
<ProjectileForce value="0.000000" />
<FragImpulse value="250.000000" />
<Penetration value="0.010000" />
<VerticalLaunchAdjustment value="0.000000" />
<DropForwardVelocity value="0.000000" />
<Speed value="2000.000000" />
<BulletsInBatch value="1" />
<BatchSpread value="0.000000" />
<ReloadTimeMP value="-1.000000" />
<ReloadTimeSP value="-1.000000" />
<VehicleReloadTime value="-1.000000" />
<AnimReloadRate value="1.000000" />
<BulletsPerAnimLoop value="1" />
<TimeBetweenShots value="0.000000" />
<TimeLeftBetweenShotsWhereShouldFireIsCached value="-1.000000" />
<SpinUpTime value="0.000000" />
<SpinTime value="0.000000" />
<SpinDownTime value="0.000000" />
<AlternateWaitTime value="-1.000000" />
<BulletBendingNearRadius value="0.000000" />
<BulletBendingFarRadius value="0.750000" />
<BulletBendingZoomedRadius value="0.375000" />
<FirstPersonBulletBendingNearRadius value="0.000000" />
<FirstPersonBulletBendingFarRadius value="0.750000" />
<FirstPersonBulletBendingZoomedRadius value="0.375000" />
<Fx>
<EffectGroup>WEAPON_EFFECT_GROUP_PISTOL_SMALL</EffectGroup>
<FlashFx>weap_extinguisher</FlashFx>
<FlashFxAlt />
<MuzzleSmokeFx />
<MuzzleSmokeFxMinLevel value="0.000000" />
<MuzzleSmokeFxIncPerShot value="0.000000" />
<MuzzleSmokeFxDecPerSec value="0.000000" />
<ShellFx />
<TracerFx />
<PedDamageHash>BulletSmall</PedDamageHash>
<TracerFxChanceSP value="0.000000" />
<TracerFxChanceMP value="0.000000" />
<FlashFxChanceSP value="0.000000" />
<FlashFxChanceMP value="0.000000" />
<FlashFxAltChance value="0.000000" />
<FlashFxScale value="1.000000" />
<FlashFxLightEnabled value="false" />
<FlashFxLightCastsShadows value="true" />
<FlashFxLightOffsetDist value="0.000000" />
<FlashFxLightRGBAMin x="0.000000" y="0.000000" z="0.000000" />
<FlashFxLightRGBAMax x="0.000000" y="0.000000" z="0.000000" />
<FlashFxLightIntensityMinMax x="0.000000" y="0.000000" />
<FlashFxLightRangeMinMax x="0.000000" y="0.000000" />
<FlashFxLightFalloffMinMax x="0.000000" y="0.000000" />
<GroundDisturbFxEnabled value="false" />
<GroundDisturbFxDist value="5.000000" />
<GroundDisturbFxNameDefault />
<GroundDisturbFxNameSand />
<GroundDisturbFxNameDirt />
<GroundDisturbFxNameWater />
<GroundDisturbFxNameFoliage />
</Fx>
<InitialRumbleDuration value="0" />
<InitialRumbleIntensity value="0.000000" />
<InitialRumbleIntensityTrigger value="0.300000" />
<RumbleDuration value="110" />
<RumbleIntensity value="0.020000" />
<RumbleIntensityTrigger value="0.100000" />
<RumbleDamageIntensity value="1.000000" />
<NetworkPlayerDamageModifier value="1.000000" />
<NetworkPedDamageModifier value="1.000000" />
<NetworkHeadShotPlayerDamageModifier value="1.000000" />
<LockOnRange value="45.000000" />
<WeaponRange value="50.000000" />
<BulletDirectionOffsetInDegrees value="0.000000" />
<AiSoundRange value="-1.000000" />
<AiPotentialBlastEventRange value="-1.000000" />
<DamageFallOffRangeMin value="50.000000" />
<DamageFallOffRangeMax value="50.000000" />
<DamageFallOffModifier value="0.300000" />
<VehicleWeaponHash />
<DefaultCameraHash>HIP_AIM_CAMERA</DefaultCameraHash>
<CoverCameraHash>HIP_AIM_IN_COVER_CAMERA</CoverCameraHash>
<CoverReadyToFireCameraHash />
<RunAndGunCameraHash>HIP_RUN_AND_GUN_CAMERA</RunAndGunCameraHash>
<CinematicShootingCameraHash />
<AlternativeOrScopedCameraHash />
<RunAndGunAlternativeOrScopedCameraHash />
<CinematicShootingAlternativeOrScopedCameraHash />
<CameraFov value="45.000000" />
<ZoomFactorForAccurateMode value="1.000000" />
<RecoilShakeHash />
<RecoilShakeHashFirstPerson />
<AccuracyOffsetShakeHash />
<MinTimeBetweenRecoilShakes value="150" />
<RecoilShakeAmplitude value="1.000000" />
<ExplosionShakeAmplitude value="-1.000000" />
<ReticuleHudPosition x="0.000000" y="0.000000" />
<AimOffsetMin x="0.000000" y="0.000000" z="0.000000" />
<AimProbeLengthMin value="0.000000" />
<AimOffsetMax x="0.000000" y="0.000000" z="0.000000" />
<AimProbeLengthMax value="0.000000" />
<TorsoAimOffset x="0.150000" y="0.550000" />
<TorsoCrouchedAimOffset x="0.200000" y="0.050000" />
<LeftHandIkOffset x="0.025000" y="0.110000" z="0.075000" />
<ReticuleMinSizeStanding value="0.650000" />
<ReticuleMinSizeCrouched value="0.550000" />
<ReticuleScale value="0.300000" />
<ReticuleStyleHash>WEAPON_PISTOL</ReticuleStyleHash>
<FirstPersonReticuleStyleHash />
<PickupHash />
<MPPickupHash />
<HumanNameHash>WT_HOSE</HumanNameHash>
<MovementModeConditionalIdle />
<StatName>EXTINGUISHER</StatName>
<KnockdownCount value="-1" />
<KillshotImpulseScale value="1.000000" />
<NmShotTuningSet>Normal</NmShotTuningSet>
<AttachPoints />
<GunFeedBone />
<TargetSequenceGroup />
<WeaponFlags>CarriedInHand Automatic CanFreeAim AnimCrouchFire UsableOnFoot UsableClimbing AllowEarlyExitFromFireAnimAfterBulletFired DoesRevivableDamage CanBeFiredLikeGun NonViolent SuppressGunshotEvent</WeaponFlags>
<TintSpecValues ref="TINT_DEFAULT" />
<FiringPatternAliases ref="NULL" />
<ReloadUpperBodyFixupExpressionData ref="default" />
<AmmoDiminishingRate value="0" />
<AimingBreathingAdditiveWeight value="1.000000" />
<FiringBreathingAdditiveWeight value="1.000000" />
<StealthAimingBreathingAdditiveWeight value="0.000000" />
<StealthFiringBreathingAdditiveWeight value="0.000000" />
<AimingLeanAdditiveWeight value="1.000000" />
<FiringLeanAdditiveWeight value="1.000000" />
<StealthAimingLeanAdditiveWeight value="0.000000" />
<StealthFiringLeanAdditiveWeight value="0.000000" />
<ExpandPedCapsuleRadius value="0.000000" />
<AudioCollisionHash />
<HudDamage value="0" />
<HudSpeed value="100" />
<HudCapacity value="100" />
<HudAccuracy value="10" />
<HudRange value="35" />
</Item>
</Infos>
</Item>
</Infos>
<Name>Hose</Name>
</CWeaponInfoBlob>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More