mirror of
https://github.com/jimathy/jim_bridge.git
synced 2026-08-17 22:16:03 +01:00
262 lines
9.9 KiB
Lua
262 lines
9.9 KiB
Lua
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("^6Bridge^7: ^2Loading ^3Script ^2AudioBank^7...")
|
|
while not RequestScriptAudioBank(bank, false) do Wait(10) timeout -= 10 if timeout <= 0 then break end end
|
|
|
|
local success = RequestScriptAudioBank(bank, false)
|
|
debugPrint("^6Bridge^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("^6Bridge^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("^6Bridge^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("^6Bridge^7: ^3playAnim^7() ^2Triggered^7: ", animDict, animName, flag)
|
|
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("^6Bridge^7: ^3stopAnim^7() ^2Triggered^7: ", animDict, animName)
|
|
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(audioBank, soundSet, soundRef, coords, synced, range)
|
|
debugPrint("^6Bridge^7: ^2Attempting to play: ^3"..soundRef.." ^7('^4"..audioBank.."^7')")
|
|
loadScriptBank(audioBank)
|
|
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("^6Bridge^7: ^2Playing sound from Coord^7: "..formatCoord(coords.xyz))
|
|
PlaySoundFromCoord(soundId, soundRef, coords.x, coords.y, coords.z, soundSet, synced, range, 0)
|
|
else
|
|
debugPrint("^6Bridge^7: ^2Playing sound from Entity^7: ^4"..coords.."^7")
|
|
PlaySoundFromEntity(soundId, soundRef, coords, soundSet, synced, 1.0)
|
|
end
|
|
ReleaseScriptAudioBank(audioBank)
|
|
end
|
|
|
|
-- Experimental, add fade in for spawned entities
|
|
function fadeInEnt(ent, duration)
|
|
if not DoesEntityExist(ent) then return end
|
|
duration = duration or 500 -- in ms
|
|
local fadeSteps = 20
|
|
local stepTime = duration / fadeSteps
|
|
|
|
SetEntityAlpha(ent, 0, false)
|
|
SetEntityVisible(ent, true, false)
|
|
SetEntityLocallyInvisible(ent) -- sometimes helps prevent "pop-in" in early frames
|
|
|
|
for i = 1, fadeSteps do
|
|
Wait(stepTime)
|
|
local newAlpha = math.floor((i / fadeSteps) * 255)
|
|
SetEntityAlpha(ent, newAlpha, false)
|
|
end
|
|
|
|
-- Restore full visibility
|
|
ResetEntityAlpha(ent)
|
|
end |