mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 22:16:03 +01:00
Upload beta 1.2
This commit is contained in:
75
shared/make/cameras.lua
Normal file
75
shared/make/cameras.lua
Normal file
@@ -0,0 +1,75 @@
|
||||
--- Creates a temporary camera at a specified position, pointing towards given coordinates.
|
||||
--
|
||||
-- This function creates a camera at a position relative to an entity or at a specified position and orients it to look at the target coordinates.
|
||||
-- The camera is only created if `Config.Crafting.craftCam` is enabled in the configuration.
|
||||
--
|
||||
---@param ent entityId|coords The base position for the camera. Can be an entity handle or a `vector3` position.
|
||||
-- If `ent` is an entity, the camera position is calculated as an offset from the entity's position using `GetOffsetFromEntityInWorldCoords`.
|
||||
-- If `ent` is a `vector3`, it is used directly as the camera's position.
|
||||
--
|
||||
---@param coords vector3 The target `vector3` coordinates that the camera will point at.
|
||||
--
|
||||
---@return cam camID The handle of the created camera, or `nil` if the camera was not created (e.g., if `Config.Crafting.craftCam` is `false`).
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- local cam = createTempCam(entity, targetCoords)
|
||||
-- ```
|
||||
function createTempCam(ent, coords)
|
||||
local cam = nil
|
||||
if Config.Crafting.craftCam then
|
||||
if debugMode then
|
||||
triggerNotify(nil, "ModCam Created", "success")
|
||||
end
|
||||
local camCoords = nil
|
||||
if type(ent) ~= "vector3" then
|
||||
camCoords = GetOffsetFromEntityInWorldCoords(ent, 1.0, -0.3, 0.8)
|
||||
else
|
||||
camCoords = ent
|
||||
end
|
||||
-- Create the camera with specified parameters
|
||||
cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", camCoords.x, camCoords.y, camCoords.z + 0.5, 1.0, 0.0, 0.0, 60.00, false, 0)
|
||||
-- Point the camera at the target coordinates
|
||||
PointCamAtCoord(cam, coords)
|
||||
end
|
||||
return cam
|
||||
end
|
||||
|
||||
--- Activates and starts rendering the temporary camera.
|
||||
--
|
||||
-- This function sets the specified camera as active and begins rendering it with a smooth transition.
|
||||
-- The camera is only activated if `Config.Crafting.craftCam` is enabled in the configuration.
|
||||
--
|
||||
---@param cam camID The handle of the camera to activate and render.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- startTempCam(cam)
|
||||
-- ```
|
||||
function startTempCam(cam)
|
||||
if Config.Crafting.craftCam then
|
||||
SetCamActive(cam, true)
|
||||
RenderScriptCams(true, true, 1000, true, true)
|
||||
end
|
||||
end
|
||||
|
||||
--- Deactivates the temporary camera and stops rendering.
|
||||
--
|
||||
-- This function waits for one second, then stops rendering script cameras and destroys all cameras.
|
||||
-- The delay allows for any transitions or animations to complete.
|
||||
--
|
||||
-- The camera is only deactivated if `Config.Crafting.craftCam` is enabled in the configuration.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- stopTempCam()
|
||||
-- ```
|
||||
function stopTempCam()
|
||||
if Config.Crafting.craftCam then
|
||||
CreateThread(function()
|
||||
Wait(1000)
|
||||
RenderScriptCams(false, true, 500, true, true)
|
||||
DestroyAllCams()
|
||||
end)
|
||||
end
|
||||
end
|
||||
239
shared/make/loaders.lua
Normal file
239
shared/make/loaders.lua
Normal file
@@ -0,0 +1,239 @@
|
||||
local time = 500
|
||||
|
||||
--- Loads a specified model into memory.
|
||||
---
|
||||
--- This function checks if the model is valid and not already loaded.
|
||||
--- If not loaded, it requests the model and waits until it is loaded or times out.
|
||||
---
|
||||
---@param model string|number The name or hash of the model to load.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- loadModel('prop_chair_01a')
|
||||
--- ```
|
||||
function loadModel(model)
|
||||
if not IsModelValid(model) then print("^6Bridge^7: ^1ERROR^7: ^2Model^7 - '^6"..model.."^7' ^2does not exist in server") return
|
||||
else
|
||||
if not HasModelLoaded(model) then
|
||||
debugPrint("^6Bridge^7: ^2Loading Model^7: '^6"..model.."^7'")
|
||||
while not HasModelLoaded(model) and time > 0 do time -= 1 RequestModel(model) Wait(0) end
|
||||
if not HasModelLoaded(model) then print("^6Bridge^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") end
|
||||
end
|
||||
time = 500
|
||||
end
|
||||
end
|
||||
|
||||
--- Unloads a model from memory.
|
||||
---
|
||||
--- This function marks a model as no longer needed, allowing the game to free up memory.
|
||||
---
|
||||
---@param model string|number The name or hash of the model to unload.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- unloadModel('prop_chair_01a')
|
||||
--- ```
|
||||
function unloadModel(model)
|
||||
debugPrint("^6Bridge^7: ^2Removing Model from memory cache^7: '^6"..model.."^7'")
|
||||
SetModelAsNoLongerNeeded(model)
|
||||
end
|
||||
|
||||
--- Loads an animation dictionary into memory.
|
||||
---
|
||||
--- This function checks if the animation dictionary exists and requests it.
|
||||
--- It waits until the animation dictionary is loaded before proceeding.
|
||||
---
|
||||
---@param animDict string The name of the animation dictionary to load.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- loadAnimDict('amb@world_human_hang_out_street@male_c@base')
|
||||
--- ```
|
||||
function loadAnimDict(animDict)
|
||||
if not DoesAnimDictExist(animDict) then
|
||||
print("^6Bridge^7: ^1ERROR^7: ^2Anim Dictionary^7 - '^6"..animDict.."^7' ^2does not exist in server") return
|
||||
else
|
||||
debugPrint("^6Bridge^7: ^2Loading Anim Dictionary^7: '^6"..animDict.."^7'")
|
||||
while not HasAnimDictLoaded(animDict) do RequestAnimDict(animDict) Wait(5) end
|
||||
end
|
||||
end
|
||||
|
||||
--- Unloads an animation dictionary from memory.
|
||||
---
|
||||
--- This function removes the animation dictionary from the game's memory cache.
|
||||
---
|
||||
---@param animDict string The name of the animation dictionary to unload.
|
||||
---
|
||||
---@usage
|
||||
---@
|
||||
--- ```lua
|
||||
--- unloadAnimDict('amb@world_human_hang_out_street@male_c@base')
|
||||
--- ```
|
||||
function unloadAnimDict(animDict)
|
||||
debugPrint("^6Bridge^7: ^2Removing Anim Dictionary from memory cache^7: '^6"..animDict.."^7'")
|
||||
RemoveAnimDict(animDict)
|
||||
end
|
||||
|
||||
--- Loads a particle effects (ptfx) dictionary into memory.
|
||||
---
|
||||
--- This function requests the named particle effects asset and waits until it's loaded.
|
||||
---
|
||||
---@param ptFxName string The name of the particle effects dictionary to load.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- loadPtfxDict('core')
|
||||
--- ```
|
||||
function loadPtfxDict(ptFxName)
|
||||
if not HasNamedPtfxAssetLoaded(ptFxName) then
|
||||
debugPrint("^6Bridge^7: ^2Loading Ptfx Dictionary^7: '^6"..ptFxName.."^7'")
|
||||
while not HasNamedPtfxAssetLoaded(ptFxName) do RequestNamedPtfxAsset(ptFxName) Wait(5) end
|
||||
end
|
||||
end
|
||||
|
||||
--- Unloads a particle effects (ptfx) dictionary from memory.
|
||||
---
|
||||
--- This function removes the named particle effects asset from the game's memory cache.
|
||||
---
|
||||
---@param dict string The name of the particle effects dictionary to unload.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- unloadPtfxDict('core')
|
||||
--- ```
|
||||
function unloadPtfxDict(dict)
|
||||
debugPrint("^6Bridge^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'")
|
||||
RemoveNamedPtfxAsset(dict)
|
||||
end
|
||||
|
||||
--- Loads a texture dictionary into memory.
|
||||
---
|
||||
--- This function requests the streamed texture dictionary and waits until it's loaded.
|
||||
---
|
||||
---@param dict string The name of the texture dictionary to load.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- loadTextureDict('commonmenu')
|
||||
--- ```
|
||||
function loadTextureDict(dict)
|
||||
if not HasStreamedTextureDictLoaded(dict) then
|
||||
debugPrint("^6Bridge^7: ^2Loading Texture Dictionary^7: '^6"..dict.."^7'")
|
||||
while not HasStreamedTextureDictLoaded(dict) do RequestStreamedTextureDict(dict) Wait(5) end
|
||||
end
|
||||
end
|
||||
|
||||
--- Loads a script audio bank into memory.
|
||||
---
|
||||
--- This function requests a script audio bank and waits until it's loaded or times out.
|
||||
---
|
||||
---@param bank string The name of the script audio bank to load.
|
||||
---
|
||||
---@return boolean `true` if the audio bank was successfully loaded; otherwise, `false`.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local success = loadScriptBank('DLC_HEISTS_GENERAL_FRONTEND_SOUNDS')
|
||||
--- ```
|
||||
function loadScriptBank(bank)
|
||||
local timeout = 2000
|
||||
debugPrint("^6Debug^7: ^2Loading ^3Script ^2AudioBank^7...")
|
||||
while not RequestScriptAudioBank(bank, 0) do Wait(10) timeout -= 10 if timeout <= 0 then break end end
|
||||
|
||||
local success = RequestScriptAudioBank(bank, 0)
|
||||
debugPrint("^6Debug^7: "..(success and "^3Successfully ^2loaded^7: '^4" or "^1Failed to ^2load^7: '^4")..bank.."^7'")
|
||||
return success
|
||||
end
|
||||
|
||||
--- Loads an ambient audio bank into memory.
|
||||
---
|
||||
--- This function requests an ambient audio bank and waits until it's loaded or times out.
|
||||
---
|
||||
---@param bank string The name of the ambient audio bank to load.
|
||||
---
|
||||
---@return boolean `true` if the audio bank was successfully loaded; otherwise, `false`.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local success = loadAmbientBank('AMB_REVERB_GENERIC')
|
||||
--- ```
|
||||
function loadAmbientBank(bank)
|
||||
local timeout = 2000
|
||||
debugPrint("^6Debug^7: ^2Loading ^3Ambient ^2AudioBank^7...")
|
||||
while not RequestAmbientAudioBank(bank, 0) do
|
||||
Wait(10)
|
||||
timeout -= 10
|
||||
if timeout <= 0 then break end
|
||||
end
|
||||
local success = RequestAmbientAudioBank(bank, 0)
|
||||
debugPrint("^6Debug^7: "..(success and "^3Successfully ^2loaded^7: '^4" or "^1Failed to ^2load^7: '^4")..bank.."^7'")
|
||||
return success
|
||||
end
|
||||
|
||||
--- Plays an animation on a specified ped.
|
||||
---
|
||||
--- This function loads the animation dictionary and instructs the ped to play the animation.
|
||||
---
|
||||
---@param animDict string The name of the animation dictionary.
|
||||
---@param animName string The name of the animation within the dictionary.
|
||||
---@param duration number (optional) The duration to play the animation in milliseconds. Default is `30000`.
|
||||
---@param flag number (optional) The animation flag controlling how the animation is played. Default is `50`.
|
||||
---@param ped number (optional) The ped on which to play the animation. Defaults to the player's ped if not specified.
|
||||
---@param speed number (optional) The speed multiplier for the animation. Default is `8.0`.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- playAnim('amb@world_human_hang_out_street@male_c@base', 'base', 5000, 1, PlayerPedId(), 1.0)
|
||||
--- ```
|
||||
function playAnim(animDict, animName, duration, flag, ped, speed)
|
||||
loadAnimDict(animDict)
|
||||
debugPrint("Attempting to make player play anim", animDict, animName)
|
||||
TaskPlayAnim(ped and ped or PlayerPedId(), animDict, animName, speed or 8.0, speed or -8.0, duration or 30000, flag or 50, 1, false, false, false)
|
||||
end
|
||||
|
||||
--- Stops a specified animation on a ped.
|
||||
---
|
||||
--- This function stops the animation and unloads the animation dictionary from memory.
|
||||
---
|
||||
---@param animDict string The name of the animation dictionary.
|
||||
---@param animName string The name of the animation within the dictionary.
|
||||
---@param ped number (optional) The ped on which to stop the animation. Defaults to the player's ped if not specified.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- stopAnim('amb@world_human_hang_out_street@male_c@base', 'base', PlayerPedId())
|
||||
--- ```
|
||||
function stopAnim(animDict, animName, ped)
|
||||
debugPrint("Stopping anim for "..(ped or PlayerPedId()))
|
||||
StopAnimTask(ped or PlayerPedId(), animDict, animName, 0.5)
|
||||
StopAnimTask(ped or PlayerPedId(), animName, animDict, 0.5)
|
||||
unloadAnimDict(animDict)
|
||||
end
|
||||
|
||||
--- Plays a game sound from a specified coordinate or entity.
|
||||
---
|
||||
--- This function attempts to play a sound from either a coordinate or an entity, using the specified audio bank and sound name.
|
||||
---
|
||||
---@param bank string The name of the audio bank containing the sound.
|
||||
---@param sound string The name of the sound to play.
|
||||
---@param coords vector3|number A `vector3` coordinate or an entity handle from which to play the sound.
|
||||
---@param synced boolean A boolean indicating whether the sound is synced across clients.
|
||||
---@param range number (optional) The maximum range at which the sound can be heard. Default is `10.0`.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- playGameSound('DLC_HEIST_HACKING_SNAKE_SOUNDS', 'Beep', vector3(0, 0, 0), false, 15.0)
|
||||
--- ```
|
||||
function playGameSound(bank, sound, coords, synced, range)
|
||||
debugPrint("^6Debug^7: ^2Attempting to play: ^3"..sound.." ^7(^4"..bank.."^7')")
|
||||
local range = range or 10.0
|
||||
local soundId = GetSoundId()
|
||||
while not soundId do Wait(10) end
|
||||
if type(coords) == "vector3" or type(coords) == "vector4" then
|
||||
debugPrint("^6Debug^7: ^2Playing sound from Coord^7: "..formatCoord(coords.xyz))
|
||||
PlaySoundFromCoord(soundId, sound, coords.x, coords.y, coords.z, bank, synced, range, 0)
|
||||
else
|
||||
debugPrint("^6Debug^7: ^2Playing sound from Entity^7: ^4"..coords.."^7")
|
||||
PlaySoundFromEntity(soundId, sound, coords, bank, synced, 0)
|
||||
end
|
||||
end
|
||||
119
shared/make/makeBlip.lua
Normal file
119
shared/make/makeBlip.lua
Normal file
@@ -0,0 +1,119 @@
|
||||
--- Creates a blip at specified coordinates with given properties.
|
||||
--
|
||||
-- This function adds a map blip at the provided coordinates and sets various display properties such as sprite, color, scale, and more.
|
||||
-- It also handles attaching a preview image to the blip if certain resources are running and a preview is provided.
|
||||
--
|
||||
---@param data A table containing blip data and properties.
|
||||
-- - **coords**: A `vector3` containing x, y, z coordinates where the blip will be placed.
|
||||
-- - **sprite** (optional): The blip sprite/icon ID. Default is `106`.
|
||||
-- - **col** (optional): The color ID of the blip. Default is `5`.
|
||||
-- - **scale** (optional): The scale of the blip. Default is `0.7`.
|
||||
-- - **disp** (optional): The display option of the blip. Default is `6`.
|
||||
-- - **category** (optional): The category ID for the blip.
|
||||
-- - **name**: The name of the blip, used for display on the map.
|
||||
-- - **preview** (optional): A URL or image path for a preview image to display with the blip.
|
||||
--
|
||||
---@return blip blipID The handle of the created blip.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- local blipData = {
|
||||
-- coords = vector3(123.4, 567.8, 90.1),
|
||||
-- sprite = 1,
|
||||
-- col = 2,
|
||||
-- scale = 0.8,
|
||||
-- disp = 4,
|
||||
-- category = 7,
|
||||
-- name = "My Blip",
|
||||
-- preview = "http://example.com/preview.png"
|
||||
-- }
|
||||
-- local blip = makeBlip(blipData)
|
||||
-- ```
|
||||
function makeBlip(data)
|
||||
local blip = AddBlipForCoord(vec3(data.coords.x, data.coords.y, data.coords.z))
|
||||
SetBlipCoords(blip, data.coords.x, data.coords.y, data.coords.z) -- Manually set blip coordinates again as sometimes it just refuses
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipSprite(blip, data.sprite or 106)
|
||||
SetBlipColour(blip, data.col or 5)
|
||||
SetBlipScale(blip, data.scale or 0.7)
|
||||
SetBlipDisplay(blip, data.disp or 6)
|
||||
if data.category then SetBlipCategory(blip, data.category) end
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentString(tostring(data.name))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
-- Handle preview image if certain resources are running
|
||||
if isStarted("fs_smallresources") or isStarted("blip_info") or isStarted("blipinfo") then
|
||||
if data.preview then
|
||||
local txname = string.gsub(tostring(data.name..'preview'..string.gsub(data.coords.z, "%.", "")), "[ ()~]", "")
|
||||
if data.preview:find("http") or data.preview:find("nui") then
|
||||
createDui(txname, data.preview, vec2(512, 256), scriptTxd)
|
||||
else
|
||||
CreateRuntimeTextureFromImage(scriptTxd, txname, data.preview)
|
||||
end
|
||||
exports["fs_smallresources"]:SetBlipInfoImage(blip, getScript()..'scriptTxd', txname)
|
||||
exports["fs_smallresources"]:SetBlipInfoTitle(blip, data.name, false)
|
||||
end
|
||||
end
|
||||
debugPrint("^6Bridge^7: ^6Blip ^2created^7: '^6"..data.name.."^7' - '"..formatCoord(data.coords).."'")
|
||||
return blip
|
||||
end
|
||||
|
||||
--- Creates a blip attached to a specified entity with given properties.
|
||||
--
|
||||
-- This function adds a map blip attached to the provided entity and sets various display properties such as sprite, color, scale, and more.
|
||||
-- It also handles attaching a preview image to the blip if certain resources are running and a preview is provided.
|
||||
--
|
||||
---@param data table A table containing blip data and properties.
|
||||
-- - **entity**: The entity to which the blip will be attached.
|
||||
-- - **sprite** (optional): The blip sprite/icon ID. Default is `106`.
|
||||
-- - **col** (optional): The color ID of the blip. Default is `5`.
|
||||
-- - **scale** (optional): The scale of the blip. Default is `0.7`.
|
||||
-- - **disp** (optional): The display option of the blip. Default is `6`.
|
||||
-- - **category** (optional): The category ID for the blip.
|
||||
-- - **name**: The name of the blip, used for display on the map.
|
||||
-- - **preview** (optional): A URL or image path for a preview image to display with the blip.
|
||||
--
|
||||
--
|
||||
---@return number blipID The handle of the created blip.
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- local blipData = {
|
||||
-- entity = myEntity,
|
||||
-- sprite = 1,
|
||||
-- col = 2,
|
||||
-- scale = 0.8,
|
||||
-- disp = 4,
|
||||
-- category = 7,
|
||||
-- name = "Entity Blip",
|
||||
-- preview = "http://example.com/preview.png"
|
||||
-- }
|
||||
-- local blip = makeEntityBlip(blipData)
|
||||
-- ```
|
||||
function makeEntityBlip(data)
|
||||
AddBlipForEntity(data.entity)
|
||||
local blip = GetBlipFromEntity(data.entity)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
SetBlipSprite(blip, data.sprite or 106)
|
||||
SetBlipColour(blip, data.col or 5)
|
||||
SetBlipScale(blip, data.scale or 0.7)
|
||||
SetBlipDisplay(blip, data.disp or 6)
|
||||
if data.category then SetBlipCategory(blip, data.category) end
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentString(tostring(data.name))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
-- Handle preview image if certain resources are running
|
||||
if isStarted("fs_smallresources") or isStarted("blip-info") or isStarted("blipinfo") then
|
||||
if data.preview then
|
||||
local txname = string.gsub(tostring(data.name..'preview'), "[ ()~]", "")
|
||||
if data.preview:find("http") or data.preview:find("nui") then
|
||||
createDui(txname, data.preview, vec2(512, 256), scriptTxd)
|
||||
else
|
||||
CreateRuntimeTextureFromImage(scriptTxd, txname, data.preview)
|
||||
end
|
||||
exports["fs_smallresources"]:SetBlipInfoImage(blip, getScript()..'previewTxd', txname)
|
||||
exports["fs_smallresources"]:SetBlipInfoTitle(blip, data.name, false)
|
||||
end
|
||||
end
|
||||
debugPrint("^6Bridge^7: ^6Blip ^2created for Entity^7: '^6"..data.name.."^7'")
|
||||
return blip
|
||||
end
|
||||
230
shared/make/makePed.lua
Normal file
230
shared/make/makePed.lua
Normal file
@@ -0,0 +1,230 @@
|
||||
--- A table to keep track of all created Peds.
|
||||
local Peds = {}
|
||||
|
||||
--- Creates a distance-based Ped (pedestrian) that spawns when the player enters a specified area.
|
||||
--
|
||||
-- This function sets up a circular area using `createCirclePoly`. When the player enters this area, a Ped is created using `makePed`.
|
||||
-- When the player exits the area, the Ped is deleted.
|
||||
--
|
||||
---@param data table A table containing Ped data and properties. Should include at least `model` and `coords`.
|
||||
---@param coords vector4 A `vector3` or `vector4` specifying the coordinates where the Ped will be placed.
|
||||
---@param freeze boolean (optional) Boolean indicating whether the Ped should be frozen in place. Default is `true`.
|
||||
---@param collision boolean (optional) Boolean indicating whether collision with the Ped is enabled. Default is `false`.
|
||||
---@param scenario boolean (optional) String specifying the scenario the Ped should perform.
|
||||
---@param anim table (optional) A table containing animation dictionary and name `{animDict, animName}`.
|
||||
---@param synced boolean (optional) Boolean indicating whether the Ped is synced across clients. Default is `false`.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- makeDistPed(pedData, pedCoords, true, false, 'WORLD_HUMAN_STAND_IMPATIENT', nil, true)
|
||||
-- ```
|
||||
function makeDistPed(data, coords, freeze, collision, scenario, anim, synced)
|
||||
createCirclePoly({
|
||||
name = keyGen()..keyGen(),
|
||||
coords = vec3(data.coords.x, data.coords.y, data.coords.z - 1.03),
|
||||
radius = 50.0,
|
||||
onEnter = function()
|
||||
Peds[#Peds + 1] = makePed(data, coords, freeze, collision, scenario, anim, synced)
|
||||
end,
|
||||
onExit = function()
|
||||
DeletePed(Peds[#Peds])
|
||||
end,
|
||||
debug = debugMode,
|
||||
})
|
||||
end
|
||||
|
||||
--- Creates a Ped (pedestrian character) with specified properties.
|
||||
--
|
||||
-- This function creates a Ped at the given coordinates and applies appearance and clothing based on the provided data.
|
||||
--
|
||||
-- If `data` is a table with `custom` properties, it customizes the Ped's appearance accordingly.
|
||||
--
|
||||
---@param data modelHash|table Either a string/model hash of the Ped model to use, or a table containing `model` and `custom` data.
|
||||
---@param coords vector4 `vector3` or `vector4` specifying the coordinates where the Ped will be placed.
|
||||
---@param freeze boolean (optional) Boolean indicating whether the Ped should be frozen in place. Default is `true`.
|
||||
---@param collision boolean (optional) Boolean indicating whether collision with the Ped is enabled. Default is `false`.
|
||||
---@param scenario string (optional) String specifying the scenario the Ped should perform.
|
||||
---@param anim table (optional) A table containing animation dictionary and name `{animDict, animName}`.
|
||||
---@param synced boolean (optional) Boolean indicating whether the Ped is synced across clients. Default is `false`.
|
||||
--
|
||||
---@return ped entityID The handle of the created Ped.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- local ped = makePed(pedData, pedCoords, true, false, nil, {'animDict', 'animName'}, true)
|
||||
-- ```
|
||||
function makePed(data, coords, freeze, collision, scenario, anim, synced)
|
||||
local ped = nil
|
||||
local model = nil
|
||||
if type(data) == "table" then
|
||||
model = data.model
|
||||
loadModel(data.model)
|
||||
ped = CreatePed(0, model, coords.x, coords.y, coords.z - 1.03, coords.w, synced and synced or false, false)
|
||||
|
||||
-- Inheritance
|
||||
SetPedHeadBlendData(ped, data.custom.faceFather, data.custom.faceMother, data.custom.raceShape, data.custom.skinFather, data.custom.skinMother, data.custom.raceSkin, data.custom.faceMix or 0, data.custom.skinMix or 0, data.custom.raceMix or 0, false)
|
||||
|
||||
-- Face Features
|
||||
for k, v in pairs({
|
||||
"noseWidth", "noseHeight", "noseSize", "noseBoneHeight", "nosePeakHeight", "noseBoneTwist",
|
||||
"eyebrowHeight", "eyebrowDepth",
|
||||
"cheekBoneHeight", "cheekBoneWidth", "cheeckWidth",
|
||||
"eyeOpening", "lipThickness",
|
||||
"jawWidth", "jawSize",
|
||||
"chinLowering", "chinLength", "chinSize", "chinHole",
|
||||
"neckThickness"
|
||||
}) do
|
||||
SetPedFaceFeature(ped, k - 1, data.custom[v])
|
||||
end
|
||||
|
||||
-- Appearance
|
||||
SetPedComponentVariation(ped, 2, data.custom.Hair, 0, 0)
|
||||
SetPedHairColor(ped, data.custom.HairTexture, data.custom.HairHighlight or 0)
|
||||
SetPedHeadOverlay(ped, 2, data.custom.Eyebrows, data.custom.EyebrowsOpacity)
|
||||
SetPedHeadOverlayColor(ped, 2, 1, data.custom.EyebrowsColor, 0)
|
||||
SetPedEyeColor(ped, data.custom.Eyecolor)
|
||||
SetPedHeadOverlay(ped, 4, data.custom.Makeup, data.custom.MakeupOpacity)
|
||||
SetPedHeadOverlayColor(ped, 4, 1, data.custom.MakeupColor, 0)
|
||||
SetPedHeadOverlay(ped, 8, data.custom.Lipstick, data.custom.LipstickOpacity)
|
||||
SetPedHeadOverlayColor(ped, 8, 1, data.custom.LipstickColor, 0)
|
||||
SetPedHeadOverlay(ped, 1, data.custom.Beard, data.custom.BeardOpacity)
|
||||
SetPedHeadOverlayColor(ped, 1, 1, data.custom.BeardColor, 0)
|
||||
|
||||
-- Clothes
|
||||
SetPedComponentVariation(ped, 1, data.custom.Mask, data.custom.MaskVariant, 0)
|
||||
SetPedComponentVariation(ped, 7, data.custom.Scarf, data.custom.ScarfVariant, 0)
|
||||
SetPedComponentVariation(ped, 11, data.custom.Jacket, data.custom.JacketVariant, 0)
|
||||
SetPedComponentVariation(ped, 8, data.custom.Shirt, data.custom.ShirtVariant, 0)
|
||||
SetPedComponentVariation(ped, 9, data.custom.Vest, data.custom.VestVariant, 0)
|
||||
SetPedComponentVariation(ped, 5, data.custom.Bags, data.custom.BagsVariant, 0)
|
||||
SetPedComponentVariation(ped, 3, data.custom.Arms, data.custom.ArmsVariant, 0)
|
||||
SetPedComponentVariation(ped, 4, data.custom.Pants, data.custom.PantsVariant, 0)
|
||||
SetPedComponentVariation(ped, 6, data.custom.Shoes, data.custom.ShoesVariant, 0)
|
||||
SetPedComponentVariation(ped, 10, data.custom.Decal, data.custom.DecalVariant, 0)
|
||||
|
||||
-- Accessories
|
||||
SetPedPropIndex(ped, 0, data.custom.Hat, data.custom.HatVariant, true)
|
||||
SetPedPropIndex(ped, 1, data.custom.Glasses, data.custom.GlassesVariant, true)
|
||||
|
||||
SetPedPropIndex(ped, 2, data.custom.Ear, data.custom.EarVariant, true)
|
||||
SetPedPropIndex(ped, 6, data.custom.Watches, data.custom.WatchesVariant, true)
|
||||
SetPedPropIndex(ped, 7, data.custom.Bracelets, data.custom.BraceletsVariant, true)
|
||||
else
|
||||
model = data
|
||||
loadModel(model)
|
||||
ped = CreatePed(0, model, coords.x, coords.y, coords.z - 1.03, coords.w, synced or false, false)
|
||||
end
|
||||
|
||||
SetEntityInvincible(ped, true)
|
||||
SetBlockingOfNonTemporaryEvents(ped, true)
|
||||
FreezeEntityPosition(ped, freeze and freeze or true)
|
||||
|
||||
if collision then SetEntityNoCollisionEntity(ped, PlayerPedId(), false) end
|
||||
if scenario then TaskStartScenarioInPlace(ped, scenario, 0, true) end
|
||||
if anim then
|
||||
loadAnimDict(anim[1])
|
||||
TaskPlayAnim(ped, anim[1], anim[2], 0.5, 1.0, -1, 1, 0.2, 0, 0, 0)
|
||||
end
|
||||
|
||||
debugPrint("^6Bridge^7: ^1Ped ^2Created^7: '^6"..ped.."^7' | ^2Hash^7: ^7'^5"..(model).."^7' | ^2Coord^7: "..formatCoord(coords))
|
||||
unloadModel(model)
|
||||
Peds[#Peds + 1] = ped
|
||||
return ped
|
||||
end
|
||||
|
||||
--- Generates random Ped data by filling in missing customization options with random values.
|
||||
--
|
||||
-- This function takes in a data table that may have some customization options missing in `data.custom`.
|
||||
--
|
||||
-- It generates random values for any missing options and returns a new data table with complete customization.
|
||||
--
|
||||
---@param data table A table containing at least a `model` field, and possibly a `custom` table with customization options.
|
||||
--
|
||||
---@return generatedTable table A new table containing `model` and `custom` with all customization options filled.
|
||||
--
|
||||
---@usage
|
||||
-- ```lua
|
||||
-- local pedData = GenerateRandomPedData({ model = `MP_M_Freemode_01`, custom = {} })
|
||||
-- ```
|
||||
function GenerateRandomPedData(data)
|
||||
local newTable = {
|
||||
model = data.model,
|
||||
custom = {},
|
||||
}
|
||||
local isMale = data.model == `MP_M_Freemode_01`
|
||||
local randomTable = {
|
||||
-- Inheritance
|
||||
faceFather = math.random(0, 45), faceMother = math.random(0, 45), faceMix = (math.random(0, 9) / 10),
|
||||
skinFather = math.random(0, 45), skinMother = math.random(0, 45), skinMix = (math.random(0, 9) / 10),
|
||||
raceShape = math.random(0, 45), raceSkin = math.random(0, 45), raceMix = (math.random(0, 9) / 10),
|
||||
|
||||
-- Face Features
|
||||
noseWidth = (math.random(0, 9) / 10),
|
||||
noseHeight = (math.random(0, 9) / 10),
|
||||
noseSize = (math.random(0, 9) / 10),
|
||||
noseBoneHeight = (math.random(0, 9) / 10),
|
||||
nosePeakHeight = (math.random(0, 9) / 10),
|
||||
noseBoneTwist = (math.random(0, 9) / 10),
|
||||
|
||||
eyebrowHeight = (math.random(0, 9) / 10),
|
||||
eyebrowDepth = (math.random(0, 9) / 10),
|
||||
|
||||
cheekBoneHeight = (math.random(0, 9) / 10),
|
||||
cheekBoneWidth = (math.random(0, 9) / 10),
|
||||
cheeckWidth = (math.random(0, 9) / 10),
|
||||
|
||||
eyeOpening = (math.random(0, 9) / 10),
|
||||
lipThickness = (math.random(0, 9) / 10),
|
||||
|
||||
jawWidth = (math.random(0, 9) / 10),
|
||||
jawSize = (math.random(0, 9) / 10),
|
||||
|
||||
chinLowering = (math.random(0, 9) / 10),
|
||||
chinLength = (math.random(0, 9) / 10),
|
||||
chinSize = (math.random(0, 9) / 10),
|
||||
chinHole = (math.random(0, 9) / 10),
|
||||
|
||||
neckThickness = (math.random(0, 9) / 10),
|
||||
|
||||
-- Appearance
|
||||
Hair = math.random(0, isMale and 147 or 261), HairTexture = math.random(0, 63), HairHighlight = math.random(0, 63),
|
||||
Eyebrows = math.random(0, 33),
|
||||
EyebrowsOpacity = 0.9, EyebrowsColor = 0,
|
||||
Eyecolor = math.random(0, 30),
|
||||
Makeup = 0, MakeupOpacity = 0, MakeupColor = 0,
|
||||
Lipstick = 0, LipstickOpacity = 0, LipstickColor = 0,
|
||||
Beard = isMale and math.random(0, 28) or -1,
|
||||
BeardOpacity = isMale and 0.9 or 0.0, BeardColor = 0,
|
||||
|
||||
-- Clothing
|
||||
Mask = math.random(0, 252), MaskVariant = 0,
|
||||
Scarf = math.random(0, isMale and 249 or 198), ScarfVariant = 0,
|
||||
Jacket = math.random(0, isMale and 634 or 713), JacketVariant = 0,
|
||||
Shirt = math.random(0, isMale and 237 or 299), ShirtVariant = 0,
|
||||
Vest = math.random(0, isMale and 81 or 91), VestVariant = 0,
|
||||
Bags = math.random(0, isMale and 138 or 148), BagsVariant = 0,
|
||||
Arms = math.random(0, isMale and 224 or 261), ArmsVariant = 0,
|
||||
Pants = math.random(0, isMale and 255 or 275), PantsVariant = 0,
|
||||
Shoes = math.random(0, isMale and 157 or 199), ShoesVariant = 0,
|
||||
Decal = math.random(0, isMale and 238 or 253), DecalVariant = 0,
|
||||
|
||||
-- Accessories
|
||||
Hat = math.random(0, isMale and 232 or 229), HatVariant = 0,
|
||||
Glasses = math.random(0, isMale and 68 or 71), GlassesVariant = 0,
|
||||
Ear = math.random(0, isMale and 51 or 40), EarVariant = 0,
|
||||
Watches = math.random(0, isMale and 46 or 35), WatchesVariant = 0,
|
||||
Bracelets = math.random(0, isMale and 13 or 20), BraceletsVariant = 0,
|
||||
}
|
||||
for option in pairs(randomTable) do
|
||||
if not data.custom[option] then
|
||||
newTable.custom[option] = randomTable[option]
|
||||
debugPrint("^6Bridge^7: ^2Picking Random Ped option ^7[^5"..option.."^7]: ^6"..newTable.custom[option].."^7")
|
||||
else
|
||||
newTable.custom[option] = data.custom[option]
|
||||
end
|
||||
end
|
||||
return newTable
|
||||
end
|
||||
|
||||
--- Cleans up all created Peds when the resource stops.
|
||||
onResourceStop(function() for i = 1, #Peds do DeletePed(Peds[i]) end end, true)
|
||||
90
shared/make/makeProp.lua
Normal file
90
shared/make/makeProp.lua
Normal file
@@ -0,0 +1,90 @@
|
||||
local Props = {}
|
||||
|
||||
--- Creates a prop (object) in the game world at specified coordinates.
|
||||
---
|
||||
--- This function loads the model, creates the object, sets its heading, and freezes it if specified.
|
||||
---
|
||||
---@param data table A table containing prop data.
|
||||
--- - **prop** `string`: The model name or hash of the prop to create.
|
||||
--- - **coords** `vector4`: The coordinates where the prop will be placed. Should include x, y, z, and w (heading).
|
||||
---@param freeze boolean (optional) Whether to freeze the prop in place. Defaults to `false`.
|
||||
---@param synced boolean (optional) Whether the prop should be synced across clients. Defaults to `false`.
|
||||
---
|
||||
---@return number entityID The handle of the created prop object.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local propData = {
|
||||
--- prop = 'prop_chair_01a',
|
||||
--- coords = vector4(123.4, 567.8, 90.1, 180.0)
|
||||
--- }
|
||||
--- local prop = makeProp(propData, true, false)
|
||||
--- ```
|
||||
function makeProp(data, freeze, synced)
|
||||
loadModel(data.prop)
|
||||
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z-1.03, synced and synced or false, synced and synced or false, false)
|
||||
SetEntityHeading(prop, data.coords.w + 180.0)
|
||||
FreezeEntityPosition(prop, freeze or false)
|
||||
|
||||
debugPrint("^6Bridge^7: ^1Prop ^2Created^7: '^6"..prop.."^7' | ^2Hash^7: ^7'^6"..data.prop.."^7' | ^2Coord^7: "..formatCoord(data.coords))
|
||||
SetModelAsNoLongerNeeded(data.prop)
|
||||
Props[#Props + 1] = prop
|
||||
return prop
|
||||
end
|
||||
|
||||
--- Creates a prop that appears when the player is within a certain distance.
|
||||
---
|
||||
--- This function sets up a proximity area, and when the player enters it, the prop is created.
|
||||
--- When the player exits the area, the prop is destroyed.
|
||||
---
|
||||
---@param data table A table containing prop data.
|
||||
--- - **prop** `string`: The model name or hash of the prop to create.
|
||||
--- - **coords** `vector4`: The coordinates where the prop will be placed. Should include x, y, z, and w (heading).
|
||||
---@param freeze boolean (optional) Whether to freeze the prop in place. Defaults to `false`.
|
||||
---@param synced boolean (optional) Whether the prop should be synced across clients. Defaults to `false`.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local propData = {
|
||||
--- prop = 'prop_chair_01a',
|
||||
--- coords = vector4(123.4, 567.8, 90.1, 180.0)
|
||||
--- }
|
||||
--- makeDistProp(propData, true, false)
|
||||
--- ```
|
||||
function makeDistProp(data, freeze, synced)
|
||||
local prop = nil
|
||||
createCirclePoly({
|
||||
name = keyGen()..keyGen(),
|
||||
coords = vec3(data.coords.x, data.coords.y, data.coords.z - 1.03),
|
||||
radius = 50.0,
|
||||
onEnter = function()
|
||||
prop = makeProp(data, freeze, synced)
|
||||
end,
|
||||
onExit = function()
|
||||
destroyProp(prop)
|
||||
end,
|
||||
debug = debugMode,
|
||||
})
|
||||
end
|
||||
|
||||
--- Destroys a prop, detaching it if attached to the player beforehand.
|
||||
---
|
||||
---@param entity number The handle of the prop entity to destroy.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- destroyProp(prop)
|
||||
--- ```
|
||||
function destroyProp(entity)
|
||||
if entity then
|
||||
debugPrint("^6Bridge^7: ^2Destroying Prop^7: '^6"..entity.."^7'")
|
||||
if IsEntityAttachedToEntity(entity, PlayerPedId()) then
|
||||
SetEntityAsMissionEntity(entity)
|
||||
DetachEntity(entity, true, true)
|
||||
end
|
||||
DeleteObject(entity)
|
||||
end
|
||||
end
|
||||
|
||||
--- Cleans up all created props when the resource stops.
|
||||
onResourceStop(function() for i = 1, #Props do destroyProp(Props[i]) end end, true)
|
||||
73
shared/make/makeVeh.lua
Normal file
73
shared/make/makeVeh.lua
Normal file
@@ -0,0 +1,73 @@
|
||||
local Vehicles = {}
|
||||
|
||||
--- Creates a vehicle with the specified model and coordinates.
|
||||
---
|
||||
--- This function loads the vehicle model, creates the vehicle in the world at the given coordinates, sets initial properties, and returns the vehicle handle.
|
||||
---
|
||||
---@param model string|number The model name or hash of the vehicle to create.
|
||||
---@param coords vector4 The coordinates where the vehicle will be placed, including x, y, z, and w (heading).
|
||||
---
|
||||
---@return number entityID The handle of the created vehicle.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local vehicle = makeVeh('adder', vector4(123.4, 567.8, 90.1, 180.0))
|
||||
--- ```
|
||||
function makeVeh(model, coords)
|
||||
loadModel(model)
|
||||
local veh = CreateVehicle(model, coords.x, coords.y, coords.z, coords.w, true, false)
|
||||
SetVehicleHasBeenOwnedByPlayer(veh, true)
|
||||
SetNetworkIdCanMigrate(NetworkGetNetworkIdFromEntity(veh), true)
|
||||
Wait(100)
|
||||
SetVehicleNeedsToBeHotwired(veh, false)
|
||||
SetVehRadioStation(veh, 'OFF')
|
||||
SetVehicleFuelLevel(veh, 100.0)
|
||||
SetVehicleModKit(veh, 0)
|
||||
SetVehicleOnGroundProperly(veh)
|
||||
|
||||
debugPrint("^6Bridge^7: ^1Veh ^2Created^7: '^6"..veh.."^7' | ^2Hash^7: ^7'^6"..model.."^7' | ^2Coord^7: "..formatCoord(coords))
|
||||
unloadModel(model)
|
||||
Vehicles[#Vehicles + 1] = veh
|
||||
return veh
|
||||
end
|
||||
|
||||
--- Attempts to gain network control of a vehicle and set it as a mission entity.
|
||||
---
|
||||
--- This function forces synchronization of a vehicle with other players by requesting network control and setting the vehicle as a mission entity.
|
||||
---
|
||||
---@param entity number The handle of the vehicle entity to push.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- pushVehicle(vehicle)
|
||||
--- ```
|
||||
function pushVehicle(entity)
|
||||
SetVehicleModKit(entity, 0)
|
||||
if entity ~= 0 and DoesEntityExist(entity) then
|
||||
if not NetworkHasControlOfEntity(entity) then
|
||||
debugPrint("^6Bridge^7: ^3pushVehicle^7: ^2Requesting network control of vehicle^7.")
|
||||
NetworkRequestControlOfEntity(entity)
|
||||
local timeout = 2000
|
||||
while timeout > 0 and not NetworkHasControlOfEntity(entity) do
|
||||
Wait(100)
|
||||
timeout -= 100
|
||||
end
|
||||
if NetworkHasControlOfEntity(entity) then debugPrint("^6Bridge^7: ^3pushVehicle^7: ^2Network has control of entity^7.") end
|
||||
end
|
||||
if not IsEntityAMissionEntity(entity) then
|
||||
debugPrint("^6Bridge^7: ^3pushVehicle^7: ^2Setting vehicle as a ^7'^2mission^7' ^2entity^7.")
|
||||
SetEntityAsMissionEntity(entity, true, true)
|
||||
local timeout = 2000
|
||||
while timeout > 0 and not IsEntityAMissionEntity(entity) do
|
||||
Wait(100)
|
||||
timeout -= 100
|
||||
end
|
||||
if IsEntityAMissionEntity(entity) then debugPrint("^6Bridge^7: ^3pushVehicle^7: ^2Vehicle is a ^7'^2mission^7'^2 entity^7.") end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Cleans up all created vehicles when the resource stops.
|
||||
onResourceStop(function(r)
|
||||
for i = 1, #Vehicles do DeleteVehicle(Vehicles[i]) end
|
||||
end)
|
||||
209
shared/make/progressBars.lua
Normal file
209
shared/make/progressBars.lua
Normal file
@@ -0,0 +1,209 @@
|
||||
local inProgress = false
|
||||
|
||||
--- Displays a progress bar using the configured progress bar system.
|
||||
---
|
||||
--- This function handles displaying a progress bar to the player using the specified progress bar system (e.g., ox, qb, esx, gta).
|
||||
--- It supports shared progress bars between players, animations, camera effects, and more.
|
||||
---
|
||||
---@param data table A table containing the progress bar configuration.
|
||||
--- - **label** (`string`): The text label to display on the progress bar.
|
||||
--- - **time** (`number`): The duration of the progress bar in milliseconds.
|
||||
--- - **dict** (`string`, optional): The animation dictionary to use.
|
||||
--- - **anim** (`string`, optional): The animation name to play.
|
||||
--- - **task** (`string`, optional): The task scenario to perform.
|
||||
--- - **flag** (`number`, optional): The animation flag.
|
||||
--- - **dead** (`boolean`, optional): Whether to allow the progress bar when the player is dead. Default is `false`.
|
||||
--- - **cancel** (`boolean`, optional): Whether the progress bar can be canceled by the player. Default is `true`.
|
||||
--- - **icon** (`string`, optional): The icon to display (for qb progress bar).
|
||||
--- - **cam** (`number`, optional): The camera handle to use.
|
||||
--- - **shared** (`table`, optional): Data for shared progress bars.
|
||||
--- - **pid** (`number`): The player ID to share the progress bar with.
|
||||
--- - **label** (`string`): The label to display on the shared progress bar.
|
||||
---
|
||||
--- @return boolean `true` if the progress bar completed successfully, or `false` if it was canceled.
|
||||
---
|
||||
---@usage
|
||||
--- ```lua
|
||||
--- local success = progressBar({
|
||||
--- label = "Processing...",
|
||||
--- time = 5000,
|
||||
--- dict = "amb@world_human_hang_out_street@female_hold_arm@base",
|
||||
--- anim = "base",
|
||||
--- flag = 49,
|
||||
--- cancel = true,
|
||||
--- })
|
||||
--- ```
|
||||
function progressBar(data)
|
||||
local ped = PlayerPedId()
|
||||
if data.shared then
|
||||
debugPrint("^6Bridge^7: ^6Sharing progressBar to player^7: ^6"..data.shared.pid.."^7")
|
||||
storedPID = data.shared.pid
|
||||
TriggerServerEvent(getScript()..":server:sharedProg:Start", data)
|
||||
end
|
||||
local result = nil
|
||||
if data.cam then startTempCam(data.cam) end
|
||||
if Config.System.ProgressBar == "ox" then
|
||||
if exports[OXLibExport]:progressBar({
|
||||
duration = debugMode and 1000 or data.time,
|
||||
label = data.label,
|
||||
useWhileDead = data.dead or false,
|
||||
canCancel = data.cancel and data.cancel or true,
|
||||
anim = {
|
||||
dict = data.dict,
|
||||
clip = data.anim,
|
||||
flag = (data.flag == 8 and 32 or data.flag) or nil,
|
||||
scenario = data.task
|
||||
},
|
||||
disable = {
|
||||
combat = true
|
||||
},
|
||||
}) then
|
||||
result = true
|
||||
else
|
||||
result = false
|
||||
end
|
||||
|
||||
elseif Config.System.ProgressBar == "qb" then
|
||||
Core.Functions.Progressbar("progbar",
|
||||
data.label,
|
||||
debugMode and 1000 or data.time,
|
||||
data.dead or false,
|
||||
data.cancel or true,
|
||||
{ disableMovement = true, disableCarMovement = true, disableMouse = false, disableCombat = true },
|
||||
{ animDict = data.dict, anim = data.anim, flags = data.flag or 32, task = data.task }, {}, {},
|
||||
function()
|
||||
result = true
|
||||
end, function()
|
||||
result = false
|
||||
end, data.icon)
|
||||
|
||||
elseif Config.System.ProgressBar == "esx" then
|
||||
ESX.Progressbar(data.label, debugMode and 1000 or data.time, {
|
||||
FreezePlayer = true,
|
||||
animation = {
|
||||
type = data.anim,
|
||||
dict = data.dict,
|
||||
scenario = data.task,
|
||||
},
|
||||
onFinish = function()
|
||||
result = true
|
||||
end,
|
||||
onCancel = function()
|
||||
result = false
|
||||
end
|
||||
})
|
||||
|
||||
elseif Config.System.ProgressBar == "gta" then
|
||||
local wait = debugMode and 1000 or data.time
|
||||
inProgress = true
|
||||
if not (data.dead or false) then
|
||||
lockInv(true)
|
||||
displaySpinner(data.label)
|
||||
if data.dict then
|
||||
playAnim(data.dict, data.anim, -1, (data.flag == 8 and 32 or data.flag) or nil)
|
||||
end
|
||||
if data.task then
|
||||
TaskStartScenarioInPlace(ped, data.task, -1, true)
|
||||
end
|
||||
while inProgress and wait > 0 do
|
||||
wait -= 15
|
||||
local waitTimer = 0
|
||||
DisablePlayerFiring(ped, true)
|
||||
DisableControlAction(0, 25, true) -- Disable aim
|
||||
DisableControlAction(0, 21, true) -- Disable sprint
|
||||
DisableControlAction(0, 30, true) -- Disable move left/right
|
||||
DisableControlAction(0, 31, true) -- Disable move forward/back
|
||||
DisableControlAction(0, 36, true) -- Disable stealth
|
||||
if data.cam ~= nil then
|
||||
DisableControlAction(0, 1, true) -- Disable look left/right
|
||||
DisableControlAction(0, 2, true) -- Disable look up/down
|
||||
DisableControlAction(0, 106, true) -- Disable vehicle mouse control
|
||||
end
|
||||
if data.cancel then
|
||||
if IsControlJustReleased(0, 202) or IsControlJustReleased(0, 77) then -- Cancel key (Backspace or Delete)
|
||||
inProgress = false
|
||||
waitTimer = 1500
|
||||
displaySpinner(Loc[Config.Lan].error["cancel"])
|
||||
end
|
||||
end
|
||||
Wait(waitTimer)
|
||||
end
|
||||
inProgress = false
|
||||
if data.dict then stopAnim(data.dict, data.anim, ped) end
|
||||
ClearPedTasks(ped)
|
||||
end
|
||||
stopSpinner()
|
||||
result = (wait <= 0)
|
||||
end
|
||||
|
||||
while result == nil do Wait(10) end
|
||||
|
||||
-- Cleanup
|
||||
FreezeEntityPosition(ped, false)
|
||||
lockInv(false)
|
||||
if data.cam then stopTempCam(data.cam) end
|
||||
if result == false and data.shared then
|
||||
debugPrint("^6Bridge^7: ^2Sending cancel to ^6"..storedPID.."^7")
|
||||
TriggerServerEvent(getScript().."server:sharedProg:cancel", storedPID)
|
||||
end
|
||||
storedPID = nil
|
||||
return result
|
||||
end
|
||||
|
||||
--- Stops the current progress bar.
|
||||
---
|
||||
--- This function cancels the progress bar based on the configured progress bar system, handling any necessary cleanup.
|
||||
function stopPropgressBar()
|
||||
if Config.System.ProgressBar == "ox" then
|
||||
exports[OXLibExport]:cancelProgress()
|
||||
elseif Config.System.ProgressBar == "qb" then
|
||||
TriggerEvent("progressbar:client:cancel")
|
||||
elseif Config.System.ProgressBar == "gta" then
|
||||
inProgress = false
|
||||
BusyspinnerOff()
|
||||
end
|
||||
end
|
||||
|
||||
-- System to handle sending/sharing progress bars between players --
|
||||
-- For example, healing someone --
|
||||
|
||||
local storedPID = nil
|
||||
|
||||
--- Server event handler for starting a shared progress bar.
|
||||
--- This event is triggered when a player wants to start a progress bar on another player.
|
||||
--- It adjusts the data to prevent loops and sends the data to the target client.
|
||||
RegisterNetEvent(getScript()..":server:sharedProg:Start", function(data)
|
||||
local pid = data.shared.pid -- Get player ID from the client
|
||||
data.label = data.shared.label -- Set progress bar label to the shared label
|
||||
data.cancel = false -- Make it so it can't be canceled
|
||||
data.dead = true -- Allow progress bar even if player is dead
|
||||
data.shared = nil -- Remove shared info to prevent loops
|
||||
data.anim = nil -- Remove animation so players don't share it
|
||||
debugPrint("^6Bridge^7: ^6"..source.." ^2is sending shared progressBar to player^7, ^6"..pid.."^7")
|
||||
TriggerClientEvent(getScript()..":client:sharedProg:Start", pid, data)
|
||||
end)
|
||||
|
||||
--- Client event handler for starting a shared progress bar.
|
||||
--- This event is triggered when the server wants the client to start a shared progress bar.
|
||||
RegisterNetEvent(getScript()..":client:sharedProg:Start", function(data)
|
||||
debugPrint("^6Bridge^7: ^2You have been sent a progressBar^7")
|
||||
progressBar(data)
|
||||
end)
|
||||
|
||||
--- Server event handler for canceling a shared progress bar.
|
||||
--- This event is triggered when a progress bar is canceled and the server needs to notify the other player.
|
||||
RegisterNetEvent(getScript()..":server:sharedProg:Cancel", function(pid)
|
||||
debugPrint("^6Bridge^7: ^2Sending cancel progressBar to ^6"..pid.."^7")
|
||||
TriggerClientEvent(getScript()..":client:sharedProg:Cancel", pid)
|
||||
end)
|
||||
|
||||
--- Client event handler for canceling a shared progress bar.
|
||||
--- This event is triggered when the server wants the client to cancel a shared progress bar.
|
||||
RegisterNetEvent(getScript()..":client:sharedProg:Cancel", function()
|
||||
debugPrint("^6Bridge^7: ^2Receiving cancel progressBar^7")
|
||||
stopPropgressBar()
|
||||
end)
|
||||
|
||||
--- Cleans up when the resource stops.
|
||||
--- This event handler ensures that any active spinners or progress bars are stopped when the resource is stopped.
|
||||
onResourceStop(function() stopSpinner() end, true)
|
||||
Reference in New Issue
Block a user