refactor(streaming): convert to modules

Import methods rather than call via exports.
This commit is contained in:
Linden
2022-11-21 21:39:01 +11:00
parent 6825103dd5
commit 00c2086072
9 changed files with 213 additions and 86 deletions

View File

@@ -39,6 +39,8 @@ shared_scripts {
client_scripts { client_scripts {
'imports/callback/client.lua', 'imports/callback/client.lua',
'imports/requestModel/client.lua',
'imports/requestAnimDict/client.lua',
'resource/**/client.lua', 'resource/**/client.lua',
'resource/**/client/*.lua' 'resource/**/client/*.lua'
} }

View File

@@ -0,0 +1,35 @@
---Load an animation dictionary. When called from a thread, it will yield until it has loaded.
---@param animDict string
---@param timeout number? Number of ticks to wait for the dictionary to load. Default is 500.
---@return string? animDict
function lib.requestAnimDict(animDict, timeout)
if HasAnimDictLoaded(animDict) then return animDict end
if type(animDict) ~= 'string' then
error(("expected animDict to have type 'string' (received %s)"):format(type(animDict)))
end
if not DoesAnimDictExist(animDict) then
return error(("attempted to load invalid animDict '%s'"):format(animDict))
end
RequestAnimDict(animDict)
if coroutine.running() then
timeout = tonumber(timeout) or 500
for _ = 1, timeout do
if HasAnimDictLoaded(animDict) then
return animDict
end
Wait(0)
end
print(("failed to load animDict '%s' after %s ticks"):format(animDict, timeout))
end
return animDict
end
return lib.requestAnimDict

View File

@@ -0,0 +1,31 @@
---Load an animation clipset. When called from a thread, it will yield until it has loaded.
---@param animSet string
---@param timeout number? Number of ticks to wait for the clipset to load. Default is 500.
---@return string? animSet
function lib.requestAnimSet(animSet, timeout)
if HasAnimSetLoaded(animSet) then return animSet end
if type(animSet) ~= 'string' then
error(("expected animSet to have type 'string' (received %s)"):format(type(animSet)))
end
RequestAnimSet(animSet)
if coroutine.running() then
timeout = tonumber(timeout) or 500
for _ = 1, timeout do
if HasAnimSetLoaded(animSet) then
return animSet
end
Wait(0)
end
print(("failed to load animSet '%s' after %s ticks"):format(animSet, timeout))
end
return animSet
end
return lib.requestAnimSet

View File

@@ -0,0 +1,33 @@
---Load a model. When called from a thread, it will yield until it has loaded.
---@param model number | string
---@param timeout number? Number of ticks to wait for the model to load. Default is 500.
---@return number? model
function lib.requestModel(model, timeout)
if not tonumber(model) then model = joaat(model) end
---@cast model -string
if HasModelLoaded(model) then return model end
if not IsModelValid(model) then
return error(("attempted to load invalid model '%s'"):format(model))
end
RequestModel(model)
if coroutine.running() then
timeout = tonumber(timeout) or 500
for _ = 1, timeout do
if HasModelLoaded(model) then
return model
end
Wait(0)
end
print(("failed to load model '%s' after %s ticks"):format(model, timeout))
end
return model
end
return lib.requestModel

View File

@@ -0,0 +1,31 @@
---Load a named particle effect. When called from a thread, it will yield until it has loaded.
---@param ptFxName string
---@param timeout number? Number of ticks to wait for the particle effect to load. Default is 500.
---@return string? ptFxName
function lib.requestNamedPtfxAsset(ptFxName, timeout)
if HasNamedPtfxAssetLoaded(ptFxName) then return ptFxName end
if type(ptFxName) ~= 'string' then
error(("expected ptFxName to have type 'string' (received %s)"):format(type(ptFxName)))
end
RequestNamedPtfxAsset(ptFxName)
if coroutine.running() then
timeout = tonumber(timeout) or 500
for _ = 1, timeout do
if HasNamedPtfxAssetLoaded(ptFxName) then
return ptFxName
end
Wait(0)
end
print(("failed to load ptFxName '%s' after %s ticks"):format(ptFxName, timeout))
end
return ptFxName
end
return lib.requestNamedPtfxAsset

View File

@@ -0,0 +1,31 @@
---Load a texture dictionary. When called from a thread, it will yield until it has loaded.
---@param textureDict string
---@param timeout number? Number of ticks to wait for the dictionary to load. Default is 500.
---@return string? textureDict
function lib.requestStreamedTextureDict(textureDict, timeout)
if HasStreamedTextureDictLoaded(textureDict) then return textureDict end
if type(textureDict) ~= 'string' then
error(("expected textureDict to have type 'string' (received %s)"):format(type(textureDict)))
end
RequestStreamedTextureDict(textureDict)
if coroutine.running() then
timeout = tonumber(timeout) or 500
for _ = 1, timeout do
if HasStreamedTextureDictLoaded(textureDict) then
return textureDict
end
Wait(0)
end
print(("failed to load textureDict '%s' after %s ticks"):format(textureDict, timeout))
end
return textureDict
end
return lib.requestStreamedTextureDict

View File

@@ -1,14 +1,47 @@
export const requestAnimDict = (animDict: string, timeout?: number): string => function streamingRequest(
exports.ox_lib.requestAnimDict(animDict, timeout); request: Function,
hasLoaded: Function,
assetType: string,
asset: any,
timeout?: number
): Promise<any> {
return new Promise((resolve, reject) => {
if (hasLoaded(asset)) resolve(asset);
export const requestAnimSet = (animSet: string, timeout?: number): string => request(asset);
exports.ox_lib.requestAnimSet(animSet, timeout);
export const requestModel = (model: string | number, timeout?: number): string => if (typeof timeout !== 'number') timeout = 500;
exports.ox_lib.requestModel(model, timeout);
export const requestStreamedTextureDict = (dict: string, timeout?: number): string => let i = 0;
exports.ox_lib.requestStreamedTextureDict(dict, timeout);
export const requestNamedPtfxAsset = (fxName: string, timeout?: number): string => setTick(() => {
exports.ox_lib.requestNamedPtfxAsset(fxName, timeout); if (hasLoaded(asset)) resolve(asset);
i++;
if (i === timeout) reject(`failed to load ${assetType} '${asset}' after ${timeout} ticks`);
});
});
}
export const requestAnimDict = (animDict: string, timeout?: number): Promise<string> => {
if (!DoesAnimDictExist(animDict)) throw new Error(`attempted to load invalid animDict '${animDict}'`);
return streamingRequest(RequestAnimDict, HasAnimDictLoaded, 'animDict', animDict, timeout);
};
export const requestAnimSet = (animSet: string, timeout?: number): Promise<string> =>
streamingRequest(RequestAnimSet, HasAnimSetLoaded, 'animSet', animSet, timeout);
export const requestModel = (model: string | number, timeout?: number): Promise<number> => {
if (typeof model !== 'number') model = GetHashKey(model);
if (!IsModelValid(model)) throw new Error(`attempted to load invalid model '${model}'`);
return streamingRequest(RequestModel, HasModelLoaded, 'model', model, timeout);
};
export const requestStreamedTextureDict = (textureDict: string, timeout?: number): Promise<string> =>
streamingRequest(RequestStreamedTextureDict, HasStreamedTextureDictLoaded, 'textureDict', textureDict, timeout);
export const requestNamedPtfxAsset = (ptFxName: string, timeout?: number): Promise<string> =>
streamingRequest(RequestNamedPtfxAsset, HasNamedPtfxAssetLoaded, 'ptFxName', ptFxName, timeout);

View File

@@ -26,7 +26,10 @@ local function createProp(prop)
lib.requestModel(prop.model) lib.requestModel(prop.model)
local coords = GetEntityCoords(cache.ped) local coords = GetEntityCoords(cache.ped)
local object = CreateObject(prop.model, coords.x, coords.y, coords.z, true, true, true) local object = CreateObject(prop.model, coords.x, coords.y, coords.z, true, true, true)
AttachEntityToEntity(object, cache.ped, GetPedBoneIndex(cache.ped, prop.bone or 60309), prop.pos.x, prop.pos.y, prop.pos.z, prop.rot.x, prop.rot.y, prop.rot.z, true, true, false, true, 0, true) AttachEntityToEntity(object, cache.ped, GetPedBoneIndex(cache.ped, prop.bone or 60309), prop.pos.x, prop.pos.y, prop.pos.z, prop.rot.x, prop.rot.y, prop.rot.z, true, true, false, true, 0, true)
SetModelAsNoLongerNeeded(prop.model)
return object return object
end end
@@ -44,10 +47,14 @@ local function startProgress(data)
if data.anim then if data.anim then
if data.anim.dict then if data.anim.dict then
lib.requestAnimDict(data.anim.dict) lib.requestAnimDict(data.anim.dict)
TaskPlayAnim(cache.ped, data.anim.dict, data.anim.clip, data.anim.blendIn or 3.0, data.anim.blendOut or 1.0, data.anim.duration or -1, data.anim.flag or 49, data.anim.playbackRate or 0, data.anim.lockX, data.anim.lockY, data.anim.lockZ) TaskPlayAnim(cache.ped, data.anim.dict, data.anim.clip, data.anim.blendIn or 3.0, data.anim.blendOut or 1.0, data.anim.duration or -1, data.anim.flag or 49, data.anim.playbackRate or 0, data.anim.lockX, data.anim.lockY, data.anim.lockZ)
RemoveAnimDict(data.anim.dict)
data.anim = true data.anim = true
elseif data.anim.scenario then elseif data.anim.scenario then
TaskStartScenarioInPlace(cache.ped, data.anim.scenario, 0, data.anim.playEnter ~= nil and data.anim.playEnter or true) TaskStartScenarioInPlace(cache.ped, data.anim.scenario, 0, data.anim.playEnter ~= nil and data.anim.playEnter or true)
data.anim = true data.anim = true
end end
end end

View File

@@ -1,76 +0,0 @@
local function request(native, hasLoaded, requestType, name, timeout)
native(name)
if coroutine.running() then
if not timeout then
timeout = 500
end
for i = 1, timeout do
Wait(0)
if hasLoaded(name) then
return name
end
end
print(("Failed to load %s '%s' after %s ticks"):format(requestType, name, timeout))
end
return name
end
---Load an animation dictionary. When called from a thread, it will yield until it has loaded.
---@param animDict string
---@param timeout number? Number of ticks to wait for the dictionary to load. Default is 500.
---@return string? animDict
function lib.requestAnimDict(animDict, timeout)
if HasAnimDictLoaded(animDict) then return animDict end
if not DoesAnimDictExist(animDict) then
return error(("Attempted to load invalid animDict (%s)"):format(animDict))
end
return request(RequestAnimDict, HasAnimDictLoaded, 'animDict', animDict, timeout)
end
---Load an animation clipset. When called from a thread, it will yield until it has loaded.
---@param animSet string
---@param timeout number? Number of ticks to wait for the clipset to load. Default is 500.
---@return string? animSet
function lib.requestAnimSet(animSet, timeout)
if HasAnimSetLoaded(animSet) then return animSet end
return request(RequestAnimSet, HasAnimSetLoaded, 'animSet', animSet, timeout)
end
---Load a model. When called from a thread, it will yield until it has loaded.
---@param model number
---@param timeout number? Number of ticks to wait for the model to load. Default is 500.
---@return number? model
function lib.requestModel(model, timeout)
if not tonumber(model) then model = joaat(model) end
if HasModelLoaded(model) then return model end
if not IsModelValid(model) then
return error(("Attempted to load invalid model (%s)"):format(model))
end
return request(RequestModel, HasModelLoaded, 'model', model, timeout)
end
---Load a texture dictionary. When called from a thread, it will yield until it has loaded.
---@param textureDict string
---@param timeout number? Number of ticks to wait for the dictionary to load. Default is 500.
---@return string? textureDict
function lib.requestStreamedTextureDict(textureDict, timeout)
if HasStreamedTextureDictLoaded(textureDict) then return textureDict end
return request(RequestStreamedTextureDict, HasStreamedTextureDictLoaded, 'textureDict', textureDict, timeout)
end
---Load a named particle effect. When called from a thread, it will yield until it has loaded.
---@param fxName string
---@param timeout number? Number of ticks to wait for the particle effect to load. Default is 500.
---@return string? fxName
function lib.requestNamedPtfxAsset(fxName, timeout)
if HasNamedPtfxAssetLoaded(fxName) then return fxName end
return request(RequestNamedPtfxAsset, HasNamedPtfxAssetLoaded, 'fxName', fxName, timeout)
end