@laot/bridge 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ltbridge.js +1 -1
- package/dist/modules.dat +1 -1
- package/package.json +1 -1
- package/dist/ltbridge-v1.0.3.zip +0 -0
package/dist/modules.dat
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"1.0.3","modules":{"@Alert":{"ns":"Alert","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal Alert = {}\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetAlertResource()\r\n return resourceName\r\nend\r\nfunction SetAlertResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Alert resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\n Alert = exports[name]\r\nend\r\nlocal resource = DetectResource(list, 'alert')\r\nif resource then\r\n SetAlertResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(data)\r\n local result = Alert:alertDialog(data)\r\n return result\r\n end,\r\n ['lt-ui'] = function(data)\r\n local result = Alert:alertDialog(data)\r\n return result\r\n end,\r\n ['lation_ui'] = function(data)\r\n local result = Alert:alert(data)\r\n return result\r\n end,\r\n}\r\nfunction SendAlert(data)\r\n if not resourceName then return end\r\n local adapter = adapters[resourceName]\r\n if not adapter then return end\r\n return adapter(data)\r\nend","stubs":[{"funcName":"GetAlertResource","metadata":{"export":"GetResource"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Returns alert resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'lation_ui'|nil\nfunction LT.Alert.GetResource() end"},{"funcName":"SetAlertResource","metadata":{"export":"SetResource"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Force set alert resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'lation_ui'\nfunction LT.Alert.SetResource(name) end"},{"funcName":"SendAlert","metadata":{"export":"Send"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Send alert dialog to player.\r\n--- @param data table { header: string, content: string, centered: boolean, size = 'xs'|'sm'|'md'|'lg'|'xl', cancel: boolean, labels: { cancel: string, confirm: string } }\r\n--- ```lua\r\n--- LT.Alert.Send({\r\n--- header = 'Alert',\r\n--- content = 'Alert',\r\n--- centered = true,\r\n--- size = 'md',\r\n--- cancel = true,\r\n--- labels = { cancel = 'Cancel', confirm = 'Confirm' }\r\n--- })\r\n--- ```\r\n--- @return 'cancel'|'confirm'|nil\nfunction LT.Alert.Send(data) end"}]},"server":null},"@Cache":{"ns":"Cache","meta":{},"shared":null,"client":{"code":"local PlayerPedId = PlayerPedId\nlocal PlayerId = PlayerId\nlocal GetPlayerServerId = GetPlayerServerId\nlocal GetVehiclePedIsIn = GetVehiclePedIsIn\nlocal GetPedInVehicleSeat = GetPedInVehicleSeat\nlocal GetEntityCoords = GetEntityCoords\nlocal GetSelectedPedWeapon = GetSelectedPedWeapon\nlocal IsEntityDead = IsEntityDead\n\nlocal cache = {}\nlocal listeners = {}\n\nfunction GetCache(key)\n if key then return cache[key] end\n return cache\nend\n\nfunction OnCacheChange(key, cb)\n if not listeners[key] then listeners[key] = {} end\n table.insert(listeners[key], cb)\nend\n\nlocal function triggerListeners(key, newValue, oldValue)\n if not listeners[key] then return end\n for i = 1, #listeners[key] do\n listeners[key][i](newValue, oldValue)\n end\nend\n\nCreateThread(function()\n local ped = PlayerPedId()\n cache.playerId = PlayerId()\n cache.serverId = GetPlayerServerId(cache.playerId)\n cache.ped = ped\n cache.coords = GetEntityCoords(ped)\n cache.vehicle = false\n cache.seat = false\n cache.weapon = false\n cache.isDead = IsEntityDead(ped)\n\n while true do\n ped = PlayerPedId()\n\n if ped ~= cache.ped then\n local oldPed = cache.ped\n cache.ped = ped\n triggerListeners('ped', ped, oldPed)\n end\n\n cache.coords = GetEntityCoords(ped)\n\n local vehicle = GetVehiclePedIsIn(ped, false)\n if vehicle == 0 then vehicle = false end\n\n if vehicle ~= cache.vehicle then\n local oldVehicle = cache.vehicle\n cache.vehicle = vehicle\n triggerListeners('vehicle', vehicle, oldVehicle)\n end\n\n if vehicle then\n\n local seat = false\n for i = -1, 6 do\n if GetPedInVehicleSeat(vehicle, i) == ped then\n seat = i\n break\n end\n end\n if seat ~= cache.seat then\n local oldSeat = cache.seat\n cache.seat = seat\n triggerListeners('seat', seat, oldSeat)\n end\n else\n if cache.seat ~= false then\n local oldSeat = cache.seat\n cache.seat = false\n triggerListeners('seat', false, oldSeat)\n end\n end\n\n local weapon = GetSelectedPedWeapon(ped)\n if weapon == `WEAPON_UNARMED` then weapon = false end\n if weapon ~= cache.weapon then\n local oldWeapon = cache.weapon\n cache.weapon = weapon\n triggerListeners('weapon', weapon, oldWeapon)\n end\n\n local isDead = IsEntityDead(ped)\n if isDead ~= cache.isDead then\n local oldState = cache.isDead\n cache.isDead = isDead\n triggerListeners('isDead', isDead, oldState)\n end\n\n Wait(500)\n end\nend)","stubs":[{"funcName":"GetCache","metadata":{"export":"Get"},"stubCode":"--- **`CACHE` `CLIENT`**\n--- Get a specific cache value or the whole table.\n--- @param key? 'ped'|'vehicle'|'seat'|'weapon'|'coords'|'isDead'|'playerId'|'serverId'\n--- @return any\nfunction LT.Cache.Get(key) end"},{"funcName":"OnCacheChange","metadata":{"export":"OnChange"},"stubCode":"--- **`CACHE` `CLIENT`**\n--- Listen for changes in cache values.\n--- ```lua\n--- LT.Cache.OnChange('vehicle', function(vehicle, oldVehicle)\n--- print('Vehicle state changed', vehicle)\n--- end)\n--- ```\n--- @param key string The cache key to listen for ('vehicle', 'seat', 'weapon', 'isDead')\n--- @param cb fun(newValue: any, oldValue: any)\nfunction LT.Cache.OnChange(key, cb) end"}]},"server":null},"@Callback":{"ns":"Callback","meta":{},"shared":{"code":"local cbEvent = ('__%s_cb_%%s'):format(LT_RESOURCE_NAME)\nlocal registeredCallbacks = {}\n\nfunction GetCbEvent()\n return cbEvent\nend\n\nfunction CallbackResponse(success, result, ...)\n if not success then\n if result then\n printf('error', '%s', result)\n end\n return false\n end\n return result, ...\nend\n\nfunction SetRegisteredCallback(name)\n registeredCallbacks[name] = true\nend\n\nRegisterNetEvent(LT_RESOURCE_NAME..':cb:validate', function(callbackName, key)\n if registeredCallbacks[callbackName] then return end\n\n if IsDuplicityVersion() then\n TriggerClientEvent(cbEvent:format(LT_RESOURCE_NAME), source, key, 'cb_invalid')\n else\n TriggerServerEvent(cbEvent:format(LT_RESOURCE_NAME), key, 'cb_invalid')\n end\nend)","stubs":[{"funcName":"GetCbEvent","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function for getting CB event formatted.\nfunction LT.Callback.GetCbEvent() end"},{"funcName":"CallbackResponse","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function for callback response.\nfunction LT.Callback.CallbackResponse(success, result, ...) end"},{"funcName":"SetRegisteredCallback","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function to register a callback.\n--- @param name string\nfunction LT.Callback.SetRegisteredCallback(name) end"}]},"client":{"code":"local pendingCallbacks = {}\nlocal cbEvent = GetCbEvent()\nlocal pcall = pcall\n\nRegisterNetEvent(cbEvent:format(LT_RESOURCE_NAME), function(key, ...)\n local cb = pendingCallbacks[key]\n if not cb then return end\n\n pendingCallbacks[key] = nil\n cb(...)\nend)\n\nlocal function triggerServerCallback(event, cb, ...)\n local key\n\n repeat\n key = ('%s:%s'):format(event, math.random(0, 100000))\n until not pendingCallbacks[key]\n\n TriggerServerEvent(LT_RESOURCE_NAME..':cb:validate', event, key)\n TriggerServerEvent(cbEvent:format(event), LT_RESOURCE_NAME, key, ...)\n\n local p = not cb and promise.new()\n\n pendingCallbacks[key] = function(response, ...)\n if response == 'cb_invalid' then\n response = (\"callback '%s' does not exist\"):format(event)\n\n if p then\n return p:reject(response)\n end\n\n return printf('error', '%s', response)\n end\n\n response = { response, ... }\n\n if p then\n return p:resolve(response)\n end\n\n if cb then\n cb(table.unpack(response))\n end\n end\n\n if p then\n SetTimeout(15000, function()\n if pendingCallbacks[key] then\n pendingCallbacks[key] = nil\n p:reject((\"callback '%s' timed out\"):format(event))\n end\n end)\n\n return table.unpack(Citizen.Await(p))\n end\nend\n\nfunction RegisterCallback(name, cb)\n SetRegisteredCallback(name)\n\n RegisterNetEvent(cbEvent:format(name), function(resource, key, ...)\n TriggerServerEvent(cbEvent:format(resource), key, CallbackResponse(pcall(cb, ...)))\n end)\nend\n\nfunction AwaitCallback(name, ...)\n return triggerServerCallback(name, false, ...)\nend\n\nfunction TriggerAsyncCallback(name, cb, ...)\n return triggerServerCallback(name, cb, ...)\nend","stubs":[{"funcName":"RegisterCallback","metadata":{"export":"Register"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Register a client-side callback that the server can invoke.\n--- @param name string Callback name\n--- @param cb fun(...: any): ...any\nfunction LT.Callback.Register(name, cb) end"},{"funcName":"AwaitCallback","metadata":{"export":"Await"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Await a server callback synchronously (yields current thread).\n--- ```lua\n--- local money = LT.Callback.Await('getMoney', 'cash')\n--- print(money)\n--- ```\n--- @param name string Callback name\n--- @param ... any Arguments to send\n--- @return any ...\nfunction LT.Callback.Await(name, ...) end"},{"funcName":"TriggerAsyncCallback","metadata":{"export":"Trigger"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Trigger a server callback asynchronously (non-blocking).\n--- ```lua\n--- LT.Callback.Trigger('getMoney', function(money)\n--- print(money)\n--- end, 'cash')\n--- ```\n--- @param name string Callback name\n--- @param cb fun(...: any)\n--- @param ... any Arguments to send\nfunction LT.Callback.Trigger(name, cb, ...) end"}]},"server":{"code":"local pendingCallbacks = {}\nlocal cbEvent = GetCbEvent()\nlocal pcall = pcall\n\nRegisterNetEvent(cbEvent:format(LT_RESOURCE_NAME), function(key, ...)\n local cb = pendingCallbacks[key]\n if not cb then return end\n\n pendingCallbacks[key] = nil\n cb(...)\nend)\n\nlocal function triggerClientCallback(event, playerId, cb, ...)\n local key\n\n repeat\n key = ('%s:%s:%s'):format(event, math.random(0, 100000), playerId)\n until not pendingCallbacks[key]\n\n TriggerClientEvent(LT_RESOURCE_NAME..':cb:validate', playerId, event, key)\n TriggerClientEvent(cbEvent:format(event), playerId, LT_RESOURCE_NAME, key, ...)\n\n local p = not cb and promise.new()\n\n pendingCallbacks[key] = function(response, ...)\n if response == 'cb_invalid' then\n response = (\"callback '%s' does not exist\"):format(event)\n\n if p then\n return p:reject(response)\n end\n\n return printf('error', '%s', response)\n end\n\n response = { response, ... }\n\n if p then\n return p:resolve(response)\n end\n\n if cb then\n cb(table.unpack(response))\n end\n end\n\n if p then\n SetTimeout(15000, function()\n if pendingCallbacks[key] then\n pendingCallbacks[key] = nil\n p:reject((\"callback '%s' timed out\"):format(event))\n end\n end)\n\n return table.unpack(Citizen.Await(p))\n end\nend\n\nfunction RegisterCallback(name, cb)\n SetRegisteredCallback(name)\n\n RegisterNetEvent(cbEvent:format(name), function(resource, key, ...)\n TriggerClientEvent(cbEvent:format(resource), source, key, CallbackResponse(pcall(cb, source, ...)))\n end)\nend\n\nfunction AwaitCallback(playerId, name, ...)\n return triggerClientCallback(name, playerId, false, ...)\nend\n\nfunction TriggerAsyncCallback(playerId, name, cb, ...)\n return triggerClientCallback(name, playerId, cb, ...)\nend","stubs":[{"funcName":"RegisterCallback","metadata":{"export":"Register"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Register a server-side callback that clients can invoke.\n--- @param name string Callback name\n--- @param cb fun(source: number, ...: any): ...any\nfunction LT.Callback.Register(name, cb) end"},{"funcName":"AwaitCallback","metadata":{"export":"Await"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Await a client callback synchronously (yields current thread).\n--- ```lua\n--- local result = LT.Callback.Await(source, 'getScreenData')\n--- print(result)\n--- ```\n--- @param playerId number Player source\n--- @param name string Callback name\n--- @param ... any Arguments to send\n--- @return any ...\nfunction LT.Callback.Await(playerId, name, ...) end"},{"funcName":"TriggerAsyncCallback","metadata":{"export":"Trigger"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Trigger a client callback asynchronously (non-blocking).\n--- ```lua\n--- LT.Callback.Trigger(source, 'getScreenData', function(result)\n--- print(result)\n--- end)\n--- ```\n--- @param playerId number Player source\n--- @param name string Callback name\n--- @param cb fun(...: any)\n--- @param ... any Arguments to send\nfunction LT.Callback.Trigger(playerId, name, cb, ...) end"}]}},"@Class":{"ns":"Class","meta":{},"shared":{"code":"function CreateClass(name, super)\n local cls = {}\n cls.__name = name\n cls.__index = cls\n cls.super = super\n\n if super then\n setmetatable(cls, { __index = super })\n end\n\n function cls.new(...)\n local instance = setmetatable({}, cls)\n instance.__destroyed = false\n\n if instance.constructor then\n instance:constructor(...)\n end\n return instance\n end\n\n function cls:include(mixin)\n for k, v in pairs(mixin) do\n if k ~= 'constructor' and k ~= '__index' and k ~= 'super' and k ~= '__name' then\n cls[k] = v\n end\n end\n return cls\n end\n\n function cls:isA(other)\n local current = self\n while current do\n if current == other then return true end\n\n local mt = getmetatable(current)\n if mt and mt.__index and mt.__index == other then return true end\n\n current = current.super\n end\n return false\n end\n\n local privateScope = setmetatable({}, { __mode = \"k\" })\n function cls:private()\n local p = privateScope[self]\n if not p then\n p = {}\n privateScope[self] = p\n end\n return p\n end\n\n function cls:destroy()\n if self.__destroyed then return end\n self.__destroyed = true\n\n if self.destructor then\n self:destructor()\n end\n end\n\n return cls\nend","stubs":[{"funcName":"CreateClass","metadata":{"export":"Create"},"stubCode":"--- **`CLASS` `SHARED`**\n--- Creates a new OOP class.\n--- @param name string Class name.\n--- @param super? table Parent class to inherit from.\n--- @return table\nfunction LT.Class.Create(name, super) end"}]},"client":null,"server":null},"@Cooldown":{"ns":"Cooldown","meta":{},"shared":null,"client":null,"server":{"code":"local os_time = os.time\nlocal lastTriggerTime = {}\n\nfunction StartCooldown(source, key, durationMs)\n if not source or not key then return end\n local srcStr = tostring(source)\n if not lastTriggerTime[srcStr] then lastTriggerTime[srcStr] = {} end\n\n local durationSec = durationMs / 1000\n lastTriggerTime[srcStr][key] = os_time() + durationSec\nend\n\nfunction CheckCooldown(source, key)\n if not source or not key then return false end\n local srcStr = tostring(source)\n\n if not lastTriggerTime[srcStr] or not lastTriggerTime[srcStr][key] then\n return false\n end\n\n if os_time() < lastTriggerTime[srcStr][key] then\n return true\n end\n\n lastTriggerTime[srcStr][key] = nil\n return false\nend\n\nfunction GetCooldownRemaining(source, key)\n if not source or not key then return 0 end\n local srcStr = tostring(source)\n\n if not lastTriggerTime[srcStr] or not lastTriggerTime[srcStr][key] then\n return 0\n end\n\n local remaining = lastTriggerTime[srcStr][key] - os_time()\n if remaining > 0 then\n return math.floor(remaining * 1000)\n end\n\n lastTriggerTime[srcStr][key] = nil\n return 0\nend\n\nfunction ClearCooldown(source, key)\n if not source or not key then return end\n local srcStr = tostring(source)\n if lastTriggerTime[srcStr] then\n lastTriggerTime[srcStr][key] = nil\n end\nend\n\nAddEventHandler('playerDropped', function()\n local srcStr = tostring(source)\n if lastTriggerTime[srcStr] then\n lastTriggerTime[srcStr] = nil\n end\nend)","stubs":[{"funcName":"StartCooldown","metadata":{"export":"Start"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Start a cooldown for a specific player and key.\n--- ```lua\n--- LT.Cooldown.Start(source, 'gather', 5000) -- 5 seconds\n--- ```\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @param durationMs number Cooldown duration in milliseconds\nfunction LT.Cooldown.Start(source, key, durationMs) end"},{"funcName":"CheckCooldown","metadata":{"export":"Check"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Check if a specific cooldown is active.\n--- ```lua\n--- if LT.Cooldown.Check(source, 'gather') then return end\n--- ```\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @return boolean\nfunction LT.Cooldown.Check(source, key) end"},{"funcName":"GetCooldownRemaining","metadata":{"export":"Remaining"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Get remaining cooldown time in milliseconds.\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @return number remainingMs\nfunction LT.Cooldown.Remaining(source, key) end"},{"funcName":"ClearCooldown","metadata":{"export":"Clear"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Clear a specific cooldown early.\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\nfunction LT.Cooldown.Clear(source, key) end"}]}},"@Debug":{"ns":"Debug","meta":{},"shared":{"code":"local debugMode = 1\r\nlocal print = print\r\nlocal string_format = string.format\r\nlocal function handleException(result, value)\r\n if type(value) == 'function' then\r\n return tostring(value)\r\n end\r\n return result\r\nend\r\nlocal function format(message, ...)\r\n local data = { ... }\r\n for i = 1, #data do\r\n local v = data[i]\r\n if v == nil then\r\n data[i] = 'nil'\r\n elseif type(v) == \"table\" then\r\n data[i] = json.encode(v, {\r\n sort_keys = true,\r\n indent = true,\r\n exception = handleException\r\n })\r\n elseif type(v) == \"boolean\" then\r\n data[i] = v and \"true\" or \"false\"\r\n elseif type(v) ~= \"string\" then\r\n data[i] = tostring(v)\r\n end\r\n end\r\n return string_format(message, table.unpack(data))\r\nend\r\nfunction SetDebugMode(mode)\r\n debugMode = mode or 1\r\nend\r\nlocal debugTypes <const> = {\r\n ['success'] = { mode = 3, color = 2 },\r\n ['error'] = { mode = 1, color = 1 },\r\n ['warning'] = { mode = 2, color = 3 },\r\n ['info'] = { mode = 3, color = 4 },\r\n ['verbose'] = { mode = 4, color = 5 },\r\n}\r\nfunction DebugDetailed(message, type, ...)\r\n if not type then type = 'verbose' end\r\n local data = debugTypes[type]\r\n if not data then return end\r\n if tonumber(debugMode) < tonumber(data.mode) then return end\r\n local info = debug.getinfo(2, 'Sl')\r\n local source = info and info.short_src or 'unknown'\r\n local line = info and info.currentline or -1\r\n source = source:gsub(\"^@\", \"\")\r\n local short = source:match(\"([^/]+/[^/]+%.lua)$\") or source:match(\"([^/]+%.lua)$\") or source\r\n print(string_format('^3[%s:%d]^7 ^%d[%s]^7 %s^7', short, line, data.color, type:upper(), format(message, ...)))\r\nend\r\nfunction DebugPrint(message, type, ...)\r\n if not type then type = 'verbose' end\r\n local data = debugTypes[type]\r\n if not data then return end\r\n if tonumber(debugMode) < tonumber(data.mode) then return end\r\n print(string_format('^%d[%s]^7 %s^7', data.color, type:upper(), format(message, ...)))\r\nend\r\nfunction DebugInfo(message, ...)\r\n DebugPrint(message, 'info', ...)\r\nend\r\nfunction DebugSuccess(message, ...)\r\n DebugPrint(message, 'success', ...)\r\nend\r\nfunction DebugError(message, ...)\r\n DebugPrint(message, 'error', ...)\r\nend\r\nfunction DebugWarn(message, ...)\r\n DebugPrint(message, 'warning', ...)\r\nend\r\nfunction DebugVerbose(message, ...)\r\n DebugPrint(message, 'verbose', ...)\r\nend","stubs":[{"funcName":"SetDebugMode","metadata":{"export":"SetMode"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Set debug mode.\r\n--- **0**: `Disabled` (Not Recommended)\r\n--- \r\n--- **1**: `Errors` (Default)\r\n--- \r\n--- **2**: `Errors + Warnings`\r\n--- \r\n--- **3**: `Except Verbose`\r\n--- \r\n--- **4**: `All Messages`\r\n--- \r\n--- @param mode? number\nfunction LT.Debug.SetMode(mode) end"},{"funcName":"DebugDetailed","metadata":{"export":"Detailed"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Prints a formatted and detailed (with file and line info) debug message.\r\n--- @param message string Message to print.\r\n--- @param type? 'info'|'success'|'error'|'warning'|'verbose'\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Detailed(message, type, ...) end"},{"funcName":"DebugPrint","metadata":{"export":"Print"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Prints a formatted debug message.\r\n--- @param message string Message to print.\r\n--- @param type? 'info'|'success'|'error'|'warning'|'verbose'\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Print(message, type, ...) end"},{"funcName":"DebugInfo","metadata":{"export":"Info"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a info debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Info(message, ...) end"},{"funcName":"DebugSuccess","metadata":{"export":"Success"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a success debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Success(message, ...) end"},{"funcName":"DebugError","metadata":{"export":"Error"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a error debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Error(message, ...) end"},{"funcName":"DebugWarn","metadata":{"export":"Warn"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a warning debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Warn(message, ...) end"},{"funcName":"DebugVerbose","metadata":{"export":"Verbose"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a verbose debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Verbose(message, ...) end"}]},"client":null,"server":null},"@Dispatch":{"ns":"Dispatch","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ps-dispatch'] = { providers = { 'lb-tablet' } },\r\n ['cd_dispatch'] = {},\r\n ['tk_dispatch'] = {},\r\n ['qs-dispatch'] = {},\r\n ['emergencydispatch'] = {},\r\n ['wasabi_mdt'] = {},\r\n ['linden_outlawalert'] = {}\r\n}\r\nfunction GetDispatchResource()\r\n return resourceName\r\nend\r\nfunction SetDispatchResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Dispatch resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'dispatch')\r\nif resource then\r\n SetDispatchResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ps-dispatch'] = function(data)\r\n local alertData = {\r\n message = data.message or \"No message\",\r\n code = data.code or '10-80',\r\n icon = data.icon or 'fas fa-question',\r\n priority = data.priority or 2,\r\n coords = data.coords or GetEntityCoords(PlayerPedId()),\r\n vehicle = data.vehicle,\r\n plate = data.plate,\r\n alertTime = data.time and (data.time / 1000) or nil,\r\n radius = data.blipData and data.blipData.radius or 0,\r\n sprite = data.blipData and data.blipData.sprite or 161,\r\n color = data.blipData and data.blipData.color or 84,\r\n scale = data.blipData and data.blipData.scale or 1.0,\r\n length = 2,\r\n sound = \"Lose_1st\",\r\n sound2 = \"GTAO_FM_Events_Soundset\",\r\n offset = false,\r\n flash = data.blipData and data.blipData.flash or false,\r\n jobs = data.jobs or data.job or \"police\"\r\n }\r\n exports[\"ps-dispatch\"]:CustomAlert(alertData)\r\n end,\r\n ['cd_dispatch'] = function(data)\r\n local pData = exports['cd_dispatch']:GetPlayerInfo()\r\n TriggerServerEvent('cd_dispatch:AddNotification', {\r\n job_table = data.jobs,\r\n coords = data.coords,\r\n title = data.message,\r\n message = data.message,\r\n flash = 0,\r\n unique_id = pData.unique_id,\r\n sound = 1,\r\n blip = {\r\n sprite = data.blipData.sprite,\r\n scale = data.blipData.scale,\r\n colour = data.blipData.color,\r\n flashes = false,\r\n text = data.message,\r\n time = (data.time / 1000),\r\n radius = 0,\r\n }\r\n })\r\n end,\r\n ['tk_dispatch'] = function(data)\r\n local alertData = {\r\n title = data.message,\r\n code = data.code or '10-80',\r\n priority = 'Priority '.. (data.priority or 2),\r\n coords = data.coords or GetEntityCoords(PlayerPedId()),\r\n showLocation = true,\r\n showGender = false,\r\n playSound = true,\r\n blip = {\r\n color = data.blipData.color or 3,\r\n sprite = data.blipData.sprite or 1,\r\n scale = data.blipData.scale or 0.8,\r\n },\r\n jobs = data.jobs or {'police'},\r\n }\r\n exports.tk_dispatch:addCall(alertData)\r\n end,\r\n ['qs-dispatch'] = function(data)\r\n local customData = {\r\n job = data.jobs or { 'police' },\r\n callLocation = data.coords or vec3(0.0, 0.0, 0.0),\r\n callCode = {\r\n code = data.code or '10-80',\r\n snippet = data.snippet or 'General Alert'\r\n },\r\n message = data.message,\r\n flashes = false,\r\n image = nil,\r\n blip = {\r\n sprite = data.blipData.sprite or 1,\r\n scale = data.blipData.scale or 1.0,\r\n colour = data.blipData.color or 1,\r\n flashes = false,\r\n text = data.message or \"Alert\",\r\n time = data.length and (data.time * 1000) or 20000\r\n },\r\n otherData = {\r\n {\r\n text = data.name or 'N/A',\r\n icon = data.icon or 'fas fa-question'\r\n }\r\n }\r\n }\r\n exports['qs-dispatch']:getSSURL(function(image)\r\n customData.image = image or customData.image\r\n TriggerServerEvent('qs-dispatch:server:CreateDispatchCall', customData)\r\n end)\r\n end,\r\n ['emergencydispatch'] = function(data)\r\n local ped = PlayerPedId()\r\n local job = data.job or data.jobs[1] or 'police'\r\n local message = data.message or 'Alert'\r\n local coords = data.coords or GetEntityCoords(ped)\r\n TriggerServerEvent('emergencydispatch:emergencycall:new', job, message, coords, true)\r\n end,\r\n ['wasabi_mdt'] = function(data)\r\n local fallbackCoords = GetEntityCoords(PlayerPedId())\r\n local alertData = {\r\n type = data.code or '10-80',\r\n title = data.code or '10-80',\r\n description = data.message or \"No message provided\",\r\n location = {data.coords.x, data.coords.y, data.coords.z} or {fallbackCoords.x, fallbackCoords.y, fallbackCoords.z},\r\n coords = {data.coords.x, data.coords.y, data.coords.z} or {fallbackCoords.x, fallbackCoords.y, fallbackCoords.z},\r\n }\r\n exports.wasabi_mdt:CreateDispatch(alertData)\r\n end,\r\n ['linden_outlawalert'] = function(data)\r\n local ped = PlayerPedId()\r\n TriggerServerEvent('wf-alerts:svNotify', {\r\n dispatchData = {\r\n displayCode = data.code or '211',\r\n description = data.message or \"Alert\",\r\n isImportant = 0,\r\n recipientList = data.jobs or {'police'},\r\n length = data.time or '10000',\r\n infoM = data.icon or 'fas fa-question',\r\n info = data.message or \"Alert\"\r\n },\r\n caller = 'Anonymous',\r\n coords = data.coords or GetEntityCoords(ped)\r\n })\r\n end\r\n}\r\nfunction SendDispatch(data)\r\n local resource = GetDispatchResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n adapter(data)\r\nend","stubs":[{"funcName":"GetDispatchResource","metadata":{"export":"GetResource"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Returns dispatch resource name.\r\n--- @return 'ps-dispatch'|'cd_dispatch'|'tk_dispatch'|'qs-dispatch'|'emergencydispatch'|'wasabi_mdt'|'linden_outlawalert'|nil\nfunction LT.Dispatch.GetResource() end"},{"funcName":"SetDispatchResource","metadata":{"export":"SetResource"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Force set dispatch resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ps-dispatch'|'cd_dispatch'|'tk_dispatch'|'qs-dispatch'|'emergencydispatch'|'wasabi_mdt'|'linden_outlawalert'\nfunction LT.Dispatch.SetResource(name) end"},{"funcName":"SendDispatch","metadata":{"export":"Send"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Send dispatch alert to given jobs.\r\n--- @param data table Dispatch data\nfunction LT.Dispatch.Send(data) end"}]},"server":null},"@Events/Emit":{"ns":"Events","meta":{},"shared":{"code":"function EventEmit(name, ...)\r\n TriggerEvent(GetEventName(name), ...)\r\nend","stubs":[{"funcName":"EventEmit","metadata":{"export":"Emit"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Triggers local event with formatted name.\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local emit = LT.Events.Emit\r\n--- \r\n--- -- Client example:\r\n--- emit('event', 'arg1', 'arg2')\r\n--- ```\r\n--- @param name string Event name\r\n--- @param ...? any Event arguments (Optional)\nfunction LT.Events.Emit(name, ...) end"}]},"client":null,"server":null},"@Events/EmitNet":{"ns":"Events","meta":{},"shared":{"code":"local isServer <const> = IsDuplicityVersion()\r\nfunction EventEmitNet(name, ...)\r\n local eventName = GetEventName(name, true)\r\n if isServer then\r\n local args = {...}\r\n local target = args[1]\r\n if type(target) ~= 'number' then\r\n local info = debug.getinfo(2, \"Sl\")\r\n return printf(\r\n 'error',\r\n 'EmitNet: invalid target on event (%s) [%s:%d]',\r\n name,\r\n info.short_src or info.source,\r\n info.currentline or -1\r\n )\r\n end\r\n table.remove(args, 1)\r\n TriggerClientEvent(eventName, target, table.unpack(args))\r\n else\r\n TriggerServerEvent(eventName, ...)\r\n end\r\nend","stubs":[{"funcName":"EventEmitNet","metadata":{"export":"EmitNet"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Triggers network event with formatted name.\r\n--- \r\n--- `Client` -> `Server`\r\n--- \r\n--- `Server` -> `Client`\r\n--- \r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local emitNet = LT.Events.EmitNet\r\n--- \r\n--- -- Client example:\r\n--- emitNet('exampleEvent', 'arg1', 'arg2')\r\n--- \r\n--- -- Server example:\r\n--- emitNet('exampleEvent', source, 'arg1', 'arg2')\r\n--- ```\r\n--- @param name string Event name\r\n--- @param ...? any Event arguments (Optional)\nfunction LT.Events.EmitNet(name, ...) end"}]},"client":null,"server":null},"@Events/Register":{"ns":"Events","meta":{},"shared":{"code":"function EventRegister(name, cb)\r\n local event = GetEventName(name)\r\n if cb and type(cb) == 'function' then\r\n RegisterNetEvent(event, cb)\r\n else\r\n RegisterNetEvent(event)\r\n end\r\nend","stubs":[{"funcName":"EventRegister","metadata":{"export":"Register"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Register a event with formatted name.\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local register = LT.Events.Register\r\n--- \r\n--- -- Client example:\r\n--- register('event', function(arg1, arg2)\r\n--- print(arg1, arg2)\r\n--- end)\r\n--- \r\n--- -- Server example:\r\n--- register('event', function(arg1, arg2)\r\n--- local src = source\r\n--- print(source, arg1, arg2)\r\n--- end)\r\n--- ```\r\n--- @param name string Event name.\r\n--- @param cb? function Callback function.\nfunction LT.Events.Register(name, cb) end"}]},"client":null,"server":null},"@Events":{"ns":"Events","meta":{},"shared":{"code":"local isServer <const> = IsDuplicityVersion()\r\nlocal format = string.format\r\nfunction GetEventName(name, remote)\r\n local side\r\n if remote then\r\n side = isServer and 'client' or 'server'\r\n else\r\n side = isServer and 'server' or 'client'\r\n end\r\n return format('%s:%s:%s', LT_RESOURCE_NAME, side, name)\r\nend","stubs":[{"funcName":"GetEventName","metadata":{"internal":true},"stubCode":"--- **`EVENTS` `SHARED`**\n--- @param name string\r\n--- @param remote? boolean\r\n--- @return string\nfunction LT.Events.GetEventName(name, remote) end"}]},"client":null,"server":null},"@Framework/GetFrameworkJobs":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetFrameworkJobs()\r\n if ESX then\r\n return ESX.GetJobs()\r\n elseif QBCore then\r\n local jobs = {}\r\n for k, v in pairs(QBCore.Shared.Jobs) do\r\n jobs[#jobs+1] = {\r\n name = k,\r\n label = v.label,\r\n grade = v.grades\r\n }\r\n end\r\n return jobs\r\n elseif QBX then\r\n return QBX:GetJobs()\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"GetFrameworkJobs","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- This will return the jobs registered in the framework in a table.\r\n--- @return table\nfunction LT.Framework.GetFrameworkJobs() end"}]}},"@Framework/GetPlayerJobData":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerJobData()\r\n local jobData = GetPlayerData().job\r\n if ESX then\r\n local isBoss = (jobData.grade_name == \"boss\")\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade,\r\n gradeName = jobData.grade_name,\r\n gradeLabel = jobData.grade_label,\r\n isBoss = isBoss,\r\n onDuty = jobData.onduty,\r\n }\r\n elseif QBCore then\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade.level,\r\n gradeName = jobData.grade.name,\r\n gradeLabel = jobData.grade.name,\r\n isBoss = jobData.isboss,\r\n onDuty = jobData.onduty,\r\n }\r\n elseif QBX then\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade.level,\r\n gradeName = jobData.grade.name,\r\n gradeLabel = jobData.grade.name,\r\n isBoss = jobData.isboss,\r\n onDuty = jobData.onduty,\r\n }\r\n end\r\n return\r\nend","stubs":[{"funcName":"GetPlayerJobData","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player job data.\r\n--- @return table|nil {name,label,grade,gradeName,gradeLabel,isBoss,onDuty}\nfunction LT.Framework.GetPlayerJobData() end"}]},"server":{"code":"function GetPlayerJobData(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n if ESX then\n local job = Player.getJob()\n local isBoss = (job.grade_name == \"boss\")\n return {\n name = job.name,\n label = job.label,\n grade = job.grade,\n gradeName = job.grade_name,\n gradeLabel = job.grade_label,\n isBoss = isBoss,\n onDuty = job.onduty,\n }\n elseif QBCore or QBX then\n local jobData = Player.PlayerData.job\n return {\n name = jobData.name,\n label = jobData.label,\n grade = jobData.grade.level,\n gradeName = jobData.grade.name,\n gradeLabel = jobData.grade.name,\n isBoss = jobData.isboss,\n onDuty = jobData.onduty,\n }\n end\n\n return\nend","stubs":[{"funcName":"GetPlayerJobData","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player job data.\n--- @param source number Player source\n--- @return table|nil {name,label,grade,gradeName,gradeLabel,isBoss,onDuty}\nfunction LT.Framework.GetPlayerJobData(source) end"}]}},"@Framework/SetPlayerJob":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function SetPlayerJob(source, name, grade)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n if ESX then\r\n Player.setJob(name, grade, true)\r\n return true\r\n elseif QBX or QBCore then\r\n Player.Functions.SetJob(name, grade)\r\n return true\r\n end\r\n return false\r\nend","stubs":[{"funcName":"SetPlayerJob","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Set player job to given job and grade.\r\n--- @param source number Player source\r\n--- @param name string Job name\r\n--- @param grade number Job grade\r\n--- @return boolean\nfunction LT.Framework.SetPlayerJob(source, name, grade) end"}]}},"@Framework/AddMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddMoney(source, account, amount)\n if not source or not amount or amount <= 0 then return false end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return false end\n\n if ESX then\n if account == 'cash' then\n Player.addMoney(amount)\n elseif account == 'bank' then\n Player.addAccountMoney('bank', amount)\n elseif account == 'black' or account == 'black_money' then\n Player.addAccountMoney('black_money', amount)\n end\n return true\n elseif QBX or QBCore then\n return Player.Functions.AddMoney(account, amount)\n end\n\n return false\nend","stubs":[{"funcName":"AddMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add money to player account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @param amount number Amount to add\n--- @return boolean\nfunction LT.Framework.AddMoney(source, account, amount) end"}]}},"@Framework/GetMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetMoney(source, account)\n if not source then return 0 end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return 0 end\n\n if ESX then\n if account == 'cash' then\n return Player.getMoney()\n elseif account == 'bank' then\n return Player.getAccount('bank').money\n elseif account == 'black' or account == 'black_money' then\n return Player.getAccount('black_money').money\n end\n elseif QBX or QBCore then\n return Player.PlayerData.money[account] or 0\n end\n\n return 0\nend","stubs":[{"funcName":"GetMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players money on account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @return number amount\nfunction LT.Framework.GetMoney(source, account) end"}]}},"@Framework/RemoveMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function RemoveMoney(source, account, amount)\n if not source or not amount or amount <= 0 then return false end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return false end\n\n local money = GetMoney(source, account)\n if money < amount then return false end\n\n if ESX then\n if account == 'cash' then\n Player.removeMoney(amount)\n elseif account == 'bank' then\n Player.removeAccountMoney('bank', amount)\n elseif account == 'black' or account == 'black_money' then\n Player.removeAccountMoney('black_money', amount)\n end\n return true\n elseif QBX or QBCore then\n return Player.Functions.RemoveMoney(account, amount, 'LTBridge')\n end\n\n return false\nend","stubs":[{"funcName":"RemoveMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Removes money from player account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @param amount number Amount to add\n--- @return boolean `true` if success, `false` if anything goes wrong or player does not have that much money on account.\nfunction LT.Framework.RemoveMoney(source, account, amount) end"}]}},"@Framework/AddHunger":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddHunger(source, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n local clamped = math.clamp(value, 0, 200000)\r\n local val = clamped * 2000\r\n TriggerClientEvent('esx_status:add', source, 'hunger', val)\r\n return val\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n local newHunger = (playerData.metadata.hunger or 0) + value\r\n Player.Functions.SetMetaData('hunger', math.clamp(newHunger, 0, 100))\r\n return newHunger\r\n end\r\nend","stubs":[{"funcName":"AddHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add hunger to player.\r\n--- @param source number Player source\r\n--- @param value number Amount to add\r\n--- @return number? `new hunger` if success, `nil` if player not found\nfunction LT.Framework.AddHunger(source, value) end"}]}},"@Framework/AddThirst":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddThirst(source, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n local clamped = math.clamp(value, 0, 200000)\r\n local val = clamped * 2000\r\n TriggerClientEvent('esx_status:add', source, 'thirst', val)\r\n return val\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n local new = (playerData.metadata.thirst or 0) + value\r\n Player.Functions.SetMetaData('thirst', math.clamp(new, 0, 100))\r\n return new\r\n end\r\nend","stubs":[{"funcName":"AddThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add thirst to player.\r\n--- @param source number Player source\r\n--- @param value number Amount to add\r\n--- @return number? `new thirst` if success, `nil` if player not found\nfunction LT.Framework.AddThirst(source, value) end"}]}},"@Framework/GetHunger":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"local function getStatus(search)\r\n local playerData = GetPlayerData()\r\n if not playerData then return 0 end\r\n local status = playerData.variables.status\r\n for _, entry in ipairs(status) do\r\n if entry.name == search then\r\n return entry.percent or 0\r\n end\r\n end\r\n return 0\r\nend\r\nfunction GetHunger()\r\n if ESX then\r\n local status = getStatus(\"hunger\")\r\n return math.floor((status) + 0.5) or 0\r\n elseif QBX or QBCore then\r\n local hunger = GetPlayerMetadata(\"hunger\") or 0\r\n return math.floor((hunger) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player hunger\r\n--- @return number\nfunction LT.Framework.GetHunger() end"}]},"server":{"code":"local function getStatus(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n return Player.get(key) or nil\r\nend\r\nfunction GetHunger(source)\r\n if ESX then\r\n local status = getStatus(source, \"status\")\r\n if not status then return 0 end\r\n if type(status) ~= \"table\" then return 0 end\r\n for _, entry in ipairs(status) do\r\n if entry.name == \"hunger\" then\r\n return math.floor((entry.percent) + 0.5) or 0\r\n end\r\n end\r\n elseif QBX or QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local playerData = Player.PlayerData\r\n local newHunger = (playerData.metadata.hunger or 0)\r\n return math.floor((newHunger) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player hunger\r\n--- @param source number Player source\r\n--- @return number\nfunction LT.Framework.GetHunger(source) end"}]}},"@Framework/GetPlayerMetadata":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerMetadata(key)\r\n return GetPlayerData().metadata[key]\r\nend","stubs":[{"funcName":"GetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player metadata of the given key.\r\n--- @param key string Metadata key\r\n--- @return any\nfunction LT.Framework.GetPlayerMetadata(key) end"}]},"server":{"code":"function GetPlayerMetadata(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n return Player.getMeta(key) or false\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n return playerData.metadata[key] or false\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player metadata of the given key.\r\n--- @param source number Player source\r\n--- @param key string Metadata key\r\n--- @return any\nfunction LT.Framework.GetPlayerMetadata(source, key) end"}]}},"@Framework/GetThirst":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"local function getStatus(search)\r\n local playerData = GetPlayerData()\r\n if not playerData then return 0 end\r\n local status = playerData.variables.status\r\n for _, entry in ipairs(status) do\r\n if entry.name == search then\r\n return entry.percent or 0\r\n end\r\n end\r\n return 0\r\nend\r\nfunction GetThirst()\r\n if ESX then\r\n local status = getStatus(\"thirst\")\r\n return math.floor((status) + 0.5) or 0\r\n elseif QBX or QBCore then\r\n local val = GetPlayerMetadata(\"thirst\") or 0\r\n return math.floor((val) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player thirst\r\n--- @return number\nfunction LT.Framework.GetThirst() end"}]},"server":{"code":"local function getStatus(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n return Player.get(key) or nil\r\nend\r\nfunction GetThirst(source)\r\n if ESX then\r\n local status = getStatus(source, \"status\")\r\n if not status then return 0 end\r\n if type(status) ~= \"table\" then return 0 end\r\n for _, entry in ipairs(status) do\r\n if entry.name == \"thirst\" then\r\n return math.floor((entry.percent) + 0.5) or 0\r\n end\r\n end\r\n elseif QBX or QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local playerData = Player.PlayerData\r\n local newThirst = (playerData.metadata.thirst or 0)\r\n return math.floor((newThirst) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player thirst\r\n--- @param source number Player source\r\n--- @return number\nfunction LT.Framework.GetThirst(source) end"}]}},"@Framework/IsPlayerDead":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function IsPlayerDead()\r\n if ESX then\r\n return GetPlayerData().dead\r\n elseif QBX or QBCore then\r\n local playerData = GetPlayerData()\r\n if not playerData then return false end\r\n return playerData.metadata[\"isdead\"] or playerData.metadata[\"inlaststand\"]\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsPlayerDead","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns true if the player is dead, false otherwise.\r\n--- @return boolean\nfunction LT.Framework.IsPlayerDead() end"}]},"server":{"code":"function IsPlayerDead(source)\r\n if ESX then\r\n local xPlayer = GetPlayer(source)\r\n if not xPlayer then return false end\r\n return xPlayer.get(\"is_dead\") or false\r\n elseif QBX or QBCore then\r\n local player = GetPlayer(source)\r\n if not player then return false end\r\n local playerData = player.PlayerData\r\n return playerData.metadata.isdead or playerData.metadata.inlaststand or false\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsPlayerDead","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns true if the player is dead, false otherwise.\r\n--- @param source number Player source\r\n--- @return boolean\nfunction LT.Framework.IsPlayerDead(source) end"}]}},"@Framework/IsPlayerLoaded":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function IsPlayerLoaded()\r\n if ESX then\r\n return ESX.IsPlayerLoaded()\r\n else\r\n return LocalPlayer.state.isLoggedIn or false\r\n end\r\nend","stubs":[{"funcName":"IsPlayerLoaded","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns true if player loaded, false otherwise.\r\n--- @return boolean\nfunction LT.Framework.IsPlayerLoaded() end"}]},"server":null},"@Framework/SetPlayerMetadata":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function SetPlayerMetadata(source, key, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n Player.setMeta(key, value, nil)\r\n elseif QBCore then\r\n Player.Functions.SetMetaData(key, value)\r\n elseif QBX then\r\n Player.Functions.SetMetaData(key, value)\r\n end\r\n return true\r\nend","stubs":[{"funcName":"SetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Sets player metadata for the given key.\r\n--- @param source number Player source\r\n--- @param key string Metadata key\r\n--- @param value table | string | number | boolean Value to assign\nfunction LT.Framework.SetPlayerMetadata(source, key, value) end"}]}},"@Framework/GetOwnedVehicles":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"local GetResourceState = GetResourceState\r\nfunction GetOwnedVehicles(source)\r\n if GetResourceState('oxmysql') ~= 'missing' then\r\n local citizenId = GetPlayerCitizenId(source)\r\n if ESX then\r\n local result = exports.oxmysql:query_async(\"SELECT vehicle, plate FROM owned_vehicles WHERE owner = ?\", { citizenId })\r\n local vehicles = {}\r\n for i = 1, #result do\r\n local vehicle = result[i].vehicle\r\n local plate = result[i].plate\r\n local model = json.decode(vehicle).model\r\n table.insert(vehicles, { vehicle = model, plate = plate })\r\n end\r\n return vehicles\r\n elseif QBX or QBCore then\r\n local result = exports.oxmysql:query_async(\"SELECT vehicle, plate FROM player_vehicles WHERE citizenid = ?\", { citizenId })\r\n local vehicles = {}\r\n for i = 1, #result do\r\n local vehicle = result[i].vehicle\r\n local plate = result[i].plate\r\n table.insert(vehicles, { vehicle = vehicle, plate = plate })\r\n end\r\n return vehicles\r\n end\r\n return {}\r\n else\r\n printf('error', '^3GetOwnedVehicles ^7needs ^2oxmysql ^7to work.')\r\n return {}\r\n end\r\nend","stubs":[{"funcName":"GetOwnedVehicles","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players owned vehicles.\r\n--- @param source number Player source\r\n--- @return table { vehicle, plate }\nfunction LT.Framework.GetOwnedVehicles(source) end"}]}},"@Framework/IsVehicleOwnedByPlayer":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"local GetResourceState = GetResourceState\r\nfunction IsVehicleOwnedByPlayer(source, plate)\r\n if GetResourceState('oxmysql') ~= 'missing' then\r\n local citizenId = GetPlayerCitizenId(source)\r\n if ESX then\r\n local result = exports.oxmysql:query_async(\"SELECT id, vehicle, plate FROM owned_vehicles WHERE owner = ? AND plate = ?\", {\r\n citizenId, plate\r\n })\r\n if not result[1] then return false end\r\n local id = result[1].id\r\n local vehicle = result[1].vehicle\r\n local model = json.decode(vehicle).model\r\n return { id = id, vehicle = model, plate = plate }\r\n elseif QBX or QBCore then\r\n local result = exports.oxmysql:query_async(\"SELECT id, vehicle, plate FROM player_vehicles WHERE citizenid = ? AND plate = ?\", {\r\n citizenId, plate\r\n })\r\n if not result[1] then return false end\r\n local id = result[1].id\r\n local vehicle = result[1].vehicle\r\n return { id = id, vehicle = vehicle, plate = plate }\r\n end\r\n return false\r\n else\r\n printf('error', '^3IsVehicleOwnedByPlayer ^7needs ^2oxmysql ^7to work.')\r\n return false\r\n end\r\nend","stubs":[{"funcName":"IsVehicleOwnedByPlayer","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Check if a vehicle owned by player. Returns vehicle data if owned by player, false otherwise.\r\n--- @param source number Player source\r\n--- @param plate string Vehicle plate\r\n--- @return table|boolean {id = id, vehicle = model, plate = plate}\nfunction LT.Framework.IsVehicleOwnedByPlayer(source, plate) end"}]}},"@Framework/GetPlayer":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayer(source)\n if not source then return nil end\n\n if ESX then\n return ESX.GetPlayerFromId(source)\n elseif QBX then\n return QBX:GetPlayer(source)\n elseif QBCore then\n return QBCore.Functions.GetPlayer(source)\n end\n\n return nil\nend","stubs":[{"funcName":"GetPlayer","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player object of framework default.\n--- @param source number Player source\n--- @return table|nil\nfunction LT.Framework.GetPlayer(source) end"}]}},"@Framework/GetPlayerBirthdate":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerBirthdate()\r\n local data = GetPlayerData()\r\n if not data then return end\r\n if ESX then\r\n return data.dateofbirth\r\n elseif QBX or QBCore then\r\n return data.charinfo.birthdate\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerBirthdate","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player date of birth.\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerBirthdate() end"}]},"server":{"code":"function GetPlayerBirthdate(source)\r\n local player = GetPlayer(source)\r\n if not player then return nil end\r\n if ESX then\r\n return player.get(\"dateofbirth\")\r\n elseif QBX or QBCore then\r\n return player.PlayerData.charinfo.birthdate\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerBirthdate","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player date of birth.\r\n--- @param source number Player source\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerBirthdate(source) end"}]}},"@Framework/GetPlayerByCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerByCitizenId(citizenid)\n if not citizenid then return end\n\n if ESX then\n return ESX.GetPlayerFromIdentifier(citizenid)\n elseif QBCore then\n return QBCore.Functions.GetPlayerByCitizenId(citizenid)\n elseif QBX then\n return QBX:GetPlayerByCitizenId(citizenid)\n end\n\n return\nend","stubs":[{"funcName":"GetPlayerByCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- @param citizenid string Player identifier|citizenid\n--- @return table|nil Player or nil\nfunction LT.Framework.GetPlayerByCitizenId(citizenid) end"}]}},"@Framework/GetPlayerCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerCitizenId()\r\n local playerData = GetPlayerData()\r\n if not playerData then return end\r\n if ESX then\r\n return playerData.identifier\r\n elseif QBCore or QBX then\r\n return playerData.citizenid\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player citizenid | identifier.\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerCitizenId() end"}]},"server":{"code":"function GetPlayerCitizenId(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n if ESX then\n return Player and Player.identifier\n elseif QBCore or QBX then\n return Player and Player.PlayerData.citizenid\n end\n\n return nil\nend","stubs":[{"funcName":"GetPlayerCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player citizenid | identifier from source.\n--- @param source number Player source\n--- @return string|nil\nfunction LT.Framework.GetPlayerCitizenId(source) end"}]}},"@Framework/GetPlayerData":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerData()\r\n if ESX then\r\n return ESX.GetPlayerData()\r\n elseif QBX then\r\n return QBX:GetPlayerData()\r\n elseif QBCore then\r\n return QBCore.Functions.GetPlayerData()\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerData","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player data in the framework default format.\r\n--- @return table|nil PlayerData\nfunction LT.Framework.GetPlayerData() end"}]},"server":null},"@Framework/GetPlayerName":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerName()\r\n local playerData = GetPlayerData()\r\n if not playerData then return end\r\n local f\r\n local l\r\n if ESX then\r\n f = playerData.firstName\r\n l = playerData.lastName\r\n elseif QBX or QBCore then\r\n f = playerData.charinfo.firstname\r\n l = playerData.charinfo.lastname\r\n end\r\n if f and l then\r\n return f, l\r\n end\r\nend","stubs":[{"funcName":"GetPlayerName","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player character name.\r\n--- @return string? Firstname\r\n--- @return string? Lastname\nfunction LT.Framework.GetPlayerName() end"}]},"server":{"code":"function GetPlayerName(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n local f\n local l\n\n if ESX then\n f = Player.variables.firstName\n l = Player.variables.lastName\n elseif QBX or QBCore then\n local playerData = Player.PlayerData\n f = playerData.charinfo.firstname\n l = playerData.charinfo.lastname\n end\n\n if f and l then\n return f, l\n end\nend","stubs":[{"funcName":"GetPlayerName","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player character name from source.\n--- @param source number Player source\n--- @return string? Firstname\n--- @return string? Lastname\nfunction LT.Framework.GetPlayerName(source) end"}]}},"@Framework/GetPlayerPhoneNumber":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerPhoneNumber(source)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n return Player.get(\"phone_number\")\r\n elseif QBX or QBCore then\r\n return Player.PlayerData.charinfo.phone\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerPhoneNumber","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players phone number.\r\n---@param source number Player source\r\n---@return string|nil\nfunction LT.Framework.GetPlayerPhoneNumber(source) end"}]}},"@Framework/GetPlayers":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayers()\r\n if ESX then\r\n local players = ESX.GetExtendedPlayers()\r\n local playerList = {}\r\n for _, xPlayer in pairs(players) do\r\n table.insert(playerList, xPlayer.source)\r\n end\r\n return playerList\r\n elseif QBCore then\r\n local players = QBCore.Functions.GetPlayers()\r\n local playerList = {}\r\n for _, src in pairs(players) do\r\n table.insert(playerList, src)\r\n end\r\n return playerList\r\n elseif QBX then\r\n local players = QBX:GetQBPlayers()\r\n local playerList = {}\r\n for src, _ in pairs(players) do\r\n table.insert(playerList, src)\r\n end\r\n return playerList\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"GetPlayers","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns all connected players.\r\n--- @return table\nfunction LT.Framework.GetPlayers() end"}]}},"@Framework/GetPlayerSourceByCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerSourceByCitizenId(citizenid)\r\n local Player = GetPlayerByCitizenId(citizenid)\r\n if not Player then return end\r\n if ESX then\r\n return Player.source\r\n elseif QBX or QBCore then\r\n return Player.PlayerData.source\r\n end\r\nend","stubs":[{"funcName":"GetPlayerSourceByCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player source from citizen id | identifier.\r\n---@param citizenid string Player citizen id | identifier.\r\n---@return number|nil\nfunction LT.Framework.GetPlayerSourceByCitizenId(citizenid) end"}]}},"@Framework/IsFrameworkAdmin":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function IsFrameworkAdmin(source)\r\n if ESX then\r\n local xPlayer = GetPlayer(source)\r\n if not xPlayer then return false end\r\n local group = xPlayer.getGroup()\r\n if group == 'admin' or group == 'superadmin' then return true end\r\n return false\r\n elseif QBCore then\r\n local isAdmin = QBCore.Functions.HasPermission(source, 'admin')\r\n local isGod = QBCore.Functions.HasPermission(source, 'god')\r\n local isAceAllowed = IsPlayerAceAllowed(source, 'command')\r\n return isAdmin or isGod or isAceAllowed\r\n elseif QBX then\r\n return IsPlayerAceAllowed(source, 'admin')\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsFrameworkAdmin","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns true if player is admin, false otherwise.\r\n--- @param source number Player source\r\n--- @return boolean\nfunction LT.Framework.IsFrameworkAdmin(source) end"}]}},"@Framework/RegisterUsableItem":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function RegisterUsableItem(name, cb)\r\n if ESX then\r\n ESX.RegisterUsableItem(name,function(source)\r\n cb(source)\r\n end)\r\n elseif QBCore then\r\n local func = function(src, item, itemData)\r\n itemData = itemData or item\r\n itemData.metadata = itemData.metadata or itemData.info or {}\r\n itemData.slot = itemData.id or itemData.slot\r\n cb(src, itemData)\r\n end\r\n QBCore.Functions.CreateUseableItem(name, func)\r\n elseif QBX then\r\n local func = function(src, item, itemData)\r\n itemData = itemData or item\r\n itemData.metadata = itemData.metadata or itemData.info or {}\r\n itemData.slot = itemData.id or itemData.slot\r\n cb(src, itemData)\r\n end\r\n QBX:CreateUseableItem(name, func)\r\n end\r\nend","stubs":[{"funcName":"RegisterUsableItem","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Register usable item on framework default format.\r\n--- @param name string Item name\r\n--- @param cb fun(source: number, item?: table)\nfunction LT.Framework.RegisterUsableItem(name, cb) end"}]}},"@Framework":{"ns":"Framework","meta":{},"shared":{"code":"local GetResourceState = GetResourceState\r\nlocal resourceName = nil\r\nESX = nil\r\nQBCore = nil\r\nQBX = nil\r\nlocal function isStarted(res)\r\n return GetResourceState(res) ~= 'missing'\r\nend\r\nlocal function detectFramework()\r\n if isStarted('es_extended') then\r\n ESX = exports.es_extended:getSharedObject()\r\n resourceName = 'es_extended'\r\n elseif isStarted('qb-core') and not isStarted('qbx_core') then\r\n QBCore = exports['qb-core']:GetCoreObject()\r\n resourceName = 'qb-core'\r\n elseif isStarted('qbx_core') then\r\n QBX = exports.qbx_core\r\n resourceName = 'qbx_core'\r\n end\r\n if not resourceName then\r\n printf('error', 'No supported framework found.')\r\n end\r\nend\r\nfunction GetFramework()\r\n return resourceName\r\nend\r\ndetectFramework()","stubs":[{"funcName":"GetFramework","metadata":{"export":"GetResource"},"stubCode":"--- **`FRAMEWORK` `SHARED`**\n--- Returns framework name.\r\n--- @return 'es_extended'|'qb-core'|'qbx_core'|nil\nfunction LT.Framework.GetResource() end"}]},"client":null,"server":null},"@Fuel/GetFuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local DoesEntityExist = DoesEntityExist\r\nlocal adapters = {\r\n ['ox_fuel'] = function(vehicle)\r\n return Entity(vehicle).state.fuel\r\n end,\r\n ['x-fuel'] = function(vehicle)\r\n local level, _ = Fuel:getFuel(vehicle)\r\n return level\r\n end,\r\n default = function(vehicle)\r\n return Fuel:GetFuel(vehicle)\r\n end,\r\n fallback = function(vehicle)\r\n return GetVehicleFuelLevel(vehicle)\r\n end\r\n}\r\nfunction GetFuel(vehicle)\r\n if not DoesEntityExist(vehicle) then return 0.0 end\r\n local adapter = adapters.fallback\r\n local resource = GetFuelResource()\r\n if resource then\r\n if adapters[resource] then\r\n adapter = adapters[resource]\r\n else\r\n adapter = adapters.default\r\n end\r\n end\r\n return adapter(vehicle)\r\nend","stubs":[{"funcName":"GetFuel","metadata":{},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Get fuel percentage of vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @return number Fuel\nfunction LT.Fuel.GetFuel(vehicle) end"}]},"server":null},"@Fuel/SetFuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['ox_fuel'] = function(vehicle, fuel)\r\n local newFuel = (Entity(vehicle).state.fuel or 0) + fuel\r\n Entity(vehicle).state.fuel = newFuel\r\n end,\r\n ['x-fuel'] = function(vehicle, fuel)\r\n Fuel:SetFuel(vehicle, fuel)\r\n end,\r\n default = function(vehicle, fuel)\r\n Fuel:SetFuel(vehicle, fuel)\r\n end,\r\n fallback = function(vehicle, fuel)\r\n SetVehicleFuelLevel(vehicle, fuel)\r\n end\r\n}\r\nfunction SetFuel(vehicle, fuel)\r\n if not DoesEntityExist(vehicle) then return end\r\n local adapter = adapters.fallback\r\n local resource = GetFuelResource()\r\n if resource then\r\n if adapters[resource] then\r\n adapter = adapters[resource]\r\n else\r\n adapter = adapters.default\r\n end\r\n end\r\n adapter(vehicle, fuel)\r\nend","stubs":[{"funcName":"SetFuel","metadata":{},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Set fuel percentage of vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @param fuel number Fuel level to assign.\nfunction LT.Fuel.SetFuel(vehicle, fuel) end"}]},"server":null},"@Fuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_fuel'] = {},\r\n ['lt-fuel'] = {},\r\n ['LegacyFuel'] = { providers = { 'lt-fuel', 'qb-fuel' } },\r\n ['qb-fuel'] = {},\r\n ['qs-fuelstations'] = {},\r\n ['cdn-fuel'] = {},\r\n ['x-fuel'] = {},\r\n ['okokGasStation'] = {},\r\n ['esx-sna-fuel'] = {},\r\n ['ps-fuel'] = {},\r\n ['BigDaddy-Fuel'] = {},\r\n ['Renewed-Fuel'] = {},\r\n ['lc_fuel'] = {}\r\n}\r\nfunction GetFuelResource()\r\n return resourceName\r\nend\r\nfunction SetFuelResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Fuel resource ^3%s^7 not found.', name) end\r\n Fuel = exports[name]\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'fuel')\r\nif resource then\r\n SetFuelResource(resource)\r\nend","stubs":[{"funcName":"GetFuelResource","metadata":{"export":"GetResource"},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Returns fuel resource name.\r\n--- @return 'ox_fuel'|'lt-fuel'|'LegacyFuel'|'qb-fuel'|'qs-fuelstations'|'cdn-fuel'|'x-fuel'|'okokGasStation'|'esx-sna-fuel'|'ps-fuel'|'BigDaddy-Fuel'|'Renewed-Fuel'|'lc_fuel'|nil\nfunction LT.Fuel.GetResource() end"},{"funcName":"SetFuelResource","metadata":{"export":"SetResource"},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Force set fuel resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_fuel'|'lt-fuel'|'LegacyFuel'|'qb-fuel'|'qs-fuelstations'|'cdn-fuel'|'x-fuel'|'okokGasStation'|'esx-sna-fuel'|'ps-fuel'|'BigDaddy-Fuel'|'Renewed-Fuel'|'lc_fuel'\nfunction LT.Fuel.SetResource(name) end"}]},"server":null},"@Helpers/DetectResource":{"ns":"Helpers","meta":{"internal":true},"shared":{"code":"local GetResourceState = GetResourceState\r\nfunction DetectResource(list, name)\r\n local startedResources = {}\r\n for resourceName, data in pairs(list) do\r\n if GetResourceState(resourceName) ~= 'missing' then\r\n local canSelect = true\r\n if data.providers then\r\n for i = 1, #data.providers do\r\n if GetResourceState(data.providers[i]) ~= 'missing' then\r\n canSelect = false\r\n break\r\n end\r\n end\r\n end\r\n if canSelect then\r\n startedResources[#startedResources+1] = resourceName\r\n end\r\n end\r\n end\r\n if #startedResources == 1 then\r\n return startedResources[1]\r\n elseif #startedResources > 1 then\r\n printf('warning', 'Multiple %s script detected! First resource will be used. Running resources:', name)\r\n for i = 1, #startedResources do\r\n printf(nil, '%d. %s', i, startedResources[i])\r\n end\r\n return startedResources[1]\r\n else\r\n printf('error', 'No supported %s script found.', name)\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"DetectResource","metadata":{"internal":true,"global":true},"stubCode":"--- **`HELPERS` `SHARED`**\n--- Helper function to detect resources.\r\n--- @param list table { resourceName = { providers? = { 'resourceName' } } }\r\n--- @return string?\nfunction LT.DetectResource(list, name) end"}]},"client":null,"server":null},"@Hooks/Start":{"ns":"Hooks","meta":{},"shared":{"code":"function OnResourceStart(cb, resource)\r\n local checkResource = resource or LT_RESOURCE_NAME\r\n AddEventHandler('onResourceStart', function (res)\r\n if res ~= checkResource then return end\r\n cb()\r\n end)\r\nend","stubs":[{"funcName":"OnResourceStart","metadata":{"export":"Start"},"stubCode":"--- **`HOOKS` `SHARED`**\n--- Execute a callback when a resource starts.\r\n--- @param cb fun()\r\n--- @param resource? string Defaults to the current resource name.\r\n--- ```lua\r\n--- LT.Hooks.Start(function()\r\n--- print(\"Resource started.\")\r\n--- end)\r\n--- ```\nfunction LT.Hooks.Start(cb, resource) end"}]},"client":null,"server":null},"@Hooks/Stop":{"ns":"Hooks","meta":{},"shared":{"code":"function OnResourceStop(cb, resource)\r\n local checkResource = resource or LT_RESOURCE_NAME\r\n AddEventHandler('onResourceStop', function (res)\r\n if res ~= checkResource then return end\r\n cb()\r\n end)\r\nend","stubs":[{"funcName":"OnResourceStop","metadata":{"export":"Stop"},"stubCode":"--- **`HOOKS` `SHARED`**\n--- Execute a callback when a resource stops.\r\n--- @param cb fun()\r\n--- @param resource? string Defaults to the current resource name.\r\n--- ```lua\r\n--- LT.Hooks.Stop(function()\r\n--- print(\"Resource stopped.\")\r\n--- end)\r\n--- ```\nfunction LT.Hooks.Stop(cb, resource) end"}]},"client":null,"server":null},"@Input":{"ns":"Input","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['qb-input'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetInputResource()\r\n return resourceName\r\nend\r\nfunction SetInputResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Input resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'input')\r\nif resource then\r\n SetInputResource(resource)\r\nend\r\nlocal function convertTypesQBtoOX(_type)\r\n if _type == \"text\" then\r\n return \"input\"\r\n elseif _type == \"password\" then\r\n return \"input\"\r\n elseif _type == \"number\" then\r\n return \"number\"\r\n elseif _type == \"radio\" then\r\n return \"checkbox\"\r\n elseif _type == \"checkbox\" then\r\n return \"checkbox\"\r\n elseif _type == \"select\" then\r\n return \"select\"\r\n end\r\nend\r\nlocal function convertInputQBtoOX(inputs)\r\n local returnData = {}\r\n for i, v in pairs(inputs) do\r\n local input = {\r\n label = v.text,\r\n name = i,\r\n type = convertTypesQBtoOX(v.type),\r\n required = v.isRequired,\r\n default = v.placeholder,\r\n }\r\n if v.type == \"select\" then\r\n input.options = {}\r\n for i, v in pairs(v.options) do\r\n table.insert(input.options, {value = v.value, label = v.text})\r\n end\r\n elseif v.type == \"checkbox\" then\r\n for i, v in pairs(v.options) do\r\n table.insert(returnData, {value = v.value, label = v.text})\r\n end\r\n end\r\n table.insert(returnData, input)\r\n end\r\n return returnData\r\nend\r\nlocal function convertTypesOXtoQB(_type)\r\n if _type == \"input\" then\r\n return \"text\"\r\n elseif _type == \"number\" then\r\n return \"number\"\r\n elseif _type == \"checkbox\" then\r\n return \"checkbox\"\r\n elseif _type == \"select\" then\r\n return \"select\"\r\n elseif _type == \"multi-select\" then\r\n return \"select\"\r\n elseif _type == \"slider\" then\r\n return \"number\"\r\n elseif _type == \"color\" then\r\n return \"text\"\r\n elseif _type == \"date\" then\r\n return \"date\"\r\n elseif _type == \"date-range\" then\r\n return \"date\"\r\n elseif _type == \"time\" then\r\n return \"time\"\r\n elseif _type == \"textarea\" then\r\n return \"text\"\r\n end\r\nend\r\nlocal function convertInputOXtoQB(inputs)\r\n local returnData = {}\r\n for i, v in pairs(inputs) do\r\n local input = {\r\n text = v.label,\r\n name = i,\r\n type = convertTypesOXtoQB(v.type),\r\n isRequired = v.required,\r\n default = v.default or \"\",\r\n }\r\n if v.type == \"select\" then\r\n input.text = \"\"\r\n input.options = {}\r\n for k, j in pairs(v.options) do\r\n table.insert(input.options, {value = j.value, text = j.label})\r\n end\r\n elseif v.type == \"checkbox\" then\r\n input.text = \"\"\r\n input.options = {}\r\n if v.options then \n for k, j in pairs(v.options) do\r\n table.insert(input.options, {value = #returnData + #input.options + 1, text = j.label, checked = j.checked}) \n end\r\n else \n table.insert(input.options, {value = #returnData + 1, text = v.label, checked = v.checked}) \n end\r\n end\r\n table.insert(returnData, input)\r\n end\r\n return returnData\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n local convertedData = {}\r\n local returnData = lib.inputDialog(title, convertInputQBtoOX(inputs))\r\n for i, v in pairs(inputs) do\r\n for k, j in pairs(returnData or {}) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n else\r\n return lib.inputDialog(title, data)\r\n end\r\n end,\r\n ['lt-ui'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n local convertedData = {}\r\n local returnData = exports['lt-ui']:inputDialog(title, convertInputQBtoOX(inputs))\r\n for i, v in pairs(inputs) do\r\n for k, j in pairs(returnData or {}) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n else\r\n return exports['lt-ui']:inputDialog(title, data)\r\n end\r\n end,\r\n ['qb-input'] = function(title, data, isQB, submitText)\r\n local input = data.inputs\r\n if not isQB then\r\n input = convertInputOXtoQB(data)\r\n end\r\n local returnData = exports['qb-input']:ShowInput({\r\n header = title,\r\n submitText = submitText or \"Submit\",\r\n inputs = input\r\n })\r\n if not returnData then return end\r\n if returnData[1] then return returnData end\r\n local convertedData = {}\r\n if isQB then\r\n for i, v in pairs(input) do\r\n for k, j in pairs(returnData) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n end\r\n for i, v in pairs(returnData) do\r\n local index = i and tonumber(i)\r\n v = tostring(v) == \"true\" and true or (tostring(v) == \"false\" and false or v)\r\n if not index then\r\n table.insert(convertedData, v)\r\n else\r\n convertedData[index] = v\r\n end\r\n end\r\n return convertedData\r\n end,\r\n ['lation_ui'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n return exports.lation_ui:input({title = title, inputs = convertInputQBtoOX(inputs)})\r\n else\r\n return exports.lation_ui:input({title = title, options = data})\r\n end\r\n end,\r\n}\r\nfunction OpenInput(header, data, isQB, submitText)\r\n local resource = GetInputResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n return adapter(header, data, isQB, submitText)\r\nend","stubs":[{"funcName":"GetInputResource","metadata":{"export":"GetResource"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Returns input resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'qb-input'|'lation_ui'|nil\nfunction LT.Input.GetResource() end"},{"funcName":"SetInputResource","metadata":{"export":"SetResource"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Force set input resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'qb-input'|'lation_ui'\nfunction LT.Input.SetResource(name) end"},{"funcName":"OpenInput","metadata":{"export":"Open"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Opens a input dialog.\r\n--- @param header string Title of input dialog\r\n--- @param data table Data table\r\n--- @param isQB? boolean If data table is sent with QB format set to true, default: false\r\n--- @param submitText? string Submit button text, only for `qb-input`\r\n--- @return table|nil\nfunction LT.Input.Open(header, data, isQB, submitText) end"}]},"server":null},"@Inventory/AddItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local function addESXItem(source, item, count, slot, metadata)\r\n local msg = \"This framework ^1ESX^7 does not support ^3%s^7, please ensure you are using a supported inventory system or that you have the correct start order.\"\r\n if slot then\r\n printf('warning', msg, 'item slots')\r\n end\r\n if metadata then\r\n printf('warning', msg, 'item metadata')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n Player.addInventoryItem(item, count)\r\n return true\r\nend\r\nlocal function addQBItem(source, item, count, slot, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n local success = Player.Functions.AddItem(item, count, slot, metadata)\r\n if not success then return false end\r\n return success\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count, metadata) then return false end\r\n local success = Inventory:AddItem(source, item, count, metadata)\r\n return success or false\r\n end,\r\n ['qs-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['qb-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanAddItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata, 'lt_bridge')\r\n if QBCore then\r\n TriggerClientEvent('qb-inventory:client:ItemBox', source, QBCore.Shared.Items[item], 'add', count)\r\n end\r\n return success or false\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata, false)\r\n return success or false\r\n end,\r\n ['origen_inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:canCarryItem(source, item, count) then return false end\r\n local success = Inventory:addItem(source, item, count, metadata, slot, false)\r\n return success or false\r\n end,\r\n fallback = function(source, item, count, slot, metadata)\r\n if ESX then\r\n return addESXItem(source, item, count, slot, metadata)\r\n elseif QBX or QBCore then\r\n return addQBItem(source, item, count, slot, metadata)\r\n end\r\n end\r\n}\r\nfunction AddItem(source, item, count, slot, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, count, slot, metadata)\r\nend","stubs":[{"funcName":"AddItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Add item to player.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @param slot? number Item slot (optional)\r\n--- @param metadata? table Item metadata (optional)\r\n--- @return boolean\nfunction LT.Inventory.AddItem(source, item, count, slot, metadata) end"}]}},"@Inventory/CanCarryItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['qs-inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['qb-inventory'] = function(source, item, count)\r\n return Inventory:CanAddItem(source, item, count)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['origen_inventory'] = function(source, item, count)\r\n return Inventory:canCarryItem(source, item, count)\r\n end\r\n}\r\nfunction CanCarryItem(source, item, count)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return false end\r\n return adapters[name](source, item, count)\r\nend","stubs":[{"funcName":"CanCarryItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Check if player can carry item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @return boolean\nfunction LT.Inventory.CanCarryItem(source, item, count) end"}]}},"@Inventory/GetItemBySlot":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, slot)\r\n return Inventory:GetSlot(source, slot)\r\n end,\r\n ['qs-inventory'] = function(source, slot)\r\n local playerItems = Inventory:GetInventory(source)\r\n for _, item in pairs(playerItems) do\r\n if item.slot == slot then\r\n return {\r\n name = item.name,\r\n label = item.label,\r\n weight = item.weight,\r\n slot = slot,\r\n count = item.amount or item.count,\r\n metadata = item.info or item.metadata or {},\r\n stack = item.unique or item.stack or false,\r\n description = item.description\r\n }\r\n end\r\n end\r\n return {}\r\n end,\r\n ['qb-inventory'] = function(source, slot)\r\n local slotData = Inventory:GetItemBySlot(source, slot)\r\n if not slotData then return {} end\r\n return {\r\n name = slotData.name,\r\n label = slotData.name,\r\n weight = slotData.weight,\r\n slot = slotData.slot,\r\n count = slotData.amount,\r\n metadata = slotData.info,\r\n stack = slotData.unique,\r\n description = slotData.description\r\n }\r\n end,\r\n ['tgiann-inventory'] = function(source, slot)\r\n local item = Inventory:GetItemBySlot(source, slot)\r\n if not item then return {} end\r\n return {\r\n name = item.name,\r\n label = item.label,\r\n weight = item.weight,\r\n slot = slot,\r\n count = item.amount or item.count,\r\n metadata = item.info or item.metadata or {},\r\n stack = item.unique or item.stack or false,\r\n description = item.description\r\n }\r\n end,\r\n ['origen_inventory'] = function(source, slot)\r\n local playerInv = GetPlayerInventory(source)\r\n for _, v in pairs(playerInv) do\r\n if v.slot == slot then\r\n return {\r\n name = v.name,\r\n count = v.count or v.amount,\r\n weight = v.weight or 0,\r\n metadata = v.metadata or v.info or {},\r\n slot = v.slot,\r\n label = v.label\r\n }\r\n end\r\n end\r\n return {}\r\n end\r\n}\r\nfunction GetItemBySlot(source, slot)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return nil end\r\n return adapters[name](source, slot)\r\nend","stubs":[{"funcName":"GetItemBySlot","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns the specified slot item data as a table.\r\n--- @param source number Player source\r\n--- @param slot number Slot to search\r\n--- @return table|nil {name, label, count, slot, weight, metadata, stack, description}\nfunction LT.Inventory.GetItemBySlot(source, slot) end"}]}},"@Inventory/GetItemCount":{"ns":"Inventory","meta":{},"shared":null,"client":{"code":"local function frameworkSearch(item, metadata)\r\n if ESX then\r\n if metadata then\r\n printf('warning', 'This framework ^1(ESX)^7 does not support item metadata, please ensure you are using a supported inventory system or that you have the correct start order.')\r\n end\r\n local item = ESX.SearchInventory(item)\r\n return item.count\r\n elseif QBX or QBCore then\r\n local inv = GetPlayerData().items\r\n local count = 0\r\n for _, v in pairs(inv) do\r\n if v.name == item and (not metadata or (v.info == metadata or v.metadata == metadata)) then\r\n count = count + (v.amount or v.count)\r\n end\r\n end\r\n return count\r\n end\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(item, metadata)\r\n return Inventory:GetItemCount(item, metadata, false)\r\n end,\r\n ['qs-inventory'] = function(item, metadata)\r\n if metadata then\r\n printf('warning', '^1qs-inventory^7 does not support metadata searching for item counts, you will need to get the inventory and parse it manually.')\r\n end\r\n return Inventory:Search(item)\r\n end,\r\n ['qb-inventory'] = function(item, metadata)\r\n return frameworkSearch(item, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(item, metadata)\r\n return Inventory:GetItemCount(item, metadata, false)\r\n end,\r\n ['origen_inventory'] = function(item, metadata)\r\n return Inventory:Search('count', item, metadata).count\r\n end,\r\n fallback = function(item, metadata)\r\n return frameworkSearch(item, metadata)\r\n end\r\n}\r\nfunction GetItemCountClient(item, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(item, metadata) or 0\r\nend","stubs":[{"funcName":"GetItemCountClient","metadata":{"export":"GetItemCount"},"stubCode":"--- **`INVENTORY` `CLIENT`**\n--- Returns count of items on players inventory. If there is none returns 0.\r\n--- @param item string Item name\r\n--- @param metadata? any Metadata (optional)\r\n--- @return number\nfunction LT.Inventory.GetItemCount(item, metadata) end"}]},"server":{"code":"local function getESXItemCount(source, item, metadata)\r\n if metadata then\r\n printf('warning', 'This framework ^1(ESX)^7 does not support item metadata, please ensure you are using a supported inventory system or that you have the correct start order.')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n return Player.getInventoryItem(item).count or 0\r\nend\r\nlocal function getQBItemCount(source, item, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local inv = Player.PlayerData.items\r\n local count = 0\r\n for _, v in pairs(inv) do\r\n if v.name == item and (not metadata or (v.info == metadata or v.metadata == metadata)) then\r\n count = count + (v.amount or v.count)\r\n end\r\n end\r\n return count\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, metadata)\r\n return Inventory:GetItemCount(source, item, metadata, false)\r\n end,\r\n ['qs-inventory'] = function(source, item, metadata)\r\n if metadata then\r\n printf('warning', '^1qs-inventory^7 does not support metadata searching for item counts, you will need to get the inventory and parse it manually.')\r\n end\r\n return Inventory:GetItemTotalAmount(source, item)\r\n end,\r\n ['qb-inventory'] = function(source, item, metadata)\r\n return getQBItemCount(source, item, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, metadata)\r\n return Inventory:GetItemByName(source, item, metadata).amount\r\n end,\r\n ['origen_inventory'] = function(source, item, metadata)\r\n return Inventory:getItemCount(source, item, metadata, false)\r\n end,\r\n fallback = function(source, item, metadata)\r\n if ESX then\r\n return getESXItemCount(source, item, metadata)\r\n elseif QBX or QBCore then\r\n return getQBItemCount(source, item, metadata)\r\n end\r\n end\r\n}\r\nfunction GetItemCountServer(source, item, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, metadata) or 0\r\nend","stubs":[{"funcName":"GetItemCountServer","metadata":{"export":"GetItemCount"},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns count of items on players inventory. If there is none returns 0.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param metadata? any Metadata (optional)\r\n--- @return number\nfunction LT.Inventory.GetItemCount(source, item, metadata) end"}]}},"@Inventory/GetItemImage":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local laot = 'https://avatars.githubusercontent.com/u/70145288'\r\nlocal string_format = string.format\r\nlocal function stripPng(item)\r\n if string.find(item, \".png\") then\r\n item = string.gsub(item, \".png\", \"\")\r\n end\r\n return item\r\nend\r\nlocal function stripWebp(item)\r\n if string.find(item, \".webp\") then\r\n item = string.gsub(item, \".webp\", \"\")\r\n end\r\n return item\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(item)\r\n local file = LoadResourceFile(\"ox_inventory\", string_format(\"web/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://ox_inventory/web/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['qs-inventory'] = function(item)\r\n local file = LoadResourceFile(\"qs-inventory\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://qs-inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['qb-inventory'] = function(item)\r\n local file = LoadResourceFile(\"qb-inventory\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://qb-inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['tgiann-inventory'] = function(item)\r\n local webpItem = stripWebp(item)\r\n local pngPath = LoadResourceFile(\"inventory_images\", string_format(\"/images/%s.png\", item))\r\n local webpPath = LoadResourceFile(\"inventory_images\", string_format(\"/images/%s.webp\", webpItem))\r\n local imagePath = pngPath and string_format(\"nui://inventory_images/images/%s.png\", item) or webpPath and string_format(\"nui://inventory_images/images/%s.webp\", webpItem)\r\n return imagePath or laot\r\n end,\r\n ['origen_inventory'] = function(item)\r\n local file = LoadResourceFile(\"origin\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://origen_inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end\r\n}\r\nfunction GetItemImage(item)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return end\r\n item = stripPng(item)\r\n return adapters[name](item)\r\nend","stubs":[{"funcName":"GetItemImage","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns item image path.\r\n--- @param item string Item name\r\n--- @return string|nil\nfunction LT.Inventory.GetItemImage(item) end"}]}},"@Inventory/GetItemInfo":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(item)\r\n local itemData = Inventory:Items(item)\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.stack or \"true\",\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['qs-inventory'] = function(item)\r\n local itemsData = Inventory:GetItemList()\r\n if not itemsData then return {} end\r\n local itemData = itemsData[item]\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['qb-inventory'] = function(item)\r\n if not QBCore then return {} end\r\n local itemData = QBCore.Shared.Items[item]\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name,\r\n label = itemData.label,\r\n stack = itemData.unique,\r\n weight = itemData.weight,\r\n description = itemData.description,\r\n image = GetItemImage(item)\r\n }\r\n end,\r\n ['tgiann-inventory'] = function(item)\r\n local itemData = Inventory:GetItemList()\r\n if not itemData[item] then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['origen_inventory'] = function(item)\r\n local itemData = Inventory:Items(item)\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end\r\n}\r\nfunction GetItemInfo(item)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return end\r\n return adapters[name](item)\r\nend","stubs":[{"funcName":"GetItemInfo","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns item info as a table.\r\n--- @param item string Item name\r\n--- @return table|nil {name, label, stack, weight, description, image}\nfunction LT.Inventory.GetItemInfo(item) end"}]}},"@Inventory/GetPlayerInventory":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source)\r\n return Inventory:GetInventoryItems(source, false)\r\n end,\r\n ['qs-inventory'] = function(source)\r\n local playerItems = Inventory:GetInventory(source)\r\n local repackedTable = {}\r\n for _, v in pairs(playerItems) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info or v.metadata or {},\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end,\r\n ['qb-inventory'] = function(source)\r\n local player = GetPlayer(source)\r\n if not player then return {} end\r\n local inventory = player.PlayerData.item\r\n local repackedTable = {}\r\n for _, v in pairs(inventory) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end,\r\n ['tgiann-inventory'] = function(source)\r\n local inventory = Inventory:GetPlayerItems(source)\r\n local items = {}\r\n for _, v in pairs(inventory) do\r\n if tonumber(_) then\r\n table.insert(items, {name = v.name, label = v.name, weight = 0, description = v.description, slot = v.slot, count = v.amount, metadata = v.info})\r\n end\r\n end\r\n return items\r\n end,\r\n ['origen_inventory'] = function(source)\r\n local playerInv = Inventory:GetInventory(source)\r\n local inv = playerInv.inventory or {}\r\n local repack = {}\r\n for _, v in pairs(inv) do\r\n if v.slot then\r\n table.insert(repack, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.metadata or v.info or {},\r\n slot = v.slot,\r\n label = v.label or \"Unknown\"\r\n })\r\n end\r\n end\r\n return repack\r\n end,\r\n fallback = function(source)\r\n if ESX then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inv = Player.getInventory()\r\n local repackedTable = {}\r\n for _, v in pairs(inv) do\r\n if v.count > 0 then\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.count,\r\n metadata = {}, \n slot = 0, \n })\r\n end\r\n end\r\n return repackedTable\r\n elseif QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inv = Player.PlayerData.items\r\n local repackedTable = {}\r\n for _, v in pairs(inv) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n elseif QBX then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inventory = Player.PlayerData.items\r\n local repackedTable = {}\r\n for _, v in pairs(inventory) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount,\r\n metadata = v.metadata,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end\r\n end\r\n}\r\nfunction GetPlayerInventory(source)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source)\r\nend","stubs":[{"funcName":"GetPlayerInventory","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns player inventory as table.\r\n--- @param source number Player source\r\n--- @return table {name,label?,weight?,description?,count,slot,metadata}\nfunction LT.Inventory.GetPlayerInventory(source) end"}]}},"@Inventory/HasItem":{"ns":"Inventory","meta":{},"shared":null,"client":{"code":"function HasItem(item, count)\r\n return GetItemCountClient(item) >= (count or 1) or false\r\nend","stubs":[{"funcName":"HasItem","metadata":{},"stubCode":"--- **`INVENTORY` `CLIENT`**\n--- Check if player has item.\r\n--- @param item string Item name\r\n--- @param count? number Required count (optional)\r\n--- @return boolean\nfunction LT.Inventory.HasItem(item, count) end"}]},"server":{"code":"function HasItem(source, item, count)\r\n return GetItemCountServer(source, item) >= (count or 1) or false\r\nend","stubs":[{"funcName":"HasItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Check if player has item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count? number Required count (optional)\r\n--- @return boolean\nfunction LT.Inventory.HasItem(source, item, count) end"}]}},"@Inventory/RemoveItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local function removeESXItem(source, item, count, slot, metadata)\r\n local msg = \"This framework (esx) does not support %s, please ensure you are using a supported inventory system or that you have the correct start order.\"\r\n if slot then\r\n printf('error', msg, 'item slots')\r\n end\r\n if metadata then\r\n printf('error', msg, 'item metadata')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n Player.removeInventoryItem(item, count)\r\n return true\r\nend\r\nlocal function removeQBItem(source, item, count, slot, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n local success = Player.Functions.RemoveItem(item, count, slot)\r\n if not success then return false end\r\n return success\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, metadata, slot)\r\n return success or false\r\n end,\r\n ['qs-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['qb-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, 'lt-bridge')\r\n if QBCore then\r\n TriggerClientEvent('qb-inventory:client:ItemBox', source, QBCore.Shared.Items[item], 'remove', count)\r\n end\r\n return success or false\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['origen_inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:removeItem(source, item, count, metadata, slot, false)\r\n return success or false\r\n end,\r\n fallback = function(source, item, count, slot, metadata)\r\n if ESX then\r\n return removeESXItem(source, item, count, slot, metadata)\r\n elseif QBX or QBCore then\r\n return removeQBItem(source, item, count, slot, metadata)\r\n end\r\n end\r\n}\r\nfunction RemoveItem(source, item, count, slot, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, count, slot, metadata)\r\nend","stubs":[{"funcName":"RemoveItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Remove item from player.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @param slot? number Item slot (optional)\r\n--- @param metadata? table Item metadata (optional)\r\n--- @return boolean\nfunction LT.Inventory.RemoveItem(source, item, count, slot, metadata) end"}]}},"@Inventory/SetItemMetadata":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, item, slot, metadata)\r\n return Inventory:SetMetadata(source, slot, metadata)\r\n end,\r\n ['qs-inventory'] = function(source, item, slot, metadata)\r\n return Inventory:SetItemMetadata(source, slot, metadata)\r\n end,\r\n ['qb-inventory'] = function(source, item, slot, metadata)\r\n local player = GetPlayer(source)\r\n if not player then return false end\r\n player.Functions.RemoveItem(item, 1, slot)\r\n return player.Functions.AddItem(item, 1, slot, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, slot, metadata)\r\n return Inventory:UpdateItemMetadata(source, item, slot, metadata)\r\n end,\r\n ['origen_inventory'] = function(source, item, slot, metadata)\r\n return Inventory:setMetadata(source, slot, metadata)\r\n end\r\n}\r\nfunction SetItemMetadata(source, item, slot, metadata)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return 0 end\r\n return adapters[name](source, item, slot, metadata)\r\nend","stubs":[{"funcName":"SetItemMetadata","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Set/change metadata of item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param slot number Item slot\r\n--- @param metadata any New metadata\nfunction LT.Inventory.SetItemMetadata(source, item, slot, metadata) end"}]}},"@Inventory":{"ns":"Inventory","meta":{"dependencies":["@Framework","@Helpers/DetectResource"]},"shared":{"code":"local resourceName = nil\n\nInventory = {}\n\nlocal list = {\n ['ox_inventory'] = { providers = {'tgiann-inventory', 'qs-inventory', 'origen_inventory'} },\n ['qs-inventory'] = {},\n ['qb-inventory'] = { providers = {'ox_inventory','origen_inventory'} },\n ['tgiann-inventory'] = {},\n ['origen_inventory'] = { providers = {'ox_inventory'} },\n}\n\nfunction GetInventoryResource()\n return resourceName\nend\n\nfunction SetInventoryResource(name)\n if not name then return end\n if not list[name] then return printf('error', 'Inventory resource ^3%s^7 not found.', name) end\n Inventory = exports[name]\n resourceName = name\nend\n\nlocal resource = DetectResource(list, 'inventory')\nif resource then\n SetInventoryResource(resource)\nend","stubs":[{"funcName":"GetInventoryResource","metadata":{"export":"GetResource"},"stubCode":"--- **`INVENTORY` `SHARED`**\n--- Returns inventory resource name.\n--- @return 'ox_inventory'|'qs-inventory'|'qb-inventory'|'tgiann-inventory'|'origen_inventory'|nil\nfunction LT.Inventory.GetResource() end"},{"funcName":"SetInventoryResource","metadata":{"export":"SetResource"},"stubCode":"--- **`INVENTORY` `SHARED`**\n--- Force set inventory resource.\n--- @param name 'ox_inventory'|'qs-inventory'|'qb-inventory'|'tgiann-inventory'|'origen_inventory'\nfunction LT.Inventory.SetResource(name) end"}]},"client":null,"server":null},"@LoadUnload":{"ns":"LoadUnload","meta":{},"shared":null,"client":{"code":"function OnPlayerLoad(cb)\r\n CreateThread(function()\r\n while not IsPlayerLoaded() do\r\n Wait(100)\r\n end\r\n cb()\r\n end)\r\nend\r\nCreateThread(function()\r\n while not IsPlayerLoaded() do\r\n Wait(100)\r\n end\r\n TriggerServerEvent(LT_RESOURCE_NAME..':server:@LoadUnload:Loaded')\r\nend)","stubs":[{"funcName":"OnPlayerLoad","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `CLIENT`**\n--- Execute a callback when a player loads.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerLoad(function()\r\n--- print(\"Player loaded.\")\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerLoad(cb) end"}]},"server":{"code":"function OnPlayerLoad(cb)\r\n local eventName = LT_RESOURCE_NAME..':server:@LoadUnload:Loaded'\r\n RegisterNetEvent(eventName)\r\n AddEventHandler(eventName, cb)\r\nend\r\nfunction OnPlayerUnload(cb)\r\n AddEventHandler('playerDropped', cb)\r\nend","stubs":[{"funcName":"OnPlayerLoad","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `SERVER`**\n--- Execute a callback when a player loads.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerLoad(function()\r\n--- local src = source\r\n--- print(\"Player loaded: \".. src)\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerLoad(cb) end"},{"funcName":"OnPlayerUnload","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `SERVER`**\n--- Execute a callback when a player unloads/drops.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerUnload(function()\r\n--- local src = source\r\n--- print(\"Player disconnected: \".. src)\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerUnload(cb) end"}]}},"@Locale":{"ns":"Locale","meta":{},"shared":{"code":"local currentLocale = nil\r\nlocal dict = {}\r\nlocal corruptedMsg <const> = 'Locale file ^3%s^7 is corrupted.'\r\nlocal function unflattenDict(flat)\r\n local result = {}\r\n for key, value in pairs(flat) do\r\n local current = result\r\n local parts = {}\r\n for part in key:gmatch(\"[^%.]+\") do\r\n table.insert(parts, part)\r\n end\r\n for i = 1, #parts do\r\n local part = parts[i]\r\n if i == #parts then\r\n current[part] = value\r\n else\r\n current[part] = current[part] or {}\r\n current = current[part]\r\n end\r\n end\r\n end\r\n return result\r\nend\r\nlocal function flattenDict(source, target, prefix)\r\n for key, value in pairs(source) do\r\n local fullKey = prefix and (prefix .. '.' .. key) or key\r\n if type(value) == 'table' then\r\n flattenDict(value, target, fullKey)\r\n else\r\n target[fullKey] = value\r\n end\r\n end\r\n return target\r\nend\r\nfunction InitLocale(key, fileType)\r\n local extension = fileType == 'lua' and 'lua' or 'json'\r\n local locales = nil\r\n local file = LoadResourceFile(LT_RESOURCE_NAME, ('locales/%s.%s'):format(key, extension))\r\n if not file then\r\n file = LoadResourceFile(LT_RESOURCE_NAME, ('locales/en.%s'):format(extension))\r\n if not file then\r\n printf('error', 'Locale file ^3%s^7 and fallback ^3en^7 not found or cannot be loaded. Stopping initialization.', key)\r\n return\r\n end\r\n printf('error', 'Locale file ^3%s^7 not found or cannot be loaded. Using ^3en^7 fallback.', key)\r\n key = 'en'\r\n end\r\n if extension == 'json' then\r\n locales = json.decode(file)\r\n else\r\n local fn, err = load(file, ('@@%s/locales/%s.lua'):format(LT_RESOURCE_NAME, key))\r\n if not fn then\r\n printf('error', '%s\\n^1%s^7\\n', corruptedMsg, key, err)\r\n return\r\n end\r\n locales = fn()\r\n end\r\n if not locales or type(locales) ~= 'table' then\r\n printf('error', corruptedMsg, key)\r\n return\r\n end\r\n local flat = flattenDict(locales, {})\r\n for k, v in pairs(flat) do\r\n if type(v) == 'string' then\r\n for var in v:gmatch('${[%w%s%p]-}') do\r\n local locale = flat[var:sub(3, -2)]\r\n if locale then\r\n locale = locale:gsub('%%', '%%%%')\r\n v = v:gsub(var, locale)\r\n end\r\n end\r\n end\r\n dict[k] = v\r\n end\r\n currentLocale = key\r\nend\r\nfunction GetString(str, ...)\r\n local txt = dict[str]\r\n if txt then\r\n if ... then\r\n return txt and txt:format(...)\r\n end\r\n return txt\r\n end\r\n return str\r\nend\r\nfunction GetLocaleStrings(keepNesting)\r\n local returnDict = dict or {}\r\n return keepNesting and unflattenDict(returnDict) or returnDict\r\nend\r\nfunction GetCurrentLocaleKey()\r\n if not currentLocale then\r\n printf('error', 'No locale has been initialized. Please call `LT.Locale.Init` first.')\r\n return\r\n end\r\n return currentLocale\r\nend","stubs":[{"funcName":"InitLocale","metadata":{"export":"Init"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Load and prepare localization from `locales` folder of resource.\r\n--- Don't forget to add `locales/*.{json,lua}` to `files` in `fxmanifest.lua`\r\n---\r\n--- **JSON**:\r\n--- ```lua\r\n--- LT.Locale.Init('en', 'json') -- Setup a JSON locale.\r\n---\r\n--- -- locales/en.json\r\n--- ```\r\n--- ```JSON\r\n--- {\r\n--- \"client\": {\r\n--- \"hello\": \"Hello!\",\r\n--- \"how_are_you\": \"How are you, %s?\",\r\n--- \"hello_how_are_you\": \"${client.hello} ${client.how_are_you}\"\r\n--- }\r\n--- }\r\n--- ```\r\n---\r\n--- **LUA**:\r\n--- ```lua\r\n--- LT.Locale.Init('en', 'lua') -- Setup a LUA locale.\r\n--- \r\n--- -- locales/en.lua\r\n--- return {\r\n--- client = {\r\n--- hello = 'Hello!',\r\n--- how_are_you = 'How are you, %s?',\r\n--- hello_how_are_you = '${client.hello} ${client.how_are_you}'\r\n--- },\r\n--- }\r\n--- ```\r\n--- **Using the locales:**\r\n---\r\n--- ```lua\r\n--- local _t = LT.Locale.Get -- Simplify the function.\r\n---\r\n--- _t('client.hello') -> Hello!\r\n--- _t('client.how_are_you', 'John') -> How are you, John?\r\n--- _t('client.hello_how_are_you', 'John') -> Hello! How are you, John?\r\n--- ```\r\n--- @param key string Locale key (e.g. 'en', 'tr')\r\n--- @param fileType? 'json'|'lua' Default: `json`\nfunction LT.Locale.Init(key, fileType) end"},{"funcName":"GetString","metadata":{"export":"Get"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Get localized string with formatting.\r\n--- @param str string Locale key.\r\n--- @param ...? any Format parameters (Optional)\r\n--- ```lua\r\n--- -- Simplify the function.\r\n--- local _t = LT.Locale.Get\r\n--- \r\n--- _t('client.hello') -> Hello.\r\n--- _t('client.hello_name', 'John') -> Hello, John.\r\n--- ```\r\n--- @return string\nfunction LT.Locale.Get(str, ...) end"},{"funcName":"GetLocaleStrings","metadata":{"export":"GetAllStrings"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Returns all translated strings as a table.\r\n--- Useful for sending translations to NUI.\r\n---\r\n--- By default, the dictionary is flattened:\r\n--- Nested keys like `client -> hello` become a single key (`\"client.hello\"`).\r\n---\r\n--- If `keepNesting` is set to `true`, the original nested structure is preserved:\r\n--- `{ client = { hello = \"...\" } }`\r\n---\r\n---@param keepNesting? boolean Whether to preserve the original nested structure\r\n---@return table<string, string|table> `Translated strings`\nfunction LT.Locale.GetAllStrings(keepNesting) end"},{"funcName":"GetCurrentLocaleKey","metadata":{"export":"GetCurrentKey"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Returns the current locale key.\r\n--- @return string?\nfunction LT.Locale.GetCurrentKey() end"}]},"client":null,"server":null},"@Logger":{"ns":"Logger","meta":{},"shared":null,"client":null,"server":{"code":"local PerformHttpRequest = PerformHttpRequest\r\nlocal CreateThread = CreateThread\r\nlocal insert = table.insert\r\nlocal string_format = string.format\r\nlocal settings = {\r\n type = nil,\r\n webhook = \"\",\r\n folder = \"logs\",\r\n interval = 60000,\r\n fivemerrAPIKey = nil,\r\n}\r\nlocal LOGGER_TXT_BUFFER = {}\r\nlocal LOGGER_DISCORD_BUFFER = {}\r\nfunction InitLogger(logType, data)\r\n if logType ~= 'discord' and logType ~= 'txt' and logType ~= 'fivemanage' and logType ~= 'fivemerr' then\r\n return printf('error', 'Please select a valid log type: ^4discord^7, ^4txt^7, ^4fivemanage^7, ^4fivemerr^7')\r\n end\r\n if logType == 'discord' then\r\n if not data or not data.webhook then return printf('error', 'Please provide a webhook for discord logger.') end\r\n settings.webhook = data.webhook\r\n elseif logType == 'txt' then\r\n if not data or not data.folder then\r\n data.folder = 'logs/'\r\n else\r\n settings.folder = data.folder\r\n end\r\n elseif logType == 'fivemanage' then\r\n if GetResourceState(\"fmsdk\") == \"missing\" then\r\n return printf('error', '^3fivemanage^7 log system selected but ^3fmsdk^7 resource is missing.')\r\n end\r\n elseif logType == 'fivemerr' then\r\n if not data or not data.fivemerrAPIKey then return printf('error', 'Please provide a fivemerr API key for logger.') end\r\n settings.fivemerrAPIKey = data.fivemerrAPIKey\r\n end\r\n settings.type = logType\r\n if data and data.interval then \r\n settings.interval = data.interval \r\n end\r\n CreateThread(function()\r\n while true do\r\n Wait(settings.interval)\r\n if settings.type == 'txt' then\r\n if #LOGGER_TXT_BUFFER > 0 then\r\n local date = os.date('%Y-%m-%d')\r\n local path = settings.folder .. '/' .. date .. '.txt'\r\n local existing = LoadResourceFile(LT_RESOURCE_NAME, path) or \"\"\r\n local newData = existing .. table.concat(LOGGER_TXT_BUFFER)\r\n SaveResourceFile(LT_RESOURCE_NAME, path, newData, -1)\r\n LOGGER_TXT_BUFFER = {}\r\n end\r\n end\r\n if settings.type == 'discord' then\r\n if #LOGGER_DISCORD_BUFFER > 0 then\r\n local embeds = {}\r\n local toRemove = {}\r\n for i, log in ipairs(LOGGER_DISCORD_BUFFER) do\r\n if #embeds < 10 then\r\n table.insert(embeds, {\r\n color = log.color,\r\n title = LT_RESOURCE_NAME,\r\n fields = {\r\n {\r\n name = 'Log Message',\r\n value = '```' .. log.message .. '```',\r\n inline = false,\r\n }\r\n },\r\n footer = {\r\n text = \"Created with ❤️ by Laot | LTBridge\"\r\n },\r\n timestamp = log.timestamp,\r\n })\r\n table.insert(toRemove, i)\r\n else\r\n break\r\n end\r\n end\r\n for i = #toRemove, 1, -1 do\r\n table.remove(LOGGER_DISCORD_BUFFER, toRemove[i])\r\n end\r\n PerformHttpRequest(settings.webhook, function(status, text, headers) \r\n if status ~= 200 and status ~= 204 then\r\n printf('error', 'Failed to send logs to discord. Status: %s - Response: %s', json.encode(status), json.encode(text))\r\n end\r\n end, 'POST', json.encode({\r\n username = 'LTBridge Logger',\r\n avatar_url = 'https://avatars.githubusercontent.com/u/70145288?v=4',\r\n embeds = embeds,\r\n }), { ['Content-Type'] = 'application/json' })\r\n end\r\n end\r\n end\r\n end)\r\nend\r\nfunction GetLoggerType()\r\n return settings.type\r\nend\r\nfunction GetLoggerSettings()\r\n return settings\r\nend\r\nlocal adapters = {\r\n ['txt'] = function(message, status)\r\n local date = os.date('%H:%M:%S')\r\n local statusTable = {\r\n ['info'] = 'INFO',\r\n ['warn'] = 'WARN',\r\n ['error'] = 'ERROR',\r\n }\r\n local log\r\n local msg = '[%s] %s\\n'\r\n if status ~= nil then\r\n msg = '[%s] %s: %s\\n'\r\n log = string_format(msg, date, statusTable[status] or \"INFO\", message)\r\n else\r\n log = string_format(msg, date, message)\r\n end\r\n insert(LOGGER_TXT_BUFFER, log)\r\n end,\r\n ['discord'] = function(message, status)\r\n local timestamp = os.date(\"!%Y-%m-%dT%H:%M:%SZ\")\r\n local message = tostring(message)\r\n local colors = {\r\n info = 3447003,\r\n warn = 16776960,\r\n error = 15158332,\r\n }\r\n insert(LOGGER_DISCORD_BUFFER, {\r\n color = colors[status] or 3447003,\r\n message = message,\r\n timestamp = timestamp\r\n })\r\n end,\r\n ['fivemanage'] = function(message, status)\r\n exports.fmsdk:LogMessage(status or 'info', message)\r\n end,\r\n ['fivemerr'] = function(message, status)\r\n local data = {\r\n level = status or 'info',\r\n message = tostring(message),\r\n resource = LT_RESOURCE_NAME,\r\n }\r\n PerformHttpRequest('https://api.fivemerr.com/v1/logs', function(status, text, headers)\r\n if status ~= 200 then\r\n printf('error', 'Failed to send log to Fivemerr API (HTTP %d): Please verify your API key is correct and the service is available.', status)\r\n end\r\n end, 'POST', json.encode(data), {\r\n ['Content-Type'] = 'application/json',\r\n ['Authorization'] = GetLoggerSettings().fivemerrAPIKey\r\n })\r\n end\r\n}\r\nfunction CreateLog(message, status)\r\n local logType = GetLoggerType()\r\n if not logType then return printf('error', 'Logger not initialized. Please use ^3LT.Logger.Init()^7 first.') end\r\n local adapter = adapters[logType]\r\n if not adapter then return end\r\n adapter(message, status)\r\nend","stubs":[{"funcName":"InitLogger","metadata":{"export":"Init"},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Initialize logger.\r\n--- **NOTE:** If using `txt` type, you need to create the folder manually `logs` (by default) in your resource folder.\r\n--- @param logType 'discord'|'txt'|'fivemanage'|'fivemerr'\r\n--- @param data? table { `webhook: string` (If using discord), `folder: string` (If using txt, optional), `interval: number` (optional), `fivemerrAPIKey: string` (If using fivemerr, optional) }\r\n--- ```lua\r\n--- LT.Logger.Init('discord', {\r\n--- webhook = '', -- Webhook URL if using discord.\r\n--- folder = 'custom_logs_folder', -- Custom folder if using txt logs. Must be manually created in resource directory.\r\n--- fivemerrAPIKey = '', -- Fivemerr API key if using it.\r\n--- interval = 60000, -- Log write/send interval to prevent spam or rate limits. (default: 60000 -> every minute)\r\n--- })\r\n--- ```\nfunction LT.Logger.Init(logType, data) end"},{"funcName":"GetLoggerType","metadata":{"internal":true},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Get current logger type.\nfunction LT.Logger.GetLoggerType() end"},{"funcName":"GetLoggerSettings","metadata":{"internal":true},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Get current logger settings.\nfunction LT.Logger.GetLoggerSettings() end"},{"funcName":"CreateLog","metadata":{"export":"Create"},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Creates a log message.\r\n--- Use `LT.Logger.Init()` before using this function.\r\n--- @param message string The message to log.\r\n--- @param status? 'info'|'warn'|'error' (optional)\nfunction LT.Logger.Create(message, status) end"}]}},"@Math/Clamp":{"ns":"Math","meta":{},"shared":{"code":"function MathClamp(value, min, max)\n if value < min then return min end\n if value > max then return max end\n return value\nend","stubs":[{"funcName":"MathClamp","metadata":{"export":"Clamp"},"stubCode":"--- **`MATH` `SHARED`**\n--- Clamp a value between min and max.\n--- @param value number\n--- @param min number\n--- @param max number\n--- @return number\nfunction LT.Math.Clamp(value, min, max) end"}]},"client":null,"server":null},"@Math/FormatMoney":{"ns":"Math","meta":{},"shared":{"code":"function MathFormatMoney(num, symbol)\n local formatted = tostring(math.floor(num))\n local k\n while true do\n formatted, k = formatted:gsub('^(-?%d+)(%d%d%d)', '%1,%2')\n if k == 0 then break end\n end\n return (symbol or '$') .. formatted\nend","stubs":[{"funcName":"MathFormatMoney","metadata":{"export":"FormatMoney"},"stubCode":"--- **`MATH` `SHARED`**\n--- Format a number as money with currency symbol.\n--- ```lua\n--- LT.Math.FormatMoney(1234567) -- \"$1,234,567\"\n--- LT.Math.FormatMoney(1234567, '€') -- \"€1,234,567\"\n--- ```\n--- @param num number\n--- @param symbol? string Currency symbol, defaults to \"$\"\n--- @return string\nfunction LT.Math.FormatMoney(num, symbol) end"}]},"client":null,"server":null},"@Math/FormatNumber":{"ns":"Math","meta":{},"shared":{"code":"function MathFormatNumber(num)\n local formatted = tostring(math.floor(num))\n local k\n while true do\n formatted, k = formatted:gsub('^(-?%d+)(%d%d%d)', '%1,%2')\n if k == 0 then break end\n end\n return formatted\nend","stubs":[{"funcName":"MathFormatNumber","metadata":{"export":"FormatNumber"},"stubCode":"--- **`MATH` `SHARED`**\n--- Format a number with thousand separators.\n--- ```lua\n--- LT.Math.FormatNumber(1234567) -- \"1,234,567\"\n--- ```\n--- @param num number\n--- @return string\nfunction LT.Math.FormatNumber(num) end"}]},"client":null,"server":null},"@Math/Lerp":{"ns":"Math","meta":{},"shared":{"code":"function MathLerp(a, b, t)\n return a + (b - a) * t\nend","stubs":[{"funcName":"MathLerp","metadata":{"export":"Lerp"},"stubCode":"--- **`MATH` `SHARED`**\n--- Linear interpolation between two values.\n--- @param a number Start value\n--- @param b number End value\n--- @param t number Interpolation factor (0-1)\n--- @return number\nfunction LT.Math.Lerp(a, b, t) end"}]},"client":null,"server":null},"@Math/MapRange":{"ns":"Math","meta":{},"shared":{"code":"function MathMapRange(value, inMin, inMax, outMin, outMax)\n if inMin == inMax then return outMin end\n return outMin + (value - inMin) * (outMax - outMin) / (inMax - inMin)\nend","stubs":[{"funcName":"MathMapRange","metadata":{"export":"MapRange"},"stubCode":"--- **`MATH` `SHARED`**\n--- Map a value from one range to another.\n--- ```lua\n--- LT.Math.MapRange(50, 0, 100, 0, 1) -- 0.5\n--- ```\n--- @param value number\n--- @param inMin number\n--- @param inMax number\n--- @param outMin number\n--- @param outMax number\n--- @return number\nfunction LT.Math.MapRange(value, inMin, inMax, outMin, outMax) end"}]},"client":null,"server":null},"@Math/RandomFloat":{"ns":"Math","meta":{},"shared":{"code":"function MathRandomFloat(min, max)\n return min + math.random() * (max - min)\nend","stubs":[{"funcName":"MathRandomFloat","metadata":{"export":"RandomFloat"},"stubCode":"--- **`MATH` `SHARED`**\n--- Get a random float in range.\n--- @param min number\n--- @param max number\n--- @return number\nfunction LT.Math.RandomFloat(min, max) end"}]},"client":null,"server":null},"@Math/Round":{"ns":"Math","meta":{},"shared":{"code":"function MathRound(num, decimals)\n local mult = 10 ^ (decimals or 0)\n return math.floor(num * mult + 0.5) / mult\nend","stubs":[{"funcName":"MathRound","metadata":{"export":"Round"},"stubCode":"--- **`MATH` `SHARED`**\n--- Round a number to given decimal places.\n--- @param num number\n--- @param decimals? number Defaults to 0\n--- @return number\nfunction LT.Math.Round(num, decimals) end"}]},"client":null,"server":null},"@Menu":{"ns":"Menu","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['qb-menu'] = {},\r\n ['lation_ui'] = {},\r\n ['wasabi_uikit'] = {},\r\n}\r\nfunction GetMenuResource()\r\n return resourceName\r\nend\r\nfunction SetMenuResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Menu resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'menu')\r\nif resource then\r\n SetMenuResource(resource)\r\nend\r\nlocal function convertQBtoOX(id, menu)\r\n local oxMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if oxMenu.title == \"\" then\r\n oxMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = v.action or function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(oxMenu.options, option)\r\n end\r\n end\r\n return oxMenu\r\nend\r\nlocal function convertOXtoQB(id, menu)\r\n local qbMenu = {\r\n {\r\n header = menu.title,\r\n isMenuHeader = true,\r\n }\r\n }\r\n for i, v in pairs(menu.options) do\r\n local button = {\r\n header = v.title,\r\n txt = v.description,\r\n icon = v.icon,\r\n disabled = v.disabled,\r\n }\r\n if v.onSelect then\r\n button.params = {\r\n event = \"community_bridge:client:MenuCallback\",\r\n args = {id = id, selected = i, args = v.args, onSelect = v.onSelect},\r\n }\r\n else\r\n button.params = {} \n end\r\n table.insert(qbMenu, button)\r\n end\r\n return qbMenu\r\nend\r\nlocal function convertQBtoLation(id, menu)\r\n local lationMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if lationMenu.title == \"\" then\r\n lationMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(lationMenu.options, option)\r\n end\r\n end\r\n return lationMenu\r\nend\r\nlocal function runCheckForImageIcon(icon)\r\n local iconStr = tostring(icon):lower()\r\n if iconStr:match(\"^https?://\") or iconStr:match(\"^nui://\") or iconStr:match(\"^file://\") then\r\n return true\r\n end\r\n local extensions = {\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\", \".ico\"}\r\n for _, ext in pairs(extensions) do\r\n if iconStr:match(ext .. \"$\") then\r\n return true\r\n end\r\n end\r\n return false\r\nend\r\nlocal function convertOXtoLation(data)\r\n local repack = {\r\n id = data.id,\r\n title = data.title or \"\",\r\n canClose = data.canClose ~= false,\r\n options = {}\r\n }\r\n for k, v in pairs(data.options) do\r\n if v.iconColor then\r\n if v.icon and runCheckForImageIcon(v.icon) then\r\n v.iconColor = nil\r\n end\r\n end\r\n table.insert(repack.options, v)\r\n end\r\n return repack\r\nend\r\nlocal function convertQBtoWasabi(id, menu)\r\n local wasabiMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if wasabiMenu.title == \"\" then\r\n wasabiMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = v.action or function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(wasabiMenu.options, option)\r\n end\r\n end\r\n return wasabiMenu\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoOX(id, data)\r\n end\r\n exports.ox_lib:registerContext(data)\r\n exports.ox_lib:showContext(id)\r\n return data\r\n end,\r\n ['lt-ui'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoOX(id, data)\r\n end\r\n exports['lt-ui']:registerContext(data)\r\n exports['lt-ui']:showContext(id)\r\n return data\r\n end,\r\n ['qb-menu'] = function(id, data, isQB)\r\n if not isQB then\r\n data = convertOXtoQB(id, data)\r\n end\r\n exports['qb-menu']:openMenu(data)\r\n return data\r\n end,\r\n ['lation_ui'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoLation(id, data)\r\n else\r\n data = convertOXtoLation(data)\r\n end\r\n exports.lation_ui:registerMenu(data)\r\n exports.lation_ui:showMenu(id)\r\n return data\r\n end,\r\n ['wasabi_uikit'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoWasabi(id, data)\r\n end\r\n exports.wasabi_uikit:RegisterContextMenu(data)\r\n exports.wasabi_uikit:OpenContextMenu(id)\r\n return data\r\n end,\r\n}\r\nfunction OpenMenu(id, data, isQB)\r\n local resource = GetMenuResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n data.id = id\r\n return adapter(id, data, isQB)\r\nend","stubs":[{"funcName":"GetMenuResource","metadata":{"export":"GetResource"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Returns menu resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'qb-menu'|'lation_ui'|'wasabi_uikit'|nil\nfunction LT.Menu.GetResource() end"},{"funcName":"SetMenuResource","metadata":{"export":"SetResource"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Force set menu resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'qb-menu'|'lation_ui'|'wasabi_uikit'\nfunction LT.Menu.SetResource(name) end"},{"funcName":"OpenMenu","metadata":{"export":"Open"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Opens a interactable menu.\r\n--- @param id string Menu unique ID\r\n--- @param data table Menu data\r\n--- @param isQB? boolean If data table is sent with QB format set to true, default: false\r\n--- @return table|nil\nfunction LT.Menu.Open(id, data, isQB) end"}]},"server":null},"@Notify":{"ns":"Notify","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal exp = {}\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['esx_notify'] = {},\r\n ['okokNotify'] = {},\r\n ['pNotify'] = {},\r\n ['mythic_notify'] = {},\r\n ['brutal_notify'] = {},\r\n ['wasabi_notify'] = {},\r\n ['origen_notify'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetNotifyResource()\r\n return resourceName\r\nend\r\nfunction SetNotifyResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Notify resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\n exp = exports[name]\r\nend\r\nlocal resource = DetectResource(list, 'notify')\r\nif resource then\r\n SetNotifyResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:notify({\r\n title = title,\r\n description = message,\r\n type = variant,\r\n duration = time,\r\n })\r\n end,\r\n ['lt-ui'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:notify({\r\n title = title,\r\n description = message,\r\n type = variant,\r\n duration = time,\r\n })\r\n end,\r\n ['esx_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n TriggerEvent('esx:showNotification', message, variant, time, title, 'top-left')\r\n end,\r\n ['okokNotify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:Alert(title, message, time, variant)\r\n end,\r\n ['pNotify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:SendNotification({ title = title, text = message, type = variant, timeout = time })\r\n end,\r\n ['mythic_notify'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:Notify(variant, message, time)\r\n end,\r\n ['brutal_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:SendAlert(title, message, time, variant)\r\n end,\r\n ['wasabi_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:notify(title, message, time, variant)\r\n end,\r\n ['origen_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:ShowNotification(message, variant, time)\r\n end,\r\n ['lation_ui'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:notify({\r\n title = title,\r\n message = message,\r\n duration = time,\r\n type = variant\r\n })\r\n end,\r\n}\r\nfunction SendNotify(title, message, variant, time)\r\n local name = GetNotifyResource()\r\n if not name then return end\r\n local adapter = adapters[name]\r\n if not adapter then return end\r\n adapter(title, message, (time or 3500), (variant or 'info'))\r\nend\r\nRegisterNetEvent(LT_RESOURCE_NAME..':client:@Notify:Send', function(title, message, variant, time)\r\n SendNotify(title, message, variant, time)\r\nend)","stubs":[{"funcName":"GetNotifyResource","metadata":{"export":"GetResource"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Returns notify resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'esx_notify'|'okokNotify'|'pNotify'|'mythic_notify'|'brutal_notify'|'wasabi_notify'|'origen_notify'|'lation_ui'|nil\nfunction LT.Notify.GetResource() end"},{"funcName":"SetNotifyResource","metadata":{"export":"SetResource"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Force set notify resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'esx_notify'|'okokNotify'|'pNotify'|'mythic_notify'|'brutal_notify'|'wasabi_notify'|'origen_notify'|'lation_ui'\nfunction LT.Notify.SetResource(name) end"},{"funcName":"SendNotify","metadata":{"export":"Send"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Send notification to player.\r\n--- @param title? string Title for notification.\r\n--- @param message string Notify message.\r\n--- @param variant? 'success'|'error'|'info'|'warning' Type of notification.\r\n--- @param time? number Duration in milliseconds. Defaults to 3500.\nfunction LT.Notify.Send(title, message, variant, time) end"}]},"server":{"code":"function SendNotify(source, title, message, variant, time)\r\n TriggerClientEvent(LT_RESOURCE_NAME..':client:@Notify:Send', source, title, message, variant, time)\r\nend","stubs":[{"funcName":"SendNotify","metadata":{"export":"Send"},"stubCode":"--- **`NOTIFY` `SERVER`**\n--- Send notification to player.\r\n--- @param source number Player source\r\n--- @param title? string Title\r\n--- @param message string Messsage section\r\n--- @param variant? 'success'|'error'|'info'|'warning' Type of notification.\r\n--- @param time? number Duration in milliseconds. Defaults to 3500.\nfunction LT.Notify.Send(source, title, message, variant, time) end"}]}},"@NUI/Callback":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local RegisterNUICallback = RegisterNUICallback\n\nfunction NUICallback(name, cb)\n RegisterNUICallback(name, cb)\nend","stubs":[{"funcName":"NUICallback","metadata":{"export":"Callback"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Registers a NUI callback/listener.\n--- ```lua\n--- LT.NUI.Callback('closeMenu', function(data, cb)\n--- LT.NUI.Focus(false)\n--- cb('ok')\n--- end)\n--- ```\n--- @param name string Callback name\n--- @param cb fun(data: table, cb: fun(response: any))\nfunction LT.NUI.Callback(name, cb) end"}]},"server":null},"@NUI/Focus":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"function NUIFocus(status, cursor)\n SetNuiFocus(status, (cursor == nil and status) or (type(cursor) == \"boolean\" and cursor))\n TriggerEvent(LT_RESOURCE_NAME.. ':client:@NUI:FocusChanged', status, cursor)\nend","stubs":[{"funcName":"NUIFocus","metadata":{"export":"Focus"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Set NUI focus and optional mouse cursor. Also triggers an event that can be listened to.\n---\n--- **Lua Example:**\n--- ```lua\n--- LT.NUI.Focus(true, true) -- Focus + Mouse\n--- LT.NUI.Focus(false) -- Close All\n--- \n--- AddEventHandler(GetCurrentResourceName() .. ':client:@NUI:FocusChanged', function(status, cursor)\n--- print('NUI Focus Changed:', status, cursor)\n--- end)\n--- ```\n---\n--- @param status boolean Focus status\n--- @param cursor? boolean Optional mouse cursor status (defaults to status)\nfunction LT.NUI.Focus(status, cursor) end"}]},"server":null},"@NUI/Request":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local requestId = 0\nlocal requests = {}\n\nRegisterNUICallback('ltbridge:response', function(data, cb)\n local id = data.requestId\n if id and requests[id] then\n requests[id]:resolve(data.data)\n requests[id] = nil\n end\n if cb then cb('ok') end\nend)\n\nfunction NUIRequest(action, data, timeout)\n CheckNUI()\n requestId = requestId + 1\n local id = requestId\n local p = promise.new()\n\n requests[id] = p\n\n SendNUIMessage({\n action = action,\n data = data,\n requestId = id\n })\n\n SetTimeout(timeout or 5000, function()\n if p.state == 0 then \n p:resolve(nil)\n end\n end)\n\n local result = Citizen.Await(p)\n return result\nend","stubs":[{"funcName":"NUIRequest","metadata":{"export":"Request"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Sends a message to the NUI and waits for a response.\n---\n--- **Lua Example:**\n--- ```lua\n--- local name = LT.NUI.Request('get_name', { title = 'Enter' }, 5000)\n--- print(name)\n--- ```\n---\n--- **NUI (JS) Example:**\n--- ```javascript\n--- window.addEventListener('message', (event) => {\n--- if (event.data.action === 'get_name') {\n--- fetch(`https://${GetParentResourceName()}/ltbridge:response`, {\n--- method: 'POST',\n--- body: JSON.stringify({ requestId: event.data.requestId, data: 'John Doe' })\n--- });\n--- }\n--- });\n--- ```\n--- @param action string Action name\n--- @param data? any Optional data to send\n--- @param timeout? number Optional timeout in ms (default: 5000)\n--- @return any? result The data returned from the NUI, or nil if timed out.\nfunction LT.NUI.Request(action, data, timeout) end"}]},"server":null},"@NUI/Send":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local SendNUIMessage = SendNUIMessage\n\nfunction SendNUI(action, payload)\n CheckNUI()\n SendNUIMessage({\n action = action,\n payload = payload\n })\nend","stubs":[{"funcName":"SendNUI","metadata":{"export":"Send"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Sends a message to the NUI.\n---\n--- **Lua Example:**\n--- ```lua\n--- LT.NUI.Send('open_shop', { items = {1, 2, 3} })\n--- ```\n---\n--- **NUI (JS) Example:**\n--- ```javascript\n--- window.addEventListener('message', (event) => {\n--- if (event.data.action === 'open_shop') {\n--- console.log('Shop items:', event.data.payload.items);\n--- }\n--- });\n--- ```\n--- @param action string Action name\n--- @param payload? any Optional data payload\nfunction LT.NUI.Send(action, payload) end"}]},"server":null},"@NUI/State":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local function deepEqual(a, b)\n if type(a) ~= type(b) then return false end\n if type(a) ~= 'table' then return a == b end\n if a == b then return true end\n\n local keys = {}\n for k, v in pairs(a) do\n keys[k] = true\n if not deepEqual(v, b[k]) then return false end\n end\n for k in pairs(b) do\n if not keys[k] then return false end\n end\n return true\nend\n\nlocal RootState = {}\nRootState.__index = RootState\n\nfunction RootState:queueUpdate(key, value)\n local current = self._batch\n local parts = {}\n\n for part in key:gmatch(\"[^%.]+\") do\n table.insert(parts, part)\n end\n\n for i = 1, #parts - 1 do\n local part = parts[i]\n if type(current[part]) ~= 'table' then\n current[part] = {}\n end\n current = current[part]\n end\n\n current[parts[#parts]] = value\n\n if not self._isTicking then\n self._isTicking = true\n SetTimeout(0, function()\n self._isTicking = false\n\n SendNUIMessage({\n action = self._action,\n namespace = self._namespace,\n batch = self._batch\n })\n\n self._batch = {}\n end)\n end\nend\n\nfunction RootState:sync()\n SendNUIMessage({\n action = self._action .. '_sync',\n namespace = self._namespace,\n state = self._internal\n })\nend\n\nfunction RootState:update(changes)\n if type(changes) ~= 'table' then return end\n for k, v in pairs(changes) do\n self._proxy[k] = v\n end\nend\n\nlocal function isDetached(ctx)\n while ctx do\n if ctx.detached then return true end\n ctx = ctx.parent\n end\n return false\nend\n\nlocal function buildProxy(tbl, path, root, ctx)\n local proxy = {}\n local internal = tbl\n local childProxies = {}\n ctx = ctx or { detached = false, parent = nil }\n\n setmetatable(proxy, {\n __isProxy = true,\n __raw = internal,\n __index = function(_, k)\n local v = internal[k]\n\n if v == nil and path == \"\" and RootState[k] then\n return function(_, ...)\n return RootState[k](root, ...)\n end\n end\n\n if type(v) == 'table' then\n local cached = childProxies[k]\n\n if cached and cached.ref ~= v then\n cached.ctx.detached = true\n childProxies[k] = nil\n cached = nil\n end\n\n if not cached then\n local newPath = path == \"\" and k or (path .. \".\" .. k)\n local newCtx = { detached = false, parent = ctx }\n childProxies[k] = {\n ref = v,\n ctx = newCtx,\n proxy = buildProxy(v, newPath, root, newCtx)\n }\n end\n\n return childProxies[k].proxy\n end\n\n return v\n end,\n __newindex = function(_, k, v)\n local mt = getmetatable(v)\n if type(v) == 'table' and mt and mt.__isProxy then\n v = mt.__raw\n end\n\n if deepEqual(internal[k], v) then return end\n internal[k] = v\n\n if isDetached(ctx) then\n return\n end\n\n local fullKey = path == \"\" and k or (path .. \".\" .. k)\n\n if type(v) ~= 'function' and not root._ignore[fullKey] then\n root:queueUpdate(fullKey, v)\n end\n\n if childProxies[k] then\n childProxies[k].ctx.detached = true\n childProxies[k] = nil\n end\n end,\n __pairs = function()\n local function proxy_iter(_, k)\n local next_k = next(internal, k)\n if next_k ~= nil then\n return next_k, proxy[next_k]\n end\n end\n return proxy_iter, internal, nil\n end,\n __len = function() return #internal end\n })\n\n return proxy\nend\n\nfunction CreateNUIState(namespace, tbl, ignoreList, action)\n local ignoreHash = {}\n if type(ignoreList) == 'table' then\n for _, key in ipairs(ignoreList) do\n ignoreHash[key] = true\n end\n end\n\n local root = setmetatable({\n _internal = tbl or {},\n _namespace = namespace,\n _action = action or 'ltbridge_state_update',\n _ignore = ignoreHash,\n _batch = {},\n _isTicking = false\n }, RootState)\n\n root._proxy = buildProxy(root._internal, \"\", root)\n return root._proxy\nend","stubs":[{"funcName":"CreateNUIState","metadata":{"export":"CreateState"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Creates a reactive Lua table proxy that automatically triggers a NUI message when updated.\n--- Features Deep Reactivity, Batching, and full state Syncing.\n---\n--- **Lua Example:**\n--- ```lua\n--- local Hud = LT.NUI.CreateState('hud', { health = 100, stats = { stamina = 50 } })\n---\n--- Hud.health = 85 -- Triggers NUI update: { health: 85 }\n--- Hud.stats.stamina = 20 -- Deep reactivity, triggers NUI update: { stats: { stamina: 20 } }\n--- \n--- Hud:sync() -- Sends { action = '..._sync', state = { full_state } }\n--- Hud:update({ health = 100, armor = 50 }) -- Batch update\n--- ```\n---\n--- **NUI (Pinia / Vue) Example:**\n--- ```javascript\n--- import { useHudStore } from '@/stores/hud'\n---\n--- window.addEventListener('message', (event) => {\n--- const data = event.data;\n--- const hudStore = useHudStore();\n---\n--- // 1. Standard Event (Batched nested payload)\n--- if (data.action === 'ltbridge_state_update') {\n--- // data.batch = { health: 100, stats: { stamina: 20 } }\n--- // Pinia's $patch automatically performs a Deep Merge!\n--- hudStore.$patch(data.batch);\n--- }\n--- // 2. Sync Event (Triggered by Hud:sync())\n--- else if (data.action === 'ltbridge_state_update_sync') {\n--- hudStore.$state = data.state;\n--- }\n--- });\n--- ```\n--- @param namespace string Unique namespace for this state\n--- @param tbl table Initial table data\n--- @param ignoreList? table|string Keys to ignore when sending NUI messages (e.g. {'health', 'stats.stamina'})\n--- @param action? string Action to send NUI (defaults to: 'ltbridge_state_update')\n--- @return table proxy The proxy table with methods (:sync, :update)\nfunction LT.NUI.CreateState(namespace, tbl, ignoreList, action) end"}]},"server":null},"@NUI":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local isNUILoaded = false\r\nlocal actionToSend = 'ltbridge_check_nui'\r\nRegisterNUICallback('ltbridge:ready', function(_, cb)\r\n isNUILoaded = true\r\n if cb then cb('ok') end\r\nend)\r\nfunction CheckNUI(action)\r\n if isNUILoaded then return true end\r\n if action then\r\n actionToSend = action\r\n end\r\n while not isNUILoaded do\r\n SendNUIMessage({\r\n action = actionToSend\r\n })\r\n Wait(500)\r\n end\r\n return true\r\nend\r\nfunction IsNUILoaded()\r\n return isNUILoaded\r\nend","stubs":[{"funcName":"CheckNUI","metadata":{"export":"Check"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Yields the current thread until NUI signals its ready.\r\n---\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- LT.NUI.Check()\r\n--- ```\r\n---\r\n--- **NUI (JS) Example:**\r\n--- ```javascript\r\n--- window.addEventListener('message', function(event) {\r\n--- if (event.data.action === 'ltbridge_check_nui') {\r\n--- fetch(`https://${GetParentResourceName()}/ltbridge:ready`, { method: 'POST' });\r\n--- }\r\n--- });\r\n--- ```\r\n--- @param action? string NUI message to send (defaults to 'ltbridge_check_nui').\r\n--- @return boolean\nfunction LT.NUI.Check(action) end"},{"funcName":"IsNUILoaded","metadata":{"export":"IsLoaded"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Returns `true` if NUI is loaded, `false` otherwise.\r\n--- @return boolean\nfunction LT.NUI.IsLoaded() end"}]},"server":null},"@Phone/GetNumber":{"ns":"Phone","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['lb-phone'] = function(source)\r\n return exports[\"lb-phone\"]:GetEquippedPhoneNumber(source)\r\n end,\r\n ['qb-phone'] = function(source)\r\n return GetPlayerPhoneNumber(source)\r\n end,\r\n ['okokPhone'] = function(source)\r\n return exports.okokPhone:getPhoneNumberFromSource(source)\r\n end,\r\n ['qs-smartphone-pro'] = function(source)\r\n local identifier = GetPlayerCitizenId(source)\r\n return exports['qs-smartphone-pro']:GetPhoneNumberFromIdentifier(identifier, false)\r\n end,\r\n ['gksphone'] = function(source)\r\n return exports['gksphone']:GetPhoneBySource(source)\r\n end,\r\n ['cylex_phone'] = function(source)\r\n local user = exports['cylex_phone']:getUserDataBySource(source)\r\n return user and user.phoneNumber\r\n end\r\n}\r\nfunction GetNumber(source)\r\n if not source then return nil end\r\n local adapter = adapters[GetPhoneResource()]\r\n if adapter then\r\n return adapter(source) or nil\r\n else\r\n return GetPlayerPhoneNumber(source) or nil\r\n end\r\nend","stubs":[{"funcName":"GetNumber","metadata":{},"stubCode":"--- **`PHONE` `SERVER`**\n--- Returns players phone number using active phone resource. Fallbacks to framework function.\r\n--- @param source number Player source\r\n--- @return string|nil `Phone number` if found, `nil` otherwise.\nfunction LT.Phone.GetNumber(source) end"}]}},"@Phone/SendMail":{"ns":"Phone","meta":{},"shared":null,"client":{"code":"function SendMail(mail, title, message)\r\n TriggerServerEvent(LT_RESOURCE_NAME..':server:@Phone:Send', mail, title, message)\r\n return true\r\nend","stubs":[{"funcName":"SendMail","metadata":{"export":"SendMail"},"stubCode":"--- **`PHONE` `CLIENT`**\n--- Send mail to player. Recommend to use `server` side function.\r\n--- @param mail string Sender mail\r\n--- @param title string Mail title\r\n--- @param message string Content of mail\r\n--- @return boolean\nfunction LT.Phone.SendMail(mail, title, message) end"}]},"server":{"code":"local adapters = {\r\n ['lb-phone'] = function(source, mail, title, message)\r\n local number = exports[\"lb-phone\"]:GetEquippedPhoneNumber(source)\r\n if not number then return false end\r\n local sourceMail = exports[\"lb-phone\"]:GetEmailAddress(number)\r\n if not sourceMail then return false end\r\n local success, id = exports[\"lb-phone\"]:SendMail({\r\n to = sourceMail,\r\n sender = mail,\r\n subject = title,\r\n message = message,\r\n })\r\n return success or false\r\n end,\r\n ['qb-phone'] = function(source, mail, title, message)\r\n local cId = GetPlayerCitizenId(source)\r\n if not cId then return false end\r\n local mailData = { sender = mail, subject = title, message = message }\r\n exports[\"qb-phone\"]:sendNewMailToOffline(cId, mailData)\r\n return true\r\n end,\r\n ['okokPhone'] = function(source, mail, title, message)\r\n local senderAddress = exports.okokPhone:getEmailAddressFromSource(source)\r\n if not senderAddress then return false end\r\n local data = {\r\n sender = senderAddress,\r\n recipients = { mail },\r\n subject = title,\r\n body = message,\r\n }\r\n local success = exports.okokPhone:sendEmail(data)\r\n return success or false\r\n end,\r\n ['qs-smartphone-pro'] = function(source, mail, title, message)\r\n exports['qs-smartphone-pro']:sendNewMail(source, {\r\n sender = mail,\r\n subject = title,\r\n message = message\r\n })\r\n return true\r\n end,\r\n ['gksphone'] = function(source, mail, title, message)\r\n exports[\"gksphone\"]:SendNewMail(source, {\r\n sender = mail,\r\n image = '/html/img/icons/mail.png',\r\n subject = title,\r\n message = message,\r\n })\r\n return true\r\n end,\r\n ['cylex_phone'] = function(source, mail, title, message)\r\n local identifier = GetPlayerCitizenId(source)\r\n if not identifier then return false end\r\n exports['cylex_phone']:sendMail(identifier, source, { sender = mail, subject = title, message = message })\r\n return true\r\n end\r\n}\r\nfunction SendMail(source, mail, title, message)\r\n if not source then return false end\r\n local adapter = adapters[GetPhoneResource()]\r\n return adapter(source, mail, title, message) or false\r\nend\r\nRegisterNetEvent(LT_RESOURCE_NAME..':server:@Phone:Send', function(mail, title, message)\r\n local src = source\r\n SendMail(src, mail, title, message)\r\nend)","stubs":[{"funcName":"SendMail","metadata":{},"stubCode":"--- **`PHONE` `SERVER`**\n--- Send mail to player.\r\n--- @param source number Player source\r\n--- @param mail string Sender mail\r\n--- @param title string Mail title\r\n--- @param message string Content of mail\r\n--- @return boolean\nfunction LT.Phone.SendMail(source, mail, title, message) end"}]}},"@Phone":{"ns":"Phone","meta":{},"shared":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['lb-phone'] = {},\r\n ['qb-phone'] = { providers = {'lb-phone', 'gksphone', 'okokPhone', 'qs-smartphone-pro', 'yseries', 'cylex_phone'} },\r\n ['okokPhone'] = {},\r\n ['qs-smartphone-pro'] = {},\r\n ['gksphone'] = {},\r\n ['cylex_phone'] = {},\r\n}\r\nfunction GetPhoneResource()\r\n return resourceName\r\nend\r\nfunction SetPhoneResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Phone resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'phone')\r\nif resource then\r\n SetPhoneResource(resource)\r\nend","stubs":[{"funcName":"GetPhoneResource","metadata":{"export":"GetResource"},"stubCode":"--- **`PHONE` `SHARED`**\n--- Returns phone resource name.\r\n--- @return 'lb-phone'|'qb-phone'|'okokPhone'|'qs-smartphone-pro'|'gksphone'|'cylex_phone'|nil\nfunction LT.Phone.GetResource() end"},{"funcName":"SetPhoneResource","metadata":{"export":"SetResource"},"stubCode":"--- **`PHONE` `SHARED`**\n--- Force set phone resource. \r\n--- Useful for config assignment.\r\n--- @param name 'lb-phone'|'qb-phone'|'okokPhone'|'qs-smartphone-pro'|'gksphone'|'cylex_phone'\nfunction LT.Phone.SetResource(name) end"}]},"client":null,"server":null},"@Progress":{"ns":"Progress","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['progressbar'] = {},\r\n ['lation_ui'] = {},\r\n ['wasabi_uikit'] = {},\r\n}\r\nfunction GetProgressResource()\r\n return resourceName\r\nend\r\nfunction SetProgressResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Progress resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'progress')\r\nif resource then\r\n SetProgressResource(resource)\r\nend\r\nlocal function convertQBtoOX(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n local props = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n }\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n position = 'bottom',\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = {\r\n move = options.controlDisables.disableMovement,\r\n car = options.controlDisables.disableCarMovement,\r\n combat = options.controlDisables.disableCombat,\r\n mouse = options.controlDisables.disableMouse\r\n },\r\n anim = {\r\n dict = options.animation.animDict,\r\n clip = options.animation.anim,\r\n flag = options.animation.flags or 49,\r\n },\r\n prop = props,\r\n }\r\nend\r\nlocal function convertOXtoQB(options)\r\n if not options then return options end\r\n local prop1 = (type(options.prop) == 'table' and options.prop[1]) or options.prop or {}\r\n local prop2 = (type(options.prop) == 'table' and options.prop[2]) or {}\r\n return {\r\n name = options.label,\r\n duration = options.duration,\r\n label = options.label,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n controlDisables = {\r\n disableMovement = options.disable.move,\r\n disableCarMovement = options.disable.car,\r\n disableMouse = options.disable.mouse,\r\n disableCombat = options.disable.combat\r\n },\r\n animation = {\r\n animDict = options.anim.dict,\r\n anim = options.anim.clip,\r\n flags = options.anim.flag or 49\r\n },\r\n prop = {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n coords = prop1.pos,\r\n rotation = prop1.rot\r\n },\r\n propTwo = {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n coords = prop2.pos,\r\n rotation = prop2.rot\r\n }\r\n }\r\nend\r\nlocal function convertQBtoLation(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n local props = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n }\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n description = options.description,\r\n icon = options.icon,\r\n iconColor = options.iconColor,\r\n iconAnimation = options.iconAnimation,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = {\r\n move = options.controlDisables.disableMovement,\r\n car = options.controlDisables.disableCarMovement,\r\n combat = options.controlDisables.disableCombat,\r\n mouse = options.controlDisables.disableMouse\r\n },\r\n anim = {\r\n dict = options.animation.animDict,\r\n clip = options.animation.anim,\r\n flag = options.animation.flags or 49,\r\n },\r\n prop = props,\r\n }\r\nend\r\nlocal function convertOXtoLation(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n description = options.description,\r\n icon = options.icon,\r\n iconColor = options.iconColor,\r\n iconAnimation = options.iconAnimation,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = options.disable,\r\n anim = options.anim,\r\n prop = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n },\r\n }\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.ox_lib:progressCircle(options) or exports.ox_lib:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['lt-ui'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.ox_lib:progressCircle(options) or exports.ox_lib:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['progressbar'] = function(options, cb, isQB)\r\n if not isQB then\r\n options = convertOXtoQB(options)\r\n end\r\n local prom = promise.new()\r\n exports['progressbar']:Progress(options, function(cancelled)\r\n if cb then cb( not cancelled) end\r\n prom:resolve(not cancelled)\r\n end)\r\n return Citizen.Await(prom)\r\n end,\r\n ['lation_ui'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoLation(options)\r\n else\r\n options = convertOXtoLation(options)\r\n end\r\n local success = exports.lation_ui:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['wasabi_uikit'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.wasabi_uikit:ProgressBar(options, 'circle') or exports.wasabi_uikit:ProgressBar(options, 'bar')\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n}\r\nfunction OpenProgress(options, cb, isQB)\r\n local name = GetProgressResource()\r\n local adapter = name and adapters[name]\r\n if adapter then\r\n return adapter(options, cb, isQB)\r\n end\r\n return false\r\nend","stubs":[{"funcName":"GetProgressResource","metadata":{"export":"GetResource"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Returns progress bar resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'progressbar'|'lation_ui'|'wasabi_uikit'|nil\nfunction LT.Progress.GetResource() end"},{"funcName":"SetProgressResource","metadata":{"export":"SetResource"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Force set progress bar resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'progressbar'|'lation_ui'|'wasabi_uikit'\nfunction LT.Progress.SetResource(name) end"},{"funcName":"OpenProgress","metadata":{"export":"Open"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Open progress bar.\r\n--- @param options table Options\r\n--- @param cb? fun(success: boolean)\r\n--- @param isQB? boolean If options are sent in \"qb-progressbar\" format, set to true. If not set, it will be assumed as \"ox_lib\" progress bar format.\r\n--- @return boolean success\nfunction LT.Progress.Open(options, cb, isQB) end"}]},"server":null},"@State/Get":{"ns":"State","meta":{},"shared":{"code":"function GetState(entity, key)\n return Entity(entity).state[key]\nend","stubs":[{"funcName":"GetState","metadata":{"export":"Get"},"stubCode":"--- **`STATE` `SHARED`**\n--- Get entity state value.\n--- ```lua\n--- local fuel = LT.State.Get(vehicle, 'fuel')\n--- ```\n--- @param entity number Entity handle\n--- @param key string State key\n--- @return any\nfunction LT.State.Get(entity, key) end"}]},"client":null,"server":null},"@State/GetPlayer":{"ns":"State","meta":{},"shared":null,"client":{"code":"function GetPlayerState(key)\n return LocalPlayer.state[key]\nend","stubs":[{"funcName":"GetPlayerState","metadata":{"export":"GetPlayer"},"stubCode":"--- **`STATE` `CLIENT`**\n--- Get local player state value.\n--- ```lua\n--- local isBusy = LT.State.GetPlayer('busy')\n--- ```\n--- @param key string State key\n--- @return any\nfunction LT.State.GetPlayer(key) end"}]},"server":{"code":"function GetPlayerState(source, key)\n return Player(source).state[key]\nend","stubs":[{"funcName":"GetPlayerState","metadata":{"export":"GetPlayer"},"stubCode":"--- **`STATE` `SERVER`**\n--- Get player state value.\n--- ```lua\n--- local isWanted = LT.State.GetPlayer(source, 'wanted')\n--- ```\n--- @param source number Player source\n--- @param key string State key\n--- @return any\nfunction LT.State.GetPlayer(source, key) end"}]}},"@State/OnChange":{"ns":"State","meta":{},"shared":{"code":"function OnStateChange(key, handler)\n\n return AddStateBagChangeHandler(key, nil, function(bagName, _, value)\n handler(value, bagName)\n end)\nend","stubs":[{"funcName":"OnStateChange","metadata":{"export":"OnChange"},"stubCode":"--- **`STATE` `SHARED`**\n--- Register a handler for state bag changes across all entities.\n--- ```lua\n--- LT.State.OnChange('fuel', function(value, bagName)\n--- local entity = GetEntityFromStateBagName(bagName)\n--- if entity > 0 then\n--- print(('Entity %s fuel changed to %s'):format(entity, value))\n--- end\n--- end)\n--- ```\n--- @param key string State key to watch\n--- @param handler fun(value: any, bagName: string)\n--- @return number Handler ID (use RemoveStateBagChangeHandler to remove)\nfunction LT.State.OnChange(key, handler) end"}]},"client":null,"server":null},"@State/Set":{"ns":"State","meta":{},"shared":{"code":"function SetState(entity, key, value, replicated)\n Entity(entity).state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetState","metadata":{"export":"Set"},"stubCode":"--- **`STATE` `SHARED`**\n--- Set entity state value.\n--- ```lua\n--- LT.State.Set(vehicle, 'fuel', 100.0)\n--- LT.State.Set(ped, 'busy', true, false) -- not replicated\n--- ```\n--- @param entity number Entity handle\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to network (default: true)\nfunction LT.State.Set(entity, key, value, replicated) end"}]},"client":null,"server":null},"@State/SetPlayer":{"ns":"State","meta":{},"shared":null,"client":{"code":"function SetPlayerState(key, value, replicated)\n LocalPlayer.state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetPlayerState","metadata":{"export":"SetPlayer"},"stubCode":"--- **`STATE` `CLIENT`**\n--- Set local player state value.\n--- ```lua\n--- LT.State.SetPlayer('busy', true)\n--- ```\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to server (default: true)\nfunction LT.State.SetPlayer(key, value, replicated) end"}]},"server":{"code":"function SetPlayerState(source, key, value, replicated)\n Player(source).state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetPlayerState","metadata":{"export":"SetPlayer"},"stubCode":"--- **`STATE` `SERVER`**\n--- Set player state value.\n--- ```lua\n--- LT.State.SetPlayer(source, 'wanted', true)\n--- ```\n--- @param source number Player source\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to clients (default: true)\nfunction LT.State.SetPlayer(source, key, value, replicated) end"}]}},"@Streaming/RequestAnimDict":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestAnimDict(dict, timeout)\n return AwaitAssetLoad(RequestAnimDict, HasAnimDictLoaded, dict, timeout)\nend","stubs":[{"funcName":"StreamRequestAnimDict","metadata":{"export":"RequestAnimDict"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await an animation dictionary load.\n--- @param dict string Animation dictionary name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestAnimDict(dict, timeout) end"}]},"server":null},"@Streaming/RequestAnimSet":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestAnimSet(set, timeout)\n return AwaitAssetLoad(RequestAnimSet, HasAnimSetLoaded, set, timeout)\nend","stubs":[{"funcName":"StreamRequestAnimSet","metadata":{"export":"RequestAnimSet"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await an animation set load.\n--- @param set string Animation set name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestAnimSet(set, timeout) end"}]},"server":null},"@Streaming/RequestClipSet":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestClipSet(set, timeout)\n return AwaitAssetLoad(RequestClipSet, HasClipSetLoaded, set, timeout)\nend","stubs":[{"funcName":"StreamRequestClipSet","metadata":{"export":"RequestClipSet"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a clip set load.\n--- @param set string Clip set name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestClipSet(set, timeout) end"}]},"server":null},"@Streaming/RequestModel":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local joaat = joaat\nlocal tostring = tostring\nlocal IsModelValid = IsModelValid\n\nfunction StreamRequestModel(model, timeout)\n if type(model) == 'string' then model = joaat(model) end\n if not IsModelValid(model) then\n printf('error', 'Invalid model: %s', tostring(model))\n return false\n end\n return AwaitAssetLoad(RequestModel, HasModelLoaded, model, timeout)\nend","stubs":[{"funcName":"StreamRequestModel","metadata":{"export":"RequestModel"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a model load.\n--- ```lua\n--- if LT.Streaming.RequestModel('prop_cs_cardbox_01') then\n--- -- model loaded\n--- end\n--- ```\n--- @param model string|number Model name or hash\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestModel(model, timeout) end"}]},"server":null},"@Streaming/RequestPtfxAsset":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestPtfxAsset(asset, timeout)\n return AwaitAssetLoad(RequestNamedPtfxAsset, HasNamedPtfxAssetLoaded, asset, timeout)\nend","stubs":[{"funcName":"StreamRequestPtfxAsset","metadata":{"export":"RequestPtfxAsset"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a named PTFX asset load.\n--- @param asset string PTFX asset name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestPtfxAsset(asset, timeout) end"}]},"server":null},"@Streaming/RequestTexture":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestTexture(dict, timeout)\n return AwaitAssetLoad(RequestStreamedTextureDict, HasStreamedTextureDictLoaded, dict, timeout)\nend","stubs":[{"funcName":"StreamRequestTexture","metadata":{"export":"RequestTexture"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a texture dictionary load.\n--- @param dict string Texture dictionary name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestTexture(dict, timeout) end"}]},"server":null},"@Streaming/RequestWeaponAsset":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local joaat = joaat\n\nfunction StreamRequestWeaponAsset(hash, timeout)\n if type(hash) == 'string' then hash = joaat(hash) end\n return AwaitAssetLoad(function(h) RequestWeaponAsset(h, 31, 0) end, HasWeaponAssetLoaded, hash, timeout)\nend","stubs":[{"funcName":"StreamRequestWeaponAsset","metadata":{"export":"RequestWeaponAsset"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a weapon asset load.\n--- @param hash number|string Weapon hash or name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestWeaponAsset(hash, timeout) end"}]},"server":null},"@Streaming":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local GetGameTimer = GetGameTimer\nlocal tostring = tostring\n\nfunction AwaitAssetLoad(requestFn, checkFn, asset, timeout)\n if checkFn(asset) then return true end\n\n requestFn(asset)\n\n timeout = timeout or 5000\n local start = GetGameTimer()\n\n while not checkFn(asset) do\n if GetGameTimer() - start > timeout then\n printf('error', 'Failed to load asset \"%s\" (timed out after %dms)', tostring(asset), timeout)\n return false\n end\n Wait(0)\n end\n\n return true\nend","stubs":[{"funcName":"AwaitAssetLoad","metadata":{"internal":true},"stubCode":"--- **`STREAMING` `CLIENT`**\n\nfunction LT.Streaming.AwaitAssetLoad(requestFn, checkFn, asset, timeout) end"}]},"server":null},"@String/Capitalize":{"ns":"String","meta":{},"shared":{"code":"function StringCapitalize(str)\n return str:sub(1, 1):upper() .. str:sub(2)\nend","stubs":[{"funcName":"StringCapitalize","metadata":{"export":"Capitalize"},"stubCode":"--- **`STRING` `SHARED`**\n--- Capitalize first letter of a string.\n--- @param str string\n--- @return string\nfunction LT.String.Capitalize(str) end"}]},"client":null,"server":null},"@String/EndsWith":{"ns":"String","meta":{},"shared":{"code":"function StringEndsWith(str, suffix)\n return suffix == '' or str:sub(-#suffix) == suffix\nend","stubs":[{"funcName":"StringEndsWith","metadata":{"export":"EndsWith"},"stubCode":"--- **`STRING` `SHARED`**\n--- Check if string ends with given suffix.\n--- @param str string\n--- @param suffix string\n--- @return boolean\nfunction LT.String.EndsWith(str, suffix) end"}]},"client":null,"server":null},"@String/Split":{"ns":"String","meta":{},"shared":{"code":"function StringSplit(str, delimiter)\n local result = {}\n local from = 1\n local delim_from, delim_to = str:find(delimiter, from, true)\n\n while delim_from do\n result[#result + 1] = str:sub(from, delim_from - 1)\n from = delim_to + 1\n delim_from, delim_to = str:find(delimiter, from, true)\n end\n\n result[#result + 1] = str:sub(from)\n return result\nend","stubs":[{"funcName":"StringSplit","metadata":{"export":"Split"},"stubCode":"--- **`STRING` `SHARED`**\n--- Split a string by delimiter.\n--- ```lua\n--- LT.String.Split('hello-world-test', '-') -- {'hello', 'world', 'test'}\n--- ```\n--- @param str string\n--- @param delimiter string\n--- @return table\nfunction LT.String.Split(str, delimiter) end"}]},"client":null,"server":null},"@String/StartsWith":{"ns":"String","meta":{},"shared":{"code":"function StringStartsWith(str, prefix)\n return str:sub(1, #prefix) == prefix\nend","stubs":[{"funcName":"StringStartsWith","metadata":{"export":"StartsWith"},"stubCode":"--- **`STRING` `SHARED`**\n--- Check if string starts with given prefix.\n--- @param str string\n--- @param prefix string\n--- @return boolean\nfunction LT.String.StartsWith(str, prefix) end"}]},"client":null,"server":null},"@String/TitleCase":{"ns":"String","meta":{},"shared":{"code":"function StringTitleCase(str)\n return (str:gsub('(%a)([%w]*)', function(first, rest)\n return first:upper() .. rest:lower()\n end))\nend","stubs":[{"funcName":"StringTitleCase","metadata":{"export":"TitleCase"},"stubCode":"--- **`STRING` `SHARED`**\n--- Capitalize first letter of each word.\n--- ```lua\n--- LT.String.TitleCase('hello world') -- 'Hello World'\n--- ```\n--- @param str string\n--- @return string\nfunction LT.String.TitleCase(str) end"}]},"client":null,"server":null},"@String/Trim":{"ns":"String","meta":{},"shared":{"code":"function StringTrim(str)\n return (str:gsub('^%s+', ''):gsub('%s+$', ''))\nend","stubs":[{"funcName":"StringTrim","metadata":{"export":"Trim"},"stubCode":"--- **`STRING` `SHARED`**\n--- Trim whitespace from both ends of a string.\n--- @param str string\n--- @return string\nfunction LT.String.Trim(str) end"}]},"client":null,"server":null},"@Table/Contains":{"ns":"Table","meta":{},"shared":{"code":"function TableContains(tbl, value, iter)\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _, v in iterator(tbl) do\n if v == value then return true end\n end\n return false\nend","stubs":[{"funcName":"TableContains","metadata":{"export":"Contains"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Check if a table contains a value.\n--- @param tbl table\n--- @param value any\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return boolean\nfunction LT.Table.Contains(tbl, value, iter) end"}]},"client":null,"server":null},"@Table/DeepCopy":{"ns":"Table","meta":{},"shared":{"code":"function TableDeepCopy(tbl, iter)\n local copy = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n if type(v) == 'table' then\n copy[k] = TableDeepCopy(v, iter)\n else\n copy[k] = v\n end\n end\n\n return setmetatable(copy, getmetatable(tbl))\nend","stubs":[{"funcName":"TableDeepCopy","metadata":{"export":"DeepCopy"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Deep copy a table recursively.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.DeepCopy(tbl, iter) end"}]},"client":null,"server":null},"@Table/Filter":{"ns":"Table","meta":{},"shared":{"code":"function TableFilter(tbl, predicate, iter)\n local result = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n if predicate(v, k) then\n result[#result + 1] = v\n end\n end\n\n return result\nend","stubs":[{"funcName":"TableFilter","metadata":{"export":"Filter"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Filter a table by a predicate function.\n--- ```lua\n--- local evens = LT.Table.Filter({1, 2, 3, 4}, function(v) return v % 2 == 0 end)\n--- -- {2, 4}\n--- ```\n--- @param tbl table\n--- @param predicate fun(value: any, key: any): boolean\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Filter(tbl, predicate, iter) end"}]},"client":null,"server":null},"@Table/Keys":{"ns":"Table","meta":{},"shared":{"code":"function TableKeys(tbl, iter)\n local keys = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for k in iterator(tbl) do\n keys[#keys + 1] = k\n end\n return keys\nend","stubs":[{"funcName":"TableKeys","metadata":{"export":"Keys"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get all keys of a table.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Keys(tbl, iter) end"}]},"client":null,"server":null},"@Table/Map":{"ns":"Table","meta":{},"shared":{"code":"function TableMap(tbl, transform, iter)\n local result = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n result[k] = transform(v, k)\n end\n\n return result\nend","stubs":[{"funcName":"TableMap","metadata":{"export":"Map"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Map a table by a transform function.\n--- ```lua\n--- local doubled = LT.Table.Map({1, 2, 3}, function(v) return v * 2 end)\n--- -- {2, 4, 6}\n--- ```\n--- @param tbl table\n--- @param transform fun(value: any, key: any): any\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Map(tbl, transform, iter) end"}]},"client":null,"server":null},"@Table/Merge":{"ns":"Table","meta":{},"shared":{"code":"function TableMerge(base, override, iter)\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n local function deepCopy(t)\n local copy = {}\n for k, v in iterator(t) do\n copy[k] = type(v) == 'table' and deepCopy(v) or v\n end\n return setmetatable(copy, getmetatable(t))\n end\n\n local result = deepCopy(base)\n for k, v in iterator(override) do\n if type(v) == 'table' and type(result[k]) == 'table' then\n result[k] = TableMerge(result[k], v, iter)\n else\n result[k] = v\n end\n end\n return result\nend","stubs":[{"funcName":"TableMerge","metadata":{"export":"Merge"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Merge two tables. Override values take priority.\n--- Performs deep merge for nested tables.\n--- @param base table\n--- @param override table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Merge(base, override, iter) end"}]},"client":null,"server":null},"@Table/Size":{"ns":"Table","meta":{},"shared":{"code":"function TableSize(tbl, iter)\n local count = 0\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _ in iterator(tbl) do count = count + 1 end\n return count\nend","stubs":[{"funcName":"TableSize","metadata":{"export":"Size"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get size of a table (works for non-sequential tables by default).\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return number\nfunction LT.Table.Size(tbl, iter) end"}]},"client":null,"server":null},"@Table/Values":{"ns":"Table","meta":{},"shared":{"code":"function TableValues(tbl, iter)\n local values = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _, v in iterator(tbl) do\n values[#values + 1] = v\n end\n return values\nend","stubs":[{"funcName":"TableValues","metadata":{"export":"Values"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get all values of a table.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Values(tbl, iter) end"}]},"client":null,"server":null},"@Target/AddBoxZone":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddBoxZone(name, coords, size, heading, options, debug)\r\n local tName = GetTargetResource()\r\n options = FixOptions(options)\r\n local target\r\n if tName == 'ox_target' then\r\n target = Target:addBoxZone({\r\n coords = coords,\r\n size = size,\r\n rotation = heading,\r\n debug = debug or false,\r\n options = options,\r\n })\r\n elseif tName == 'qb-target' then\r\n Target:AddBoxZone(name, coords, size.x, size.y, {\r\n name = name,\r\n debugPoly = debug or false,\r\n heading = heading,\r\n minZ = coords.z - (size.z * 0.5),\r\n maxZ = coords.z + (size.z * 0.5),\r\n }, {\r\n options = options,\r\n distance = GetLargestDistance(options),\r\n })\r\n target = true\r\n end\r\n if target then\r\n AddZone(name)\r\n end\r\nend","stubs":[{"funcName":"AddBoxZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target box zone.\r\n--- @param name string Box name\r\n--- @param coords table Box cooords {x,y,z}\r\n--- @param size table Box size {x,y,z}\r\n--- @param heading number Box heading\r\n--- @param options table Options\r\n--- @param debug? boolean Debug\nfunction LT.Target.AddBoxZone(name, coords, size, heading, options, debug) end"}]},"server":null},"@Target/AddGlobalPed":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalPed(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalPed(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalPed({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalPed","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to peds (excluding players).\r\n--- @param options table Options\nfunction LT.Target.AddGlobalPed(options) end"}]},"server":null},"@Target/AddGlobalPlayer":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalPlayer(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalPlayer(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalPlayer({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalPlayer","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to all players.\r\n--- @param options table Options\nfunction LT.Target.AddGlobalPlayer(options) end"}]},"server":null},"@Target/AddGlobalVehicle":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalVehicle(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalVehicle(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalVehicle({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalVehicle","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to all vehicles.\r\n--- @param options table Options\nfunction LT.Target.AddGlobalVehicle(options) end"}]},"server":null},"@Target/AddLocalEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddLocalEntity(entities, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addLocalEntity(entities, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetEntity(entities, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddLocalEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options on non-networked entity(s).\r\n--- @param entities table|number Entity(s)\r\n--- @param options table Options\nfunction LT.Target.AddLocalEntity(entities, options) end"}]},"server":null},"@Target/AddModel":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddModel(models, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addModel(models, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetModel(models, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddModel","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options for specified model(s).\r\n--- @param models table|number Model(s)\r\n--- @param options table Options\nfunction LT.Target.AddModel(models, options) end"}]},"server":null},"@Target/AddNetworkedEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddNetworkedEntity(netids, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addEntity(netids, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetEntity(netids, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddNetworkedEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options on networked entity(s).\r\n--- @param netids table|number Net id(s)\r\n--- @param options table Options\nfunction LT.Target.AddNetworkedEntity(netids, options) end"}]},"server":null},"@Target/AddSphereZone":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddSphereZone(name, coords, radius, options, debug)\r\n local tName = GetTargetResource()\r\n options = FixOptions(options)\r\n local target\r\n if tName == 'ox_target' then\r\n target = Target:addSphereZone({\r\n coords = coords,\r\n radius = radius,\r\n name = name,\r\n debug = debug or false,\r\n options = options\r\n })\r\n elseif tName == 'qb-target' then\r\n Target:AddCircleZone(name, coords, radius, {\r\n name = name,\r\n debugPoly = debug or false,\r\n }, {\r\n options = options,\r\n distance = GetLargestDistance(options),\r\n })\r\n target = true\r\n end\r\n if target then\r\n AddZone(name)\r\n end\r\nend","stubs":[{"funcName":"AddSphereZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target sphere zone.\r\n---@param name string Zone name\r\n---@param coords table Zone coords\r\n---@param radius number Radius\r\n---@param options table Options\r\n---@param debug? boolean Debug mode\nfunction LT.Target.AddSphereZone(name, coords, radius, options, debug) end"}]},"server":null},"@Target/FixOptions":{"ns":"Target","meta":{"internal":true},"shared":null,"client":{"code":"local function fixOX(options)\r\n for i = 1, #options do\r\n local opt = options[i]\r\n local action = opt.onSelect or opt.action\r\n if not action then \r\n local _type = opt.type\r\n if _type and _type == \"server\" then\r\n opt.serverEvent = opt.event\r\n opt.event = nil\r\n end\r\n else\r\n local select = function(entityOrData)\r\n if type(entityOrData) == 'table' then\r\n return action(entityOrData.entity)\r\n end\r\n return action(entityOrData)\r\n end\r\n opt.onSelect = select\r\n end\r\n opt.groups = opt.job or opt.groups\r\n local optionsCanInteract = opt.canInteract\r\n if optionsCanInteract then\r\n local id = CreateCanInteract(optionsCanInteract)\r\n opt.canInteract = function(...)\r\n return CanInteract(id, ...)\r\n end\r\n end\r\n end\r\n return options\r\nend\r\nlocal function fixQB(options)\r\n for i = 1, #options do\r\n local opt = options[i]\r\n local action = opt.onSelect or opt.action\r\n local select = action and function(entityOrData)\r\n if type(entityOrData) == 'table' then\r\n return action(entityOrData.entity)\r\n end\r\n return action(entityOrData)\r\n end\r\n if opt.serverEvent then\r\n opt.type = \"server\"\r\n opt.event = opt.serverEvent\r\n elseif opt.event then\r\n opt.type = \"client\"\r\n opt.event = opt.event\r\n end\r\n options[i].action = select\r\n options[i].job = opt.job or opt.groups\r\n options[i].jobType = opt.jobType\r\n local optionsCanInteract = opt.canInteract\r\n if optionsCanInteract then\r\n local id = CreateCanInteract(optionsCanInteract)\r\n opt.canInteract = function(...)\r\n return CanInteract(id, ...)\r\n end\r\n end\r\n end\r\n return options\r\nend\r\nfunction FixOptions(options)\r\n local name = GetTargetResource()\r\n if not options or not name then return options end\r\n if name == 'ox_target' then\r\n return fixOX(options)\r\n elseif name == 'qb-target' then\r\n return fixQB(options)\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"FixOptions","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Internal function to fix options for working on all target systems.\r\n--- @param options table\r\n--- @return table\nfunction LT.Target.FixOptions(options) end"}]},"server":null},"@Target/GetLargestDistance":{"ns":"Target","meta":{"internal":true},"shared":null,"client":{"code":"function GetLargestDistance(options)\r\n local largestDistance = -1\r\n for _, v in pairs(options) do\r\n if v.distance and v.distance > largestDistance then\r\n largestDistance = v.distance\r\n end\r\n end\r\n return largestDistance ~= -1 and largestDistance or 2.0\r\nend","stubs":[{"funcName":"GetLargestDistance","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Get largest distance, internal.\r\n--- @param options any\r\n--- @return number\nfunction LT.Target.GetLargestDistance(options) end"}]},"server":null},"@Target/RemoveGlobalPed":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalPed(options)\r\n local name = GetTargetResource()\r\n if options then options = FixOptions(options) end\r\n if name == 'ox_target' then\r\n Target:removeGlobalPed(options)\r\n elseif name == 'qb-target' then\r\n Target:RemoveGlobalPed(options)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalPed","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all Peds.\r\n--- @param options? table Options\nfunction LT.Target.RemoveGlobalPed(options) end"}]},"server":null},"@Target/RemoveGlobalPlayer":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalPlayer(options)\r\n local name = GetTargetResource()\r\n if options then options = FixOptions(options) end\r\n if name == 'ox_target' then\r\n Target:removeGlobalPlayer(options)\r\n elseif name == 'qb-target' then\r\n Target:RemoveGlobalPlayer(options)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalPlayer","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all players.\r\n--- @param options? table Options\nfunction LT.Target.RemoveGlobalPlayer(options) end"}]},"server":null},"@Target/RemoveGlobalVehicle":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalVehicle(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n local labels = {}\r\n for k, v in pairs(options) do\r\n table.insert(labels, v.name)\r\n end\r\n Target:removeGlobalVehicle(labels)\r\n elseif name == 'qb-target' then\r\n local labels = {}\r\n for k, v in pairs(options) do\r\n table.insert(labels, v.label)\r\n end\r\n Target:RemoveGlobalVehicle(labels)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalVehicle","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all vehicles.\r\n--- @param options table Options\nfunction LT.Target.RemoveGlobalVehicle(options) end"}]},"server":null},"@Target/RemoveLocalEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveLocalEntity(entities, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeLocalEntity(entities, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetEntity(entities, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveLocalEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove target options on non-networked entity(s).\r\n--- @param entities table|number Entity(s)\r\n--- @param optionNames string|table Option(s)\nfunction LT.Target.RemoveLocalEntity(entities, optionNames) end"}]},"server":null},"@Target/RemoveModel":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveModel(models, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeModel(models, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetModel(models, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveModel","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove specified target options for specified model(s).\r\n--- @param models table|number Model(s)\r\n--- @param optionNames string|table Option name(s)\nfunction LT.Target.RemoveModel(models, optionNames) end"}]},"server":null},"@Target/RemoveNetworkedEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveNetworkedEntity(netids, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeEntity(netids, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetEntity(netids, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveNetworkedEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove target options from networked entity(s).\r\n--- @param netids table|number Net id(s)\r\n--- @param optionNames string|table Option name(s)\nfunction LT.Target.RemoveNetworkedEntity(netids, optionNames) end"}]},"server":null},"@Target/ToggleTargeting":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function ToggleTargeting(state)\r\n local name = GetTargetResource()\r\n if not Target or not name then return end\r\n if name == 'ox_target' then\r\n Target:disableTargeting(not state)\r\n elseif name == 'qb-target' then\r\n Target:AllowTargeting(state)\r\n end\r\nend","stubs":[{"funcName":"ToggleTargeting","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Toggle on/off targeting.\r\n--- @param state boolean `true` Can target | `false` Can't target.\nfunction LT.Target.ToggleTargeting(state) end"}]},"server":null},"@Target":{"ns":"Target","meta":{},"shared":null,"client":{"code":"LT_TARGET_NAME = nil\r\nTarget = {}\r\nlocal createdZones = {}\r\nlocal function detectTarget()\r\n if GetResourceState('ox_target') == 'started' then\r\n LT_TARGET_NAME = 'ox_target'\r\n elseif GetResourceState('qb-target') == 'started' then\r\n LT_TARGET_NAME = 'qb-target'\r\n end\r\n Target = exports[LT_TARGET_NAME]\r\nend\r\nfunction GetTargetResource()\r\n return LT_TARGET_NAME\r\nend\r\nfunction AddZone(name)\r\n createdZones[#createdZones+1] = name\r\nend\r\nfunction RemoveZone(name)\r\n if not name then return end\r\n for i, zoneName in ipairs(createdZones) do\r\n if zoneName == name then\r\n if LT_TARGET_NAME == 'ox_target' then\r\n Target:removeZone(name)\r\n elseif LT_TARGET_NAME == 'qb-target' then\r\n Target:RemoveZone(name)\r\n end\r\n table.remove(createdZones, i)\r\n break\r\n end\r\n end\r\nend\r\nlocal function createUniqueId(tbl, len, pattern)\r\n tbl = tbl or {}\r\n len = len or 8\r\n local id = \"\"\r\n for i = 1, len do\r\n local char = \"\"\r\n if pattern then\r\n local charIndex = math.random(1, #pattern)\r\n char = pattern:sub(charIndex, charIndex)\r\n else\r\n char = math.random(1, 2) == 1 and string.char(math.random(65, 90)) or string.format(\"%d\", math.random(10) - 1) \n end\r\n id = id .. char\r\n end\r\n if tbl[id] then\r\n return createUniqueId(tbl, len, pattern)\r\n end\r\n return id\r\nend\r\nlocal InteractIds = {}\r\nfunction CreateCanInteract(cb)\r\n if not cb then return end\r\n local id = createUniqueId(InteractIds)\r\n InteractIds[id] = {\r\n id = id,\r\n ableToInteract = -1,\r\n onInteract = cb\r\n }\r\n return id\r\nend\r\nfunction CanInteract(id, ...)\r\n local interactData = InteractIds[id]\r\n if not interactData then return true end\r\n if interactData.ableToInteract == -1 then\r\n local cb = interactData.onInteract\r\n local canInteractStatus = cb(...)\r\n interactData.ableToInteract = canInteractStatus and 1 or 0\r\n SetTimeout(1000, function()\r\n interactData.ableToInteract = -1\r\n end)\r\n end\r\n return interactData.ableToInteract > 0\r\nend\r\ndetectTarget()\r\nAddEventHandler('onResourceStop', function(resource)\r\n if resource ~= LT_RESOURCE_NAME then return end\r\n for _, zone in pairs(createdZones) do\r\n RemoveZone(zone)\r\n end\r\nend)","stubs":[{"funcName":"GetTargetResource","metadata":{"export":"GetResource"},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Returns target resource name.\r\n--- @return 'ox_target'|'qb-target'|nil\nfunction LT.Target.GetResource() end"},{"funcName":"AddZone","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- WARNING: Do not use this. This is a internal function.\nfunction LT.Target.AddZone(name) end"},{"funcName":"RemoveZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove a target zone.\r\n--- @param name string\nfunction LT.Target.RemoveZone(name) end"}]},"server":null},"@TextUI/HideTextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local exp = {}\r\nlocal adapters = {\r\n ['ox_lib'] = function()\r\n exp:hideTextUI()\r\n end,\r\n ['lt-ui'] = function()\r\n exp:hideTextUI()\r\n end,\r\n ['jg-textui'] = function()\r\n exp:HideText()\r\n end,\r\n ['esx_textui'] = function()\r\n exp:HideUI()\r\n end,\r\n ['okokTextUI'] = function()\r\n exp:Close()\r\n end,\r\n ['cd_drawtextui'] = function()\r\n TriggerEvent('cd_drawtextui:HideUI')\r\n end,\r\n ['lation_ui'] = function()\r\n exp:hideText()\r\n end,\r\n ['lab-HintUI'] = function()\r\n exp:Hide()\r\n end,\r\n}\r\nfunction HideTextUI()\r\n local resource = GetTextUIResource()\r\n if not resource then return end\r\n exp = exports[resource]\r\n local adapter = adapters[resource]\r\n if adapter then\r\n adapter()\r\n end\r\nend","stubs":[{"funcName":"HideTextUI","metadata":{"export":"Hide"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Hides Text UI from screen.\nfunction LT.TextUI.Hide() end"}]},"server":null},"@TextUI/ShowTextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local exp = {}\r\nlocal adapters = {\r\n ['ox_lib'] = function(text)\r\n exp:showTextUI(text)\r\n end,\r\n ['lt-ui'] = function(text)\r\n exp:showTextUI(text)\r\n end,\r\n ['jg-textui'] = function(text)\r\n exp:DrawText(text)\r\n end,\r\n ['esx_textui'] = function(text)\r\n exp:TextUI(text)\r\n end,\r\n ['okokTextUI'] = function(text)\r\n exp:Open(text, 'darkblue', 'right', false)\r\n end,\r\n ['cd_drawtextui'] = function(text)\r\n TriggerEvent('cd_drawtextui:ShowUI', 'show', text)\r\n end,\r\n ['lation_ui'] = function(text)\r\n exp:showText({description = text, position = 'right-center'})\r\n end,\r\n ['lab-HintUI'] = function(text)\r\n exp:Show(text, 'Hint')\r\n end,\r\n}\r\nfunction ShowTextUI(text)\r\n local resource = GetTextUIResource()\r\n if not resource then return end\r\n exp = exports[resource]\r\n local adapter = adapters[resource]\r\n if adapter then\r\n adapter(tostring(text))\r\n end\r\nend","stubs":[{"funcName":"ShowTextUI","metadata":{"export":"Show"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Show Text UI on screen.\r\n--- @param text string Text to show on screen.\nfunction LT.TextUI.Show(text) end"}]},"server":null},"@TextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['jg-textui'] = {},\r\n ['esx_textui'] = {},\r\n ['okokTextUI'] = {},\r\n ['cd_drawtextui'] = {},\r\n ['lation_ui'] = {},\r\n ['lab-HintUI'] = {},\r\n}\r\nfunction GetTextUIResource()\r\n return resourceName\r\nend\r\nfunction SetTextUIResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'TextUI resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'textui')\r\nif resource then\r\n SetTextUIResource(resource)\r\nend","stubs":[{"funcName":"GetTextUIResource","metadata":{"export":"GetResource"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Returns TextUI resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'jg-textui'|'esx_textui'|'okokTextUI'|'cd_drawtextui'|'lation_ui'|'lab-HintUI'|nil\nfunction LT.TextUI.GetResource() end"},{"funcName":"SetTextUIResource","metadata":{"export":"SetResource"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Force set TextUI resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'jg-textui'|'esx_textui'|'okokTextUI'|'cd_drawtextui'|'lation_ui'|'lab-HintUI'\nfunction LT.TextUI.SetResource(name) end"}]},"server":null},"@Utils/GetClosestObject":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestObject(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestObj, closestDist\n\n for _, obj in ipairs(GetGamePool('CObject')) do\n local dist = #(coords - GetEntityCoords(obj))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestObj = obj\n closestDist = dist\n end\n end\n\n return closestObj, closestDist\nend","stubs":[{"funcName":"GetClosestObject","metadata":{"export":"GetClosestObject"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest object to given coords.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? object, number? distance\nfunction LT.Utils.GetClosestObject(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestPed":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\nlocal IsPedAPlayer = IsPedAPlayer\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestPed(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestPed, closestDist\n local myPed = PlayerPedId()\n\n for _, ped in ipairs(GetGamePool('CPed')) do\n if ped ~= myPed and not IsPedAPlayer(ped) then\n local dist = #(coords - GetEntityCoords(ped))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestPed = ped\n closestDist = dist\n end\n end\n end\n\n return closestPed, closestDist\nend","stubs":[{"funcName":"GetClosestPed","metadata":{"export":"GetClosestPed"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest ped to given coords (excluding players).\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? ped, number? distance\nfunction LT.Utils.GetClosestPed(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestPlayer":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetActivePlayers = GetActivePlayers\nlocal GetPlayerPed = GetPlayerPed\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerId = PlayerId\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestPlayer(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestId, closestPed, closestDist\n local myId = PlayerId()\n\n for _, id in ipairs(GetActivePlayers()) do\n if id ~= myId then\n local ped = GetPlayerPed(id)\n local dist = #(coords - GetEntityCoords(ped))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestId = id\n closestPed = ped\n closestDist = dist\n end\n end\n end\n\n return closestId, closestPed, closestDist\nend","stubs":[{"funcName":"GetClosestPlayer","metadata":{"export":"GetClosestPlayer"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest player to given coords.\n--- ```lua\n--- local playerId, ped, dist = LT.Utils.GetClosestPlayer()\n--- ```\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? playerId, number? ped, number? distance\nfunction LT.Utils.GetClosestPlayer(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestVehicle":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestVehicle(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestVeh, closestDist\n\n for _, veh in ipairs(GetGamePool('CVehicle')) do\n local dist = #(coords - GetEntityCoords(veh))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestVeh = veh\n closestDist = dist\n end\n end\n\n return closestVeh, closestDist\nend","stubs":[{"funcName":"GetClosestVehicle","metadata":{"export":"GetClosestVehicle"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest vehicle to given coords.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? vehicle, number? distance\nfunction LT.Utils.GetClosestVehicle(coords, maxDistance) end"}]},"server":null},"@Utils/GetPlayersInArea":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetActivePlayers = GetActivePlayers\nlocal GetPlayerPed = GetPlayerPed\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerId = PlayerId\nlocal PlayerPedId = PlayerPedId\n\nfunction GetPlayersInArea(coords, radius)\n coords = coords or GetEntityCoords(PlayerPedId())\n local players = {}\n local myId = PlayerId()\n\n for _, id in ipairs(GetActivePlayers()) do\n if id ~= myId then\n local ped = GetPlayerPed(id)\n local dist = #(coords - GetEntityCoords(ped))\n if dist <= radius then\n players[#players + 1] = { id = id, ped = ped, dist = dist }\n end\n end\n end\n\n return players\nend","stubs":[{"funcName":"GetPlayersInArea","metadata":{"export":"GetPlayersInArea"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get all players within a radius.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param radius number\n--- @return table Array of { id, ped, dist }\nfunction LT.Utils.GetPlayersInArea(coords, radius) end"}]},"server":null},"@VehicleKeys/GiveKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['qb-vehiclekeys'] = function(vehicle, plate)\r\n TriggerServerEvent(\"qb-vehiclekeys:server:AcquireVehicleKeys\", plate)\r\n end,\r\n ['qbx_vehiclekeys'] = function(vehicle, plate)\r\n TriggerServerEvent(\"qb-vehiclekeys:server:AcquireVehicleKeys\", plate)\r\n end,\r\n ['qs-vehiclekeys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['qs-vehiclekeys']:GiveKeys(plate, model, true)\r\n end,\r\n ['mk_vehiclekeys'] = function(vehicle, plate)\r\n exports[\"mk_vehiclekeys\"]:AddKey(vehicle)\r\n end,\r\n ['0r-vehiclekeys'] = function(vehicle, plate)\r\n exports['0r-vehiclekeys']:GiveKeys(plate)\r\n end,\r\n ['MrNewbVehicleKeys'] = function(vehicle, plate)\r\n exports.MrNewbVehicleKeys:GiveKeysByPlate(plate)\r\n end,\r\n ['t1ger_keys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['t1ger_keys']:GiveTemporaryKeys(plate, model, '')\r\n end,\r\n ['mVehicle'] = function(vehicle, plate)\r\n exports.mVehicle:AddTemporalVehicleClient(vehicle)\r\n end,\r\n ['okokGarage'] = function(vehicle, plate)\r\n TriggerServerEvent('okokGarage:GiveKeys', plate)\r\n end\r\n}\r\nfunction GiveKeys(vehicle, plate)\r\n local name = GetKeysResource()\r\n if not name then return false end\r\n if not vehicle or not DoesEntityExist(vehicle) then return false end\r\n if not plate then\r\n plate = GetVehicleNumberPlateText(vehicle)\r\n end\r\n local adapter = adapters[name]\r\n if not adapter then return false end\r\n adapter(vehicle, plate)\r\n return true\r\nend","stubs":[{"funcName":"GiveKeys","metadata":{"export":"Give"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Give player(self) the keys of specified vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @param plate? string Plate of vehicle\r\n--- @return boolean\nfunction LT.VehicleKeys.Give(vehicle, plate) end"}]},"server":null},"@VehicleKeys/RemoveKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['qb-vehiclekeys'] = function(vehicle, plate)\r\n TriggerEvent(\"qb-vehiclekeys:client:RemoveKeys\", plate)\r\n end,\r\n ['qbx_vehiclekeys'] = function(vehicle, plate)\r\n TriggerEvent(\"qb-vehiclekeys:client:RemoveKeys\", plate)\r\n end,\r\n ['qs-vehiclekeys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['qs-vehiclekeys']:RemoveKeys(plate, model)\r\n end,\r\n ['mk_vehiclekeys'] = function(vehicle, plate)\r\n exports[\"mk_vehiclekeys\"]:RemoveKey(vehicle)\r\n end,\r\n ['0r-vehiclekeys'] = function(vehicle, plate)\r\n exports['0r-vehiclekeys']:RemoveKeys(plate)\r\n end,\r\n ['MrNewbVehicleKeys'] = function(vehicle, plate)\r\n exports.MrNewbVehicleKeys:RemoveKeysByPlate(plate)\r\n end,\r\n ['t1ger_keys'] = function(vehicle, plate)\r\n printf('error', '^4t1ger_keys^7 does not support removing keys.')\r\n end,\r\n ['mVehicle'] = function(vehicle, plate)\r\n printf('error', '^4mVehicle^7 does not support removing keys.')\r\n end,\r\n ['okokGarage'] = function(vehicle, plate)\r\n local src = GetPlayerServerId(PlayerId())\r\n TriggerServerEvent(\"okokGarage:RemoveKeys\", plate, src)\r\n end\r\n}\r\nfunction RemoveKeys(vehicle, plate)\r\n local name = GetKeysResource()\r\n if not name then return false end\r\n if not vehicle or not DoesEntityExist(vehicle) then return false end\r\n if not plate then\r\n plate = GetVehicleNumberPlateText(vehicle)\r\n end\r\n local adapter = adapters[name]\r\n if not adapter then return false end\r\n adapter(vehicle, plate)\r\n return true\r\nend","stubs":[{"funcName":"RemoveKeys","metadata":{"export":"Remove"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Remove specified vehicle keys from player(self).\r\n--- @param vehicle number Vehicle entity.\r\n--- @param plate? string Plate of vehicle\r\n--- @return boolean\nfunction LT.VehicleKeys.Remove(vehicle, plate) end"}]},"server":null},"@VehicleKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['qb-vehiclekeys'] = { providers = {'qbx_vehiclekeys'} },\r\n ['qbx_vehiclekeys'] = {},\r\n ['qs-vehiclekeys'] = {},\r\n ['mk_vehiclekeys'] = {},\r\n ['0r-vehiclekeys'] = {},\r\n ['MrNewbVehicleKeys'] = {},\r\n ['t1ger_keys'] = {},\r\n ['mVehicle'] = {},\r\n ['okokGarage'] = {}\r\n}\r\nfunction GetKeysResource()\r\n return resourceName\r\nend\r\nfunction SetKeysResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Vehiclekeys resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'vehiclekeys')\r\nif resource then\r\n SetKeysResource(resource)\r\nend","stubs":[{"funcName":"GetKeysResource","metadata":{"export":"GetResource"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Returns vehicle key resource name.\r\n--- @return 'qb-vehiclekeys'|'qbx_vehiclekeys'|'qs-vehiclekeys'|'mk_vehiclekeys'|'0r-vehiclekeys'|'MrNewbVehicleKeys'|'t1ger_keys'|'mVehicle'|'okokGarage'|nil\nfunction LT.VehicleKeys.GetResource() end"},{"funcName":"SetKeysResource","metadata":{"export":"SetResource"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Force set vehicle key resource.\r\n--- Useful for config assignment.\r\n--- @param name 'qb-vehiclekeys'|'qbx_vehiclekeys'|'qs-vehiclekeys'|'mk_vehiclekeys'|'0r-vehiclekeys'|'MrNewbVehicleKeys'|'t1ger_keys'|'mVehicle'|'okokGarage'\nfunction LT.VehicleKeys.SetResource(name) end"}]},"server":null},"@Version/CheckDependency":{"ns":"Version","meta":{},"shared":{"code":"local function parseVersion(versionString)\r\n if not versionString then return nil end\r\n local parts = {}\r\n for num in string.gmatch(versionString, \"(%d+)\") do\r\n table.insert(parts, tonumber(num))\r\n end\r\n return {\r\n major = parts[1] or 0,\r\n minor = parts[2] or 0,\r\n patch = parts[3] or 0\r\n }\r\nend\r\nlocal function compareVersions(v1, v2)\r\n local ver1 = parseVersion(v1)\r\n local ver2 = parseVersion(v2)\r\n if not ver1 or not ver2 then return 0 end\r\n if ver1.major > ver2.major then return 1 end\r\n if ver1.major < ver2.major then return -1 end\r\n if ver1.minor > ver2.minor then return 1 end\r\n if ver1.minor < ver2.minor then return -1 end\r\n if ver1.patch > ver2.patch then return 1 end\r\n if ver1.patch < ver2.patch then return -1 end\r\n return 0\r\nend\r\nfunction CheckDependency(resourceName, minVersion)\r\n if not resourceName or not minVersion then return false end\r\n local isStarted = GetResourceState(resourceName) ~= 'missing'\r\n if not isStarted then return false end\r\n local currentVersion = GetResourceMetadata(resourceName, 'version', 0)\r\n if not currentVersion then return false end\r\n local comparison = compareVersions(currentVersion, minVersion)\r\n if comparison < 0 then\r\n printf('error', 'Dependency failed: ^3\\'%s\\'^7 ^1v%s^7 < ^2%s^7 (required)', resourceName, currentVersion, minVersion)\r\n return false\r\n end\r\n return true\r\nend","stubs":[{"funcName":"CheckDependency","metadata":{},"stubCode":"--- **`VERSION` `SHARED`**\n--- Check if a resource dependency is met.\r\n--- ```lua\r\n--- if not LT.Version.CheckDependency('resourceName', '1.0.0') then\r\n--- error()\r\n--- end\r\n--- ```\r\n--- @param resourceName string Resource to check\r\n--- @param minVersion string Minimum required version (e.g. \"1.0.0\")\r\n--- @return boolean\nfunction LT.Version.CheckDependency(resourceName, minVersion) end"}]},"client":null,"server":null},"@Version/CheckVersion":{"ns":"Version","meta":{},"shared":null,"client":null,"server":{"code":"local format = string.format\r\nlocal PerformHttpRequest = PerformHttpRequest\r\nlocal function resolvePrintFormats(messages)\r\n return {\r\n upToDate = (messages and messages.upToDate) or '^2[%s]^7 Up-to-date (v%s)',\r\n updateAvailable = (messages and messages.updateAvailable) or '^3[%s]^7 Update available: ^1v%s^7 → ^2v%s^7',\r\n download = (messages and messages.download) or ' Download: ^4%s^7',\r\n }\r\nend\r\nlocal function extractSemver(s)\r\n if not s then return nil end\r\n return s:match('%d+%.%d+%.%d+')\r\nend\r\nlocal function printVersionStatus(resourceName, msgs, currentShown, remoteShown, needsUpdate, downloadLink)\r\n if not needsUpdate then\r\n print(format(msgs.upToDate, resourceName, currentShown))\r\n return\r\n end\r\n print(format(msgs.updateAvailable, resourceName, currentShown, remoteShown))\r\n print(format(msgs.download, downloadLink))\r\nend\r\nlocal function parseRemoteFromUrlBody(fileType, body, resourceName)\r\n if fileType == 'JSON' then\r\n local decoded = json.decode(body)\r\n if not decoded or not decoded[resourceName] then\r\n printf('warning',\r\n 'Version check for %s resource failed. No matching version was found on the source, or the source URL could not be reached.',\r\n resourceName)\r\n return nil\r\n end\r\n return decoded[resourceName]\r\n end\r\n if fileType == 'PLAIN' then\r\n return tostring(body):gsub('%s+', '')\r\n end\r\n printf('warning', 'Invalid version file type: %s', fileType)\r\n return nil\r\nend\r\nfunction CheckVersion(data, messages)\r\n local resourceName <const> = (data and data.resourceName) or LT_RESOURCE_NAME\r\n local currentVersion <const> = GetResourceMetadata(resourceName, 'version', 0)\r\n if not currentVersion then\r\n return printf('warning', 'No version found for resource %s.', resourceName)\r\n end\r\n local msgs <const> = resolvePrintFormats(messages)\r\n local repo <const> = data and (data.repository or data.repo) or nil\r\n if repo ~= nil then\r\n local currentSemver <const> = extractSemver(currentVersion)\r\n if not currentSemver then\r\n printf('warning', 'Unable to determine semantic version (x.y.z) for %s. Found: %s', resourceName,\r\n currentVersion)\r\n return\r\n end\r\n PerformHttpRequest(format('https://api.github.com/repos/%s/releases/latest', repo),\r\n function(statusCode, body)\r\n if statusCode ~= 200 then return end\r\n local payload = json.decode(body)\r\n if not payload or payload.prerelease or not payload.tag_name then return end\r\n local latestSemver = extractSemver(payload.tag_name)\r\n local needsUpdate = latestSemver ~= nil and latestSemver ~= currentSemver\r\n printVersionStatus(resourceName, msgs, currentSemver, latestSemver or '', needsUpdate,\r\n needsUpdate and (payload.html_url or '') or '')\r\n end, 'GET')\r\n return\r\n end\r\n local fileType = (data and data.fileType) or 'JSON'\r\n local url = data and data.url\r\n if not url then\r\n return printf('warning', 'No URL provided for resource version check %s.', resourceName)\r\n end\r\n local downloadURL <const> = (data and data.downloadUrl) or ''\r\n PerformHttpRequest(url, function(statusCode, body, _)\r\n if statusCode ~= 200 or not body then return end\r\n local remoteVersion = parseRemoteFromUrlBody(fileType, body, resourceName)\r\n if not remoteVersion or remoteVersion == '' then return end\r\n local needsUpdate = currentVersion ~= remoteVersion\r\n printVersionStatus(resourceName, msgs, currentVersion, remoteVersion, needsUpdate, downloadURL)\r\n end, 'GET')\r\nend","stubs":[{"funcName":"CheckVersion","metadata":{"export":"Check"},"stubCode":"--- **`VERSION` `SERVER`**\n--- Compares resource version against GitHub latest release or a remote JSON / PLAIN URL.\r\n--- \r\n--- `data`: use `repository` or `repo`, **or** `url`. JSON expects `{ [resourceName] = \"x.y.z\" }`.\r\n--- \r\n--- Optional `messages`: `{ upToDate, updateAvailable, download }` format strings for console output.\r\n--- @param data table\r\n--- @param messages? table\nfunction LT.Version.Check(data, messages) end"}]}},"@Version/GetVersion":{"ns":"Version","meta":{},"shared":null,"client":null,"server":{"code":"function GetVersion(resourceName)\r\n local res = resourceName or LT_RESOURCE_NAME\r\n if GetResourceState(res) == 'missing' then return end\r\n return GetResourceMetadata(res, 'version', 0)\r\nend","stubs":[{"funcName":"GetVersion","metadata":{"export":"Get"},"stubCode":"--- **`VERSION` `SERVER`**\n--- Returns the specific resources version.\r\n--- @param resourceName? string Defaults to current resource name.\r\n--- @return string?\nfunction LT.Version.Get(resourceName) end"}]}},"__init__":{"ns":null,"meta":{},"shared":{"code":"LT_RESOURCE_NAME = GetCurrentResourceName()\r\nlocal print = print\r\nlocal format = string.format\r\nLT_DISABLE_DEBUG = false\r\nfunction printf(type, message, ...)\r\n if LT_DISABLE_DEBUG and type ~= 'error' then return end \n local prefix = {\r\n error = '^1[LTBRIDGE] ERROR:^7 ',\r\n warning = '^3[LTBRIDGE] WARN:^7 ',\r\n }\r\n print((prefix[type] and prefix[type] or '^7 ') .. format(message, ...) .. '^7')\r\nend","stubs":[{"funcName":"printf","metadata":{"internal":true},"stubCode":"--- **`GENERAL` `SHARED`**\n--- Internal print/debug function of LTBridge, use this and not the original `print()` when creating modules.\r\n--- @param type? 'error'|'warning'\r\n--- @param message string Print message\r\n--- @param ...? any Additional parameters\r\n--- @diagnostic disable-next-line: lowercase-global\nfunction LT.printf(type, message, ...) end"}]},"client":null,"server":null}},"exportMap":{"GetResource":["@Alert","@Dispatch","@Framework","@Fuel","@Input","@Inventory","@Menu","@Notify","@Phone","@Progress","@Target","@TextUI","@VehicleKeys"],"Alert.GetResource":["@Alert"],"GetAlertResource":["@Alert"],"SetResource":["@Alert","@Dispatch","@Fuel","@Input","@Inventory","@Menu","@Notify","@Phone","@Progress","@TextUI","@VehicleKeys"],"Alert.SetResource":["@Alert"],"SetAlertResource":["@Alert"],"Send":["@Alert","@Dispatch","@Notify","@NUI/Send"],"Alert.Send":["@Alert"],"SendAlert":["@Alert"],"Get":["@Cache","@Locale","@State/Get","@Version/GetVersion"],"Cache.Get":["@Cache"],"GetCache":["@Cache"],"OnChange":["@Cache","@State/OnChange"],"Cache.OnChange":["@Cache"],"OnCacheChange":["@Cache"],"Register":["@Callback","@Events/Register"],"Callback.Register":["@Callback"],"RegisterCallback":["@Callback"],"Await":["@Callback"],"Callback.Await":["@Callback"],"AwaitCallback":["@Callback"],"Trigger":["@Callback"],"Callback.Trigger":["@Callback"],"TriggerAsyncCallback":["@Callback"],"Create":["@Class","@Logger"],"Class.Create":["@Class"],"CreateClass":["@Class"],"Start":["@Cooldown","@Hooks/Start"],"Cooldown.Start":["@Cooldown"],"StartCooldown":["@Cooldown"],"Check":["@Cooldown","@NUI","@Version/CheckVersion"],"Cooldown.Check":["@Cooldown"],"CheckCooldown":["@Cooldown"],"Remaining":["@Cooldown"],"Cooldown.Remaining":["@Cooldown"],"GetCooldownRemaining":["@Cooldown"],"Clear":["@Cooldown"],"Cooldown.Clear":["@Cooldown"],"ClearCooldown":["@Cooldown"],"SetMode":["@Debug"],"Debug.SetMode":["@Debug"],"SetDebugMode":["@Debug"],"Detailed":["@Debug"],"Debug.Detailed":["@Debug"],"DebugDetailed":["@Debug"],"Print":["@Debug"],"Debug.Print":["@Debug"],"DebugPrint":["@Debug"],"Info":["@Debug"],"Debug.Info":["@Debug"],"DebugInfo":["@Debug"],"Success":["@Debug"],"Debug.Success":["@Debug"],"DebugSuccess":["@Debug"],"Error":["@Debug"],"Debug.Error":["@Debug"],"DebugError":["@Debug"],"Warn":["@Debug"],"Debug.Warn":["@Debug"],"DebugWarn":["@Debug"],"Verbose":["@Debug"],"Debug.Verbose":["@Debug"],"DebugVerbose":["@Debug"],"Dispatch.GetResource":["@Dispatch"],"GetDispatchResource":["@Dispatch"],"Dispatch.SetResource":["@Dispatch"],"SetDispatchResource":["@Dispatch"],"Dispatch.Send":["@Dispatch"],"SendDispatch":["@Dispatch"],"Emit":["@Events/Emit"],"Events.Emit":["@Events/Emit"],"EventEmit":["@Events/Emit"],"EmitNet":["@Events/EmitNet"],"Events.EmitNet":["@Events/EmitNet"],"EventEmitNet":["@Events/EmitNet"],"Events.Register":["@Events/Register"],"EventRegister":["@Events/Register"],"Framework.GetFrameworkJobs":["@Framework/GetFrameworkJobs"],"GetFrameworkJobs":["@Framework/GetFrameworkJobs"],"Framework.GetPlayerJobData":["@Framework/GetPlayerJobData"],"GetPlayerJobData":["@Framework/GetPlayerJobData"],"Framework.SetPlayerJob":["@Framework/SetPlayerJob"],"SetPlayerJob":["@Framework/SetPlayerJob"],"Framework.AddMoney":["@Framework/AddMoney"],"AddMoney":["@Framework/AddMoney"],"Framework.GetMoney":["@Framework/GetMoney"],"GetMoney":["@Framework/GetMoney"],"Framework.RemoveMoney":["@Framework/RemoveMoney"],"RemoveMoney":["@Framework/RemoveMoney"],"Framework.AddHunger":["@Framework/AddHunger"],"AddHunger":["@Framework/AddHunger"],"Framework.AddThirst":["@Framework/AddThirst"],"AddThirst":["@Framework/AddThirst"],"Framework.GetHunger":["@Framework/GetHunger"],"GetHunger":["@Framework/GetHunger"],"Framework.GetPlayerMetadata":["@Framework/GetPlayerMetadata"],"GetPlayerMetadata":["@Framework/GetPlayerMetadata"],"Framework.GetThirst":["@Framework/GetThirst"],"GetThirst":["@Framework/GetThirst"],"Framework.IsPlayerDead":["@Framework/IsPlayerDead"],"IsPlayerDead":["@Framework/IsPlayerDead"],"Framework.IsPlayerLoaded":["@Framework/IsPlayerLoaded"],"IsPlayerLoaded":["@Framework/IsPlayerLoaded"],"Framework.SetPlayerMetadata":["@Framework/SetPlayerMetadata"],"SetPlayerMetadata":["@Framework/SetPlayerMetadata"],"Framework.GetOwnedVehicles":["@Framework/GetOwnedVehicles"],"GetOwnedVehicles":["@Framework/GetOwnedVehicles"],"Framework.IsVehicleOwnedByPlayer":["@Framework/IsVehicleOwnedByPlayer"],"IsVehicleOwnedByPlayer":["@Framework/IsVehicleOwnedByPlayer"],"Framework.GetPlayer":["@Framework/GetPlayer"],"GetPlayer":["@Framework/GetPlayer","@State/GetPlayer"],"Framework.GetPlayerBirthdate":["@Framework/GetPlayerBirthdate"],"GetPlayerBirthdate":["@Framework/GetPlayerBirthdate"],"Framework.GetPlayerByCitizenId":["@Framework/GetPlayerByCitizenId"],"GetPlayerByCitizenId":["@Framework/GetPlayerByCitizenId"],"Framework.GetPlayerCitizenId":["@Framework/GetPlayerCitizenId"],"GetPlayerCitizenId":["@Framework/GetPlayerCitizenId"],"Framework.GetPlayerData":["@Framework/GetPlayerData"],"GetPlayerData":["@Framework/GetPlayerData"],"Framework.GetPlayerName":["@Framework/GetPlayerName"],"GetPlayerName":["@Framework/GetPlayerName"],"Framework.GetPlayerPhoneNumber":["@Framework/GetPlayerPhoneNumber"],"GetPlayerPhoneNumber":["@Framework/GetPlayerPhoneNumber"],"Framework.GetPlayers":["@Framework/GetPlayers"],"GetPlayers":["@Framework/GetPlayers"],"Framework.GetPlayerSourceByCitizenId":["@Framework/GetPlayerSourceByCitizenId"],"GetPlayerSourceByCitizenId":["@Framework/GetPlayerSourceByCitizenId"],"Framework.IsFrameworkAdmin":["@Framework/IsFrameworkAdmin"],"IsFrameworkAdmin":["@Framework/IsFrameworkAdmin"],"Framework.RegisterUsableItem":["@Framework/RegisterUsableItem"],"RegisterUsableItem":["@Framework/RegisterUsableItem"],"Framework.GetResource":["@Framework"],"GetFramework":["@Framework"],"Fuel.GetFuel":["@Fuel/GetFuel"],"GetFuel":["@Fuel/GetFuel"],"Fuel.SetFuel":["@Fuel/SetFuel"],"SetFuel":["@Fuel/SetFuel"],"Fuel.GetResource":["@Fuel"],"GetFuelResource":["@Fuel"],"Fuel.SetResource":["@Fuel"],"SetFuelResource":["@Fuel"],"Hooks.Start":["@Hooks/Start"],"OnResourceStart":["@Hooks/Start"],"Stop":["@Hooks/Stop"],"Hooks.Stop":["@Hooks/Stop"],"OnResourceStop":["@Hooks/Stop"],"Input.GetResource":["@Input"],"GetInputResource":["@Input"],"Input.SetResource":["@Input"],"SetInputResource":["@Input"],"Open":["@Input","@Menu","@Progress"],"Input.Open":["@Input"],"OpenInput":["@Input"],"Inventory.AddItem":["@Inventory/AddItem"],"AddItem":["@Inventory/AddItem"],"Inventory.CanCarryItem":["@Inventory/CanCarryItem"],"CanCarryItem":["@Inventory/CanCarryItem"],"Inventory.GetItemBySlot":["@Inventory/GetItemBySlot"],"GetItemBySlot":["@Inventory/GetItemBySlot"],"GetItemCount":["@Inventory/GetItemCount"],"Inventory.GetItemCount":["@Inventory/GetItemCount"],"GetItemCountClient":["@Inventory/GetItemCount"],"GetItemCountServer":["@Inventory/GetItemCount"],"Inventory.GetItemImage":["@Inventory/GetItemImage"],"GetItemImage":["@Inventory/GetItemImage"],"Inventory.GetItemInfo":["@Inventory/GetItemInfo"],"GetItemInfo":["@Inventory/GetItemInfo"],"Inventory.GetPlayerInventory":["@Inventory/GetPlayerInventory"],"GetPlayerInventory":["@Inventory/GetPlayerInventory"],"Inventory.HasItem":["@Inventory/HasItem"],"HasItem":["@Inventory/HasItem"],"Inventory.RemoveItem":["@Inventory/RemoveItem"],"RemoveItem":["@Inventory/RemoveItem"],"Inventory.SetItemMetadata":["@Inventory/SetItemMetadata"],"SetItemMetadata":["@Inventory/SetItemMetadata"],"Inventory.GetResource":["@Inventory"],"GetInventoryResource":["@Inventory"],"Inventory.SetResource":["@Inventory"],"SetInventoryResource":["@Inventory"],"OnPlayerLoad":["@LoadUnload"],"OnPlayerUnload":["@LoadUnload"],"Init":["@Locale","@Logger"],"Locale.Init":["@Locale"],"InitLocale":["@Locale"],"Locale.Get":["@Locale"],"GetString":["@Locale"],"GetAllStrings":["@Locale"],"Locale.GetAllStrings":["@Locale"],"GetLocaleStrings":["@Locale"],"GetCurrentKey":["@Locale"],"Locale.GetCurrentKey":["@Locale"],"GetCurrentLocaleKey":["@Locale"],"Logger.Init":["@Logger"],"InitLogger":["@Logger"],"Logger.Create":["@Logger"],"CreateLog":["@Logger"],"Clamp":["@Math/Clamp"],"Math.Clamp":["@Math/Clamp"],"MathClamp":["@Math/Clamp"],"FormatMoney":["@Math/FormatMoney"],"Math.FormatMoney":["@Math/FormatMoney"],"MathFormatMoney":["@Math/FormatMoney"],"FormatNumber":["@Math/FormatNumber"],"Math.FormatNumber":["@Math/FormatNumber"],"MathFormatNumber":["@Math/FormatNumber"],"Lerp":["@Math/Lerp"],"Math.Lerp":["@Math/Lerp"],"MathLerp":["@Math/Lerp"],"MapRange":["@Math/MapRange"],"Math.MapRange":["@Math/MapRange"],"MathMapRange":["@Math/MapRange"],"RandomFloat":["@Math/RandomFloat"],"Math.RandomFloat":["@Math/RandomFloat"],"MathRandomFloat":["@Math/RandomFloat"],"Round":["@Math/Round"],"Math.Round":["@Math/Round"],"MathRound":["@Math/Round"],"Menu.GetResource":["@Menu"],"GetMenuResource":["@Menu"],"Menu.SetResource":["@Menu"],"SetMenuResource":["@Menu"],"Menu.Open":["@Menu"],"OpenMenu":["@Menu"],"Notify.GetResource":["@Notify"],"GetNotifyResource":["@Notify"],"Notify.SetResource":["@Notify"],"SetNotifyResource":["@Notify"],"Notify.Send":["@Notify"],"SendNotify":["@Notify"],"Callback":["@NUI/Callback"],"NUI.Callback":["@NUI/Callback"],"NUICallback":["@NUI/Callback"],"Focus":["@NUI/Focus"],"NUI.Focus":["@NUI/Focus"],"NUIFocus":["@NUI/Focus"],"Request":["@NUI/Request"],"NUI.Request":["@NUI/Request"],"NUIRequest":["@NUI/Request"],"NUI.Send":["@NUI/Send"],"SendNUI":["@NUI/Send"],"CreateState":["@NUI/State"],"NUI.CreateState":["@NUI/State"],"CreateNUIState":["@NUI/State"],"NUI.Check":["@NUI"],"CheckNUI":["@NUI"],"IsLoaded":["@NUI"],"NUI.IsLoaded":["@NUI"],"IsNUILoaded":["@NUI"],"Phone.GetNumber":["@Phone/GetNumber"],"GetNumber":["@Phone/GetNumber"],"SendMail":["@Phone/SendMail"],"Phone.SendMail":["@Phone/SendMail"],"Phone.GetResource":["@Phone"],"GetPhoneResource":["@Phone"],"Phone.SetResource":["@Phone"],"SetPhoneResource":["@Phone"],"Progress.GetResource":["@Progress"],"GetProgressResource":["@Progress"],"Progress.SetResource":["@Progress"],"SetProgressResource":["@Progress"],"Progress.Open":["@Progress"],"OpenProgress":["@Progress"],"State.Get":["@State/Get"],"GetState":["@State/Get"],"State.GetPlayer":["@State/GetPlayer"],"GetPlayerState":["@State/GetPlayer"],"State.OnChange":["@State/OnChange"],"OnStateChange":["@State/OnChange"],"Set":["@State/Set"],"State.Set":["@State/Set"],"SetState":["@State/Set"],"SetPlayer":["@State/SetPlayer"],"State.SetPlayer":["@State/SetPlayer"],"SetPlayerState":["@State/SetPlayer"],"RequestAnimDict":["@Streaming/RequestAnimDict"],"Streaming.RequestAnimDict":["@Streaming/RequestAnimDict"],"StreamRequestAnimDict":["@Streaming/RequestAnimDict"],"RequestAnimSet":["@Streaming/RequestAnimSet"],"Streaming.RequestAnimSet":["@Streaming/RequestAnimSet"],"StreamRequestAnimSet":["@Streaming/RequestAnimSet"],"RequestClipSet":["@Streaming/RequestClipSet"],"Streaming.RequestClipSet":["@Streaming/RequestClipSet"],"StreamRequestClipSet":["@Streaming/RequestClipSet"],"RequestModel":["@Streaming/RequestModel"],"Streaming.RequestModel":["@Streaming/RequestModel"],"StreamRequestModel":["@Streaming/RequestModel"],"RequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"Streaming.RequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"StreamRequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"RequestTexture":["@Streaming/RequestTexture"],"Streaming.RequestTexture":["@Streaming/RequestTexture"],"StreamRequestTexture":["@Streaming/RequestTexture"],"RequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"Streaming.RequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"StreamRequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"Capitalize":["@String/Capitalize"],"String.Capitalize":["@String/Capitalize"],"StringCapitalize":["@String/Capitalize"],"EndsWith":["@String/EndsWith"],"String.EndsWith":["@String/EndsWith"],"StringEndsWith":["@String/EndsWith"],"Split":["@String/Split"],"String.Split":["@String/Split"],"StringSplit":["@String/Split"],"StartsWith":["@String/StartsWith"],"String.StartsWith":["@String/StartsWith"],"StringStartsWith":["@String/StartsWith"],"TitleCase":["@String/TitleCase"],"String.TitleCase":["@String/TitleCase"],"StringTitleCase":["@String/TitleCase"],"Trim":["@String/Trim"],"String.Trim":["@String/Trim"],"StringTrim":["@String/Trim"],"Contains":["@Table/Contains"],"Table.Contains":["@Table/Contains"],"TableContains":["@Table/Contains"],"DeepCopy":["@Table/DeepCopy"],"Table.DeepCopy":["@Table/DeepCopy"],"TableDeepCopy":["@Table/DeepCopy"],"Filter":["@Table/Filter"],"Table.Filter":["@Table/Filter"],"TableFilter":["@Table/Filter"],"Keys":["@Table/Keys"],"Table.Keys":["@Table/Keys"],"TableKeys":["@Table/Keys"],"Map":["@Table/Map"],"Table.Map":["@Table/Map"],"TableMap":["@Table/Map"],"Merge":["@Table/Merge"],"Table.Merge":["@Table/Merge"],"TableMerge":["@Table/Merge"],"Size":["@Table/Size"],"Table.Size":["@Table/Size"],"TableSize":["@Table/Size"],"Values":["@Table/Values"],"Table.Values":["@Table/Values"],"TableValues":["@Table/Values"],"Target.AddBoxZone":["@Target/AddBoxZone"],"AddBoxZone":["@Target/AddBoxZone"],"Target.AddGlobalPed":["@Target/AddGlobalPed"],"AddGlobalPed":["@Target/AddGlobalPed"],"Target.AddGlobalPlayer":["@Target/AddGlobalPlayer"],"AddGlobalPlayer":["@Target/AddGlobalPlayer"],"Target.AddGlobalVehicle":["@Target/AddGlobalVehicle"],"AddGlobalVehicle":["@Target/AddGlobalVehicle"],"Target.AddLocalEntity":["@Target/AddLocalEntity"],"AddLocalEntity":["@Target/AddLocalEntity"],"Target.AddModel":["@Target/AddModel"],"AddModel":["@Target/AddModel"],"Target.AddNetworkedEntity":["@Target/AddNetworkedEntity"],"AddNetworkedEntity":["@Target/AddNetworkedEntity"],"Target.AddSphereZone":["@Target/AddSphereZone"],"AddSphereZone":["@Target/AddSphereZone"],"Target.RemoveGlobalPed":["@Target/RemoveGlobalPed"],"RemoveGlobalPed":["@Target/RemoveGlobalPed"],"Target.RemoveGlobalPlayer":["@Target/RemoveGlobalPlayer"],"RemoveGlobalPlayer":["@Target/RemoveGlobalPlayer"],"Target.RemoveGlobalVehicle":["@Target/RemoveGlobalVehicle"],"RemoveGlobalVehicle":["@Target/RemoveGlobalVehicle"],"Target.RemoveLocalEntity":["@Target/RemoveLocalEntity"],"RemoveLocalEntity":["@Target/RemoveLocalEntity"],"Target.RemoveModel":["@Target/RemoveModel"],"RemoveModel":["@Target/RemoveModel"],"Target.RemoveNetworkedEntity":["@Target/RemoveNetworkedEntity"],"RemoveNetworkedEntity":["@Target/RemoveNetworkedEntity"],"Target.ToggleTargeting":["@Target/ToggleTargeting"],"ToggleTargeting":["@Target/ToggleTargeting"],"Target.GetResource":["@Target"],"GetTargetResource":["@Target"],"Target.RemoveZone":["@Target"],"RemoveZone":["@Target"],"Hide":["@TextUI/HideTextUI"],"TextUI.Hide":["@TextUI/HideTextUI"],"HideTextUI":["@TextUI/HideTextUI"],"Show":["@TextUI/ShowTextUI"],"TextUI.Show":["@TextUI/ShowTextUI"],"ShowTextUI":["@TextUI/ShowTextUI"],"TextUI.GetResource":["@TextUI"],"GetTextUIResource":["@TextUI"],"TextUI.SetResource":["@TextUI"],"SetTextUIResource":["@TextUI"],"GetClosestObject":["@Utils/GetClosestObject"],"Utils.GetClosestObject":["@Utils/GetClosestObject"],"GetClosestPed":["@Utils/GetClosestPed"],"Utils.GetClosestPed":["@Utils/GetClosestPed"],"GetClosestPlayer":["@Utils/GetClosestPlayer"],"Utils.GetClosestPlayer":["@Utils/GetClosestPlayer"],"GetClosestVehicle":["@Utils/GetClosestVehicle"],"Utils.GetClosestVehicle":["@Utils/GetClosestVehicle"],"GetPlayersInArea":["@Utils/GetPlayersInArea"],"Utils.GetPlayersInArea":["@Utils/GetPlayersInArea"],"Give":["@VehicleKeys/GiveKeys"],"VehicleKeys.Give":["@VehicleKeys/GiveKeys"],"GiveKeys":["@VehicleKeys/GiveKeys"],"Remove":["@VehicleKeys/RemoveKeys"],"VehicleKeys.Remove":["@VehicleKeys/RemoveKeys"],"RemoveKeys":["@VehicleKeys/RemoveKeys"],"VehicleKeys.GetResource":["@VehicleKeys"],"GetKeysResource":["@VehicleKeys"],"VehicleKeys.SetResource":["@VehicleKeys"],"SetKeysResource":["@VehicleKeys"],"Version.CheckDependency":["@Version/CheckDependency"],"CheckDependency":["@Version/CheckDependency"],"Version.Check":["@Version/CheckVersion"],"CheckVersion":["@Version/CheckVersion"],"Version.Get":["@Version/GetVersion"],"GetVersion":["@Version/GetVersion"]},"registry":{"@Alert":"@Alert/__init__","@Cache":"@Cache/__init__","@Callback":"@Callback/__init__","@Class":"@Class/__init__","@Cooldown":"@Cooldown/__init__","@Debug":"@Debug/__init__","@Dispatch":"@Dispatch/__init__","@Events/Emit":"@Events/Emit","@Events/EmitNet":"@Events/EmitNet","@Events/Register":"@Events/Register","@Events":"@Events/__init__","@Framework/GetFrameworkJobs":"@Framework/#Job/GetFrameworkJobs","@Framework/GetPlayerJobData":"@Framework/#Job/GetPlayerJobData","@Framework/SetPlayerJob":"@Framework/#Job/SetPlayerJob","@Framework/AddMoney":"@Framework/#Money/AddMoney","@Framework/GetMoney":"@Framework/#Money/GetMoney","@Framework/RemoveMoney":"@Framework/#Money/RemoveMoney","@Framework/AddHunger":"@Framework/#States/AddHunger","@Framework/AddThirst":"@Framework/#States/AddThirst","@Framework/GetHunger":"@Framework/#States/GetHunger","@Framework/GetPlayerMetadata":"@Framework/#States/GetPlayerMetadata","@Framework/GetThirst":"@Framework/#States/GetThirst","@Framework/IsPlayerDead":"@Framework/#States/IsPlayerDead","@Framework/IsPlayerLoaded":"@Framework/#States/IsPlayerLoaded","@Framework/SetPlayerMetadata":"@Framework/#States/SetPlayerMetadata","@Framework/GetOwnedVehicles":"@Framework/#Vehicle/GetOwnedVehicles","@Framework/IsVehicleOwnedByPlayer":"@Framework/#Vehicle/IsVehicleOwnedByPlayer","@Framework/GetPlayer":"@Framework/GetPlayer","@Framework/GetPlayerBirthdate":"@Framework/GetPlayerBirthdate","@Framework/GetPlayerByCitizenId":"@Framework/GetPlayerByCitizenId","@Framework/GetPlayerCitizenId":"@Framework/GetPlayerCitizenId","@Framework/GetPlayerData":"@Framework/GetPlayerData","@Framework/GetPlayerName":"@Framework/GetPlayerName","@Framework/GetPlayerPhoneNumber":"@Framework/GetPlayerPhoneNumber","@Framework/GetPlayers":"@Framework/GetPlayers","@Framework/GetPlayerSourceByCitizenId":"@Framework/GetPlayerSourceByCitizenId","@Framework/IsFrameworkAdmin":"@Framework/IsFrameworkAdmin","@Framework/RegisterUsableItem":"@Framework/RegisterUsableItem","@Framework":"@Framework/__init__","@Fuel/GetFuel":"@Fuel/GetFuel","@Fuel/SetFuel":"@Fuel/SetFuel","@Fuel":"@Fuel/__init__","@Helpers/DetectResource":"@Helpers/DetectResource","@Hooks/Start":"@Hooks/Start","@Hooks/Stop":"@Hooks/Stop","@Input":"@Input/__init__","@Inventory/AddItem":"@Inventory/AddItem","@Inventory/CanCarryItem":"@Inventory/CanCarryItem","@Inventory/GetItemBySlot":"@Inventory/GetItemBySlot","@Inventory/GetItemCount":"@Inventory/GetItemCount","@Inventory/GetItemImage":"@Inventory/GetItemImage","@Inventory/GetItemInfo":"@Inventory/GetItemInfo","@Inventory/GetPlayerInventory":"@Inventory/GetPlayerInventory","@Inventory/HasItem":"@Inventory/HasItem","@Inventory/RemoveItem":"@Inventory/RemoveItem","@Inventory/SetItemMetadata":"@Inventory/SetItemMetadata","@Inventory":"@Inventory/__init__","@LoadUnload":"@LoadUnload/__init__","@Locale":"@Locale/__init__","@Logger":"@Logger/__init__","@Math/Clamp":"@Math/Clamp","@Math/FormatMoney":"@Math/FormatMoney","@Math/FormatNumber":"@Math/FormatNumber","@Math/Lerp":"@Math/Lerp","@Math/MapRange":"@Math/MapRange","@Math/RandomFloat":"@Math/RandomFloat","@Math/Round":"@Math/Round","@Menu":"@Menu/__init__","@Notify":"@Notify/__init__","@NUI/Callback":"@NUI/Callback","@NUI/Focus":"@NUI/Focus","@NUI/Request":"@NUI/Request","@NUI/Send":"@NUI/Send","@NUI/State":"@NUI/State","@NUI":"@NUI/__init__","@Phone/GetNumber":"@Phone/GetNumber","@Phone/SendMail":"@Phone/SendMail","@Phone":"@Phone/__init__","@Progress":"@Progress/__init__","@State/Get":"@State/Get","@State/GetPlayer":"@State/GetPlayer","@State/OnChange":"@State/OnChange","@State/Set":"@State/Set","@State/SetPlayer":"@State/SetPlayer","@Streaming/RequestAnimDict":"@Streaming/RequestAnimDict","@Streaming/RequestAnimSet":"@Streaming/RequestAnimSet","@Streaming/RequestClipSet":"@Streaming/RequestClipSet","@Streaming/RequestModel":"@Streaming/RequestModel","@Streaming/RequestPtfxAsset":"@Streaming/RequestPtfxAsset","@Streaming/RequestTexture":"@Streaming/RequestTexture","@Streaming/RequestWeaponAsset":"@Streaming/RequestWeaponAsset","@Streaming":"@Streaming/__init__","@String/Capitalize":"@String/Capitalize","@String/EndsWith":"@String/EndsWith","@String/Split":"@String/Split","@String/StartsWith":"@String/StartsWith","@String/TitleCase":"@String/TitleCase","@String/Trim":"@String/Trim","@Table/Contains":"@Table/Contains","@Table/DeepCopy":"@Table/DeepCopy","@Table/Filter":"@Table/Filter","@Table/Keys":"@Table/Keys","@Table/Map":"@Table/Map","@Table/Merge":"@Table/Merge","@Table/Size":"@Table/Size","@Table/Values":"@Table/Values","@Target/AddBoxZone":"@Target/AddBoxZone","@Target/AddGlobalPed":"@Target/AddGlobalPed","@Target/AddGlobalPlayer":"@Target/AddGlobalPlayer","@Target/AddGlobalVehicle":"@Target/AddGlobalVehicle","@Target/AddLocalEntity":"@Target/AddLocalEntity","@Target/AddModel":"@Target/AddModel","@Target/AddNetworkedEntity":"@Target/AddNetworkedEntity","@Target/AddSphereZone":"@Target/AddSphereZone","@Target/FixOptions":"@Target/FixOptions","@Target/GetLargestDistance":"@Target/GetLargestDistance","@Target/RemoveGlobalPed":"@Target/RemoveGlobalPed","@Target/RemoveGlobalPlayer":"@Target/RemoveGlobalPlayer","@Target/RemoveGlobalVehicle":"@Target/RemoveGlobalVehicle","@Target/RemoveLocalEntity":"@Target/RemoveLocalEntity","@Target/RemoveModel":"@Target/RemoveModel","@Target/RemoveNetworkedEntity":"@Target/RemoveNetworkedEntity","@Target/ToggleTargeting":"@Target/ToggleTargeting","@Target":"@Target/__init__","@TextUI/HideTextUI":"@TextUI/HideTextUI","@TextUI/ShowTextUI":"@TextUI/ShowTextUI","@TextUI":"@TextUI/__init__","@Utils/GetClosestObject":"@Utils/GetClosestObject","@Utils/GetClosestPed":"@Utils/GetClosestPed","@Utils/GetClosestPlayer":"@Utils/GetClosestPlayer","@Utils/GetClosestVehicle":"@Utils/GetClosestVehicle","@Utils/GetPlayersInArea":"@Utils/GetPlayersInArea","@VehicleKeys/GiveKeys":"@VehicleKeys/GiveKeys","@VehicleKeys/RemoveKeys":"@VehicleKeys/RemoveKeys","@VehicleKeys":"@VehicleKeys/__init__","@Version/CheckDependency":"@Version/CheckDependency","@Version/CheckVersion":"@Version/CheckVersion","@Version/GetVersion":"@Version/GetVersion","__init__":"__init__"}}
|
|
1
|
+
{"version":"1.0.4","modules":{"@Alert":{"ns":"Alert","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal Alert = {}\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetAlertResource()\r\n return resourceName\r\nend\r\nfunction SetAlertResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Alert resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\n Alert = exports[name]\r\nend\r\nlocal resource = DetectResource(list, 'alert')\r\nif resource then\r\n SetAlertResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(data)\r\n local result = Alert:alertDialog(data)\r\n return result\r\n end,\r\n ['lt-ui'] = function(data)\r\n local result = Alert:alertDialog(data)\r\n return result\r\n end,\r\n ['lation_ui'] = function(data)\r\n local result = Alert:alert(data)\r\n return result\r\n end,\r\n}\r\nfunction SendAlert(data)\r\n if not resourceName then return end\r\n local adapter = adapters[resourceName]\r\n if not adapter then return end\r\n return adapter(data)\r\nend","stubs":[{"funcName":"GetAlertResource","metadata":{"export":"GetResource"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Returns alert resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'lation_ui'|nil\nfunction LT.Alert.GetResource() end"},{"funcName":"SetAlertResource","metadata":{"export":"SetResource"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Force set alert resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'lation_ui'\nfunction LT.Alert.SetResource(name) end"},{"funcName":"SendAlert","metadata":{"export":"Send"},"stubCode":"--- **`ALERT` `CLIENT`**\n--- Send alert dialog to player.\r\n--- @param data table { header: string, content: string, centered: boolean, size = 'xs'|'sm'|'md'|'lg'|'xl', cancel: boolean, labels: { cancel: string, confirm: string } }\r\n--- ```lua\r\n--- LT.Alert.Send({\r\n--- header = 'Alert',\r\n--- content = 'Alert',\r\n--- centered = true,\r\n--- size = 'md',\r\n--- cancel = true,\r\n--- labels = { cancel = 'Cancel', confirm = 'Confirm' }\r\n--- })\r\n--- ```\r\n--- @return 'cancel'|'confirm'|nil\nfunction LT.Alert.Send(data) end"}]},"server":null},"@Cache":{"ns":"Cache","meta":{},"shared":null,"client":{"code":"local PlayerPedId = PlayerPedId\nlocal PlayerId = PlayerId\nlocal GetPlayerServerId = GetPlayerServerId\nlocal GetVehiclePedIsIn = GetVehiclePedIsIn\nlocal GetPedInVehicleSeat = GetPedInVehicleSeat\nlocal GetEntityCoords = GetEntityCoords\nlocal GetSelectedPedWeapon = GetSelectedPedWeapon\nlocal IsEntityDead = IsEntityDead\n\nlocal cache = {}\nlocal listeners = {}\n\nfunction GetCache(key)\n if key then return cache[key] end\n return cache\nend\n\nfunction OnCacheChange(key, cb)\n if not listeners[key] then listeners[key] = {} end\n table.insert(listeners[key], cb)\nend\n\nlocal function triggerListeners(key, newValue, oldValue)\n if not listeners[key] then return end\n for i = 1, #listeners[key] do\n listeners[key][i](newValue, oldValue)\n end\nend\n\nCreateThread(function()\n local ped = PlayerPedId()\n cache.playerId = PlayerId()\n cache.serverId = GetPlayerServerId(cache.playerId)\n cache.ped = ped\n cache.coords = GetEntityCoords(ped)\n cache.vehicle = false\n cache.seat = false\n cache.weapon = false\n cache.isDead = IsEntityDead(ped)\n\n while true do\n ped = PlayerPedId()\n\n if ped ~= cache.ped then\n local oldPed = cache.ped\n cache.ped = ped\n triggerListeners('ped', ped, oldPed)\n end\n\n cache.coords = GetEntityCoords(ped)\n\n local vehicle = GetVehiclePedIsIn(ped, false)\n if vehicle == 0 then vehicle = false end\n\n if vehicle ~= cache.vehicle then\n local oldVehicle = cache.vehicle\n cache.vehicle = vehicle\n triggerListeners('vehicle', vehicle, oldVehicle)\n end\n\n if vehicle then\n\n local seat = false\n for i = -1, 6 do\n if GetPedInVehicleSeat(vehicle, i) == ped then\n seat = i\n break\n end\n end\n if seat ~= cache.seat then\n local oldSeat = cache.seat\n cache.seat = seat\n triggerListeners('seat', seat, oldSeat)\n end\n else\n if cache.seat ~= false then\n local oldSeat = cache.seat\n cache.seat = false\n triggerListeners('seat', false, oldSeat)\n end\n end\n\n local weapon = GetSelectedPedWeapon(ped)\n if weapon == `WEAPON_UNARMED` then weapon = false end\n if weapon ~= cache.weapon then\n local oldWeapon = cache.weapon\n cache.weapon = weapon\n triggerListeners('weapon', weapon, oldWeapon)\n end\n\n local isDead = IsEntityDead(ped)\n if isDead ~= cache.isDead then\n local oldState = cache.isDead\n cache.isDead = isDead\n triggerListeners('isDead', isDead, oldState)\n end\n\n Wait(500)\n end\nend)","stubs":[{"funcName":"GetCache","metadata":{"export":"Get"},"stubCode":"--- **`CACHE` `CLIENT`**\n--- Get a specific cache value or the whole table.\n--- @param key? 'ped'|'vehicle'|'seat'|'weapon'|'coords'|'isDead'|'playerId'|'serverId'\n--- @return any\nfunction LT.Cache.Get(key) end"},{"funcName":"OnCacheChange","metadata":{"export":"OnChange"},"stubCode":"--- **`CACHE` `CLIENT`**\n--- Listen for changes in cache values.\n--- ```lua\n--- LT.Cache.OnChange('vehicle', function(vehicle, oldVehicle)\n--- print('Vehicle state changed', vehicle)\n--- end)\n--- ```\n--- @param key string The cache key to listen for ('vehicle', 'seat', 'weapon', 'isDead')\n--- @param cb fun(newValue: any, oldValue: any)\nfunction LT.Cache.OnChange(key, cb) end"}]},"server":null},"@Callback":{"ns":"Callback","meta":{},"shared":{"code":"local cbEvent = ('__%s_cb_%%s'):format(LT_RESOURCE_NAME)\nlocal registeredCallbacks = {}\n\nfunction GetCbEvent()\n return cbEvent\nend\n\nfunction CallbackResponse(success, result, ...)\n if not success then\n if result then\n printf('error', '%s', result)\n end\n return false\n end\n return result, ...\nend\n\nfunction SetRegisteredCallback(name)\n registeredCallbacks[name] = true\nend\n\nRegisterNetEvent(LT_RESOURCE_NAME..':cb:validate', function(callbackName, key)\n if registeredCallbacks[callbackName] then return end\n\n if IsDuplicityVersion() then\n TriggerClientEvent(cbEvent:format(LT_RESOURCE_NAME), source, key, 'cb_invalid')\n else\n TriggerServerEvent(cbEvent:format(LT_RESOURCE_NAME), key, 'cb_invalid')\n end\nend)","stubs":[{"funcName":"GetCbEvent","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function for getting CB event formatted.\nfunction LT.Callback.GetCbEvent() end"},{"funcName":"CallbackResponse","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function for callback response.\nfunction LT.Callback.CallbackResponse(success, result, ...) end"},{"funcName":"SetRegisteredCallback","metadata":{"internal":true},"stubCode":"--- **`CALLBACK` `SHARED`**\n--- Internal function to register a callback.\n--- @param name string\nfunction LT.Callback.SetRegisteredCallback(name) end"}]},"client":{"code":"local pendingCallbacks = {}\nlocal cbEvent = GetCbEvent()\nlocal pcall = pcall\n\nRegisterNetEvent(cbEvent:format(LT_RESOURCE_NAME), function(key, ...)\n local cb = pendingCallbacks[key]\n if not cb then return end\n\n pendingCallbacks[key] = nil\n cb(...)\nend)\n\nlocal function triggerServerCallback(event, cb, ...)\n local key\n\n repeat\n key = ('%s:%s'):format(event, math.random(0, 100000))\n until not pendingCallbacks[key]\n\n TriggerServerEvent(LT_RESOURCE_NAME..':cb:validate', event, key)\n TriggerServerEvent(cbEvent:format(event), LT_RESOURCE_NAME, key, ...)\n\n local p = not cb and promise.new()\n\n pendingCallbacks[key] = function(response, ...)\n if response == 'cb_invalid' then\n response = (\"callback '%s' does not exist\"):format(event)\n\n if p then\n return p:reject(response)\n end\n\n return printf('error', '%s', response)\n end\n\n response = { response, ... }\n\n if p then\n return p:resolve(response)\n end\n\n if cb then\n cb(table.unpack(response))\n end\n end\n\n if p then\n SetTimeout(15000, function()\n if pendingCallbacks[key] then\n pendingCallbacks[key] = nil\n p:reject((\"callback '%s' timed out\"):format(event))\n end\n end)\n\n return table.unpack(Citizen.Await(p))\n end\nend\n\nfunction RegisterCallback(name, cb)\n SetRegisteredCallback(name)\n\n RegisterNetEvent(cbEvent:format(name), function(resource, key, ...)\n TriggerServerEvent(cbEvent:format(resource), key, CallbackResponse(pcall(cb, ...)))\n end)\nend\n\nfunction AwaitCallback(name, ...)\n return triggerServerCallback(name, false, ...)\nend\n\nfunction TriggerAsyncCallback(name, cb, ...)\n return triggerServerCallback(name, cb, ...)\nend","stubs":[{"funcName":"RegisterCallback","metadata":{"export":"Register"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Register a client-side callback that the server can invoke.\n--- @param name string Callback name\n--- @param cb fun(...: any): ...any\nfunction LT.Callback.Register(name, cb) end"},{"funcName":"AwaitCallback","metadata":{"export":"Await"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Await a server callback synchronously (yields current thread).\n--- ```lua\n--- local money = LT.Callback.Await('getMoney', 'cash')\n--- print(money)\n--- ```\n--- @param name string Callback name\n--- @param ... any Arguments to send\n--- @return any ...\nfunction LT.Callback.Await(name, ...) end"},{"funcName":"TriggerAsyncCallback","metadata":{"export":"Trigger"},"stubCode":"--- **`CALLBACK` `CLIENT`**\n--- Trigger a server callback asynchronously (non-blocking).\n--- ```lua\n--- LT.Callback.Trigger('getMoney', function(money)\n--- print(money)\n--- end, 'cash')\n--- ```\n--- @param name string Callback name\n--- @param cb fun(...: any)\n--- @param ... any Arguments to send\nfunction LT.Callback.Trigger(name, cb, ...) end"}]},"server":{"code":"local pendingCallbacks = {}\nlocal cbEvent = GetCbEvent()\nlocal pcall = pcall\n\nRegisterNetEvent(cbEvent:format(LT_RESOURCE_NAME), function(key, ...)\n local cb = pendingCallbacks[key]\n if not cb then return end\n\n pendingCallbacks[key] = nil\n cb(...)\nend)\n\nlocal function triggerClientCallback(event, playerId, cb, ...)\n local key\n\n repeat\n key = ('%s:%s:%s'):format(event, math.random(0, 100000), playerId)\n until not pendingCallbacks[key]\n\n TriggerClientEvent(LT_RESOURCE_NAME..':cb:validate', playerId, event, key)\n TriggerClientEvent(cbEvent:format(event), playerId, LT_RESOURCE_NAME, key, ...)\n\n local p = not cb and promise.new()\n\n pendingCallbacks[key] = function(response, ...)\n if response == 'cb_invalid' then\n response = (\"callback '%s' does not exist\"):format(event)\n\n if p then\n return p:reject(response)\n end\n\n return printf('error', '%s', response)\n end\n\n response = { response, ... }\n\n if p then\n return p:resolve(response)\n end\n\n if cb then\n cb(table.unpack(response))\n end\n end\n\n if p then\n SetTimeout(15000, function()\n if pendingCallbacks[key] then\n pendingCallbacks[key] = nil\n p:reject((\"callback '%s' timed out\"):format(event))\n end\n end)\n\n return table.unpack(Citizen.Await(p))\n end\nend\n\nfunction RegisterCallback(name, cb)\n SetRegisteredCallback(name)\n\n RegisterNetEvent(cbEvent:format(name), function(resource, key, ...)\n TriggerClientEvent(cbEvent:format(resource), source, key, CallbackResponse(pcall(cb, source, ...)))\n end)\nend\n\nfunction AwaitCallback(playerId, name, ...)\n return triggerClientCallback(name, playerId, false, ...)\nend\n\nfunction TriggerAsyncCallback(playerId, name, cb, ...)\n return triggerClientCallback(name, playerId, cb, ...)\nend","stubs":[{"funcName":"RegisterCallback","metadata":{"export":"Register"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Register a server-side callback that clients can invoke.\n--- @param name string Callback name\n--- @param cb fun(source: number, ...: any): ...any\nfunction LT.Callback.Register(name, cb) end"},{"funcName":"AwaitCallback","metadata":{"export":"Await"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Await a client callback synchronously (yields current thread).\n--- ```lua\n--- local result = LT.Callback.Await(source, 'getScreenData')\n--- print(result)\n--- ```\n--- @param playerId number Player source\n--- @param name string Callback name\n--- @param ... any Arguments to send\n--- @return any ...\nfunction LT.Callback.Await(playerId, name, ...) end"},{"funcName":"TriggerAsyncCallback","metadata":{"export":"Trigger"},"stubCode":"--- **`CALLBACK` `SERVER`**\n--- Trigger a client callback asynchronously (non-blocking).\n--- ```lua\n--- LT.Callback.Trigger(source, 'getScreenData', function(result)\n--- print(result)\n--- end)\n--- ```\n--- @param playerId number Player source\n--- @param name string Callback name\n--- @param cb fun(...: any)\n--- @param ... any Arguments to send\nfunction LT.Callback.Trigger(playerId, name, cb, ...) end"}]}},"@Class":{"ns":"Class","meta":{},"shared":{"code":"function CreateClass(name, super)\n local cls = {}\n cls.__name = name\n cls.__index = cls\n cls.super = super\n\n if super then\n setmetatable(cls, { __index = super })\n end\n\n function cls.new(...)\n local instance = setmetatable({}, cls)\n instance.__destroyed = false\n\n if instance.constructor then\n instance:constructor(...)\n end\n return instance\n end\n\n function cls:include(mixin)\n for k, v in pairs(mixin) do\n if k ~= 'constructor' and k ~= '__index' and k ~= 'super' and k ~= '__name' then\n cls[k] = v\n end\n end\n return cls\n end\n\n function cls:isA(other)\n local current = self\n while current do\n if current == other then return true end\n\n local mt = getmetatable(current)\n if mt and mt.__index and mt.__index == other then return true end\n\n current = current.super\n end\n return false\n end\n\n local privateScope = setmetatable({}, { __mode = \"k\" })\n function cls:private()\n local p = privateScope[self]\n if not p then\n p = {}\n privateScope[self] = p\n end\n return p\n end\n\n function cls:destroy()\n if self.__destroyed then return end\n self.__destroyed = true\n\n if self.destructor then\n self:destructor()\n end\n end\n\n return cls\nend","stubs":[{"funcName":"CreateClass","metadata":{"export":"Create"},"stubCode":"--- **`CLASS` `SHARED`**\n--- Creates a new OOP class.\n--- @param name string Class name.\n--- @param super? table Parent class to inherit from.\n--- @return table\nfunction LT.Class.Create(name, super) end"}]},"client":null,"server":null},"@Cooldown":{"ns":"Cooldown","meta":{},"shared":null,"client":null,"server":{"code":"local os_time = os.time\nlocal lastTriggerTime = {}\n\nfunction StartCooldown(source, key, durationMs)\n if not source or not key then return end\n local srcStr = tostring(source)\n if not lastTriggerTime[srcStr] then lastTriggerTime[srcStr] = {} end\n\n local durationSec = durationMs / 1000\n lastTriggerTime[srcStr][key] = os_time() + durationSec\nend\n\nfunction CheckCooldown(source, key)\n if not source or not key then return false end\n local srcStr = tostring(source)\n\n if not lastTriggerTime[srcStr] or not lastTriggerTime[srcStr][key] then\n return false\n end\n\n if os_time() < lastTriggerTime[srcStr][key] then\n return true\n end\n\n lastTriggerTime[srcStr][key] = nil\n return false\nend\n\nfunction GetCooldownRemaining(source, key)\n if not source or not key then return 0 end\n local srcStr = tostring(source)\n\n if not lastTriggerTime[srcStr] or not lastTriggerTime[srcStr][key] then\n return 0\n end\n\n local remaining = lastTriggerTime[srcStr][key] - os_time()\n if remaining > 0 then\n return math.floor(remaining * 1000)\n end\n\n lastTriggerTime[srcStr][key] = nil\n return 0\nend\n\nfunction ClearCooldown(source, key)\n if not source or not key then return end\n local srcStr = tostring(source)\n if lastTriggerTime[srcStr] then\n lastTriggerTime[srcStr][key] = nil\n end\nend\n\nAddEventHandler('playerDropped', function()\n local srcStr = tostring(source)\n if lastTriggerTime[srcStr] then\n lastTriggerTime[srcStr] = nil\n end\nend)","stubs":[{"funcName":"StartCooldown","metadata":{"export":"Start"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Start a cooldown for a specific player and key.\n--- ```lua\n--- LT.Cooldown.Start(source, 'gather', 5000) -- 5 seconds\n--- ```\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @param durationMs number Cooldown duration in milliseconds\nfunction LT.Cooldown.Start(source, key, durationMs) end"},{"funcName":"CheckCooldown","metadata":{"export":"Check"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Check if a specific cooldown is active.\n--- ```lua\n--- if LT.Cooldown.Check(source, 'gather') then return end\n--- ```\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @return boolean\nfunction LT.Cooldown.Check(source, key) end"},{"funcName":"GetCooldownRemaining","metadata":{"export":"Remaining"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Get remaining cooldown time in milliseconds.\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\n--- @return number remainingMs\nfunction LT.Cooldown.Remaining(source, key) end"},{"funcName":"ClearCooldown","metadata":{"export":"Clear"},"stubCode":"--- **`COOLDOWN` `SERVER`**\n--- Clear a specific cooldown early.\n--- @param source string|number Player Server ID\n--- @param key string Cooldown identifier\nfunction LT.Cooldown.Clear(source, key) end"}]}},"@Debug":{"ns":"Debug","meta":{},"shared":{"code":"local debugMode = 1\r\nlocal print = print\r\nlocal string_format = string.format\r\nlocal function handleException(result, value)\r\n if type(value) == 'function' then\r\n return tostring(value)\r\n end\r\n return result\r\nend\r\nlocal function format(message, ...)\r\n local data = { ... }\r\n for i = 1, #data do\r\n local v = data[i]\r\n if v == nil then\r\n data[i] = 'nil'\r\n elseif type(v) == \"table\" then\r\n data[i] = json.encode(v, {\r\n sort_keys = true,\r\n indent = true,\r\n exception = handleException\r\n })\r\n elseif type(v) == \"boolean\" then\r\n data[i] = v and \"true\" or \"false\"\r\n elseif type(v) ~= \"string\" then\r\n data[i] = tostring(v)\r\n end\r\n end\r\n return string_format(message, table.unpack(data))\r\nend\r\nfunction SetDebugMode(mode)\r\n debugMode = mode or 1\r\nend\r\nlocal debugTypes <const> = {\r\n ['success'] = { mode = 3, color = 2 },\r\n ['error'] = { mode = 1, color = 1 },\r\n ['warning'] = { mode = 2, color = 3 },\r\n ['info'] = { mode = 3, color = 4 },\r\n ['verbose'] = { mode = 4, color = 5 },\r\n}\r\nfunction DebugDetailed(message, type, ...)\r\n if not type then type = 'verbose' end\r\n local data = debugTypes[type]\r\n if not data then return end\r\n if tonumber(debugMode) < tonumber(data.mode) then return end\r\n local info = debug.getinfo(2, 'Sl')\r\n local source = info and info.short_src or 'unknown'\r\n local line = info and info.currentline or -1\r\n source = source:gsub(\"^@\", \"\")\r\n local short = source:match(\"([^/]+/[^/]+%.lua)$\") or source:match(\"([^/]+%.lua)$\") or source\r\n print(string_format('^3[%s:%d]^7 ^%d[%s]^7 %s^7', short, line, data.color, type:upper(), format(message, ...)))\r\nend\r\nfunction DebugPrint(message, type, ...)\r\n if not type then type = 'verbose' end\r\n local data = debugTypes[type]\r\n if not data then return end\r\n if tonumber(debugMode) < tonumber(data.mode) then return end\r\n print(string_format('^%d[%s]^7 %s^7', data.color, type:upper(), format(message, ...)))\r\nend\r\nfunction DebugInfo(message, ...)\r\n DebugPrint(message, 'info', ...)\r\nend\r\nfunction DebugSuccess(message, ...)\r\n DebugPrint(message, 'success', ...)\r\nend\r\nfunction DebugError(message, ...)\r\n DebugPrint(message, 'error', ...)\r\nend\r\nfunction DebugWarn(message, ...)\r\n DebugPrint(message, 'warning', ...)\r\nend\r\nfunction DebugVerbose(message, ...)\r\n DebugPrint(message, 'verbose', ...)\r\nend","stubs":[{"funcName":"SetDebugMode","metadata":{"export":"SetMode"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Set debug mode.\r\n--- **0**: `Disabled` (Not Recommended)\r\n--- \r\n--- **1**: `Errors` (Default)\r\n--- \r\n--- **2**: `Errors + Warnings`\r\n--- \r\n--- **3**: `Except Verbose`\r\n--- \r\n--- **4**: `All Messages`\r\n--- \r\n--- @param mode? number\nfunction LT.Debug.SetMode(mode) end"},{"funcName":"DebugDetailed","metadata":{"export":"Detailed"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Prints a formatted and detailed (with file and line info) debug message.\r\n--- @param message string Message to print.\r\n--- @param type? 'info'|'success'|'error'|'warning'|'verbose'\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Detailed(message, type, ...) end"},{"funcName":"DebugPrint","metadata":{"export":"Print"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Prints a formatted debug message.\r\n--- @param message string Message to print.\r\n--- @param type? 'info'|'success'|'error'|'warning'|'verbose'\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Print(message, type, ...) end"},{"funcName":"DebugInfo","metadata":{"export":"Info"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a info debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Info(message, ...) end"},{"funcName":"DebugSuccess","metadata":{"export":"Success"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a success debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Success(message, ...) end"},{"funcName":"DebugError","metadata":{"export":"Error"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a error debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Error(message, ...) end"},{"funcName":"DebugWarn","metadata":{"export":"Warn"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a warning debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Warn(message, ...) end"},{"funcName":"DebugVerbose","metadata":{"export":"Verbose"},"stubCode":"--- **`DEBUG` `SHARED`**\n--- Send a verbose debug mesage.\r\n--- @param message string Message to print.\r\n--- @param ...? any Format parameters.\nfunction LT.Debug.Verbose(message, ...) end"}]},"client":null,"server":null},"@Dispatch":{"ns":"Dispatch","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ps-dispatch'] = { providers = { 'lb-tablet' } },\r\n ['cd_dispatch'] = {},\r\n ['tk_dispatch'] = {},\r\n ['qs-dispatch'] = {},\r\n ['emergencydispatch'] = {},\r\n ['wasabi_mdt'] = {},\r\n ['linden_outlawalert'] = {}\r\n}\r\nfunction GetDispatchResource()\r\n return resourceName\r\nend\r\nfunction SetDispatchResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Dispatch resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'dispatch')\r\nif resource then\r\n SetDispatchResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ps-dispatch'] = function(data)\r\n local alertData = {\r\n message = data.message or \"No message\",\r\n code = data.code or '10-80',\r\n icon = data.icon or 'fas fa-question',\r\n priority = data.priority or 2,\r\n coords = data.coords or GetEntityCoords(PlayerPedId()),\r\n vehicle = data.vehicle,\r\n plate = data.plate,\r\n alertTime = data.time and (data.time / 1000) or nil,\r\n radius = data.blipData and data.blipData.radius or 0,\r\n sprite = data.blipData and data.blipData.sprite or 161,\r\n color = data.blipData and data.blipData.color or 84,\r\n scale = data.blipData and data.blipData.scale or 1.0,\r\n length = 2,\r\n sound = \"Lose_1st\",\r\n sound2 = \"GTAO_FM_Events_Soundset\",\r\n offset = false,\r\n flash = data.blipData and data.blipData.flash or false,\r\n jobs = data.jobs or data.job or \"police\"\r\n }\r\n exports[\"ps-dispatch\"]:CustomAlert(alertData)\r\n end,\r\n ['cd_dispatch'] = function(data)\r\n local pData = exports['cd_dispatch']:GetPlayerInfo()\r\n TriggerServerEvent('cd_dispatch:AddNotification', {\r\n job_table = data.jobs,\r\n coords = data.coords,\r\n title = data.message,\r\n message = data.message,\r\n flash = 0,\r\n unique_id = pData.unique_id,\r\n sound = 1,\r\n blip = {\r\n sprite = data.blipData.sprite,\r\n scale = data.blipData.scale,\r\n colour = data.blipData.color,\r\n flashes = false,\r\n text = data.message,\r\n time = (data.time / 1000),\r\n radius = 0,\r\n }\r\n })\r\n end,\r\n ['tk_dispatch'] = function(data)\r\n local alertData = {\r\n title = data.message,\r\n code = data.code or '10-80',\r\n priority = 'Priority '.. (data.priority or 2),\r\n coords = data.coords or GetEntityCoords(PlayerPedId()),\r\n showLocation = true,\r\n showGender = false,\r\n playSound = true,\r\n blip = {\r\n color = data.blipData.color or 3,\r\n sprite = data.blipData.sprite or 1,\r\n scale = data.blipData.scale or 0.8,\r\n },\r\n jobs = data.jobs or {'police'},\r\n }\r\n exports.tk_dispatch:addCall(alertData)\r\n end,\r\n ['qs-dispatch'] = function(data)\r\n local customData = {\r\n job = data.jobs or { 'police' },\r\n callLocation = data.coords or vec3(0.0, 0.0, 0.0),\r\n callCode = {\r\n code = data.code or '10-80',\r\n snippet = data.snippet or 'General Alert'\r\n },\r\n message = data.message,\r\n flashes = false,\r\n image = nil,\r\n blip = {\r\n sprite = data.blipData.sprite or 1,\r\n scale = data.blipData.scale or 1.0,\r\n colour = data.blipData.color or 1,\r\n flashes = false,\r\n text = data.message or \"Alert\",\r\n time = data.length and (data.time * 1000) or 20000\r\n },\r\n otherData = {\r\n {\r\n text = data.name or 'N/A',\r\n icon = data.icon or 'fas fa-question'\r\n }\r\n }\r\n }\r\n exports['qs-dispatch']:getSSURL(function(image)\r\n customData.image = image or customData.image\r\n TriggerServerEvent('qs-dispatch:server:CreateDispatchCall', customData)\r\n end)\r\n end,\r\n ['emergencydispatch'] = function(data)\r\n local ped = PlayerPedId()\r\n local job = data.job or data.jobs[1] or 'police'\r\n local message = data.message or 'Alert'\r\n local coords = data.coords or GetEntityCoords(ped)\r\n TriggerServerEvent('emergencydispatch:emergencycall:new', job, message, coords, true)\r\n end,\r\n ['wasabi_mdt'] = function(data)\r\n local fallbackCoords = GetEntityCoords(PlayerPedId())\r\n local alertData = {\r\n type = data.code or '10-80',\r\n title = data.code or '10-80',\r\n description = data.message or \"No message provided\",\r\n location = {data.coords.x, data.coords.y, data.coords.z} or {fallbackCoords.x, fallbackCoords.y, fallbackCoords.z},\r\n coords = {data.coords.x, data.coords.y, data.coords.z} or {fallbackCoords.x, fallbackCoords.y, fallbackCoords.z},\r\n }\r\n exports.wasabi_mdt:CreateDispatch(alertData)\r\n end,\r\n ['linden_outlawalert'] = function(data)\r\n local ped = PlayerPedId()\r\n TriggerServerEvent('wf-alerts:svNotify', {\r\n dispatchData = {\r\n displayCode = data.code or '211',\r\n description = data.message or \"Alert\",\r\n isImportant = 0,\r\n recipientList = data.jobs or {'police'},\r\n length = data.time or '10000',\r\n infoM = data.icon or 'fas fa-question',\r\n info = data.message or \"Alert\"\r\n },\r\n caller = 'Anonymous',\r\n coords = data.coords or GetEntityCoords(ped)\r\n })\r\n end\r\n}\r\nfunction SendDispatch(data)\r\n local resource = GetDispatchResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n adapter(data)\r\nend","stubs":[{"funcName":"GetDispatchResource","metadata":{"export":"GetResource"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Returns dispatch resource name.\r\n--- @return 'ps-dispatch'|'cd_dispatch'|'tk_dispatch'|'qs-dispatch'|'emergencydispatch'|'wasabi_mdt'|'linden_outlawalert'|nil\nfunction LT.Dispatch.GetResource() end"},{"funcName":"SetDispatchResource","metadata":{"export":"SetResource"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Force set dispatch resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ps-dispatch'|'cd_dispatch'|'tk_dispatch'|'qs-dispatch'|'emergencydispatch'|'wasabi_mdt'|'linden_outlawalert'\nfunction LT.Dispatch.SetResource(name) end"},{"funcName":"SendDispatch","metadata":{"export":"Send"},"stubCode":"--- **`DISPATCH` `CLIENT`**\n--- Send dispatch alert to given jobs.\r\n--- @param data table Dispatch data\nfunction LT.Dispatch.Send(data) end"}]},"server":null},"@Events/Emit":{"ns":"Events","meta":{},"shared":{"code":"function EventEmit(name, ...)\r\n TriggerEvent(GetEventName(name), ...)\r\nend","stubs":[{"funcName":"EventEmit","metadata":{"export":"Emit"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Triggers local event with formatted name.\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local emit = LT.Events.Emit\r\n--- \r\n--- -- Client example:\r\n--- emit('event', 'arg1', 'arg2')\r\n--- ```\r\n--- @param name string Event name\r\n--- @param ...? any Event arguments (Optional)\nfunction LT.Events.Emit(name, ...) end"}]},"client":null,"server":null},"@Events/EmitNet":{"ns":"Events","meta":{},"shared":{"code":"local isServer <const> = IsDuplicityVersion()\r\nfunction EventEmitNet(name, ...)\r\n local eventName = GetEventName(name, true)\r\n if isServer then\r\n local args = {...}\r\n local target = args[1]\r\n if type(target) ~= 'number' then\r\n local info = debug.getinfo(2, \"Sl\")\r\n return printf(\r\n 'error',\r\n 'EmitNet: invalid target on event (%s) [%s:%d]',\r\n name,\r\n info.short_src or info.source,\r\n info.currentline or -1\r\n )\r\n end\r\n table.remove(args, 1)\r\n TriggerClientEvent(eventName, target, table.unpack(args))\r\n else\r\n TriggerServerEvent(eventName, ...)\r\n end\r\nend","stubs":[{"funcName":"EventEmitNet","metadata":{"export":"EmitNet"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Triggers network event with formatted name.\r\n--- \r\n--- `Client` -> `Server`\r\n--- \r\n--- `Server` -> `Client`\r\n--- \r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local emitNet = LT.Events.EmitNet\r\n--- \r\n--- -- Client example:\r\n--- emitNet('exampleEvent', 'arg1', 'arg2')\r\n--- \r\n--- -- Server example:\r\n--- emitNet('exampleEvent', source, 'arg1', 'arg2')\r\n--- ```\r\n--- @param name string Event name\r\n--- @param ...? any Event arguments (Optional)\nfunction LT.Events.EmitNet(name, ...) end"}]},"client":null,"server":null},"@Events/Register":{"ns":"Events","meta":{},"shared":{"code":"function EventRegister(name, cb)\r\n local event = GetEventName(name)\r\n if cb and type(cb) == 'function' then\r\n RegisterNetEvent(event, cb)\r\n else\r\n RegisterNetEvent(event)\r\n end\r\nend","stubs":[{"funcName":"EventRegister","metadata":{"export":"Register"},"stubCode":"--- **`EVENTS` `SHARED`**\n--- Register a event with formatted name.\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- local register = LT.Events.Register\r\n--- \r\n--- -- Client example:\r\n--- register('event', function(arg1, arg2)\r\n--- print(arg1, arg2)\r\n--- end)\r\n--- \r\n--- -- Server example:\r\n--- register('event', function(arg1, arg2)\r\n--- local src = source\r\n--- print(source, arg1, arg2)\r\n--- end)\r\n--- ```\r\n--- @param name string Event name.\r\n--- @param cb? function Callback function.\nfunction LT.Events.Register(name, cb) end"}]},"client":null,"server":null},"@Events":{"ns":"Events","meta":{},"shared":{"code":"local isServer <const> = IsDuplicityVersion()\r\nlocal format = string.format\r\nfunction GetEventName(name, remote)\r\n local side\r\n if remote then\r\n side = isServer and 'client' or 'server'\r\n else\r\n side = isServer and 'server' or 'client'\r\n end\r\n return format('%s:%s:%s', LT_RESOURCE_NAME, side, name)\r\nend","stubs":[{"funcName":"GetEventName","metadata":{"internal":true},"stubCode":"--- **`EVENTS` `SHARED`**\n--- @param name string\r\n--- @param remote? boolean\r\n--- @return string\nfunction LT.Events.GetEventName(name, remote) end"}]},"client":null,"server":null},"@Framework/GetFrameworkJobs":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetFrameworkJobs()\r\n if ESX then\r\n return ESX.GetJobs()\r\n elseif QBCore then\r\n local jobs = {}\r\n for k, v in pairs(QBCore.Shared.Jobs) do\r\n jobs[#jobs+1] = {\r\n name = k,\r\n label = v.label,\r\n grade = v.grades\r\n }\r\n end\r\n return jobs\r\n elseif QBX then\r\n return QBX:GetJobs()\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"GetFrameworkJobs","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- This will return the jobs registered in the framework in a table.\r\n--- @return table\nfunction LT.Framework.GetFrameworkJobs() end"}]}},"@Framework/GetPlayerJobData":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerJobData()\r\n local jobData = GetPlayerData().job\r\n if ESX then\r\n local isBoss = (jobData.grade_name == \"boss\")\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade,\r\n gradeName = jobData.grade_name,\r\n gradeLabel = jobData.grade_label,\r\n isBoss = isBoss,\r\n onDuty = jobData.onduty,\r\n }\r\n elseif QBCore then\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade.level,\r\n gradeName = jobData.grade.name,\r\n gradeLabel = jobData.grade.name,\r\n isBoss = jobData.isboss,\r\n onDuty = jobData.onduty,\r\n }\r\n elseif QBX then\r\n return {\r\n name = jobData.name,\r\n label = jobData.label,\r\n grade = jobData.grade.level,\r\n gradeName = jobData.grade.name,\r\n gradeLabel = jobData.grade.name,\r\n isBoss = jobData.isboss,\r\n onDuty = jobData.onduty,\r\n }\r\n end\r\n return\r\nend","stubs":[{"funcName":"GetPlayerJobData","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player job data.\r\n--- @return table|nil {name,label,grade,gradeName,gradeLabel,isBoss,onDuty}\nfunction LT.Framework.GetPlayerJobData() end"}]},"server":{"code":"function GetPlayerJobData(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n if ESX then\n local job = Player.getJob()\n local isBoss = (job.grade_name == \"boss\")\n return {\n name = job.name,\n label = job.label,\n grade = job.grade,\n gradeName = job.grade_name,\n gradeLabel = job.grade_label,\n isBoss = isBoss,\n onDuty = job.onduty,\n }\n elseif QBCore or QBX then\n local jobData = Player.PlayerData.job\n return {\n name = jobData.name,\n label = jobData.label,\n grade = jobData.grade.level,\n gradeName = jobData.grade.name,\n gradeLabel = jobData.grade.name,\n isBoss = jobData.isboss,\n onDuty = jobData.onduty,\n }\n end\n\n return\nend","stubs":[{"funcName":"GetPlayerJobData","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player job data.\n--- @param source number Player source\n--- @return table|nil {name,label,grade,gradeName,gradeLabel,isBoss,onDuty}\nfunction LT.Framework.GetPlayerJobData(source) end"}]}},"@Framework/SetPlayerJob":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function SetPlayerJob(source, name, grade)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n if ESX then\r\n Player.setJob(name, grade, true)\r\n return true\r\n elseif QBX or QBCore then\r\n Player.Functions.SetJob(name, grade)\r\n return true\r\n end\r\n return false\r\nend","stubs":[{"funcName":"SetPlayerJob","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Set player job to given job and grade.\r\n--- @param source number Player source\r\n--- @param name string Job name\r\n--- @param grade number Job grade\r\n--- @return boolean\nfunction LT.Framework.SetPlayerJob(source, name, grade) end"}]}},"@Framework/AddMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddMoney(source, account, amount)\n if not source or not amount or amount <= 0 then return false end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return false end\n\n if ESX then\n if account == 'cash' then\n Player.addMoney(amount)\n elseif account == 'bank' then\n Player.addAccountMoney('bank', amount)\n elseif account == 'black' or account == 'black_money' then\n Player.addAccountMoney('black_money', amount)\n end\n return true\n elseif QBX or QBCore then\n return Player.Functions.AddMoney(account, amount)\n end\n\n return false\nend","stubs":[{"funcName":"AddMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add money to player account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @param amount number Amount to add\n--- @return boolean\nfunction LT.Framework.AddMoney(source, account, amount) end"}]}},"@Framework/GetMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetMoney(source, account)\n if not source then return 0 end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return 0 end\n\n if ESX then\n if account == 'cash' then\n return Player.getMoney()\n elseif account == 'bank' then\n return Player.getAccount('bank').money\n elseif account == 'black' or account == 'black_money' then\n return Player.getAccount('black_money').money\n end\n elseif QBX or QBCore then\n return Player.PlayerData.money[account] or 0\n end\n\n return 0\nend","stubs":[{"funcName":"GetMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players money on account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @return number amount\nfunction LT.Framework.GetMoney(source, account) end"}]}},"@Framework/RemoveMoney":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function RemoveMoney(source, account, amount)\n if not source or not amount or amount <= 0 then return false end\n account = account or 'cash'\n\n local Player = GetPlayer(source)\n if not Player then return false end\n\n local money = GetMoney(source, account)\n if money < amount then return false end\n\n if ESX then\n if account == 'cash' then\n Player.removeMoney(amount)\n elseif account == 'bank' then\n Player.removeAccountMoney('bank', amount)\n elseif account == 'black' or account == 'black_money' then\n Player.removeAccountMoney('black_money', amount)\n end\n return true\n elseif QBX or QBCore then\n return Player.Functions.RemoveMoney(account, amount, 'LTBridge')\n end\n\n return false\nend","stubs":[{"funcName":"RemoveMoney","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Removes money from player account.\n--- @param source number Player source\n--- @param account string Money type (cash, bank, black_money, crypto etc.)\n--- @param amount number Amount to add\n--- @return boolean `true` if success, `false` if anything goes wrong or player does not have that much money on account.\nfunction LT.Framework.RemoveMoney(source, account, amount) end"}]}},"@Framework/AddHunger":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddHunger(source, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n local clamped = math.clamp(value, 0, 200000)\r\n local val = clamped * 2000\r\n TriggerClientEvent('esx_status:add', source, 'hunger', val)\r\n return val\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n local newHunger = (playerData.metadata.hunger or 0) + value\r\n Player.Functions.SetMetaData('hunger', math.clamp(newHunger, 0, 100))\r\n return newHunger\r\n end\r\nend","stubs":[{"funcName":"AddHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add hunger to player.\r\n--- @param source number Player source\r\n--- @param value number Amount to add\r\n--- @return number? `new hunger` if success, `nil` if player not found\nfunction LT.Framework.AddHunger(source, value) end"}]}},"@Framework/AddThirst":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function AddThirst(source, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n local clamped = math.clamp(value, 0, 200000)\r\n local val = clamped * 2000\r\n TriggerClientEvent('esx_status:add', source, 'thirst', val)\r\n return val\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n local new = (playerData.metadata.thirst or 0) + value\r\n Player.Functions.SetMetaData('thirst', math.clamp(new, 0, 100))\r\n return new\r\n end\r\nend","stubs":[{"funcName":"AddThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Add thirst to player.\r\n--- @param source number Player source\r\n--- @param value number Amount to add\r\n--- @return number? `new thirst` if success, `nil` if player not found\nfunction LT.Framework.AddThirst(source, value) end"}]}},"@Framework/GetHunger":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"local function getStatus(search)\r\n local playerData = GetPlayerData()\r\n if not playerData then return 0 end\r\n local status = playerData.variables.status\r\n for _, entry in ipairs(status) do\r\n if entry.name == search then\r\n return entry.percent or 0\r\n end\r\n end\r\n return 0\r\nend\r\nfunction GetHunger()\r\n if ESX then\r\n local status = getStatus(\"hunger\")\r\n return math.floor((status) + 0.5) or 0\r\n elseif QBX or QBCore then\r\n local hunger = GetPlayerMetadata(\"hunger\") or 0\r\n return math.floor((hunger) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player hunger\r\n--- @return number\nfunction LT.Framework.GetHunger() end"}]},"server":{"code":"local function getStatus(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n return Player.get(key) or nil\r\nend\r\nfunction GetHunger(source)\r\n if ESX then\r\n local status = getStatus(source, \"status\")\r\n if not status then return 0 end\r\n if type(status) ~= \"table\" then return 0 end\r\n for _, entry in ipairs(status) do\r\n if entry.name == \"hunger\" then\r\n return math.floor((entry.percent) + 0.5) or 0\r\n end\r\n end\r\n elseif QBX or QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local playerData = Player.PlayerData\r\n local newHunger = (playerData.metadata.hunger or 0)\r\n return math.floor((newHunger) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetHunger","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player hunger\r\n--- @param source number Player source\r\n--- @return number\nfunction LT.Framework.GetHunger(source) end"}]}},"@Framework/GetPlayerMetadata":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerMetadata(key)\r\n return GetPlayerData().metadata[key]\r\nend","stubs":[{"funcName":"GetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player metadata of the given key.\r\n--- @param key string Metadata key\r\n--- @return any\nfunction LT.Framework.GetPlayerMetadata(key) end"}]},"server":{"code":"function GetPlayerMetadata(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n return Player.getMeta(key) or false\r\n elseif QBX or QBCore then\r\n local playerData = Player.PlayerData\r\n return playerData.metadata[key] or false\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player metadata of the given key.\r\n--- @param source number Player source\r\n--- @param key string Metadata key\r\n--- @return any\nfunction LT.Framework.GetPlayerMetadata(source, key) end"}]}},"@Framework/GetThirst":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"local function getStatus(search)\r\n local playerData = GetPlayerData()\r\n if not playerData then return 0 end\r\n local status = playerData.variables.status\r\n for _, entry in ipairs(status) do\r\n if entry.name == search then\r\n return entry.percent or 0\r\n end\r\n end\r\n return 0\r\nend\r\nfunction GetThirst()\r\n if ESX then\r\n local status = getStatus(\"thirst\")\r\n return math.floor((status) + 0.5) or 0\r\n elseif QBX or QBCore then\r\n local val = GetPlayerMetadata(\"thirst\") or 0\r\n return math.floor((val) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player thirst\r\n--- @return number\nfunction LT.Framework.GetThirst() end"}]},"server":{"code":"local function getStatus(source, key)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n return Player.get(key) or nil\r\nend\r\nfunction GetThirst(source)\r\n if ESX then\r\n local status = getStatus(source, \"status\")\r\n if not status then return 0 end\r\n if type(status) ~= \"table\" then return 0 end\r\n for _, entry in ipairs(status) do\r\n if entry.name == \"thirst\" then\r\n return math.floor((entry.percent) + 0.5) or 0\r\n end\r\n end\r\n elseif QBX or QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local playerData = Player.PlayerData\r\n local newThirst = (playerData.metadata.thirst or 0)\r\n return math.floor((newThirst) + 0.5) or 0\r\n end\r\n return 0\r\nend","stubs":[{"funcName":"GetThirst","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player thirst\r\n--- @param source number Player source\r\n--- @return number\nfunction LT.Framework.GetThirst(source) end"}]}},"@Framework/IsPlayerDead":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function IsPlayerDead()\r\n if ESX then\r\n return GetPlayerData().dead\r\n elseif QBX or QBCore then\r\n local playerData = GetPlayerData()\r\n if not playerData then return false end\r\n return playerData.metadata[\"isdead\"] or playerData.metadata[\"inlaststand\"]\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsPlayerDead","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns true if the player is dead, false otherwise.\r\n--- @return boolean\nfunction LT.Framework.IsPlayerDead() end"}]},"server":{"code":"function IsPlayerDead(source)\r\n if ESX then\r\n local xPlayer = GetPlayer(source)\r\n if not xPlayer then return false end\r\n return xPlayer.get(\"is_dead\") or false\r\n elseif QBX or QBCore then\r\n local player = GetPlayer(source)\r\n if not player then return false end\r\n local playerData = player.PlayerData\r\n return playerData.metadata.isdead or playerData.metadata.inlaststand or false\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsPlayerDead","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns true if the player is dead, false otherwise.\r\n--- @param source number Player source\r\n--- @return boolean\nfunction LT.Framework.IsPlayerDead(source) end"}]}},"@Framework/IsPlayerLoaded":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function IsPlayerLoaded()\r\n if ESX then\r\n return ESX.IsPlayerLoaded()\r\n else\r\n return LocalPlayer.state.isLoggedIn or false\r\n end\r\nend","stubs":[{"funcName":"IsPlayerLoaded","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns true if player loaded, false otherwise.\r\n--- @return boolean\nfunction LT.Framework.IsPlayerLoaded() end"}]},"server":null},"@Framework/SetPlayerMetadata":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function SetPlayerMetadata(source, key, value)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n Player.setMeta(key, value, nil)\r\n elseif QBCore then\r\n Player.Functions.SetMetaData(key, value)\r\n elseif QBX then\r\n Player.Functions.SetMetaData(key, value)\r\n end\r\n return true\r\nend","stubs":[{"funcName":"SetPlayerMetadata","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Sets player metadata for the given key.\r\n--- @param source number Player source\r\n--- @param key string Metadata key\r\n--- @param value table | string | number | boolean Value to assign\nfunction LT.Framework.SetPlayerMetadata(source, key, value) end"}]}},"@Framework/GetOwnedVehicles":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"local GetResourceState = GetResourceState\r\nfunction GetOwnedVehicles(source)\r\n if GetResourceState('oxmysql') ~= 'missing' then\r\n local citizenId = GetPlayerCitizenId(source)\r\n if ESX then\r\n local result = exports.oxmysql:query_async(\"SELECT vehicle, plate FROM owned_vehicles WHERE owner = ?\", { citizenId })\r\n local vehicles = {}\r\n for i = 1, #result do\r\n local vehicle = result[i].vehicle\r\n local plate = result[i].plate\r\n local model = json.decode(vehicle).model\r\n table.insert(vehicles, { vehicle = model, plate = plate })\r\n end\r\n return vehicles\r\n elseif QBX or QBCore then\r\n local result = exports.oxmysql:query_async(\"SELECT vehicle, plate FROM player_vehicles WHERE citizenid = ?\", { citizenId })\r\n local vehicles = {}\r\n for i = 1, #result do\r\n local vehicle = result[i].vehicle\r\n local plate = result[i].plate\r\n table.insert(vehicles, { vehicle = vehicle, plate = plate })\r\n end\r\n return vehicles\r\n end\r\n return {}\r\n else\r\n printf('error', '^3GetOwnedVehicles ^7needs ^2oxmysql ^7to work.')\r\n return {}\r\n end\r\nend","stubs":[{"funcName":"GetOwnedVehicles","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players owned vehicles.\r\n--- @param source number Player source\r\n--- @return table { vehicle, plate }\nfunction LT.Framework.GetOwnedVehicles(source) end"}]}},"@Framework/IsVehicleOwnedByPlayer":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"local GetResourceState = GetResourceState\r\nfunction IsVehicleOwnedByPlayer(source, plate)\r\n if GetResourceState('oxmysql') ~= 'missing' then\r\n local citizenId = GetPlayerCitizenId(source)\r\n if ESX then\r\n local result = exports.oxmysql:query_async(\"SELECT id, vehicle, plate FROM owned_vehicles WHERE owner = ? AND plate = ?\", {\r\n citizenId, plate\r\n })\r\n if not result[1] then return false end\r\n local id = result[1].id\r\n local vehicle = result[1].vehicle\r\n local model = json.decode(vehicle).model\r\n return { id = id, vehicle = model, plate = plate }\r\n elseif QBX or QBCore then\r\n local result = exports.oxmysql:query_async(\"SELECT id, vehicle, plate FROM player_vehicles WHERE citizenid = ? AND plate = ?\", {\r\n citizenId, plate\r\n })\r\n if not result[1] then return false end\r\n local id = result[1].id\r\n local vehicle = result[1].vehicle\r\n return { id = id, vehicle = vehicle, plate = plate }\r\n end\r\n return false\r\n else\r\n printf('error', '^3IsVehicleOwnedByPlayer ^7needs ^2oxmysql ^7to work.')\r\n return false\r\n end\r\nend","stubs":[{"funcName":"IsVehicleOwnedByPlayer","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Check if a vehicle owned by player. Returns vehicle data if owned by player, false otherwise.\r\n--- @param source number Player source\r\n--- @param plate string Vehicle plate\r\n--- @return table|boolean {id = id, vehicle = model, plate = plate}\nfunction LT.Framework.IsVehicleOwnedByPlayer(source, plate) end"}]}},"@Framework/GetPlayer":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayer(source)\n if not source then return nil end\n\n if ESX then\n return ESX.GetPlayerFromId(source)\n elseif QBX then\n return QBX:GetPlayer(source)\n elseif QBCore then\n return QBCore.Functions.GetPlayer(source)\n end\n\n return nil\nend","stubs":[{"funcName":"GetPlayer","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player object of framework default.\n--- @param source number Player source\n--- @return table|nil\nfunction LT.Framework.GetPlayer(source) end"}]}},"@Framework/GetPlayerBirthdate":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerBirthdate()\r\n local data = GetPlayerData()\r\n if not data then return end\r\n if ESX then\r\n return data.dateofbirth\r\n elseif QBX or QBCore then\r\n return data.charinfo.birthdate\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerBirthdate","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player date of birth.\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerBirthdate() end"}]},"server":{"code":"function GetPlayerBirthdate(source)\r\n local player = GetPlayer(source)\r\n if not player then return nil end\r\n if ESX then\r\n return player.get(\"dateofbirth\")\r\n elseif QBX or QBCore then\r\n return player.PlayerData.charinfo.birthdate\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerBirthdate","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player date of birth.\r\n--- @param source number Player source\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerBirthdate(source) end"}]}},"@Framework/GetPlayerByCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerByCitizenId(citizenid)\n if not citizenid then return end\n\n if ESX then\n return ESX.GetPlayerFromIdentifier(citizenid)\n elseif QBCore then\n return QBCore.Functions.GetPlayerByCitizenId(citizenid)\n elseif QBX then\n return QBX:GetPlayerByCitizenId(citizenid)\n end\n\n return\nend","stubs":[{"funcName":"GetPlayerByCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- @param citizenid string Player identifier|citizenid\n--- @return table|nil Player or nil\nfunction LT.Framework.GetPlayerByCitizenId(citizenid) end"}]}},"@Framework/GetPlayerCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerCitizenId()\r\n local playerData = GetPlayerData()\r\n if not playerData then return end\r\n if ESX then\r\n return playerData.identifier\r\n elseif QBCore or QBX then\r\n return playerData.citizenid\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player citizenid | identifier.\r\n--- @return string|nil\nfunction LT.Framework.GetPlayerCitizenId() end"}]},"server":{"code":"function GetPlayerCitizenId(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n if ESX then\n return Player and Player.identifier\n elseif QBCore or QBX then\n return Player and Player.PlayerData.citizenid\n end\n\n return nil\nend","stubs":[{"funcName":"GetPlayerCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player citizenid | identifier from source.\n--- @param source number Player source\n--- @return string|nil\nfunction LT.Framework.GetPlayerCitizenId(source) end"}]}},"@Framework/GetPlayerData":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerData()\r\n if ESX then\r\n return ESX.GetPlayerData()\r\n elseif QBX then\r\n return QBX:GetPlayerData()\r\n elseif QBCore then\r\n return QBCore.Functions.GetPlayerData()\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerData","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player data in the framework default format.\r\n--- @return table|nil PlayerData\nfunction LT.Framework.GetPlayerData() end"}]},"server":null},"@Framework/GetPlayerName":{"ns":"Framework","meta":{},"shared":null,"client":{"code":"function GetPlayerName()\r\n local playerData = GetPlayerData()\r\n if not playerData then return end\r\n local f\r\n local l\r\n if ESX then\r\n f = playerData.firstName\r\n l = playerData.lastName\r\n elseif QBX or QBCore then\r\n f = playerData.charinfo.firstname\r\n l = playerData.charinfo.lastname\r\n end\r\n if f and l then\r\n return f, l\r\n end\r\nend","stubs":[{"funcName":"GetPlayerName","metadata":{},"stubCode":"--- **`FRAMEWORK` `CLIENT`**\n--- Returns player character name.\r\n--- @return string? Firstname\r\n--- @return string? Lastname\nfunction LT.Framework.GetPlayerName() end"}]},"server":{"code":"function GetPlayerName(source)\n if not source then return end\n\n local Player = GetPlayer(source)\n if not Player then return end\n\n local f\n local l\n\n if ESX then\n f = Player.variables.firstName\n l = Player.variables.lastName\n elseif QBX or QBCore then\n local playerData = Player.PlayerData\n f = playerData.charinfo.firstname\n l = playerData.charinfo.lastname\n end\n\n if f and l then\n return f, l\n end\nend","stubs":[{"funcName":"GetPlayerName","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player character name from source.\n--- @param source number Player source\n--- @return string? Firstname\n--- @return string? Lastname\nfunction LT.Framework.GetPlayerName(source) end"}]}},"@Framework/GetPlayerPhoneNumber":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerPhoneNumber(source)\r\n local Player = GetPlayer(source)\r\n if not Player then return end\r\n if ESX then\r\n return Player.get(\"phone_number\")\r\n elseif QBX or QBCore then\r\n return Player.PlayerData.charinfo.phone\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"GetPlayerPhoneNumber","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns players phone number.\r\n---@param source number Player source\r\n---@return string|nil\nfunction LT.Framework.GetPlayerPhoneNumber(source) end"}]}},"@Framework/GetPlayers":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayers()\r\n if ESX then\r\n local players = ESX.GetExtendedPlayers()\r\n local playerList = {}\r\n for _, xPlayer in pairs(players) do\r\n table.insert(playerList, xPlayer.source)\r\n end\r\n return playerList\r\n elseif QBCore then\r\n local players = QBCore.Functions.GetPlayers()\r\n local playerList = {}\r\n for _, src in pairs(players) do\r\n table.insert(playerList, src)\r\n end\r\n return playerList\r\n elseif QBX then\r\n local players = QBX:GetQBPlayers()\r\n local playerList = {}\r\n for src, _ in pairs(players) do\r\n table.insert(playerList, src)\r\n end\r\n return playerList\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"GetPlayers","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns all connected players.\r\n--- @return table\nfunction LT.Framework.GetPlayers() end"}]}},"@Framework/GetPlayerSourceByCitizenId":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function GetPlayerSourceByCitizenId(citizenid)\r\n local Player = GetPlayerByCitizenId(citizenid)\r\n if not Player then return end\r\n if ESX then\r\n return Player.source\r\n elseif QBX or QBCore then\r\n return Player.PlayerData.source\r\n end\r\nend","stubs":[{"funcName":"GetPlayerSourceByCitizenId","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns player source from citizen id | identifier.\r\n---@param citizenid string Player citizen id | identifier.\r\n---@return number|nil\nfunction LT.Framework.GetPlayerSourceByCitizenId(citizenid) end"}]}},"@Framework/IsFrameworkAdmin":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function IsFrameworkAdmin(source)\r\n if ESX then\r\n local xPlayer = GetPlayer(source)\r\n if not xPlayer then return false end\r\n local group = xPlayer.getGroup()\r\n if group == 'admin' or group == 'superadmin' then return true end\r\n return false\r\n elseif QBCore then\r\n local isAdmin = QBCore.Functions.HasPermission(source, 'admin')\r\n local isGod = QBCore.Functions.HasPermission(source, 'god')\r\n local isAceAllowed = IsPlayerAceAllowed(source, 'command')\r\n return isAdmin or isGod or isAceAllowed\r\n elseif QBX then\r\n return IsPlayerAceAllowed(source, 'admin')\r\n end\r\n return false\r\nend","stubs":[{"funcName":"IsFrameworkAdmin","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Returns true if player is admin, false otherwise.\r\n--- @param source number Player source\r\n--- @return boolean\nfunction LT.Framework.IsFrameworkAdmin(source) end"}]}},"@Framework/RegisterUsableItem":{"ns":"Framework","meta":{},"shared":null,"client":null,"server":{"code":"function RegisterUsableItem(name, cb)\r\n if ESX then\r\n ESX.RegisterUsableItem(name,function(source)\r\n cb(source)\r\n end)\r\n elseif QBCore then\r\n local func = function(src, item, itemData)\r\n itemData = itemData or item\r\n itemData.metadata = itemData.metadata or itemData.info or {}\r\n itemData.slot = itemData.id or itemData.slot\r\n cb(src, itemData)\r\n end\r\n QBCore.Functions.CreateUseableItem(name, func)\r\n elseif QBX then\r\n local func = function(src, item, itemData)\r\n itemData = itemData or item\r\n itemData.metadata = itemData.metadata or itemData.info or {}\r\n itemData.slot = itemData.id or itemData.slot\r\n cb(src, itemData)\r\n end\r\n QBX:CreateUseableItem(name, func)\r\n end\r\nend","stubs":[{"funcName":"RegisterUsableItem","metadata":{},"stubCode":"--- **`FRAMEWORK` `SERVER`**\n--- Register usable item on framework default format.\r\n--- @param name string Item name\r\n--- @param cb fun(source: number, item?: table)\nfunction LT.Framework.RegisterUsableItem(name, cb) end"}]}},"@Framework":{"ns":"Framework","meta":{},"shared":{"code":"local GetResourceState = GetResourceState\r\nlocal resourceName = nil\r\nESX = nil\r\nQBCore = nil\r\nQBX = nil\r\nlocal function isStarted(res)\r\n return GetResourceState(res) ~= 'missing'\r\nend\r\nlocal function detectFramework()\r\n if isStarted('es_extended') then\r\n ESX = exports.es_extended:getSharedObject()\r\n resourceName = 'es_extended'\r\n elseif isStarted('qb-core') and not isStarted('qbx_core') then\r\n QBCore = exports['qb-core']:GetCoreObject()\r\n resourceName = 'qb-core'\r\n elseif isStarted('qbx_core') then\r\n QBX = exports.qbx_core\r\n resourceName = 'qbx_core'\r\n end\r\n if not resourceName then\r\n printf('error', 'No supported framework found.')\r\n end\r\nend\r\nfunction GetFramework()\r\n return resourceName\r\nend\r\ndetectFramework()","stubs":[{"funcName":"GetFramework","metadata":{"export":"GetResource"},"stubCode":"--- **`FRAMEWORK` `SHARED`**\n--- Returns framework name.\r\n--- @return 'es_extended'|'qb-core'|'qbx_core'|nil\nfunction LT.Framework.GetResource() end"}]},"client":null,"server":null},"@Fuel/GetFuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local DoesEntityExist = DoesEntityExist\r\nlocal adapters = {\r\n ['ox_fuel'] = function(vehicle)\r\n return Entity(vehicle).state.fuel\r\n end,\r\n ['x-fuel'] = function(vehicle)\r\n local level, _ = Fuel:getFuel(vehicle)\r\n return level\r\n end,\r\n default = function(vehicle)\r\n return Fuel:GetFuel(vehicle)\r\n end,\r\n fallback = function(vehicle)\r\n return GetVehicleFuelLevel(vehicle)\r\n end\r\n}\r\nfunction GetFuel(vehicle)\r\n if not DoesEntityExist(vehicle) then return 0.0 end\r\n local adapter = adapters.fallback\r\n local resource = GetFuelResource()\r\n if resource then\r\n if adapters[resource] then\r\n adapter = adapters[resource]\r\n else\r\n adapter = adapters.default\r\n end\r\n end\r\n return adapter(vehicle)\r\nend","stubs":[{"funcName":"GetFuel","metadata":{},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Get fuel percentage of vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @return number Fuel\nfunction LT.Fuel.GetFuel(vehicle) end"}]},"server":null},"@Fuel/SetFuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['ox_fuel'] = function(vehicle, fuel)\r\n local newFuel = (Entity(vehicle).state.fuel or 0) + fuel\r\n Entity(vehicle).state.fuel = newFuel\r\n end,\r\n ['x-fuel'] = function(vehicle, fuel)\r\n Fuel:SetFuel(vehicle, fuel)\r\n end,\r\n default = function(vehicle, fuel)\r\n Fuel:SetFuel(vehicle, fuel)\r\n end,\r\n fallback = function(vehicle, fuel)\r\n SetVehicleFuelLevel(vehicle, fuel)\r\n end\r\n}\r\nfunction SetFuel(vehicle, fuel)\r\n if not DoesEntityExist(vehicle) then return end\r\n local adapter = adapters.fallback\r\n local resource = GetFuelResource()\r\n if resource then\r\n if adapters[resource] then\r\n adapter = adapters[resource]\r\n else\r\n adapter = adapters.default\r\n end\r\n end\r\n adapter(vehicle, fuel)\r\nend","stubs":[{"funcName":"SetFuel","metadata":{},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Set fuel percentage of vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @param fuel number Fuel level to assign.\nfunction LT.Fuel.SetFuel(vehicle, fuel) end"}]},"server":null},"@Fuel":{"ns":"Fuel","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_fuel'] = {},\r\n ['lt-fuel'] = {},\r\n ['LegacyFuel'] = { providers = { 'lt-fuel', 'qb-fuel' } },\r\n ['qb-fuel'] = {},\r\n ['qs-fuelstations'] = {},\r\n ['cdn-fuel'] = {},\r\n ['x-fuel'] = {},\r\n ['okokGasStation'] = {},\r\n ['esx-sna-fuel'] = {},\r\n ['ps-fuel'] = {},\r\n ['BigDaddy-Fuel'] = {},\r\n ['Renewed-Fuel'] = {},\r\n ['lc_fuel'] = {}\r\n}\r\nfunction GetFuelResource()\r\n return resourceName\r\nend\r\nfunction SetFuelResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Fuel resource ^3%s^7 not found.', name) end\r\n Fuel = exports[name]\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'fuel')\r\nif resource then\r\n SetFuelResource(resource)\r\nend","stubs":[{"funcName":"GetFuelResource","metadata":{"export":"GetResource"},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Returns fuel resource name.\r\n--- @return 'ox_fuel'|'lt-fuel'|'LegacyFuel'|'qb-fuel'|'qs-fuelstations'|'cdn-fuel'|'x-fuel'|'okokGasStation'|'esx-sna-fuel'|'ps-fuel'|'BigDaddy-Fuel'|'Renewed-Fuel'|'lc_fuel'|nil\nfunction LT.Fuel.GetResource() end"},{"funcName":"SetFuelResource","metadata":{"export":"SetResource"},"stubCode":"--- **`FUEL` `CLIENT`**\n--- Force set fuel resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_fuel'|'lt-fuel'|'LegacyFuel'|'qb-fuel'|'qs-fuelstations'|'cdn-fuel'|'x-fuel'|'okokGasStation'|'esx-sna-fuel'|'ps-fuel'|'BigDaddy-Fuel'|'Renewed-Fuel'|'lc_fuel'\nfunction LT.Fuel.SetResource(name) end"}]},"server":null},"@Helpers/DetectResource":{"ns":"Helpers","meta":{"internal":true},"shared":{"code":"local GetResourceState = GetResourceState\r\nfunction DetectResource(list, name)\r\n local startedResources = {}\r\n for resourceName, data in pairs(list) do\r\n if GetResourceState(resourceName) ~= 'missing' then\r\n local canSelect = true\r\n if data.providers then\r\n for i = 1, #data.providers do\r\n if GetResourceState(data.providers[i]) ~= 'missing' then\r\n canSelect = false\r\n break\r\n end\r\n end\r\n end\r\n if canSelect then\r\n startedResources[#startedResources+1] = resourceName\r\n end\r\n end\r\n end\r\n if #startedResources == 1 then\r\n return startedResources[1]\r\n elseif #startedResources > 1 then\r\n printf('warning', 'Multiple %s script detected! First resource will be used. Running resources:', name)\r\n for i = 1, #startedResources do\r\n printf(nil, '%d. %s', i, startedResources[i])\r\n end\r\n return startedResources[1]\r\n else\r\n printf('error', 'No supported %s script found.', name)\r\n end\r\n return nil\r\nend","stubs":[{"funcName":"DetectResource","metadata":{"internal":true,"global":true},"stubCode":"--- **`HELPERS` `SHARED`**\n--- Helper function to detect resources.\r\n--- @param list table { resourceName = { providers? = { 'resourceName' } } }\r\n--- @return string?\nfunction LT.DetectResource(list, name) end"}]},"client":null,"server":null},"@Hooks/Start":{"ns":"Hooks","meta":{},"shared":{"code":"function OnResourceStart(cb, resource)\r\n local checkResource = resource or LT_RESOURCE_NAME\r\n AddEventHandler('onResourceStart', function (res)\r\n if res ~= checkResource then return end\r\n cb()\r\n end)\r\nend","stubs":[{"funcName":"OnResourceStart","metadata":{"export":"Start"},"stubCode":"--- **`HOOKS` `SHARED`**\n--- Execute a callback when a resource starts.\r\n--- @param cb fun()\r\n--- @param resource? string Defaults to the current resource name.\r\n--- ```lua\r\n--- LT.Hooks.Start(function()\r\n--- print(\"Resource started.\")\r\n--- end)\r\n--- ```\nfunction LT.Hooks.Start(cb, resource) end"}]},"client":null,"server":null},"@Hooks/Stop":{"ns":"Hooks","meta":{},"shared":{"code":"function OnResourceStop(cb, resource)\r\n local checkResource = resource or LT_RESOURCE_NAME\r\n AddEventHandler('onResourceStop', function (res)\r\n if res ~= checkResource then return end\r\n cb()\r\n end)\r\nend","stubs":[{"funcName":"OnResourceStop","metadata":{"export":"Stop"},"stubCode":"--- **`HOOKS` `SHARED`**\n--- Execute a callback when a resource stops.\r\n--- @param cb fun()\r\n--- @param resource? string Defaults to the current resource name.\r\n--- ```lua\r\n--- LT.Hooks.Stop(function()\r\n--- print(\"Resource stopped.\")\r\n--- end)\r\n--- ```\nfunction LT.Hooks.Stop(cb, resource) end"}]},"client":null,"server":null},"@Input":{"ns":"Input","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['qb-input'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetInputResource()\r\n return resourceName\r\nend\r\nfunction SetInputResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Input resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'input')\r\nif resource then\r\n SetInputResource(resource)\r\nend\r\nlocal function convertTypesQBtoOX(_type)\r\n if _type == \"text\" then\r\n return \"input\"\r\n elseif _type == \"password\" then\r\n return \"input\"\r\n elseif _type == \"number\" then\r\n return \"number\"\r\n elseif _type == \"radio\" then\r\n return \"checkbox\"\r\n elseif _type == \"checkbox\" then\r\n return \"checkbox\"\r\n elseif _type == \"select\" then\r\n return \"select\"\r\n end\r\nend\r\nlocal function convertInputQBtoOX(inputs)\r\n local returnData = {}\r\n for i, v in pairs(inputs) do\r\n local input = {\r\n label = v.text,\r\n name = i,\r\n type = convertTypesQBtoOX(v.type),\r\n required = v.isRequired,\r\n default = v.placeholder,\r\n }\r\n if v.type == \"select\" then\r\n input.options = {}\r\n for i, v in pairs(v.options) do\r\n table.insert(input.options, {value = v.value, label = v.text})\r\n end\r\n elseif v.type == \"checkbox\" then\r\n for i, v in pairs(v.options) do\r\n table.insert(returnData, {value = v.value, label = v.text})\r\n end\r\n end\r\n table.insert(returnData, input)\r\n end\r\n return returnData\r\nend\r\nlocal function convertTypesOXtoQB(_type)\r\n if _type == \"input\" then\r\n return \"text\"\r\n elseif _type == \"number\" then\r\n return \"number\"\r\n elseif _type == \"checkbox\" then\r\n return \"checkbox\"\r\n elseif _type == \"select\" then\r\n return \"select\"\r\n elseif _type == \"multi-select\" then\r\n return \"select\"\r\n elseif _type == \"slider\" then\r\n return \"number\"\r\n elseif _type == \"color\" then\r\n return \"text\"\r\n elseif _type == \"date\" then\r\n return \"date\"\r\n elseif _type == \"date-range\" then\r\n return \"date\"\r\n elseif _type == \"time\" then\r\n return \"time\"\r\n elseif _type == \"textarea\" then\r\n return \"text\"\r\n end\r\nend\r\nlocal function convertInputOXtoQB(inputs)\r\n local returnData = {}\r\n for i, v in pairs(inputs) do\r\n local input = {\r\n text = v.label,\r\n name = i,\r\n type = convertTypesOXtoQB(v.type),\r\n isRequired = v.required,\r\n default = v.default or \"\",\r\n }\r\n if v.type == \"select\" then\r\n input.text = \"\"\r\n input.options = {}\r\n for k, j in pairs(v.options) do\r\n table.insert(input.options, {value = j.value, text = j.label})\r\n end\r\n elseif v.type == \"checkbox\" then\r\n input.text = \"\"\r\n input.options = {}\r\n if v.options then \n for k, j in pairs(v.options) do\r\n table.insert(input.options, {value = #returnData + #input.options + 1, text = j.label, checked = j.checked}) \n end\r\n else \n table.insert(input.options, {value = #returnData + 1, text = v.label, checked = v.checked}) \n end\r\n end\r\n table.insert(returnData, input)\r\n end\r\n return returnData\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n local convertedData = {}\r\n local returnData = lib.inputDialog(title, convertInputQBtoOX(inputs))\r\n for i, v in pairs(inputs) do\r\n for k, j in pairs(returnData or {}) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n else\r\n return lib.inputDialog(title, data)\r\n end\r\n end,\r\n ['lt-ui'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n local convertedData = {}\r\n local returnData = exports['lt-ui']:inputDialog(title, convertInputQBtoOX(inputs))\r\n for i, v in pairs(inputs) do\r\n for k, j in pairs(returnData or {}) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n else\r\n return exports['lt-ui']:inputDialog(title, data)\r\n end\r\n end,\r\n ['qb-input'] = function(title, data, isQB, submitText)\r\n local input = data.inputs\r\n if not isQB then\r\n input = convertInputOXtoQB(data)\r\n end\r\n local returnData = exports['qb-input']:ShowInput({\r\n header = title,\r\n submitText = submitText or \"Submit\",\r\n inputs = input\r\n })\r\n if not returnData then return end\r\n if returnData[1] then return returnData end\r\n local convertedData = {}\r\n if isQB then\r\n for i, v in pairs(input) do\r\n for k, j in pairs(returnData) do\r\n if k == v.name then\r\n convertedData[v.name] = j\r\n end\r\n end\r\n end\r\n return convertedData\r\n end\r\n for i, v in pairs(returnData) do\r\n local index = i and tonumber(i)\r\n v = tostring(v) == \"true\" and true or (tostring(v) == \"false\" and false or v)\r\n if not index then\r\n table.insert(convertedData, v)\r\n else\r\n convertedData[index] = v\r\n end\r\n end\r\n return convertedData\r\n end,\r\n ['lation_ui'] = function(title, data, isQB, submitText)\r\n local inputs = data.inputs\r\n if isQB then\r\n return exports.lation_ui:input({title = title, inputs = convertInputQBtoOX(inputs)})\r\n else\r\n return exports.lation_ui:input({title = title, options = data})\r\n end\r\n end,\r\n}\r\nfunction OpenInput(header, data, isQB, submitText)\r\n local resource = GetInputResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n return adapter(header, data, isQB, submitText)\r\nend","stubs":[{"funcName":"GetInputResource","metadata":{"export":"GetResource"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Returns input resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'qb-input'|'lation_ui'|nil\nfunction LT.Input.GetResource() end"},{"funcName":"SetInputResource","metadata":{"export":"SetResource"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Force set input resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'qb-input'|'lation_ui'\nfunction LT.Input.SetResource(name) end"},{"funcName":"OpenInput","metadata":{"export":"Open"},"stubCode":"--- **`INPUT` `CLIENT`**\n--- Opens a input dialog.\r\n--- @param header string Title of input dialog\r\n--- @param data table Data table\r\n--- @param isQB? boolean If data table is sent with QB format set to true, default: false\r\n--- @param submitText? string Submit button text, only for `qb-input`\r\n--- @return table|nil\nfunction LT.Input.Open(header, data, isQB, submitText) end"}]},"server":null},"@Inventory/AddItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local function addESXItem(source, item, count, slot, metadata)\r\n local msg = \"This framework ^1ESX^7 does not support ^3%s^7, please ensure you are using a supported inventory system or that you have the correct start order.\"\r\n if slot then\r\n printf('warning', msg, 'item slots')\r\n end\r\n if metadata then\r\n printf('warning', msg, 'item metadata')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n Player.addInventoryItem(item, count)\r\n return true\r\nend\r\nlocal function addQBItem(source, item, count, slot, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n local success = Player.Functions.AddItem(item, count, slot, metadata)\r\n if not success then return false end\r\n return success\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count, metadata) then return false end\r\n local success = Inventory:AddItem(source, item, count, metadata)\r\n return success or false\r\n end,\r\n ['qs-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['qb-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanAddItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata, 'lt_bridge')\r\n if QBCore then\r\n TriggerClientEvent('qb-inventory:client:ItemBox', source, QBCore.Shared.Items[item], 'add', count)\r\n end\r\n return success or false\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:CanCarryItem(source, item, count) then return false end\r\n local success = Inventory:AddItem(source, item, count, slot, metadata, false)\r\n return success or false\r\n end,\r\n ['origen_inventory'] = function(source, item, count, slot, metadata)\r\n if not Inventory:canCarryItem(source, item, count) then return false end\r\n local success = Inventory:addItem(source, item, count, metadata, slot, false)\r\n return success or false\r\n end,\r\n fallback = function(source, item, count, slot, metadata)\r\n if ESX then\r\n return addESXItem(source, item, count, slot, metadata)\r\n elseif QBX or QBCore then\r\n return addQBItem(source, item, count, slot, metadata)\r\n end\r\n end\r\n}\r\nfunction AddItem(source, item, count, slot, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, count, slot, metadata)\r\nend","stubs":[{"funcName":"AddItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Add item to player.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @param slot? number Item slot (optional)\r\n--- @param metadata? table Item metadata (optional)\r\n--- @return boolean\nfunction LT.Inventory.AddItem(source, item, count, slot, metadata) end"}]}},"@Inventory/CanCarryItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['qs-inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['qb-inventory'] = function(source, item, count)\r\n return Inventory:CanAddItem(source, item, count)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count)\r\n return Inventory:CanCarryItem(source, item, count)\r\n end,\r\n ['origen_inventory'] = function(source, item, count)\r\n return Inventory:canCarryItem(source, item, count)\r\n end\r\n}\r\nfunction CanCarryItem(source, item, count)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return false end\r\n return adapters[name](source, item, count)\r\nend","stubs":[{"funcName":"CanCarryItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Check if player can carry item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @return boolean\nfunction LT.Inventory.CanCarryItem(source, item, count) end"}]}},"@Inventory/GetItemBySlot":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, slot)\r\n return Inventory:GetSlot(source, slot)\r\n end,\r\n ['qs-inventory'] = function(source, slot)\r\n local playerItems = Inventory:GetInventory(source)\r\n for _, item in pairs(playerItems) do\r\n if item.slot == slot then\r\n return {\r\n name = item.name,\r\n label = item.label,\r\n weight = item.weight,\r\n slot = slot,\r\n count = item.amount or item.count,\r\n metadata = item.info or item.metadata or {},\r\n stack = item.unique or item.stack or false,\r\n description = item.description\r\n }\r\n end\r\n end\r\n return {}\r\n end,\r\n ['qb-inventory'] = function(source, slot)\r\n local slotData = Inventory:GetItemBySlot(source, slot)\r\n if not slotData then return {} end\r\n return {\r\n name = slotData.name,\r\n label = slotData.name,\r\n weight = slotData.weight,\r\n slot = slotData.slot,\r\n count = slotData.amount,\r\n metadata = slotData.info,\r\n stack = slotData.unique,\r\n description = slotData.description\r\n }\r\n end,\r\n ['tgiann-inventory'] = function(source, slot)\r\n local item = Inventory:GetItemBySlot(source, slot)\r\n if not item then return {} end\r\n return {\r\n name = item.name,\r\n label = item.label,\r\n weight = item.weight,\r\n slot = slot,\r\n count = item.amount or item.count,\r\n metadata = item.info or item.metadata or {},\r\n stack = item.unique or item.stack or false,\r\n description = item.description\r\n }\r\n end,\r\n ['origen_inventory'] = function(source, slot)\r\n local playerInv = GetPlayerInventory(source)\r\n for _, v in pairs(playerInv) do\r\n if v.slot == slot then\r\n return {\r\n name = v.name,\r\n count = v.count or v.amount,\r\n weight = v.weight or 0,\r\n metadata = v.metadata or v.info or {},\r\n slot = v.slot,\r\n label = v.label\r\n }\r\n end\r\n end\r\n return {}\r\n end\r\n}\r\nfunction GetItemBySlot(source, slot)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return nil end\r\n return adapters[name](source, slot)\r\nend","stubs":[{"funcName":"GetItemBySlot","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns the specified slot item data as a table.\r\n--- @param source number Player source\r\n--- @param slot number Slot to search\r\n--- @return table|nil {name, label, count, slot, weight, metadata, stack, description}\nfunction LT.Inventory.GetItemBySlot(source, slot) end"}]}},"@Inventory/GetItemCount":{"ns":"Inventory","meta":{},"shared":null,"client":{"code":"local function frameworkSearch(item, metadata)\r\n if ESX then\r\n if metadata then\r\n printf('warning', 'This framework ^1(ESX)^7 does not support item metadata, please ensure you are using a supported inventory system or that you have the correct start order.')\r\n end\r\n local item = ESX.SearchInventory(item)\r\n return item.count\r\n elseif QBX or QBCore then\r\n local inv = GetPlayerData().items\r\n local count = 0\r\n for _, v in pairs(inv) do\r\n if v.name == item and (not metadata or (v.info == metadata or v.metadata == metadata)) then\r\n count = count + (v.amount or v.count)\r\n end\r\n end\r\n return count\r\n end\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(item, metadata)\r\n return Inventory:GetItemCount(item, metadata, false)\r\n end,\r\n ['qs-inventory'] = function(item, metadata)\r\n if metadata then\r\n printf('warning', '^1qs-inventory^7 does not support metadata searching for item counts, you will need to get the inventory and parse it manually.')\r\n end\r\n return Inventory:Search(item)\r\n end,\r\n ['qb-inventory'] = function(item, metadata)\r\n return frameworkSearch(item, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(item, metadata)\r\n return Inventory:GetItemCount(item, metadata, false)\r\n end,\r\n ['origen_inventory'] = function(item, metadata)\r\n return Inventory:Search('count', item, metadata).count\r\n end,\r\n fallback = function(item, metadata)\r\n return frameworkSearch(item, metadata)\r\n end\r\n}\r\nfunction GetItemCountClient(item, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(item, metadata) or 0\r\nend","stubs":[{"funcName":"GetItemCountClient","metadata":{"export":"GetItemCount"},"stubCode":"--- **`INVENTORY` `CLIENT`**\n--- Returns count of items on players inventory. If there is none returns 0.\r\n--- @param item string Item name\r\n--- @param metadata? any Metadata (optional)\r\n--- @return number\nfunction LT.Inventory.GetItemCount(item, metadata) end"}]},"server":{"code":"local function getESXItemCount(source, item, metadata)\r\n if metadata then\r\n printf('warning', 'This framework ^1(ESX)^7 does not support item metadata, please ensure you are using a supported inventory system or that you have the correct start order.')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n return Player.getInventoryItem(item).count or 0\r\nend\r\nlocal function getQBItemCount(source, item, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return 0 end\r\n local inv = Player.PlayerData.items\r\n local count = 0\r\n for _, v in pairs(inv) do\r\n if v.name == item and (not metadata or (v.info == metadata or v.metadata == metadata)) then\r\n count = count + (v.amount or v.count)\r\n end\r\n end\r\n return count\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, metadata)\r\n return Inventory:GetItemCount(source, item, metadata, false)\r\n end,\r\n ['qs-inventory'] = function(source, item, metadata)\r\n if metadata then\r\n printf('warning', '^1qs-inventory^7 does not support metadata searching for item counts, you will need to get the inventory and parse it manually.')\r\n end\r\n return Inventory:GetItemTotalAmount(source, item)\r\n end,\r\n ['qb-inventory'] = function(source, item, metadata)\r\n return getQBItemCount(source, item, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, metadata)\r\n return Inventory:GetItemByName(source, item, metadata).amount\r\n end,\r\n ['origen_inventory'] = function(source, item, metadata)\r\n return Inventory:getItemCount(source, item, metadata, false)\r\n end,\r\n fallback = function(source, item, metadata)\r\n if ESX then\r\n return getESXItemCount(source, item, metadata)\r\n elseif QBX or QBCore then\r\n return getQBItemCount(source, item, metadata)\r\n end\r\n end\r\n}\r\nfunction GetItemCountServer(source, item, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, metadata) or 0\r\nend","stubs":[{"funcName":"GetItemCountServer","metadata":{"export":"GetItemCount"},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns count of items on players inventory. If there is none returns 0.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param metadata? any Metadata (optional)\r\n--- @return number\nfunction LT.Inventory.GetItemCount(source, item, metadata) end"}]}},"@Inventory/GetItemImage":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local laot = 'https://avatars.githubusercontent.com/u/70145288'\r\nlocal string_format = string.format\r\nlocal function stripPng(item)\r\n if string.find(item, \".png\") then\r\n item = string.gsub(item, \".png\", \"\")\r\n end\r\n return item\r\nend\r\nlocal function stripWebp(item)\r\n if string.find(item, \".webp\") then\r\n item = string.gsub(item, \".webp\", \"\")\r\n end\r\n return item\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(item)\r\n local file = LoadResourceFile(\"ox_inventory\", string_format(\"web/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://ox_inventory/web/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['qs-inventory'] = function(item)\r\n local file = LoadResourceFile(\"qs-inventory\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://qs-inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['qb-inventory'] = function(item)\r\n local file = LoadResourceFile(\"qb-inventory\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://qb-inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end,\r\n ['tgiann-inventory'] = function(item)\r\n local webpItem = stripWebp(item)\r\n local pngPath = LoadResourceFile(\"inventory_images\", string_format(\"/images/%s.png\", item))\r\n local webpPath = LoadResourceFile(\"inventory_images\", string_format(\"/images/%s.webp\", webpItem))\r\n local imagePath = pngPath and string_format(\"nui://inventory_images/images/%s.png\", item) or webpPath and string_format(\"nui://inventory_images/images/%s.webp\", webpItem)\r\n return imagePath or laot\r\n end,\r\n ['origen_inventory'] = function(item)\r\n local file = LoadResourceFile(\"origin\", string_format(\"html/images/%s.png\", item))\r\n local imagePath = file and string_format(\"nui://origen_inventory/html/images/%s.png\", item)\r\n return imagePath or laot\r\n end\r\n}\r\nfunction GetItemImage(item)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return end\r\n item = stripPng(item)\r\n return adapters[name](item)\r\nend","stubs":[{"funcName":"GetItemImage","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns item image path.\r\n--- @param item string Item name\r\n--- @return string|nil\nfunction LT.Inventory.GetItemImage(item) end"}]}},"@Inventory/GetItemInfo":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(item)\r\n local itemData = Inventory:Items(item)\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.stack or \"true\",\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['qs-inventory'] = function(item)\r\n local itemsData = Inventory:GetItemList()\r\n if not itemsData then return {} end\r\n local itemData = itemsData[item]\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['qb-inventory'] = function(item)\r\n if not QBCore then return {} end\r\n local itemData = QBCore.Shared.Items[item]\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name,\r\n label = itemData.label,\r\n stack = itemData.unique,\r\n weight = itemData.weight,\r\n description = itemData.description,\r\n image = GetItemImage(item)\r\n }\r\n end,\r\n ['tgiann-inventory'] = function(item)\r\n local itemData = Inventory:GetItemList()\r\n if not itemData[item] then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end,\r\n ['origen_inventory'] = function(item)\r\n local itemData = Inventory:Items(item)\r\n if not itemData then return {} end\r\n return {\r\n name = itemData.name or \"Missing Name\",\r\n label = itemData.label or \"Missing Label\",\r\n stack = itemData.unique or false,\r\n weight = itemData.weight or 0,\r\n description = itemData.description or \"none\",\r\n image = GetItemImage(item),\r\n }\r\n end\r\n}\r\nfunction GetItemInfo(item)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return end\r\n return adapters[name](item)\r\nend","stubs":[{"funcName":"GetItemInfo","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns item info as a table.\r\n--- @param item string Item name\r\n--- @return table|nil {name, label, stack, weight, description, image}\nfunction LT.Inventory.GetItemInfo(item) end"}]}},"@Inventory/GetPlayerInventory":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source)\r\n return Inventory:GetInventoryItems(source, false)\r\n end,\r\n ['qs-inventory'] = function(source)\r\n local playerItems = Inventory:GetInventory(source)\r\n local repackedTable = {}\r\n for _, v in pairs(playerItems) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info or v.metadata or {},\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end,\r\n ['qb-inventory'] = function(source)\r\n local player = GetPlayer(source)\r\n if not player then return {} end\r\n local inventory = player.PlayerData.item\r\n local repackedTable = {}\r\n for _, v in pairs(inventory) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end,\r\n ['tgiann-inventory'] = function(source)\r\n local inventory = Inventory:GetPlayerItems(source)\r\n local items = {}\r\n for _, v in pairs(inventory) do\r\n if tonumber(_) then\r\n table.insert(items, {name = v.name, label = v.name, weight = 0, description = v.description, slot = v.slot, count = v.amount, metadata = v.info})\r\n end\r\n end\r\n return items\r\n end,\r\n ['origen_inventory'] = function(source)\r\n local playerInv = Inventory:GetInventory(source)\r\n local inv = playerInv.inventory or {}\r\n local repack = {}\r\n for _, v in pairs(inv) do\r\n if v.slot then\r\n table.insert(repack, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.metadata or v.info or {},\r\n slot = v.slot,\r\n label = v.label or \"Unknown\"\r\n })\r\n end\r\n end\r\n return repack\r\n end,\r\n fallback = function(source)\r\n if ESX then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inv = Player.getInventory()\r\n local repackedTable = {}\r\n for _, v in pairs(inv) do\r\n if v.count > 0 then\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.count,\r\n metadata = {}, \n slot = 0, \n })\r\n end\r\n end\r\n return repackedTable\r\n elseif QBCore then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inv = Player.PlayerData.items\r\n local repackedTable = {}\r\n for _, v in pairs(inv) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount or v.count,\r\n metadata = v.info,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n elseif QBX then\r\n local Player = GetPlayer(source)\r\n if not Player then return {} end\r\n local inventory = Player.PlayerData.items\r\n local repackedTable = {}\r\n for _, v in pairs(inventory) do\r\n table.insert(repackedTable, {\r\n name = v.name,\r\n count = v.amount,\r\n metadata = v.metadata,\r\n slot = v.slot,\r\n })\r\n end\r\n return repackedTable\r\n end\r\n end\r\n}\r\nfunction GetPlayerInventory(source)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source)\r\nend","stubs":[{"funcName":"GetPlayerInventory","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Returns player inventory as table.\r\n--- @param source number Player source\r\n--- @return table {name,label?,weight?,description?,count,slot,metadata}\nfunction LT.Inventory.GetPlayerInventory(source) end"}]}},"@Inventory/HasItem":{"ns":"Inventory","meta":{},"shared":null,"client":{"code":"function HasItem(item, count)\r\n return GetItemCountClient(item) >= (count or 1) or false\r\nend","stubs":[{"funcName":"HasItem","metadata":{},"stubCode":"--- **`INVENTORY` `CLIENT`**\n--- Check if player has item.\r\n--- @param item string Item name\r\n--- @param count? number Required count (optional)\r\n--- @return boolean\nfunction LT.Inventory.HasItem(item, count) end"}]},"server":{"code":"function HasItem(source, item, count)\r\n return GetItemCountServer(source, item) >= (count or 1) or false\r\nend","stubs":[{"funcName":"HasItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Check if player has item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count? number Required count (optional)\r\n--- @return boolean\nfunction LT.Inventory.HasItem(source, item, count) end"}]}},"@Inventory/RemoveItem":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local function removeESXItem(source, item, count, slot, metadata)\r\n local msg = \"This framework (esx) does not support %s, please ensure you are using a supported inventory system or that you have the correct start order.\"\r\n if slot then\r\n printf('error', msg, 'item slots')\r\n end\r\n if metadata then\r\n printf('error', msg, 'item metadata')\r\n end\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n Player.removeInventoryItem(item, count)\r\n return true\r\nend\r\nlocal function removeQBItem(source, item, count, slot, metadata)\r\n local Player = GetPlayer(source)\r\n if not Player then return false end\r\n local success = Player.Functions.RemoveItem(item, count, slot)\r\n if not success then return false end\r\n return success\r\nend\r\nlocal adapters = {\r\n ['ox_inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, metadata, slot)\r\n return success or false\r\n end,\r\n ['qs-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['qb-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, 'lt-bridge')\r\n if QBCore then\r\n TriggerClientEvent('qb-inventory:client:ItemBox', source, QBCore.Shared.Items[item], 'remove', count)\r\n end\r\n return success or false\r\n end,\r\n ['tgiann-inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:RemoveItem(source, item, count, slot, metadata)\r\n return success or false\r\n end,\r\n ['origen_inventory'] = function(source, item, count, slot, metadata)\r\n local success = Inventory:removeItem(source, item, count, metadata, slot, false)\r\n return success or false\r\n end,\r\n fallback = function(source, item, count, slot, metadata)\r\n if ESX then\r\n return removeESXItem(source, item, count, slot, metadata)\r\n elseif QBX or QBCore then\r\n return removeQBItem(source, item, count, slot, metadata)\r\n end\r\n end\r\n}\r\nfunction RemoveItem(source, item, count, slot, metadata)\r\n local name = GetInventoryResource()\r\n local adapter = adapters[name]\r\n if not adapter then adapter = adapters.fallback end\r\n return adapter(source, item, count, slot, metadata)\r\nend","stubs":[{"funcName":"RemoveItem","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Remove item from player.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param count number Item count\r\n--- @param slot? number Item slot (optional)\r\n--- @param metadata? table Item metadata (optional)\r\n--- @return boolean\nfunction LT.Inventory.RemoveItem(source, item, count, slot, metadata) end"}]}},"@Inventory/SetItemMetadata":{"ns":"Inventory","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['ox_inventory'] = function(source, item, slot, metadata)\r\n return Inventory:SetMetadata(source, slot, metadata)\r\n end,\r\n ['qs-inventory'] = function(source, item, slot, metadata)\r\n return Inventory:SetItemMetadata(source, slot, metadata)\r\n end,\r\n ['qb-inventory'] = function(source, item, slot, metadata)\r\n local player = GetPlayer(source)\r\n if not player then return false end\r\n player.Functions.RemoveItem(item, 1, slot)\r\n return player.Functions.AddItem(item, 1, slot, metadata)\r\n end,\r\n ['tgiann-inventory'] = function(source, item, slot, metadata)\r\n return Inventory:UpdateItemMetadata(source, item, slot, metadata)\r\n end,\r\n ['origen_inventory'] = function(source, item, slot, metadata)\r\n return Inventory:setMetadata(source, slot, metadata)\r\n end\r\n}\r\nfunction SetItemMetadata(source, item, slot, metadata)\r\n local name = GetInventoryResource()\r\n if not adapters[name] then return 0 end\r\n return adapters[name](source, item, slot, metadata)\r\nend","stubs":[{"funcName":"SetItemMetadata","metadata":{},"stubCode":"--- **`INVENTORY` `SERVER`**\n--- Set/change metadata of item.\r\n--- @param source number Player source\r\n--- @param item string Item name\r\n--- @param slot number Item slot\r\n--- @param metadata any New metadata\nfunction LT.Inventory.SetItemMetadata(source, item, slot, metadata) end"}]}},"@Inventory":{"ns":"Inventory","meta":{"dependencies":["@Framework","@Helpers/DetectResource"]},"shared":{"code":"local resourceName = nil\n\nInventory = {}\n\nlocal list = {\n ['ox_inventory'] = { providers = {'tgiann-inventory', 'qs-inventory', 'origen_inventory'} },\n ['qs-inventory'] = {},\n ['qb-inventory'] = { providers = {'ox_inventory','origen_inventory'} },\n ['tgiann-inventory'] = {},\n ['origen_inventory'] = { providers = {'ox_inventory'} },\n}\n\nfunction GetInventoryResource()\n return resourceName\nend\n\nfunction SetInventoryResource(name)\n if not name then return end\n if not list[name] then return printf('error', 'Inventory resource ^3%s^7 not found.', name) end\n Inventory = exports[name]\n resourceName = name\nend\n\nlocal resource = DetectResource(list, 'inventory')\nif resource then\n SetInventoryResource(resource)\nend","stubs":[{"funcName":"GetInventoryResource","metadata":{"export":"GetResource"},"stubCode":"--- **`INVENTORY` `SHARED`**\n--- Returns inventory resource name.\n--- @return 'ox_inventory'|'qs-inventory'|'qb-inventory'|'tgiann-inventory'|'origen_inventory'|nil\nfunction LT.Inventory.GetResource() end"},{"funcName":"SetInventoryResource","metadata":{"export":"SetResource"},"stubCode":"--- **`INVENTORY` `SHARED`**\n--- Force set inventory resource.\n--- @param name 'ox_inventory'|'qs-inventory'|'qb-inventory'|'tgiann-inventory'|'origen_inventory'\nfunction LT.Inventory.SetResource(name) end"}]},"client":null,"server":null},"@LoadUnload":{"ns":"LoadUnload","meta":{},"shared":null,"client":{"code":"function OnPlayerLoad(cb)\r\n CreateThread(function()\r\n while not IsPlayerLoaded() do\r\n Wait(100)\r\n end\r\n cb()\r\n end)\r\nend\r\nCreateThread(function()\r\n while not IsPlayerLoaded() do\r\n Wait(100)\r\n end\r\n TriggerServerEvent(LT_RESOURCE_NAME..':server:@LoadUnload:Loaded')\r\nend)","stubs":[{"funcName":"OnPlayerLoad","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `CLIENT`**\n--- Execute a callback when a player loads.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerLoad(function()\r\n--- print(\"Player loaded.\")\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerLoad(cb) end"}]},"server":{"code":"function OnPlayerLoad(cb)\r\n local eventName = LT_RESOURCE_NAME..':server:@LoadUnload:Loaded'\r\n RegisterNetEvent(eventName)\r\n AddEventHandler(eventName, cb)\r\nend\r\nfunction OnPlayerUnload(cb)\r\n AddEventHandler('playerDropped', cb)\r\nend","stubs":[{"funcName":"OnPlayerLoad","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `SERVER`**\n--- Execute a callback when a player loads.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerLoad(function()\r\n--- local src = source\r\n--- print(\"Player loaded: \".. src)\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerLoad(cb) end"},{"funcName":"OnPlayerUnload","metadata":{"global":true},"stubCode":"--- **`LOADUNLOAD` `SERVER`**\n--- Execute a callback when a player unloads/drops.\r\n--- @param cb fun()\r\n--- ```lua\r\n--- LT.OnPlayerUnload(function()\r\n--- local src = source\r\n--- print(\"Player disconnected: \".. src)\r\n--- end)\r\n--- ```\nfunction LT.OnPlayerUnload(cb) end"}]}},"@Locale":{"ns":"Locale","meta":{},"shared":{"code":"local currentLocale = nil\r\nlocal dict = {}\r\nlocal corruptedMsg <const> = 'Locale file ^3%s^7 is corrupted.'\r\nlocal function unflattenDict(flat)\r\n local result = {}\r\n for key, value in pairs(flat) do\r\n local current = result\r\n local parts = {}\r\n for part in key:gmatch(\"[^%.]+\") do\r\n table.insert(parts, part)\r\n end\r\n for i = 1, #parts do\r\n local part = parts[i]\r\n if i == #parts then\r\n current[part] = value\r\n else\r\n current[part] = current[part] or {}\r\n current = current[part]\r\n end\r\n end\r\n end\r\n return result\r\nend\r\nlocal function flattenDict(source, target, prefix)\r\n for key, value in pairs(source) do\r\n local fullKey = prefix and (prefix .. '.' .. key) or key\r\n if type(value) == 'table' then\r\n flattenDict(value, target, fullKey)\r\n else\r\n target[fullKey] = value\r\n end\r\n end\r\n return target\r\nend\r\nfunction InitLocale(key, fileType)\r\n local extension = fileType == 'lua' and 'lua' or 'json'\r\n local locales = nil\r\n local file = LoadResourceFile(LT_RESOURCE_NAME, ('locales/%s.%s'):format(key, extension))\r\n if not file then\r\n file = LoadResourceFile(LT_RESOURCE_NAME, ('locales/en.%s'):format(extension))\r\n if not file then\r\n printf('error', 'Locale file ^3%s^7 and fallback ^3en^7 not found or cannot be loaded. Stopping initialization.', key)\r\n return\r\n end\r\n printf('error', 'Locale file ^3%s^7 not found or cannot be loaded. Using ^3en^7 fallback.', key)\r\n key = 'en'\r\n end\r\n if extension == 'json' then\r\n locales = json.decode(file)\r\n else\r\n local fn, err = load(file, ('@@%s/locales/%s.lua'):format(LT_RESOURCE_NAME, key))\r\n if not fn then\r\n printf('error', '%s\\n^1%s^7\\n', corruptedMsg, key, err)\r\n return\r\n end\r\n locales = fn()\r\n end\r\n if not locales or type(locales) ~= 'table' then\r\n printf('error', corruptedMsg, key)\r\n return\r\n end\r\n local flat = flattenDict(locales, {})\r\n for k, v in pairs(flat) do\r\n if type(v) == 'string' then\r\n for var in v:gmatch('${[%w%s%p]-}') do\r\n local locale = flat[var:sub(3, -2)]\r\n if locale then\r\n locale = locale:gsub('%%', '%%%%')\r\n v = v:gsub(var, locale)\r\n end\r\n end\r\n end\r\n dict[k] = v\r\n end\r\n currentLocale = key\r\nend\r\nfunction GetString(str, ...)\r\n local txt = dict[str]\r\n if txt then\r\n if ... then\r\n return txt and txt:format(...)\r\n end\r\n return txt\r\n end\r\n return str\r\nend\r\nfunction GetLocaleStrings(keepNesting)\r\n local returnDict = dict or {}\r\n return keepNesting and unflattenDict(returnDict) or returnDict\r\nend\r\nfunction GetCurrentLocaleKey()\r\n if not currentLocale then\r\n printf('error', 'No locale has been initialized. Please call `LT.Locale.Init` first.')\r\n return\r\n end\r\n return currentLocale\r\nend","stubs":[{"funcName":"InitLocale","metadata":{"export":"Init"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Load and prepare localization from `locales` folder of resource.\r\n--- Don't forget to add `locales/*.{json,lua}` to `files` in `fxmanifest.lua`\r\n---\r\n--- **JSON**:\r\n--- ```lua\r\n--- LT.Locale.Init('en', 'json') -- Setup a JSON locale.\r\n---\r\n--- -- locales/en.json\r\n--- ```\r\n--- ```JSON\r\n--- {\r\n--- \"client\": {\r\n--- \"hello\": \"Hello!\",\r\n--- \"how_are_you\": \"How are you, %s?\",\r\n--- \"hello_how_are_you\": \"${client.hello} ${client.how_are_you}\"\r\n--- }\r\n--- }\r\n--- ```\r\n---\r\n--- **LUA**:\r\n--- ```lua\r\n--- LT.Locale.Init('en', 'lua') -- Setup a LUA locale.\r\n--- \r\n--- -- locales/en.lua\r\n--- return {\r\n--- client = {\r\n--- hello = 'Hello!',\r\n--- how_are_you = 'How are you, %s?',\r\n--- hello_how_are_you = '${client.hello} ${client.how_are_you}'\r\n--- },\r\n--- }\r\n--- ```\r\n--- **Using the locales:**\r\n---\r\n--- ```lua\r\n--- local _t = LT.Locale.Get -- Simplify the function.\r\n---\r\n--- _t('client.hello') -> Hello!\r\n--- _t('client.how_are_you', 'John') -> How are you, John?\r\n--- _t('client.hello_how_are_you', 'John') -> Hello! How are you, John?\r\n--- ```\r\n--- @param key string Locale key (e.g. 'en', 'tr')\r\n--- @param fileType? 'json'|'lua' Default: `json`\nfunction LT.Locale.Init(key, fileType) end"},{"funcName":"GetString","metadata":{"export":"Get"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Get localized string with formatting.\r\n--- @param str string Locale key.\r\n--- @param ...? any Format parameters (Optional)\r\n--- ```lua\r\n--- -- Simplify the function.\r\n--- local _t = LT.Locale.Get\r\n--- \r\n--- _t('client.hello') -> Hello.\r\n--- _t('client.hello_name', 'John') -> Hello, John.\r\n--- ```\r\n--- @return string\nfunction LT.Locale.Get(str, ...) end"},{"funcName":"GetLocaleStrings","metadata":{"export":"GetAllStrings"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Returns all translated strings as a table.\r\n--- Useful for sending translations to NUI.\r\n---\r\n--- By default, the dictionary is flattened:\r\n--- Nested keys like `client -> hello` become a single key (`\"client.hello\"`).\r\n---\r\n--- If `keepNesting` is set to `true`, the original nested structure is preserved:\r\n--- `{ client = { hello = \"...\" } }`\r\n---\r\n---@param keepNesting? boolean Whether to preserve the original nested structure\r\n---@return table<string, string|table> `Translated strings`\nfunction LT.Locale.GetAllStrings(keepNesting) end"},{"funcName":"GetCurrentLocaleKey","metadata":{"export":"GetCurrentKey"},"stubCode":"--- **`LOCALE` `SHARED`**\n--- Returns the current locale key.\r\n--- @return string?\nfunction LT.Locale.GetCurrentKey() end"}]},"client":null,"server":null},"@Logger":{"ns":"Logger","meta":{},"shared":null,"client":null,"server":{"code":"local PerformHttpRequest = PerformHttpRequest\r\nlocal CreateThread = CreateThread\r\nlocal insert = table.insert\r\nlocal string_format = string.format\r\nlocal settings = {\r\n type = nil,\r\n webhook = \"\",\r\n folder = \"logs\",\r\n interval = 60000,\r\n fivemerrAPIKey = nil,\r\n}\r\nlocal LOGGER_TXT_BUFFER = {}\r\nlocal LOGGER_DISCORD_BUFFER = {}\r\nfunction InitLogger(logType, data)\r\n if logType ~= 'discord' and logType ~= 'txt' and logType ~= 'fivemanage' and logType ~= 'fivemerr' then\r\n return printf('error', 'Please select a valid log type: ^4discord^7, ^4txt^7, ^4fivemanage^7, ^4fivemerr^7')\r\n end\r\n if logType == 'discord' then\r\n if not data or not data.webhook then return printf('error', 'Please provide a webhook for discord logger.') end\r\n settings.webhook = data.webhook\r\n elseif logType == 'txt' then\r\n if not data or not data.folder then\r\n data.folder = 'logs/'\r\n else\r\n settings.folder = data.folder\r\n end\r\n elseif logType == 'fivemanage' then\r\n if GetResourceState(\"fmsdk\") == \"missing\" then\r\n return printf('error', '^3fivemanage^7 log system selected but ^3fmsdk^7 resource is missing.')\r\n end\r\n elseif logType == 'fivemerr' then\r\n if not data or not data.fivemerrAPIKey then return printf('error', 'Please provide a fivemerr API key for logger.') end\r\n settings.fivemerrAPIKey = data.fivemerrAPIKey\r\n end\r\n settings.type = logType\r\n if data and data.interval then \r\n settings.interval = data.interval \r\n end\r\n CreateThread(function()\r\n while true do\r\n Wait(settings.interval)\r\n if settings.type == 'txt' then\r\n if #LOGGER_TXT_BUFFER > 0 then\r\n local date = os.date('%Y-%m-%d')\r\n local path = settings.folder .. '/' .. date .. '.txt'\r\n local existing = LoadResourceFile(LT_RESOURCE_NAME, path) or \"\"\r\n local newData = existing .. table.concat(LOGGER_TXT_BUFFER)\r\n SaveResourceFile(LT_RESOURCE_NAME, path, newData, -1)\r\n LOGGER_TXT_BUFFER = {}\r\n end\r\n end\r\n if settings.type == 'discord' then\r\n if #LOGGER_DISCORD_BUFFER > 0 then\r\n local embeds = {}\r\n local toRemove = {}\r\n for i, log in ipairs(LOGGER_DISCORD_BUFFER) do\r\n if #embeds < 10 then\r\n table.insert(embeds, {\r\n color = log.color,\r\n title = LT_RESOURCE_NAME,\r\n fields = {\r\n {\r\n name = 'Log Message',\r\n value = '```' .. log.message .. '```',\r\n inline = false,\r\n }\r\n },\r\n footer = {\r\n text = \"Created with ❤️ by Laot | LTBridge\"\r\n },\r\n timestamp = log.timestamp,\r\n })\r\n table.insert(toRemove, i)\r\n else\r\n break\r\n end\r\n end\r\n for i = #toRemove, 1, -1 do\r\n table.remove(LOGGER_DISCORD_BUFFER, toRemove[i])\r\n end\r\n PerformHttpRequest(settings.webhook, function(status, text, headers) \r\n if status ~= 200 and status ~= 204 then\r\n printf('error', 'Failed to send logs to discord. Status: %s - Response: %s', json.encode(status), json.encode(text))\r\n end\r\n end, 'POST', json.encode({\r\n username = 'LTBridge Logger',\r\n avatar_url = 'https://avatars.githubusercontent.com/u/70145288?v=4',\r\n embeds = embeds,\r\n }), { ['Content-Type'] = 'application/json' })\r\n end\r\n end\r\n end\r\n end)\r\nend\r\nfunction GetLoggerType()\r\n return settings.type\r\nend\r\nfunction GetLoggerSettings()\r\n return settings\r\nend\r\nlocal adapters = {\r\n ['txt'] = function(message, status)\r\n local date = os.date('%H:%M:%S')\r\n local statusTable = {\r\n ['info'] = 'INFO',\r\n ['warn'] = 'WARN',\r\n ['error'] = 'ERROR',\r\n }\r\n local log\r\n local msg = '[%s] %s\\n'\r\n if status ~= nil then\r\n msg = '[%s] %s: %s\\n'\r\n log = string_format(msg, date, statusTable[status] or \"INFO\", message)\r\n else\r\n log = string_format(msg, date, message)\r\n end\r\n insert(LOGGER_TXT_BUFFER, log)\r\n end,\r\n ['discord'] = function(message, status)\r\n local timestamp = os.date(\"!%Y-%m-%dT%H:%M:%SZ\")\r\n local message = tostring(message)\r\n local colors = {\r\n info = 3447003,\r\n warn = 16776960,\r\n error = 15158332,\r\n }\r\n insert(LOGGER_DISCORD_BUFFER, {\r\n color = colors[status] or 3447003,\r\n message = message,\r\n timestamp = timestamp\r\n })\r\n end,\r\n ['fivemanage'] = function(message, status)\r\n exports.fmsdk:LogMessage(status or 'info', message)\r\n end,\r\n ['fivemerr'] = function(message, status)\r\n local data = {\r\n level = status or 'info',\r\n message = tostring(message),\r\n resource = LT_RESOURCE_NAME,\r\n }\r\n PerformHttpRequest('https://api.fivemerr.com/v1/logs', function(status, text, headers)\r\n if status ~= 200 then\r\n printf('error', 'Failed to send log to Fivemerr API (HTTP %d): Please verify your API key is correct and the service is available.', status)\r\n end\r\n end, 'POST', json.encode(data), {\r\n ['Content-Type'] = 'application/json',\r\n ['Authorization'] = GetLoggerSettings().fivemerrAPIKey\r\n })\r\n end\r\n}\r\nfunction CreateLog(message, status)\r\n local logType = GetLoggerType()\r\n if not logType then return printf('error', 'Logger not initialized. Please use ^3LT.Logger.Init()^7 first.') end\r\n local adapter = adapters[logType]\r\n if not adapter then return end\r\n adapter(message, status)\r\nend","stubs":[{"funcName":"InitLogger","metadata":{"export":"Init"},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Initialize logger.\r\n--- **NOTE:** If using `txt` type, you need to create the folder manually `logs` (by default) in your resource folder.\r\n--- @param logType 'discord'|'txt'|'fivemanage'|'fivemerr'\r\n--- @param data? table { `webhook: string` (If using discord), `folder: string` (If using txt, optional), `interval: number` (optional), `fivemerrAPIKey: string` (If using fivemerr, optional) }\r\n--- ```lua\r\n--- LT.Logger.Init('discord', {\r\n--- webhook = '', -- Webhook URL if using discord.\r\n--- folder = 'custom_logs_folder', -- Custom folder if using txt logs. Must be manually created in resource directory.\r\n--- fivemerrAPIKey = '', -- Fivemerr API key if using it.\r\n--- interval = 60000, -- Log write/send interval to prevent spam or rate limits. (default: 60000 -> every minute)\r\n--- })\r\n--- ```\nfunction LT.Logger.Init(logType, data) end"},{"funcName":"GetLoggerType","metadata":{"internal":true},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Get current logger type.\nfunction LT.Logger.GetLoggerType() end"},{"funcName":"GetLoggerSettings","metadata":{"internal":true},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Get current logger settings.\nfunction LT.Logger.GetLoggerSettings() end"},{"funcName":"CreateLog","metadata":{"export":"Create"},"stubCode":"--- **`LOGGER` `SERVER`**\n--- Creates a log message.\r\n--- Use `LT.Logger.Init()` before using this function.\r\n--- @param message string The message to log.\r\n--- @param status? 'info'|'warn'|'error' (optional)\nfunction LT.Logger.Create(message, status) end"}]}},"@Math/Clamp":{"ns":"Math","meta":{},"shared":{"code":"function MathClamp(value, min, max)\n if value < min then return min end\n if value > max then return max end\n return value\nend","stubs":[{"funcName":"MathClamp","metadata":{"export":"Clamp"},"stubCode":"--- **`MATH` `SHARED`**\n--- Clamp a value between min and max.\n--- @param value number\n--- @param min number\n--- @param max number\n--- @return number\nfunction LT.Math.Clamp(value, min, max) end"}]},"client":null,"server":null},"@Math/FormatMoney":{"ns":"Math","meta":{},"shared":{"code":"function MathFormatMoney(num, symbol)\n local formatted = tostring(math.floor(num))\n local k\n while true do\n formatted, k = formatted:gsub('^(-?%d+)(%d%d%d)', '%1,%2')\n if k == 0 then break end\n end\n return (symbol or '$') .. formatted\nend","stubs":[{"funcName":"MathFormatMoney","metadata":{"export":"FormatMoney"},"stubCode":"--- **`MATH` `SHARED`**\n--- Format a number as money with currency symbol.\n--- ```lua\n--- LT.Math.FormatMoney(1234567) -- \"$1,234,567\"\n--- LT.Math.FormatMoney(1234567, '€') -- \"€1,234,567\"\n--- ```\n--- @param num number\n--- @param symbol? string Currency symbol, defaults to \"$\"\n--- @return string\nfunction LT.Math.FormatMoney(num, symbol) end"}]},"client":null,"server":null},"@Math/FormatNumber":{"ns":"Math","meta":{},"shared":{"code":"function MathFormatNumber(num)\n local formatted = tostring(math.floor(num))\n local k\n while true do\n formatted, k = formatted:gsub('^(-?%d+)(%d%d%d)', '%1,%2')\n if k == 0 then break end\n end\n return formatted\nend","stubs":[{"funcName":"MathFormatNumber","metadata":{"export":"FormatNumber"},"stubCode":"--- **`MATH` `SHARED`**\n--- Format a number with thousand separators.\n--- ```lua\n--- LT.Math.FormatNumber(1234567) -- \"1,234,567\"\n--- ```\n--- @param num number\n--- @return string\nfunction LT.Math.FormatNumber(num) end"}]},"client":null,"server":null},"@Math/Lerp":{"ns":"Math","meta":{},"shared":{"code":"function MathLerp(a, b, t)\n return a + (b - a) * t\nend","stubs":[{"funcName":"MathLerp","metadata":{"export":"Lerp"},"stubCode":"--- **`MATH` `SHARED`**\n--- Linear interpolation between two values.\n--- @param a number Start value\n--- @param b number End value\n--- @param t number Interpolation factor (0-1)\n--- @return number\nfunction LT.Math.Lerp(a, b, t) end"}]},"client":null,"server":null},"@Math/MapRange":{"ns":"Math","meta":{},"shared":{"code":"function MathMapRange(value, inMin, inMax, outMin, outMax)\n if inMin == inMax then return outMin end\n return outMin + (value - inMin) * (outMax - outMin) / (inMax - inMin)\nend","stubs":[{"funcName":"MathMapRange","metadata":{"export":"MapRange"},"stubCode":"--- **`MATH` `SHARED`**\n--- Map a value from one range to another.\n--- ```lua\n--- LT.Math.MapRange(50, 0, 100, 0, 1) -- 0.5\n--- ```\n--- @param value number\n--- @param inMin number\n--- @param inMax number\n--- @param outMin number\n--- @param outMax number\n--- @return number\nfunction LT.Math.MapRange(value, inMin, inMax, outMin, outMax) end"}]},"client":null,"server":null},"@Math/RandomFloat":{"ns":"Math","meta":{},"shared":{"code":"function MathRandomFloat(min, max)\n return min + math.random() * (max - min)\nend","stubs":[{"funcName":"MathRandomFloat","metadata":{"export":"RandomFloat"},"stubCode":"--- **`MATH` `SHARED`**\n--- Get a random float in range.\n--- @param min number\n--- @param max number\n--- @return number\nfunction LT.Math.RandomFloat(min, max) end"}]},"client":null,"server":null},"@Math/Round":{"ns":"Math","meta":{},"shared":{"code":"function MathRound(num, decimals)\n local mult = 10 ^ (decimals or 0)\n return math.floor(num * mult + 0.5) / mult\nend","stubs":[{"funcName":"MathRound","metadata":{"export":"Round"},"stubCode":"--- **`MATH` `SHARED`**\n--- Round a number to given decimal places.\n--- @param num number\n--- @param decimals? number Defaults to 0\n--- @return number\nfunction LT.Math.Round(num, decimals) end"}]},"client":null,"server":null},"@Menu":{"ns":"Menu","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['qb-menu'] = {},\r\n ['lation_ui'] = {},\r\n ['wasabi_uikit'] = {},\r\n}\r\nfunction GetMenuResource()\r\n return resourceName\r\nend\r\nfunction SetMenuResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Menu resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'menu')\r\nif resource then\r\n SetMenuResource(resource)\r\nend\r\nlocal function convertQBtoOX(id, menu)\r\n local oxMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if oxMenu.title == \"\" then\r\n oxMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = v.action or function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(oxMenu.options, option)\r\n end\r\n end\r\n return oxMenu\r\nend\r\nlocal function convertOXtoQB(id, menu)\r\n local qbMenu = {\r\n {\r\n header = menu.title,\r\n isMenuHeader = true,\r\n }\r\n }\r\n for i, v in pairs(menu.options) do\r\n local button = {\r\n header = v.title,\r\n txt = v.description,\r\n icon = v.icon,\r\n disabled = v.disabled,\r\n }\r\n if v.onSelect then\r\n button.params = {\r\n event = \"community_bridge:client:MenuCallback\",\r\n args = {id = id, selected = i, args = v.args, onSelect = v.onSelect},\r\n }\r\n else\r\n button.params = {} \n end\r\n table.insert(qbMenu, button)\r\n end\r\n return qbMenu\r\nend\r\nlocal function convertQBtoLation(id, menu)\r\n local lationMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if lationMenu.title == \"\" then\r\n lationMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(lationMenu.options, option)\r\n end\r\n end\r\n return lationMenu\r\nend\r\nlocal function runCheckForImageIcon(icon)\r\n local iconStr = tostring(icon):lower()\r\n if iconStr:match(\"^https?://\") or iconStr:match(\"^nui://\") or iconStr:match(\"^file://\") then\r\n return true\r\n end\r\n local extensions = {\".png\", \".jpg\", \".jpeg\", \".gif\", \".bmp\", \".svg\", \".webp\", \".ico\"}\r\n for _, ext in pairs(extensions) do\r\n if iconStr:match(ext .. \"$\") then\r\n return true\r\n end\r\n end\r\n return false\r\nend\r\nlocal function convertOXtoLation(data)\r\n local repack = {\r\n id = data.id,\r\n title = data.title or \"\",\r\n canClose = data.canClose ~= false,\r\n options = {}\r\n }\r\n for k, v in pairs(data.options) do\r\n if v.iconColor then\r\n if v.icon and runCheckForImageIcon(v.icon) then\r\n v.iconColor = nil\r\n end\r\n end\r\n table.insert(repack.options, v)\r\n end\r\n return repack\r\nend\r\nlocal function convertQBtoWasabi(id, menu)\r\n local wasabiMenu = {\r\n id = id,\r\n title = \"\",\r\n canClose = true,\r\n options = {},\r\n }\r\n for i, v in pairs(menu) do\r\n if v.isMenuHeader then\r\n if wasabiMenu.title == \"\" then\r\n wasabiMenu.title = v.header\r\n end\r\n else\r\n local option = {\r\n title = v.header,\r\n description = v.txt,\r\n icon = v.icon,\r\n args = v.params.args,\r\n onSelect = v.action or function(selected, secondary, args)\r\n local params = menu[id] and menu[id].options and menu[id].options[selected] and menu[id].options[selected].params\r\n if not params then return end\r\n local event = params.event\r\n local isServer = params.isServer\r\n if not event then return end\r\n if isServer then\r\n return TriggerServerEvent(event, args)\r\n end\r\n return TriggerEvent(event, args)\r\n end\r\n }\r\n table.insert(wasabiMenu.options, option)\r\n end\r\n end\r\n return wasabiMenu\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoOX(id, data)\r\n end\r\n exports.ox_lib:registerContext(data)\r\n exports.ox_lib:showContext(id)\r\n return data\r\n end,\r\n ['lt-ui'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoOX(id, data)\r\n end\r\n exports['lt-ui']:registerContext(data)\r\n exports['lt-ui']:showContext(id)\r\n return data\r\n end,\r\n ['qb-menu'] = function(id, data, isQB)\r\n if not isQB then\r\n data = convertOXtoQB(id, data)\r\n end\r\n exports['qb-menu']:openMenu(data)\r\n return data\r\n end,\r\n ['lation_ui'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoLation(id, data)\r\n else\r\n data = convertOXtoLation(data)\r\n end\r\n exports.lation_ui:registerMenu(data)\r\n exports.lation_ui:showMenu(id)\r\n return data\r\n end,\r\n ['wasabi_uikit'] = function(id, data, isQB)\r\n if isQB then\r\n data = convertQBtoWasabi(id, data)\r\n end\r\n exports.wasabi_uikit:RegisterContextMenu(data)\r\n exports.wasabi_uikit:OpenContextMenu(id)\r\n return data\r\n end,\r\n}\r\nfunction OpenMenu(id, data, isQB)\r\n local resource = GetMenuResource()\r\n if not resource then return end\r\n local adapter = adapters[resource]\r\n if not adapter then return end\r\n data.id = id\r\n return adapter(id, data, isQB)\r\nend","stubs":[{"funcName":"GetMenuResource","metadata":{"export":"GetResource"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Returns menu resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'qb-menu'|'lation_ui'|'wasabi_uikit'|nil\nfunction LT.Menu.GetResource() end"},{"funcName":"SetMenuResource","metadata":{"export":"SetResource"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Force set menu resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'qb-menu'|'lation_ui'|'wasabi_uikit'\nfunction LT.Menu.SetResource(name) end"},{"funcName":"OpenMenu","metadata":{"export":"Open"},"stubCode":"--- **`MENU` `CLIENT`**\n--- Opens a interactable menu.\r\n--- @param id string Menu unique ID\r\n--- @param data table Menu data\r\n--- @param isQB? boolean If data table is sent with QB format set to true, default: false\r\n--- @return table|nil\nfunction LT.Menu.Open(id, data, isQB) end"}]},"server":null},"@Notify":{"ns":"Notify","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal exp = {}\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['esx_notify'] = {},\r\n ['okokNotify'] = {},\r\n ['pNotify'] = {},\r\n ['mythic_notify'] = {},\r\n ['brutal_notify'] = {},\r\n ['wasabi_notify'] = {},\r\n ['origen_notify'] = {},\r\n ['lation_ui'] = {},\r\n}\r\nfunction GetNotifyResource()\r\n return resourceName\r\nend\r\nfunction SetNotifyResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Notify resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\n exp = exports[name]\r\nend\r\nlocal resource = DetectResource(list, 'notify')\r\nif resource then\r\n SetNotifyResource(resource)\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:notify({\r\n title = title,\r\n description = message,\r\n type = variant,\r\n duration = time,\r\n })\r\n end,\r\n ['lt-ui'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:notify({\r\n title = title,\r\n description = message,\r\n type = variant,\r\n duration = time,\r\n })\r\n end,\r\n ['esx_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n TriggerEvent('esx:showNotification', message, variant, time, title, 'top-left')\r\n end,\r\n ['okokNotify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:Alert(title, message, time, variant)\r\n end,\r\n ['pNotify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:SendNotification({ title = title, text = message, type = variant, timeout = time })\r\n end,\r\n ['mythic_notify'] = function(title, message, time, variant)\r\n if variant == 'info' then variant = 'inform' end\r\n exp:Notify(variant, message, time)\r\n end,\r\n ['brutal_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:SendAlert(title, message, time, variant)\r\n end,\r\n ['wasabi_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:notify(title, message, time, variant)\r\n end,\r\n ['origen_notify'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:ShowNotification(message, variant, time)\r\n end,\r\n ['lation_ui'] = function(title, message, time, variant)\r\n if variant == 'inform' then variant = 'info' end\r\n exp:notify({\r\n title = title,\r\n message = message,\r\n duration = time,\r\n type = variant\r\n })\r\n end,\r\n}\r\nfunction SendNotify(title, message, variant, time)\r\n local name = GetNotifyResource()\r\n if not name then return end\r\n local adapter = adapters[name]\r\n if not adapter then return end\r\n adapter(title, message, (time or 3500), (variant or 'info'))\r\nend\r\nRegisterNetEvent(LT_RESOURCE_NAME..':client:@Notify:Send', function(title, message, variant, time)\r\n SendNotify(title, message, variant, time)\r\nend)","stubs":[{"funcName":"GetNotifyResource","metadata":{"export":"GetResource"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Returns notify resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'esx_notify'|'okokNotify'|'pNotify'|'mythic_notify'|'brutal_notify'|'wasabi_notify'|'origen_notify'|'lation_ui'|nil\nfunction LT.Notify.GetResource() end"},{"funcName":"SetNotifyResource","metadata":{"export":"SetResource"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Force set notify resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'esx_notify'|'okokNotify'|'pNotify'|'mythic_notify'|'brutal_notify'|'wasabi_notify'|'origen_notify'|'lation_ui'\nfunction LT.Notify.SetResource(name) end"},{"funcName":"SendNotify","metadata":{"export":"Send"},"stubCode":"--- **`NOTIFY` `CLIENT`**\n--- Send notification to player.\r\n--- @param title? string Title for notification.\r\n--- @param message string Notify message.\r\n--- @param variant? 'success'|'error'|'info'|'warning' Type of notification.\r\n--- @param time? number Duration in milliseconds. Defaults to 3500.\nfunction LT.Notify.Send(title, message, variant, time) end"}]},"server":{"code":"function SendNotify(source, title, message, variant, time)\r\n TriggerClientEvent(LT_RESOURCE_NAME..':client:@Notify:Send', source, title, message, variant, time)\r\nend","stubs":[{"funcName":"SendNotify","metadata":{"export":"Send"},"stubCode":"--- **`NOTIFY` `SERVER`**\n--- Send notification to player.\r\n--- @param source number Player source\r\n--- @param title? string Title\r\n--- @param message string Messsage section\r\n--- @param variant? 'success'|'error'|'info'|'warning' Type of notification.\r\n--- @param time? number Duration in milliseconds. Defaults to 3500.\nfunction LT.Notify.Send(source, title, message, variant, time) end"}]}},"@NUI/Callback":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local RegisterNUICallback = RegisterNUICallback\n\nfunction NUICallback(name, cb)\n RegisterNUICallback(name, cb)\nend","stubs":[{"funcName":"NUICallback","metadata":{"export":"Callback"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Registers a NUI callback/listener.\n--- ```lua\n--- LT.NUI.Callback('closeMenu', function(data, cb)\n--- LT.NUI.Focus(false)\n--- cb('ok')\n--- end)\n--- ```\n--- @param name string Callback name\n--- @param cb fun(data: table, cb: fun(response: any))\nfunction LT.NUI.Callback(name, cb) end"}]},"server":null},"@NUI/Focus":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"function NUIFocus(status, cursor)\n SetNuiFocus(status, (cursor == nil and status) or (type(cursor) == \"boolean\" and cursor))\n TriggerEvent(LT_RESOURCE_NAME.. ':client:@NUI:FocusChanged', status, cursor)\nend","stubs":[{"funcName":"NUIFocus","metadata":{"export":"Focus"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Set NUI focus and optional mouse cursor. Also triggers an event that can be listened to.\n---\n--- **Lua Example:**\n--- ```lua\n--- LT.NUI.Focus(true, true) -- Focus + Mouse\n--- LT.NUI.Focus(false) -- Close All\n--- \n--- AddEventHandler(GetCurrentResourceName() .. ':client:@NUI:FocusChanged', function(status, cursor)\n--- print('NUI Focus Changed:', status, cursor)\n--- end)\n--- ```\n---\n--- @param status boolean Focus status\n--- @param cursor? boolean Optional mouse cursor status (defaults to status)\nfunction LT.NUI.Focus(status, cursor) end"}]},"server":null},"@NUI/Request":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local requestId = 0\nlocal requests = {}\n\nRegisterNUICallback('ltbridge:response', function(data, cb)\n local id = data.requestId\n if id and requests[id] then\n requests[id]:resolve(data.data)\n requests[id] = nil\n end\n if cb then cb('ok') end\nend)\n\nfunction NUIRequest(action, data, timeout)\n CheckNUI()\n requestId = requestId + 1\n local id = requestId\n local p = promise.new()\n\n requests[id] = p\n\n SendNUIMessage({\n action = action,\n data = data,\n requestId = id\n })\n\n SetTimeout(timeout or 5000, function()\n if p.state == 0 then \n p:resolve(nil)\n end\n end)\n\n local result = Citizen.Await(p)\n return result\nend","stubs":[{"funcName":"NUIRequest","metadata":{"export":"Request"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Sends a message to the NUI and waits for a response.\n---\n--- **Lua Example:**\n--- ```lua\n--- local name = LT.NUI.Request('get_name', { title = 'Enter' }, 5000)\n--- print(name)\n--- ```\n---\n--- **NUI (JS) Example:**\n--- ```javascript\n--- window.addEventListener('message', (event) => {\n--- if (event.data.action === 'get_name') {\n--- fetch(`https://${GetParentResourceName()}/ltbridge:response`, {\n--- method: 'POST',\n--- body: JSON.stringify({ requestId: event.data.requestId, data: 'John Doe' })\n--- });\n--- }\n--- });\n--- ```\n--- @param action string Action name\n--- @param data? any Optional data to send\n--- @param timeout? number Optional timeout in ms (default: 5000)\n--- @return any? result The data returned from the NUI, or nil if timed out.\nfunction LT.NUI.Request(action, data, timeout) end"}]},"server":null},"@NUI/Send":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local SendNUIMessage = SendNUIMessage\n\nfunction SendNUI(action, payload)\n CheckNUI()\n SendNUIMessage({\n action = action,\n payload = payload\n })\nend","stubs":[{"funcName":"SendNUI","metadata":{"export":"Send"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Sends a message to the NUI.\n---\n--- **Lua Example:**\n--- ```lua\n--- LT.NUI.Send('open_shop', { items = {1, 2, 3} })\n--- ```\n---\n--- **NUI (JS) Example:**\n--- ```javascript\n--- window.addEventListener('message', (event) => {\n--- if (event.data.action === 'open_shop') {\n--- console.log('Shop items:', event.data.payload.items);\n--- }\n--- });\n--- ```\n--- @param action string Action name\n--- @param payload? any Optional data payload\nfunction LT.NUI.Send(action, payload) end"}]},"server":null},"@NUI/State":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local function deepEqual(a, b)\n if type(a) ~= type(b) then return false end\n if type(a) ~= 'table' then return a == b end\n if a == b then return true end\n\n local keys = {}\n for k, v in pairs(a) do\n keys[k] = true\n if not deepEqual(v, b[k]) then return false end\n end\n for k in pairs(b) do\n if not keys[k] then return false end\n end\n return true\nend\n\nlocal RootState = {}\nRootState.__index = RootState\n\nfunction RootState:queueUpdate(key, value)\n local current = self._batch\n local parts = {}\n\n for part in key:gmatch(\"[^%.]+\") do\n table.insert(parts, part)\n end\n\n for i = 1, #parts - 1 do\n local part = parts[i]\n if type(current[part]) ~= 'table' then\n current[part] = {}\n end\n current = current[part]\n end\n\n current[parts[#parts]] = value\n\n if not self._isTicking then\n self._isTicking = true\n SetTimeout(0, function()\n self._isTicking = false\n\n SendNUIMessage({\n action = self._action,\n namespace = self._namespace,\n batch = self._batch\n })\n\n self._batch = {}\n end)\n end\nend\n\nfunction RootState:sync()\n SendNUIMessage({\n action = self._action .. '_sync',\n namespace = self._namespace,\n state = self._internal\n })\nend\n\nfunction RootState:update(changes)\n if type(changes) ~= 'table' then return end\n for k, v in pairs(changes) do\n self._proxy[k] = v\n end\nend\n\nlocal function isDetached(ctx)\n while ctx do\n if ctx.detached then return true end\n ctx = ctx.parent\n end\n return false\nend\n\nlocal function buildProxy(tbl, path, root, ctx)\n local proxy = {}\n local internal = tbl\n local childProxies = {}\n ctx = ctx or { detached = false, parent = nil }\n\n setmetatable(proxy, {\n __isProxy = true,\n __raw = internal,\n __index = function(_, k)\n local v = internal[k]\n\n if v == nil and path == \"\" and RootState[k] then\n return function(_, ...)\n return RootState[k](root, ...)\n end\n end\n\n if type(v) == 'table' then\n local cached = childProxies[k]\n\n if cached and cached.ref ~= v then\n cached.ctx.detached = true\n childProxies[k] = nil\n cached = nil\n end\n\n if not cached then\n local newPath = path == \"\" and k or (path .. \".\" .. k)\n local newCtx = { detached = false, parent = ctx }\n childProxies[k] = {\n ref = v,\n ctx = newCtx,\n proxy = buildProxy(v, newPath, root, newCtx)\n }\n end\n\n return childProxies[k].proxy\n end\n\n return v\n end,\n __newindex = function(_, k, v)\n local mt = getmetatable(v)\n if type(v) == 'table' and mt and mt.__isProxy then\n v = mt.__raw\n end\n\n if deepEqual(internal[k], v) then return end\n internal[k] = v\n\n if isDetached(ctx) then\n return\n end\n\n local fullKey = path == \"\" and k or (path .. \".\" .. k)\n\n if type(v) ~= 'function' and not root._ignore[fullKey] then\n root:queueUpdate(fullKey, v)\n end\n\n if childProxies[k] then\n childProxies[k].ctx.detached = true\n childProxies[k] = nil\n end\n end,\n __pairs = function()\n local function proxy_iter(_, k)\n local next_k = next(internal, k)\n if next_k ~= nil then\n return next_k, proxy[next_k]\n end\n end\n return proxy_iter, internal, nil\n end,\n __len = function() return #internal end\n })\n\n return proxy\nend\n\nfunction CreateNUIState(namespace, tbl, ignoreList, action)\n local ignoreHash = {}\n if type(ignoreList) == 'table' then\n for _, key in ipairs(ignoreList) do\n ignoreHash[key] = true\n end\n end\n\n local root = setmetatable({\n _internal = tbl or {},\n _namespace = namespace,\n _action = action or 'ltbridge_state_update',\n _ignore = ignoreHash,\n _batch = {},\n _isTicking = false\n }, RootState)\n\n root._proxy = buildProxy(root._internal, \"\", root)\n return root._proxy\nend","stubs":[{"funcName":"CreateNUIState","metadata":{"export":"CreateState"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Creates a reactive Lua table proxy that automatically triggers a NUI message when updated.\n--- Features Deep Reactivity, Batching, and full state Syncing.\n---\n--- **Lua Example:**\n--- ```lua\n--- local Hud = LT.NUI.CreateState('hud', { health = 100, stats = { stamina = 50 } })\n---\n--- Hud.health = 85 -- Triggers NUI update: { health: 85 }\n--- Hud.stats.stamina = 20 -- Deep reactivity, triggers NUI update: { stats: { stamina: 20 } }\n--- \n--- Hud:sync() -- Sends { action = '..._sync', state = { full_state } }\n--- Hud:update({ health = 100, armor = 50 }) -- Batch update\n--- ```\n---\n--- **NUI (Pinia / Vue) Example:**\n--- ```javascript\n--- import { useHudStore } from '@/stores/hud'\n---\n--- window.addEventListener('message', (event) => {\n--- const data = event.data;\n--- const hudStore = useHudStore();\n---\n--- // 1. Standard Event (Batched nested payload)\n--- if (data.action === 'ltbridge_state_update') {\n--- // data.batch = { health: 100, stats: { stamina: 20 } }\n--- // Pinia's $patch automatically performs a Deep Merge!\n--- hudStore.$patch(data.batch);\n--- }\n--- // 2. Sync Event (Triggered by Hud:sync())\n--- else if (data.action === 'ltbridge_state_update_sync') {\n--- hudStore.$state = data.state;\n--- }\n--- });\n--- ```\n--- @param namespace string Unique namespace for this state\n--- @param tbl table Initial table data\n--- @param ignoreList? table|string Keys to ignore when sending NUI messages (e.g. {'health', 'stats.stamina'})\n--- @param action? string Action to send NUI (defaults to: 'ltbridge_state_update')\n--- @return table proxy The proxy table with methods (:sync, :update)\nfunction LT.NUI.CreateState(namespace, tbl, ignoreList, action) end"}]},"server":null},"@NUI":{"ns":"NUI","meta":{},"shared":null,"client":{"code":"local isNUILoaded = false\r\nlocal actionToSend = 'ltbridge_check_nui'\r\nRegisterNUICallback('ltbridge:ready', function(_, cb)\r\n isNUILoaded = true\r\n if cb then cb('ok') end\r\nend)\r\nfunction CheckNUI(action)\r\n if isNUILoaded then return true end\r\n if action then\r\n actionToSend = action\r\n end\r\n while not isNUILoaded do\r\n SendNUIMessage({\r\n action = actionToSend\r\n })\r\n Wait(500)\r\n end\r\n return true\r\nend\r\nfunction IsNUILoaded()\r\n return isNUILoaded\r\nend","stubs":[{"funcName":"CheckNUI","metadata":{"export":"Check"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Yields the current thread until NUI signals its ready.\r\n---\r\n--- **Lua Example:**\r\n--- ```lua\r\n--- LT.NUI.Check()\r\n--- ```\r\n---\r\n--- **NUI (JS) Example:**\r\n--- ```javascript\r\n--- window.addEventListener('message', function(event) {\r\n--- if (event.data.action === 'ltbridge_check_nui') {\r\n--- fetch(`https://${GetParentResourceName()}/ltbridge:ready`, { method: 'POST' });\r\n--- }\r\n--- });\r\n--- ```\r\n--- @param action? string NUI message to send (defaults to 'ltbridge_check_nui').\r\n--- @return boolean\nfunction LT.NUI.Check(action) end"},{"funcName":"IsNUILoaded","metadata":{"export":"IsLoaded"},"stubCode":"--- **`NUI` `CLIENT`**\n--- Returns `true` if NUI is loaded, `false` otherwise.\r\n--- @return boolean\nfunction LT.NUI.IsLoaded() end"}]},"server":null},"@Phone/GetNumber":{"ns":"Phone","meta":{},"shared":null,"client":null,"server":{"code":"local adapters = {\r\n ['lb-phone'] = function(source)\r\n return exports[\"lb-phone\"]:GetEquippedPhoneNumber(source)\r\n end,\r\n ['qb-phone'] = function(source)\r\n return GetPlayerPhoneNumber(source)\r\n end,\r\n ['okokPhone'] = function(source)\r\n return exports.okokPhone:getPhoneNumberFromSource(source)\r\n end,\r\n ['qs-smartphone-pro'] = function(source)\r\n local identifier = GetPlayerCitizenId(source)\r\n return exports['qs-smartphone-pro']:GetPhoneNumberFromIdentifier(identifier, false)\r\n end,\r\n ['gksphone'] = function(source)\r\n return exports['gksphone']:GetPhoneBySource(source)\r\n end,\r\n ['cylex_phone'] = function(source)\r\n local user = exports['cylex_phone']:getUserDataBySource(source)\r\n return user and user.phoneNumber\r\n end\r\n}\r\nfunction GetNumber(source)\r\n if not source then return nil end\r\n local adapter = adapters[GetPhoneResource()]\r\n if adapter then\r\n return adapter(source) or nil\r\n else\r\n return GetPlayerPhoneNumber(source) or nil\r\n end\r\nend","stubs":[{"funcName":"GetNumber","metadata":{},"stubCode":"--- **`PHONE` `SERVER`**\n--- Returns players phone number using active phone resource. Fallbacks to framework function.\r\n--- @param source number Player source\r\n--- @return string|nil `Phone number` if found, `nil` otherwise.\nfunction LT.Phone.GetNumber(source) end"}]}},"@Phone/SendMail":{"ns":"Phone","meta":{},"shared":null,"client":{"code":"function SendMail(mail, title, message)\r\n TriggerServerEvent(LT_RESOURCE_NAME..':server:@Phone:Send', mail, title, message)\r\n return true\r\nend","stubs":[{"funcName":"SendMail","metadata":{"export":"SendMail"},"stubCode":"--- **`PHONE` `CLIENT`**\n--- Send mail to player. Recommend to use `server` side function.\r\n--- @param mail string Sender mail\r\n--- @param title string Mail title\r\n--- @param message string Content of mail\r\n--- @return boolean\nfunction LT.Phone.SendMail(mail, title, message) end"}]},"server":{"code":"local adapters = {\r\n ['lb-phone'] = function(source, mail, title, message)\r\n local number = exports[\"lb-phone\"]:GetEquippedPhoneNumber(source)\r\n if not number then return false end\r\n local sourceMail = exports[\"lb-phone\"]:GetEmailAddress(number)\r\n if not sourceMail then return false end\r\n local success, id = exports[\"lb-phone\"]:SendMail({\r\n to = sourceMail,\r\n sender = mail,\r\n subject = title,\r\n message = message,\r\n })\r\n return success or false\r\n end,\r\n ['qb-phone'] = function(source, mail, title, message)\r\n local cId = GetPlayerCitizenId(source)\r\n if not cId then return false end\r\n local mailData = { sender = mail, subject = title, message = message }\r\n exports[\"qb-phone\"]:sendNewMailToOffline(cId, mailData)\r\n return true\r\n end,\r\n ['okokPhone'] = function(source, mail, title, message)\r\n local senderAddress = exports.okokPhone:getEmailAddressFromSource(source)\r\n if not senderAddress then return false end\r\n local data = {\r\n sender = senderAddress,\r\n recipients = { mail },\r\n subject = title,\r\n body = message,\r\n }\r\n local success = exports.okokPhone:sendEmail(data)\r\n return success or false\r\n end,\r\n ['qs-smartphone-pro'] = function(source, mail, title, message)\r\n exports['qs-smartphone-pro']:sendNewMail(source, {\r\n sender = mail,\r\n subject = title,\r\n message = message\r\n })\r\n return true\r\n end,\r\n ['gksphone'] = function(source, mail, title, message)\r\n exports[\"gksphone\"]:SendNewMail(source, {\r\n sender = mail,\r\n image = '/html/img/icons/mail.png',\r\n subject = title,\r\n message = message,\r\n })\r\n return true\r\n end,\r\n ['cylex_phone'] = function(source, mail, title, message)\r\n local identifier = GetPlayerCitizenId(source)\r\n if not identifier then return false end\r\n exports['cylex_phone']:sendMail(identifier, source, { sender = mail, subject = title, message = message })\r\n return true\r\n end\r\n}\r\nfunction SendMail(source, mail, title, message)\r\n if not source then return false end\r\n local adapter = adapters[GetPhoneResource()]\r\n return adapter(source, mail, title, message) or false\r\nend\r\nRegisterNetEvent(LT_RESOURCE_NAME..':server:@Phone:Send', function(mail, title, message)\r\n local src = source\r\n SendMail(src, mail, title, message)\r\nend)","stubs":[{"funcName":"SendMail","metadata":{},"stubCode":"--- **`PHONE` `SERVER`**\n--- Send mail to player.\r\n--- @param source number Player source\r\n--- @param mail string Sender mail\r\n--- @param title string Mail title\r\n--- @param message string Content of mail\r\n--- @return boolean\nfunction LT.Phone.SendMail(source, mail, title, message) end"}]}},"@Phone":{"ns":"Phone","meta":{},"shared":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['lb-phone'] = {},\r\n ['qb-phone'] = { providers = {'lb-phone', 'gksphone', 'okokPhone', 'qs-smartphone-pro', 'yseries', 'cylex_phone'} },\r\n ['okokPhone'] = {},\r\n ['qs-smartphone-pro'] = {},\r\n ['gksphone'] = {},\r\n ['cylex_phone'] = {},\r\n}\r\nfunction GetPhoneResource()\r\n return resourceName\r\nend\r\nfunction SetPhoneResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Phone resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'phone')\r\nif resource then\r\n SetPhoneResource(resource)\r\nend","stubs":[{"funcName":"GetPhoneResource","metadata":{"export":"GetResource"},"stubCode":"--- **`PHONE` `SHARED`**\n--- Returns phone resource name.\r\n--- @return 'lb-phone'|'qb-phone'|'okokPhone'|'qs-smartphone-pro'|'gksphone'|'cylex_phone'|nil\nfunction LT.Phone.GetResource() end"},{"funcName":"SetPhoneResource","metadata":{"export":"SetResource"},"stubCode":"--- **`PHONE` `SHARED`**\n--- Force set phone resource. \r\n--- Useful for config assignment.\r\n--- @param name 'lb-phone'|'qb-phone'|'okokPhone'|'qs-smartphone-pro'|'gksphone'|'cylex_phone'\nfunction LT.Phone.SetResource(name) end"}]},"client":null,"server":null},"@Progress":{"ns":"Progress","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['progressbar'] = {},\r\n ['lation_ui'] = {},\r\n ['wasabi_uikit'] = {},\r\n}\r\nfunction GetProgressResource()\r\n return resourceName\r\nend\r\nfunction SetProgressResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Progress resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'progress')\r\nif resource then\r\n SetProgressResource(resource)\r\nend\r\nlocal function convertQBtoOX(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n local props = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n }\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n position = 'bottom',\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = {\r\n move = options.controlDisables.disableMovement,\r\n car = options.controlDisables.disableCarMovement,\r\n combat = options.controlDisables.disableCombat,\r\n mouse = options.controlDisables.disableMouse\r\n },\r\n anim = {\r\n dict = options.animation.animDict,\r\n clip = options.animation.anim,\r\n flag = options.animation.flags or 49,\r\n },\r\n prop = props,\r\n }\r\nend\r\nlocal function convertOXtoQB(options)\r\n if not options then return options end\r\n local prop1 = (type(options.prop) == 'table' and options.prop[1]) or options.prop or {}\r\n local prop2 = (type(options.prop) == 'table' and options.prop[2]) or {}\r\n return {\r\n name = options.label,\r\n duration = options.duration,\r\n label = options.label,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n controlDisables = {\r\n disableMovement = options.disable.move,\r\n disableCarMovement = options.disable.car,\r\n disableMouse = options.disable.mouse,\r\n disableCombat = options.disable.combat\r\n },\r\n animation = {\r\n animDict = options.anim.dict,\r\n anim = options.anim.clip,\r\n flags = options.anim.flag or 49\r\n },\r\n prop = {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n coords = prop1.pos,\r\n rotation = prop1.rot\r\n },\r\n propTwo = {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n coords = prop2.pos,\r\n rotation = prop2.rot\r\n }\r\n }\r\nend\r\nlocal function convertQBtoLation(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n local props = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n }\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n description = options.description,\r\n icon = options.icon,\r\n iconColor = options.iconColor,\r\n iconAnimation = options.iconAnimation,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = {\r\n move = options.controlDisables.disableMovement,\r\n car = options.controlDisables.disableCarMovement,\r\n combat = options.controlDisables.disableCombat,\r\n mouse = options.controlDisables.disableMouse\r\n },\r\n anim = {\r\n dict = options.animation.animDict,\r\n clip = options.animation.anim,\r\n flag = options.animation.flags or 49,\r\n },\r\n prop = props,\r\n }\r\nend\r\nlocal function convertOXtoLation(options)\r\n if not options then return options end\r\n local prop1 = options.prop or {}\r\n local prop2 = options.propTwo or {}\r\n return {\r\n duration = options.duration,\r\n label = options.label,\r\n description = options.description,\r\n icon = options.icon,\r\n iconColor = options.iconColor,\r\n iconAnimation = options.iconAnimation,\r\n useWhileDead = options.useWhileDead,\r\n canCancel = options.canCancel,\r\n disable = options.disable,\r\n anim = options.anim,\r\n prop = {\r\n {\r\n model = prop1.model,\r\n bone = prop1.bone,\r\n pos = prop1.coords,\r\n rot = prop1.rotation,\r\n },\r\n {\r\n model = prop2.model,\r\n bone = prop2.bone,\r\n pos = prop2.coords,\r\n rot = prop2.rotation,\r\n }\r\n },\r\n }\r\nend\r\nlocal adapters = {\r\n ['ox_lib'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.ox_lib:progressCircle(options) or exports.ox_lib:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['lt-ui'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.ox_lib:progressCircle(options) or exports.ox_lib:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['progressbar'] = function(options, cb, isQB)\r\n if not isQB then\r\n options = convertOXtoQB(options)\r\n end\r\n local prom = promise.new()\r\n exports['progressbar']:Progress(options, function(cancelled)\r\n if cb then cb( not cancelled) end\r\n prom:resolve(not cancelled)\r\n end)\r\n return Citizen.Await(prom)\r\n end,\r\n ['lation_ui'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoLation(options)\r\n else\r\n options = convertOXtoLation(options)\r\n end\r\n local success = exports.lation_ui:progressBar(options)\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n ['wasabi_uikit'] = function(options, cb, isQB)\r\n if isQB then\r\n options = convertQBtoOX(options)\r\n end\r\n local style = options.style or 'bar'\r\n local success = style == 'circle' and exports.wasabi_uikit:ProgressBar(options, 'circle') or exports.wasabi_uikit:ProgressBar(options, 'bar')\r\n if cb then cb(success) end\r\n return success\r\n end,\r\n}\r\nfunction OpenProgress(options, cb, isQB)\r\n local name = GetProgressResource()\r\n local adapter = name and adapters[name]\r\n if adapter then\r\n return adapter(options, cb, isQB)\r\n end\r\n return false\r\nend","stubs":[{"funcName":"GetProgressResource","metadata":{"export":"GetResource"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Returns progress bar resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'progressbar'|'lation_ui'|'wasabi_uikit'|nil\nfunction LT.Progress.GetResource() end"},{"funcName":"SetProgressResource","metadata":{"export":"SetResource"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Force set progress bar resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'progressbar'|'lation_ui'|'wasabi_uikit'\nfunction LT.Progress.SetResource(name) end"},{"funcName":"OpenProgress","metadata":{"export":"Open"},"stubCode":"--- **`PROGRESS` `CLIENT`**\n--- Open progress bar.\r\n--- @param options table Options\r\n--- @param cb? fun(success: boolean)\r\n--- @param isQB? boolean If options are sent in \"qb-progressbar\" format, set to true. If not set, it will be assumed as \"ox_lib\" progress bar format.\r\n--- @return boolean success\nfunction LT.Progress.Open(options, cb, isQB) end"}]},"server":null},"@State/Get":{"ns":"State","meta":{},"shared":{"code":"function GetState(entity, key)\n return Entity(entity).state[key]\nend","stubs":[{"funcName":"GetState","metadata":{"export":"Get"},"stubCode":"--- **`STATE` `SHARED`**\n--- Get entity state value.\n--- ```lua\n--- local fuel = LT.State.Get(vehicle, 'fuel')\n--- ```\n--- @param entity number Entity handle\n--- @param key string State key\n--- @return any\nfunction LT.State.Get(entity, key) end"}]},"client":null,"server":null},"@State/GetPlayer":{"ns":"State","meta":{},"shared":null,"client":{"code":"function GetPlayerState(key)\n return LocalPlayer.state[key]\nend","stubs":[{"funcName":"GetPlayerState","metadata":{"export":"GetPlayer"},"stubCode":"--- **`STATE` `CLIENT`**\n--- Get local player state value.\n--- ```lua\n--- local isBusy = LT.State.GetPlayer('busy')\n--- ```\n--- @param key string State key\n--- @return any\nfunction LT.State.GetPlayer(key) end"}]},"server":{"code":"function GetPlayerState(source, key)\n return Player(source).state[key]\nend","stubs":[{"funcName":"GetPlayerState","metadata":{"export":"GetPlayer"},"stubCode":"--- **`STATE` `SERVER`**\n--- Get player state value.\n--- ```lua\n--- local isWanted = LT.State.GetPlayer(source, 'wanted')\n--- ```\n--- @param source number Player source\n--- @param key string State key\n--- @return any\nfunction LT.State.GetPlayer(source, key) end"}]}},"@State/OnChange":{"ns":"State","meta":{},"shared":{"code":"function OnStateChange(key, handler)\n\n return AddStateBagChangeHandler(key, nil, function(bagName, _, value)\n handler(value, bagName)\n end)\nend","stubs":[{"funcName":"OnStateChange","metadata":{"export":"OnChange"},"stubCode":"--- **`STATE` `SHARED`**\n--- Register a handler for state bag changes across all entities.\n--- ```lua\n--- LT.State.OnChange('fuel', function(value, bagName)\n--- local entity = GetEntityFromStateBagName(bagName)\n--- if entity > 0 then\n--- print(('Entity %s fuel changed to %s'):format(entity, value))\n--- end\n--- end)\n--- ```\n--- @param key string State key to watch\n--- @param handler fun(value: any, bagName: string)\n--- @return number Handler ID (use RemoveStateBagChangeHandler to remove)\nfunction LT.State.OnChange(key, handler) end"}]},"client":null,"server":null},"@State/Set":{"ns":"State","meta":{},"shared":{"code":"function SetState(entity, key, value, replicated)\n Entity(entity).state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetState","metadata":{"export":"Set"},"stubCode":"--- **`STATE` `SHARED`**\n--- Set entity state value.\n--- ```lua\n--- LT.State.Set(vehicle, 'fuel', 100.0)\n--- LT.State.Set(ped, 'busy', true, false) -- not replicated\n--- ```\n--- @param entity number Entity handle\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to network (default: true)\nfunction LT.State.Set(entity, key, value, replicated) end"}]},"client":null,"server":null},"@State/SetPlayer":{"ns":"State","meta":{},"shared":null,"client":{"code":"function SetPlayerState(key, value, replicated)\n LocalPlayer.state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetPlayerState","metadata":{"export":"SetPlayer"},"stubCode":"--- **`STATE` `CLIENT`**\n--- Set local player state value.\n--- ```lua\n--- LT.State.SetPlayer('busy', true)\n--- ```\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to server (default: true)\nfunction LT.State.SetPlayer(key, value, replicated) end"}]},"server":{"code":"function SetPlayerState(source, key, value, replicated)\n Player(source).state:set(key, value, replicated ~= false)\nend","stubs":[{"funcName":"SetPlayerState","metadata":{"export":"SetPlayer"},"stubCode":"--- **`STATE` `SERVER`**\n--- Set player state value.\n--- ```lua\n--- LT.State.SetPlayer(source, 'wanted', true)\n--- ```\n--- @param source number Player source\n--- @param key string State key\n--- @param value any State value\n--- @param replicated? boolean Replicate to clients (default: true)\nfunction LT.State.SetPlayer(source, key, value, replicated) end"}]}},"@Streaming/RequestAnimDict":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestAnimDict(dict, timeout)\n return AwaitAssetLoad(RequestAnimDict, HasAnimDictLoaded, dict, timeout)\nend","stubs":[{"funcName":"StreamRequestAnimDict","metadata":{"export":"RequestAnimDict"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await an animation dictionary load.\n--- @param dict string Animation dictionary name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestAnimDict(dict, timeout) end"}]},"server":null},"@Streaming/RequestAnimSet":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestAnimSet(set, timeout)\n return AwaitAssetLoad(RequestAnimSet, HasAnimSetLoaded, set, timeout)\nend","stubs":[{"funcName":"StreamRequestAnimSet","metadata":{"export":"RequestAnimSet"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await an animation set load.\n--- @param set string Animation set name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestAnimSet(set, timeout) end"}]},"server":null},"@Streaming/RequestClipSet":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestClipSet(set, timeout)\n return AwaitAssetLoad(RequestClipSet, HasClipSetLoaded, set, timeout)\nend","stubs":[{"funcName":"StreamRequestClipSet","metadata":{"export":"RequestClipSet"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a clip set load.\n--- @param set string Clip set name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestClipSet(set, timeout) end"}]},"server":null},"@Streaming/RequestModel":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local joaat = joaat\nlocal tostring = tostring\nlocal IsModelValid = IsModelValid\n\nfunction StreamRequestModel(model, timeout)\n if type(model) == 'string' then model = joaat(model) end\n if not IsModelValid(model) then\n printf('error', 'Invalid model: %s', tostring(model))\n return false\n end\n return AwaitAssetLoad(RequestModel, HasModelLoaded, model, timeout)\nend","stubs":[{"funcName":"StreamRequestModel","metadata":{"export":"RequestModel"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a model load.\n--- ```lua\n--- if LT.Streaming.RequestModel('prop_cs_cardbox_01') then\n--- -- model loaded\n--- end\n--- ```\n--- @param model string|number Model name or hash\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestModel(model, timeout) end"}]},"server":null},"@Streaming/RequestPtfxAsset":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestPtfxAsset(asset, timeout)\n return AwaitAssetLoad(RequestNamedPtfxAsset, HasNamedPtfxAssetLoaded, asset, timeout)\nend","stubs":[{"funcName":"StreamRequestPtfxAsset","metadata":{"export":"RequestPtfxAsset"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a named PTFX asset load.\n--- @param asset string PTFX asset name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestPtfxAsset(asset, timeout) end"}]},"server":null},"@Streaming/RequestTexture":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"function StreamRequestTexture(dict, timeout)\n return AwaitAssetLoad(RequestStreamedTextureDict, HasStreamedTextureDictLoaded, dict, timeout)\nend","stubs":[{"funcName":"StreamRequestTexture","metadata":{"export":"RequestTexture"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a texture dictionary load.\n--- @param dict string Texture dictionary name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestTexture(dict, timeout) end"}]},"server":null},"@Streaming/RequestWeaponAsset":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local joaat = joaat\n\nfunction StreamRequestWeaponAsset(hash, timeout)\n if type(hash) == 'string' then hash = joaat(hash) end\n return AwaitAssetLoad(function(h) RequestWeaponAsset(h, 31, 0) end, HasWeaponAssetLoaded, hash, timeout)\nend","stubs":[{"funcName":"StreamRequestWeaponAsset","metadata":{"export":"RequestWeaponAsset"},"stubCode":"--- **`STREAMING` `CLIENT`**\n--- Request and await a weapon asset load.\n--- @param hash number|string Weapon hash or name\n--- @param timeout? number Timeout in ms (default: 5000)\n--- @return boolean\nfunction LT.Streaming.RequestWeaponAsset(hash, timeout) end"}]},"server":null},"@Streaming":{"ns":"Streaming","meta":{},"shared":null,"client":{"code":"local GetGameTimer = GetGameTimer\nlocal tostring = tostring\n\nfunction AwaitAssetLoad(requestFn, checkFn, asset, timeout)\n if checkFn(asset) then return true end\n\n requestFn(asset)\n\n timeout = timeout or 5000\n local start = GetGameTimer()\n\n while not checkFn(asset) do\n if GetGameTimer() - start > timeout then\n printf('error', 'Failed to load asset \"%s\" (timed out after %dms)', tostring(asset), timeout)\n return false\n end\n Wait(0)\n end\n\n return true\nend","stubs":[{"funcName":"AwaitAssetLoad","metadata":{"internal":true},"stubCode":"--- **`STREAMING` `CLIENT`**\n\nfunction LT.Streaming.AwaitAssetLoad(requestFn, checkFn, asset, timeout) end"}]},"server":null},"@String/Capitalize":{"ns":"String","meta":{},"shared":{"code":"function StringCapitalize(str)\n return str:sub(1, 1):upper() .. str:sub(2)\nend","stubs":[{"funcName":"StringCapitalize","metadata":{"export":"Capitalize"},"stubCode":"--- **`STRING` `SHARED`**\n--- Capitalize first letter of a string.\n--- @param str string\n--- @return string\nfunction LT.String.Capitalize(str) end"}]},"client":null,"server":null},"@String/EndsWith":{"ns":"String","meta":{},"shared":{"code":"function StringEndsWith(str, suffix)\n return suffix == '' or str:sub(-#suffix) == suffix\nend","stubs":[{"funcName":"StringEndsWith","metadata":{"export":"EndsWith"},"stubCode":"--- **`STRING` `SHARED`**\n--- Check if string ends with given suffix.\n--- @param str string\n--- @param suffix string\n--- @return boolean\nfunction LT.String.EndsWith(str, suffix) end"}]},"client":null,"server":null},"@String/Split":{"ns":"String","meta":{},"shared":{"code":"function StringSplit(str, delimiter)\n local result = {}\n local from = 1\n local delim_from, delim_to = str:find(delimiter, from, true)\n\n while delim_from do\n result[#result + 1] = str:sub(from, delim_from - 1)\n from = delim_to + 1\n delim_from, delim_to = str:find(delimiter, from, true)\n end\n\n result[#result + 1] = str:sub(from)\n return result\nend","stubs":[{"funcName":"StringSplit","metadata":{"export":"Split"},"stubCode":"--- **`STRING` `SHARED`**\n--- Split a string by delimiter.\n--- ```lua\n--- LT.String.Split('hello-world-test', '-') -- {'hello', 'world', 'test'}\n--- ```\n--- @param str string\n--- @param delimiter string\n--- @return table\nfunction LT.String.Split(str, delimiter) end"}]},"client":null,"server":null},"@String/StartsWith":{"ns":"String","meta":{},"shared":{"code":"function StringStartsWith(str, prefix)\n return str:sub(1, #prefix) == prefix\nend","stubs":[{"funcName":"StringStartsWith","metadata":{"export":"StartsWith"},"stubCode":"--- **`STRING` `SHARED`**\n--- Check if string starts with given prefix.\n--- @param str string\n--- @param prefix string\n--- @return boolean\nfunction LT.String.StartsWith(str, prefix) end"}]},"client":null,"server":null},"@String/TitleCase":{"ns":"String","meta":{},"shared":{"code":"function StringTitleCase(str)\n return (str:gsub('(%a)([%w]*)', function(first, rest)\n return first:upper() .. rest:lower()\n end))\nend","stubs":[{"funcName":"StringTitleCase","metadata":{"export":"TitleCase"},"stubCode":"--- **`STRING` `SHARED`**\n--- Capitalize first letter of each word.\n--- ```lua\n--- LT.String.TitleCase('hello world') -- 'Hello World'\n--- ```\n--- @param str string\n--- @return string\nfunction LT.String.TitleCase(str) end"}]},"client":null,"server":null},"@String/Trim":{"ns":"String","meta":{},"shared":{"code":"function StringTrim(str)\n return (str:gsub('^%s+', ''):gsub('%s+$', ''))\nend","stubs":[{"funcName":"StringTrim","metadata":{"export":"Trim"},"stubCode":"--- **`STRING` `SHARED`**\n--- Trim whitespace from both ends of a string.\n--- @param str string\n--- @return string\nfunction LT.String.Trim(str) end"}]},"client":null,"server":null},"@Table/Contains":{"ns":"Table","meta":{},"shared":{"code":"function TableContains(tbl, value, iter)\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _, v in iterator(tbl) do\n if v == value then return true end\n end\n return false\nend","stubs":[{"funcName":"TableContains","metadata":{"export":"Contains"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Check if a table contains a value.\n--- @param tbl table\n--- @param value any\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return boolean\nfunction LT.Table.Contains(tbl, value, iter) end"}]},"client":null,"server":null},"@Table/DeepCopy":{"ns":"Table","meta":{},"shared":{"code":"function TableDeepCopy(tbl, iter)\n local copy = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n if type(v) == 'table' then\n copy[k] = TableDeepCopy(v, iter)\n else\n copy[k] = v\n end\n end\n\n return setmetatable(copy, getmetatable(tbl))\nend","stubs":[{"funcName":"TableDeepCopy","metadata":{"export":"DeepCopy"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Deep copy a table recursively.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.DeepCopy(tbl, iter) end"}]},"client":null,"server":null},"@Table/Filter":{"ns":"Table","meta":{},"shared":{"code":"function TableFilter(tbl, predicate, iter)\n local result = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n if predicate(v, k) then\n result[#result + 1] = v\n end\n end\n\n return result\nend","stubs":[{"funcName":"TableFilter","metadata":{"export":"Filter"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Filter a table by a predicate function.\n--- ```lua\n--- local evens = LT.Table.Filter({1, 2, 3, 4}, function(v) return v % 2 == 0 end)\n--- -- {2, 4}\n--- ```\n--- @param tbl table\n--- @param predicate fun(value: any, key: any): boolean\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Filter(tbl, predicate, iter) end"}]},"client":null,"server":null},"@Table/Keys":{"ns":"Table","meta":{},"shared":{"code":"function TableKeys(tbl, iter)\n local keys = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for k in iterator(tbl) do\n keys[#keys + 1] = k\n end\n return keys\nend","stubs":[{"funcName":"TableKeys","metadata":{"export":"Keys"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get all keys of a table.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Keys(tbl, iter) end"}]},"client":null,"server":null},"@Table/Map":{"ns":"Table","meta":{},"shared":{"code":"function TableMap(tbl, transform, iter)\n local result = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n for k, v in iterator(tbl) do\n result[k] = transform(v, k)\n end\n\n return result\nend","stubs":[{"funcName":"TableMap","metadata":{"export":"Map"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Map a table by a transform function.\n--- ```lua\n--- local doubled = LT.Table.Map({1, 2, 3}, function(v) return v * 2 end)\n--- -- {2, 4, 6}\n--- ```\n--- @param tbl table\n--- @param transform fun(value: any, key: any): any\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Map(tbl, transform, iter) end"}]},"client":null,"server":null},"@Table/Merge":{"ns":"Table","meta":{},"shared":{"code":"function TableMerge(base, override, iter)\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n\n local function deepCopy(t)\n local copy = {}\n for k, v in iterator(t) do\n copy[k] = type(v) == 'table' and deepCopy(v) or v\n end\n return setmetatable(copy, getmetatable(t))\n end\n\n local result = deepCopy(base)\n for k, v in iterator(override) do\n if type(v) == 'table' and type(result[k]) == 'table' then\n result[k] = TableMerge(result[k], v, iter)\n else\n result[k] = v\n end\n end\n return result\nend","stubs":[{"funcName":"TableMerge","metadata":{"export":"Merge"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Merge two tables. Override values take priority.\n--- Performs deep merge for nested tables.\n--- @param base table\n--- @param override table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Merge(base, override, iter) end"}]},"client":null,"server":null},"@Table/Size":{"ns":"Table","meta":{},"shared":{"code":"function TableSize(tbl, iter)\n local count = 0\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _ in iterator(tbl) do count = count + 1 end\n return count\nend","stubs":[{"funcName":"TableSize","metadata":{"export":"Size"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get size of a table (works for non-sequential tables by default).\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return number\nfunction LT.Table.Size(tbl, iter) end"}]},"client":null,"server":null},"@Table/Values":{"ns":"Table","meta":{},"shared":{"code":"function TableValues(tbl, iter)\n local values = {}\n local iterator = (iter == true and ipairs) or (type(iter) == \"function\" and iter) or pairs\n for _, v in iterator(tbl) do\n values[#values + 1] = v\n end\n return values\nend","stubs":[{"funcName":"TableValues","metadata":{"export":"Values"},"stubCode":"--- **`TABLE` `SHARED`**\n--- Get all values of a table.\n--- @param tbl table\n--- @param iter? boolean|function If true, uses ipairs. If function, uses as iterator. Default pairs.\n--- @return table\nfunction LT.Table.Values(tbl, iter) end"}]},"client":null,"server":null},"@Target/AddBoxZone":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddBoxZone(name, coords, size, heading, options, debug)\r\n local tName = GetTargetResource()\r\n options = FixOptions(options)\r\n local target\r\n if tName == 'ox_target' then\r\n target = Target:addBoxZone({\r\n coords = coords,\r\n size = size,\r\n rotation = heading,\r\n debug = debug or false,\r\n options = options,\r\n })\r\n elseif tName == 'qb-target' then\r\n Target:AddBoxZone(name, coords, size.x, size.y, {\r\n name = name,\r\n debugPoly = debug or false,\r\n heading = heading,\r\n minZ = coords.z - (size.z * 0.5),\r\n maxZ = coords.z + (size.z * 0.5),\r\n }, {\r\n options = options,\r\n distance = GetLargestDistance(options),\r\n })\r\n target = true\r\n end\r\n if target then\r\n AddZone(name)\r\n end\r\nend","stubs":[{"funcName":"AddBoxZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target box zone.\r\n--- @param name string Box name\r\n--- @param coords table Box cooords {x,y,z}\r\n--- @param size table Box size {x,y,z}\r\n--- @param heading number Box heading\r\n--- @param options table Options\r\n--- @param debug? boolean Debug\nfunction LT.Target.AddBoxZone(name, coords, size, heading, options, debug) end"}]},"server":null},"@Target/AddGlobalPed":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalPed(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalPed(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalPed({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalPed","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to peds (excluding players).\r\n--- @param options table Options\nfunction LT.Target.AddGlobalPed(options) end"}]},"server":null},"@Target/AddGlobalPlayer":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalPlayer(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalPlayer(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalPlayer({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalPlayer","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to all players.\r\n--- @param options table Options\nfunction LT.Target.AddGlobalPlayer(options) end"}]},"server":null},"@Target/AddGlobalVehicle":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddGlobalVehicle(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addGlobalVehicle(options)\r\n elseif name == 'qb-target' then\r\n Target:AddGlobalVehicle({\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddGlobalVehicle","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Add target options to all vehicles.\r\n--- @param options table Options\nfunction LT.Target.AddGlobalVehicle(options) end"}]},"server":null},"@Target/AddLocalEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddLocalEntity(entities, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addLocalEntity(entities, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetEntity(entities, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddLocalEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options on non-networked entity(s).\r\n--- @param entities table|number Entity(s)\r\n--- @param options table Options\nfunction LT.Target.AddLocalEntity(entities, options) end"}]},"server":null},"@Target/AddModel":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddModel(models, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addModel(models, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetModel(models, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddModel","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options for specified model(s).\r\n--- @param models table|number Model(s)\r\n--- @param options table Options\nfunction LT.Target.AddModel(models, options) end"}]},"server":null},"@Target/AddNetworkedEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddNetworkedEntity(netids, options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n Target:addEntity(netids, options)\r\n elseif name == 'qb-target' then\r\n Target:AddTargetEntity(netids, {\r\n options = options,\r\n distance = GetLargestDistance(options)\r\n })\r\n end\r\nend","stubs":[{"funcName":"AddNetworkedEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target options on networked entity(s).\r\n--- @param netids table|number Net id(s)\r\n--- @param options table Options\nfunction LT.Target.AddNetworkedEntity(netids, options) end"}]},"server":null},"@Target/AddSphereZone":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function AddSphereZone(name, coords, radius, options, debug)\r\n local tName = GetTargetResource()\r\n options = FixOptions(options)\r\n local target\r\n if tName == 'ox_target' then\r\n target = Target:addSphereZone({\r\n coords = coords,\r\n radius = radius,\r\n name = name,\r\n debug = debug or false,\r\n options = options\r\n })\r\n elseif tName == 'qb-target' then\r\n Target:AddCircleZone(name, coords, radius, {\r\n name = name,\r\n debugPoly = debug or false,\r\n }, {\r\n options = options,\r\n distance = GetLargestDistance(options),\r\n })\r\n target = true\r\n end\r\n if target then\r\n AddZone(name)\r\n end\r\nend","stubs":[{"funcName":"AddSphereZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Create target sphere zone.\r\n---@param name string Zone name\r\n---@param coords table Zone coords\r\n---@param radius number Radius\r\n---@param options table Options\r\n---@param debug? boolean Debug mode\nfunction LT.Target.AddSphereZone(name, coords, radius, options, debug) end"}]},"server":null},"@Target/FixOptions":{"ns":"Target","meta":{"internal":true},"shared":null,"client":{"code":"local function fixOX(options)\r\n for i = 1, #options do\r\n local opt = options[i]\r\n local action = opt.onSelect or opt.action\r\n if not action then \r\n local _type = opt.type\r\n if _type and _type == \"server\" then\r\n opt.serverEvent = opt.event\r\n opt.event = nil\r\n end\r\n else\r\n local select = function(entityOrData)\r\n if type(entityOrData) == 'table' then\r\n return action(entityOrData.entity)\r\n end\r\n return action(entityOrData)\r\n end\r\n opt.onSelect = select\r\n end\r\n opt.groups = opt.job or opt.groups\r\n local optionsCanInteract = opt.canInteract\r\n if optionsCanInteract then\r\n local id = CreateCanInteract(optionsCanInteract)\r\n opt.canInteract = function(...)\r\n return CanInteract(id, ...)\r\n end\r\n end\r\n end\r\n return options\r\nend\r\nlocal function fixQB(options)\r\n for i = 1, #options do\r\n local opt = options[i]\r\n local action = opt.onSelect or opt.action\r\n local select = action and function(entityOrData)\r\n if type(entityOrData) == 'table' then\r\n return action(entityOrData.entity)\r\n end\r\n return action(entityOrData)\r\n end\r\n if opt.serverEvent then\r\n opt.type = \"server\"\r\n opt.event = opt.serverEvent\r\n elseif opt.event then\r\n opt.type = \"client\"\r\n opt.event = opt.event\r\n end\r\n options[i].action = select\r\n options[i].job = opt.job or opt.groups\r\n options[i].jobType = opt.jobType\r\n local optionsCanInteract = opt.canInteract\r\n if optionsCanInteract then\r\n local id = CreateCanInteract(optionsCanInteract)\r\n opt.canInteract = function(...)\r\n return CanInteract(id, ...)\r\n end\r\n end\r\n end\r\n return options\r\nend\r\nfunction FixOptions(options)\r\n local name = GetTargetResource()\r\n if not options or not name then return options end\r\n if name == 'ox_target' then\r\n return fixOX(options)\r\n elseif name == 'qb-target' then\r\n return fixQB(options)\r\n end\r\n return {}\r\nend","stubs":[{"funcName":"FixOptions","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Internal function to fix options for working on all target systems.\r\n--- @param options table\r\n--- @return table\nfunction LT.Target.FixOptions(options) end"}]},"server":null},"@Target/GetLargestDistance":{"ns":"Target","meta":{"internal":true},"shared":null,"client":{"code":"function GetLargestDistance(options)\r\n local largestDistance = -1\r\n for _, v in pairs(options) do\r\n if v.distance and v.distance > largestDistance then\r\n largestDistance = v.distance\r\n end\r\n end\r\n return largestDistance ~= -1 and largestDistance or 2.0\r\nend","stubs":[{"funcName":"GetLargestDistance","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Get largest distance, internal.\r\n--- @param options any\r\n--- @return number\nfunction LT.Target.GetLargestDistance(options) end"}]},"server":null},"@Target/RemoveGlobalPed":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalPed(options)\r\n local name = GetTargetResource()\r\n if options then options = FixOptions(options) end\r\n if name == 'ox_target' then\r\n Target:removeGlobalPed(options)\r\n elseif name == 'qb-target' then\r\n Target:RemoveGlobalPed(options)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalPed","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all Peds.\r\n--- @param options? table Options\nfunction LT.Target.RemoveGlobalPed(options) end"}]},"server":null},"@Target/RemoveGlobalPlayer":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalPlayer(options)\r\n local name = GetTargetResource()\r\n if options then options = FixOptions(options) end\r\n if name == 'ox_target' then\r\n Target:removeGlobalPlayer(options)\r\n elseif name == 'qb-target' then\r\n Target:RemoveGlobalPlayer(options)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalPlayer","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all players.\r\n--- @param options? table Options\nfunction LT.Target.RemoveGlobalPlayer(options) end"}]},"server":null},"@Target/RemoveGlobalVehicle":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveGlobalVehicle(options)\r\n local name = GetTargetResource()\r\n options = FixOptions(options)\r\n if name == 'ox_target' then\r\n local labels = {}\r\n for k, v in pairs(options) do\r\n table.insert(labels, v.name)\r\n end\r\n Target:removeGlobalVehicle(labels)\r\n elseif name == 'qb-target' then\r\n local labels = {}\r\n for k, v in pairs(options) do\r\n table.insert(labels, v.label)\r\n end\r\n Target:RemoveGlobalVehicle(labels)\r\n end\r\nend","stubs":[{"funcName":"RemoveGlobalVehicle","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove all target options from all vehicles.\r\n--- @param options table Options\nfunction LT.Target.RemoveGlobalVehicle(options) end"}]},"server":null},"@Target/RemoveLocalEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveLocalEntity(entities, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeLocalEntity(entities, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetEntity(entities, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveLocalEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove target options on non-networked entity(s).\r\n--- @param entities table|number Entity(s)\r\n--- @param optionNames string|table Option(s)\nfunction LT.Target.RemoveLocalEntity(entities, optionNames) end"}]},"server":null},"@Target/RemoveModel":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveModel(models, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeModel(models, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetModel(models, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveModel","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove specified target options for specified model(s).\r\n--- @param models table|number Model(s)\r\n--- @param optionNames string|table Option name(s)\nfunction LT.Target.RemoveModel(models, optionNames) end"}]},"server":null},"@Target/RemoveNetworkedEntity":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function RemoveNetworkedEntity(netids, optionNames)\r\n local name = GetTargetResource()\r\n if name == 'ox_target' then\r\n Target:removeEntity(netids, optionNames)\r\n elseif name == 'qb-target' then\r\n Target:RemoveTargetEntity(netids, optionNames)\r\n end\r\nend","stubs":[{"funcName":"RemoveNetworkedEntity","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove target options from networked entity(s).\r\n--- @param netids table|number Net id(s)\r\n--- @param optionNames string|table Option name(s)\nfunction LT.Target.RemoveNetworkedEntity(netids, optionNames) end"}]},"server":null},"@Target/ToggleTargeting":{"ns":"Target","meta":{},"shared":null,"client":{"code":"function ToggleTargeting(state)\r\n local name = GetTargetResource()\r\n if not Target or not name then return end\r\n if name == 'ox_target' then\r\n Target:disableTargeting(not state)\r\n elseif name == 'qb-target' then\r\n Target:AllowTargeting(state)\r\n end\r\nend","stubs":[{"funcName":"ToggleTargeting","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Toggle on/off targeting.\r\n--- @param state boolean `true` Can target | `false` Can't target.\nfunction LT.Target.ToggleTargeting(state) end"}]},"server":null},"@Target":{"ns":"Target","meta":{},"shared":null,"client":{"code":"LT_TARGET_NAME = nil\r\nTarget = {}\r\nlocal createdZones = {}\r\nlocal function detectTarget()\r\n if GetResourceState('ox_target') == 'started' then\r\n LT_TARGET_NAME = 'ox_target'\r\n elseif GetResourceState('qb-target') == 'started' then\r\n LT_TARGET_NAME = 'qb-target'\r\n end\r\n Target = exports[LT_TARGET_NAME]\r\nend\r\nfunction GetTargetResource()\r\n return LT_TARGET_NAME\r\nend\r\nfunction AddZone(name)\r\n createdZones[#createdZones+1] = name\r\nend\r\nfunction RemoveZone(name)\r\n if not name then return end\r\n for i, zoneName in ipairs(createdZones) do\r\n if zoneName == name then\r\n if LT_TARGET_NAME == 'ox_target' then\r\n Target:removeZone(name)\r\n elseif LT_TARGET_NAME == 'qb-target' then\r\n Target:RemoveZone(name)\r\n end\r\n table.remove(createdZones, i)\r\n break\r\n end\r\n end\r\nend\r\nlocal function createUniqueId(tbl, len, pattern)\r\n tbl = tbl or {}\r\n len = len or 8\r\n local id = \"\"\r\n for i = 1, len do\r\n local char = \"\"\r\n if pattern then\r\n local charIndex = math.random(1, #pattern)\r\n char = pattern:sub(charIndex, charIndex)\r\n else\r\n char = math.random(1, 2) == 1 and string.char(math.random(65, 90)) or string.format(\"%d\", math.random(10) - 1) \n end\r\n id = id .. char\r\n end\r\n if tbl[id] then\r\n return createUniqueId(tbl, len, pattern)\r\n end\r\n return id\r\nend\r\nlocal InteractIds = {}\r\nfunction CreateCanInteract(cb)\r\n if not cb then return end\r\n local id = createUniqueId(InteractIds)\r\n InteractIds[id] = {\r\n id = id,\r\n ableToInteract = -1,\r\n onInteract = cb\r\n }\r\n return id\r\nend\r\nfunction CanInteract(id, ...)\r\n local interactData = InteractIds[id]\r\n if not interactData then return true end\r\n if interactData.ableToInteract == -1 then\r\n local cb = interactData.onInteract\r\n local canInteractStatus = cb(...)\r\n interactData.ableToInteract = canInteractStatus and 1 or 0\r\n SetTimeout(1000, function()\r\n interactData.ableToInteract = -1\r\n end)\r\n end\r\n return interactData.ableToInteract > 0\r\nend\r\ndetectTarget()\r\nAddEventHandler('onResourceStop', function(resource)\r\n if resource ~= LT_RESOURCE_NAME then return end\r\n for _, zone in pairs(createdZones) do\r\n RemoveZone(zone)\r\n end\r\nend)","stubs":[{"funcName":"GetTargetResource","metadata":{"export":"GetResource"},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Returns target resource name.\r\n--- @return 'ox_target'|'qb-target'|nil\nfunction LT.Target.GetResource() end"},{"funcName":"AddZone","metadata":{"internal":true},"stubCode":"--- **`TARGET` `CLIENT`**\n--- WARNING: Do not use this. This is a internal function.\nfunction LT.Target.AddZone(name) end"},{"funcName":"RemoveZone","metadata":{},"stubCode":"--- **`TARGET` `CLIENT`**\n--- Remove a target zone.\r\n--- @param name string\nfunction LT.Target.RemoveZone(name) end"}]},"server":null},"@TextUI/HideTextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local exp = {}\r\nlocal adapters = {\r\n ['ox_lib'] = function()\r\n exp:hideTextUI()\r\n end,\r\n ['lt-ui'] = function()\r\n exp:hideTextUI()\r\n end,\r\n ['jg-textui'] = function()\r\n exp:HideText()\r\n end,\r\n ['esx_textui'] = function()\r\n exp:HideUI()\r\n end,\r\n ['okokTextUI'] = function()\r\n exp:Close()\r\n end,\r\n ['cd_drawtextui'] = function()\r\n TriggerEvent('cd_drawtextui:HideUI')\r\n end,\r\n ['lation_ui'] = function()\r\n exp:hideText()\r\n end,\r\n ['lab-HintUI'] = function()\r\n exp:Hide()\r\n end,\r\n}\r\nfunction HideTextUI()\r\n local resource = GetTextUIResource()\r\n if not resource then return end\r\n exp = exports[resource]\r\n local adapter = adapters[resource]\r\n if adapter then\r\n adapter()\r\n end\r\nend","stubs":[{"funcName":"HideTextUI","metadata":{"export":"Hide"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Hides Text UI from screen.\nfunction LT.TextUI.Hide() end"}]},"server":null},"@TextUI/ShowTextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local exp = {}\r\nlocal adapters = {\r\n ['ox_lib'] = function(text)\r\n exp:showTextUI(text)\r\n end,\r\n ['lt-ui'] = function(text)\r\n exp:showTextUI(text)\r\n end,\r\n ['jg-textui'] = function(text)\r\n exp:DrawText(text)\r\n end,\r\n ['esx_textui'] = function(text)\r\n exp:TextUI(text)\r\n end,\r\n ['okokTextUI'] = function(text)\r\n exp:Open(text, 'darkblue', 'right', false)\r\n end,\r\n ['cd_drawtextui'] = function(text)\r\n TriggerEvent('cd_drawtextui:ShowUI', 'show', text)\r\n end,\r\n ['lation_ui'] = function(text)\r\n exp:showText({description = text, position = 'right-center'})\r\n end,\r\n ['lab-HintUI'] = function(text)\r\n exp:Show(text, 'Hint')\r\n end,\r\n}\r\nfunction ShowTextUI(text)\r\n local resource = GetTextUIResource()\r\n if not resource then return end\r\n exp = exports[resource]\r\n local adapter = adapters[resource]\r\n if adapter then\r\n adapter(tostring(text))\r\n end\r\nend","stubs":[{"funcName":"ShowTextUI","metadata":{"export":"Show"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Show Text UI on screen.\r\n--- @param text string Text to show on screen.\nfunction LT.TextUI.Show(text) end"}]},"server":null},"@TextUI":{"ns":"TextUI","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['ox_lib'] = {},\r\n ['lt-ui'] = {},\r\n ['jg-textui'] = {},\r\n ['esx_textui'] = {},\r\n ['okokTextUI'] = {},\r\n ['cd_drawtextui'] = {},\r\n ['lation_ui'] = {},\r\n ['lab-HintUI'] = {},\r\n}\r\nfunction GetTextUIResource()\r\n return resourceName\r\nend\r\nfunction SetTextUIResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'TextUI resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'textui')\r\nif resource then\r\n SetTextUIResource(resource)\r\nend","stubs":[{"funcName":"GetTextUIResource","metadata":{"export":"GetResource"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Returns TextUI resource name.\r\n--- @return 'ox_lib'|'lt-ui'|'jg-textui'|'esx_textui'|'okokTextUI'|'cd_drawtextui'|'lation_ui'|'lab-HintUI'|nil\nfunction LT.TextUI.GetResource() end"},{"funcName":"SetTextUIResource","metadata":{"export":"SetResource"},"stubCode":"--- **`TEXTUI` `CLIENT`**\n--- Force set TextUI resource. \r\n--- Useful for config assignment.\r\n--- @param name 'ox_lib'|'lt-ui'|'jg-textui'|'esx_textui'|'okokTextUI'|'cd_drawtextui'|'lation_ui'|'lab-HintUI'\nfunction LT.TextUI.SetResource(name) end"}]},"server":null},"@Utils/GetClosestObject":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestObject(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestObj, closestDist\n\n for _, obj in ipairs(GetGamePool('CObject')) do\n local dist = #(coords - GetEntityCoords(obj))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestObj = obj\n closestDist = dist\n end\n end\n\n return closestObj, closestDist\nend","stubs":[{"funcName":"GetClosestObject","metadata":{"export":"GetClosestObject"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest object to given coords.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? object, number? distance\nfunction LT.Utils.GetClosestObject(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestPed":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\nlocal IsPedAPlayer = IsPedAPlayer\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestPed(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestPed, closestDist\n local myPed = PlayerPedId()\n\n for _, ped in ipairs(GetGamePool('CPed')) do\n if ped ~= myPed and not IsPedAPlayer(ped) then\n local dist = #(coords - GetEntityCoords(ped))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestPed = ped\n closestDist = dist\n end\n end\n end\n\n return closestPed, closestDist\nend","stubs":[{"funcName":"GetClosestPed","metadata":{"export":"GetClosestPed"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest ped to given coords (excluding players).\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? ped, number? distance\nfunction LT.Utils.GetClosestPed(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestPlayer":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetActivePlayers = GetActivePlayers\nlocal GetPlayerPed = GetPlayerPed\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerId = PlayerId\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestPlayer(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestId, closestPed, closestDist\n local myId = PlayerId()\n\n for _, id in ipairs(GetActivePlayers()) do\n if id ~= myId then\n local ped = GetPlayerPed(id)\n local dist = #(coords - GetEntityCoords(ped))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestId = id\n closestPed = ped\n closestDist = dist\n end\n end\n end\n\n return closestId, closestPed, closestDist\nend","stubs":[{"funcName":"GetClosestPlayer","metadata":{"export":"GetClosestPlayer"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest player to given coords.\n--- ```lua\n--- local playerId, ped, dist = LT.Utils.GetClosestPlayer()\n--- ```\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? playerId, number? ped, number? distance\nfunction LT.Utils.GetClosestPlayer(coords, maxDistance) end"}]},"server":null},"@Utils/GetClosestVehicle":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetGamePool = GetGamePool\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerPedId = PlayerPedId\n\nfunction GetClosestVehicle(coords, maxDistance)\n coords = coords or GetEntityCoords(PlayerPedId())\n maxDistance = maxDistance or 50.0\n local closestVeh, closestDist\n\n for _, veh in ipairs(GetGamePool('CVehicle')) do\n local dist = #(coords - GetEntityCoords(veh))\n if dist < maxDistance and (not closestDist or dist < closestDist) then\n closestVeh = veh\n closestDist = dist\n end\n end\n\n return closestVeh, closestDist\nend","stubs":[{"funcName":"GetClosestVehicle","metadata":{"export":"GetClosestVehicle"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get the closest vehicle to given coords.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param maxDistance? number Max search radius (default: 50.0)\n--- @return number? vehicle, number? distance\nfunction LT.Utils.GetClosestVehicle(coords, maxDistance) end"}]},"server":null},"@Utils/GetPlayersInArea":{"ns":"Utils","meta":{},"shared":null,"client":{"code":"local GetActivePlayers = GetActivePlayers\nlocal GetPlayerPed = GetPlayerPed\nlocal GetEntityCoords = GetEntityCoords\nlocal PlayerId = PlayerId\nlocal PlayerPedId = PlayerPedId\n\nfunction GetPlayersInArea(coords, radius)\n coords = coords or GetEntityCoords(PlayerPedId())\n local players = {}\n local myId = PlayerId()\n\n for _, id in ipairs(GetActivePlayers()) do\n if id ~= myId then\n local ped = GetPlayerPed(id)\n local dist = #(coords - GetEntityCoords(ped))\n if dist <= radius then\n players[#players + 1] = { id = id, ped = ped, dist = dist }\n end\n end\n end\n\n return players\nend","stubs":[{"funcName":"GetPlayersInArea","metadata":{"export":"GetPlayersInArea"},"stubCode":"--- **`UTILS` `CLIENT`**\n--- Get all players within a radius.\n--- @param coords? vector3 Coords of area (default: Player coords)\n--- @param radius number\n--- @return table Array of { id, ped, dist }\nfunction LT.Utils.GetPlayersInArea(coords, radius) end"}]},"server":null},"@VehicleKeys/GiveKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['qb-vehiclekeys'] = function(vehicle, plate)\r\n TriggerServerEvent(\"qb-vehiclekeys:server:AcquireVehicleKeys\", plate)\r\n end,\r\n ['qbx_vehiclekeys'] = function(vehicle, plate)\r\n TriggerServerEvent(\"qb-vehiclekeys:server:AcquireVehicleKeys\", plate)\r\n end,\r\n ['qs-vehiclekeys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['qs-vehiclekeys']:GiveKeys(plate, model, true)\r\n end,\r\n ['mk_vehiclekeys'] = function(vehicle, plate)\r\n exports[\"mk_vehiclekeys\"]:AddKey(vehicle)\r\n end,\r\n ['0r-vehiclekeys'] = function(vehicle, plate)\r\n exports['0r-vehiclekeys']:GiveKeys(plate)\r\n end,\r\n ['MrNewbVehicleKeys'] = function(vehicle, plate)\r\n exports.MrNewbVehicleKeys:GiveKeysByPlate(plate)\r\n end,\r\n ['t1ger_keys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['t1ger_keys']:GiveTemporaryKeys(plate, model, '')\r\n end,\r\n ['mVehicle'] = function(vehicle, plate)\r\n exports.mVehicle:AddTemporalVehicleClient(vehicle)\r\n end,\r\n ['okokGarage'] = function(vehicle, plate)\r\n TriggerServerEvent('okokGarage:GiveKeys', plate)\r\n end\r\n}\r\nfunction GiveKeys(vehicle, plate)\r\n local name = GetKeysResource()\r\n if not name then return false end\r\n if not vehicle or not DoesEntityExist(vehicle) then return false end\r\n if not plate then\r\n plate = GetVehicleNumberPlateText(vehicle)\r\n end\r\n local adapter = adapters[name]\r\n if not adapter then return false end\r\n adapter(vehicle, plate)\r\n return true\r\nend","stubs":[{"funcName":"GiveKeys","metadata":{"export":"Give"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Give player(self) the keys of specified vehicle.\r\n--- @param vehicle number Vehicle entity.\r\n--- @param plate? string Plate of vehicle\r\n--- @return boolean\nfunction LT.VehicleKeys.Give(vehicle, plate) end"}]},"server":null},"@VehicleKeys/RemoveKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local adapters = {\r\n ['qb-vehiclekeys'] = function(vehicle, plate)\r\n TriggerEvent(\"qb-vehiclekeys:client:RemoveKeys\", plate)\r\n end,\r\n ['qbx_vehiclekeys'] = function(vehicle, plate)\r\n TriggerEvent(\"qb-vehiclekeys:client:RemoveKeys\", plate)\r\n end,\r\n ['qs-vehiclekeys'] = function(vehicle, plate)\r\n local model = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle))\r\n exports['qs-vehiclekeys']:RemoveKeys(plate, model)\r\n end,\r\n ['mk_vehiclekeys'] = function(vehicle, plate)\r\n exports[\"mk_vehiclekeys\"]:RemoveKey(vehicle)\r\n end,\r\n ['0r-vehiclekeys'] = function(vehicle, plate)\r\n exports['0r-vehiclekeys']:RemoveKeys(plate)\r\n end,\r\n ['MrNewbVehicleKeys'] = function(vehicle, plate)\r\n exports.MrNewbVehicleKeys:RemoveKeysByPlate(plate)\r\n end,\r\n ['t1ger_keys'] = function(vehicle, plate)\r\n printf('error', '^4t1ger_keys^7 does not support removing keys.')\r\n end,\r\n ['mVehicle'] = function(vehicle, plate)\r\n printf('error', '^4mVehicle^7 does not support removing keys.')\r\n end,\r\n ['okokGarage'] = function(vehicle, plate)\r\n local src = GetPlayerServerId(PlayerId())\r\n TriggerServerEvent(\"okokGarage:RemoveKeys\", plate, src)\r\n end\r\n}\r\nfunction RemoveKeys(vehicle, plate)\r\n local name = GetKeysResource()\r\n if not name then return false end\r\n if not vehicle or not DoesEntityExist(vehicle) then return false end\r\n if not plate then\r\n plate = GetVehicleNumberPlateText(vehicle)\r\n end\r\n local adapter = adapters[name]\r\n if not adapter then return false end\r\n adapter(vehicle, plate)\r\n return true\r\nend","stubs":[{"funcName":"RemoveKeys","metadata":{"export":"Remove"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Remove specified vehicle keys from player(self).\r\n--- @param vehicle number Vehicle entity.\r\n--- @param plate? string Plate of vehicle\r\n--- @return boolean\nfunction LT.VehicleKeys.Remove(vehicle, plate) end"}]},"server":null},"@VehicleKeys":{"ns":"VehicleKeys","meta":{},"shared":null,"client":{"code":"local resourceName = nil\r\nlocal list = {\r\n ['qb-vehiclekeys'] = { providers = {'qbx_vehiclekeys'} },\r\n ['qbx_vehiclekeys'] = {},\r\n ['qs-vehiclekeys'] = {},\r\n ['mk_vehiclekeys'] = {},\r\n ['0r-vehiclekeys'] = {},\r\n ['MrNewbVehicleKeys'] = {},\r\n ['t1ger_keys'] = {},\r\n ['mVehicle'] = {},\r\n ['okokGarage'] = {}\r\n}\r\nfunction GetKeysResource()\r\n return resourceName\r\nend\r\nfunction SetKeysResource(name)\r\n if not name then return end\r\n if not list[name] then return printf('error', 'Vehiclekeys resource ^3%s^7 not found.', name) end\r\n resourceName = name\r\nend\r\nlocal resource = DetectResource(list, 'vehiclekeys')\r\nif resource then\r\n SetKeysResource(resource)\r\nend","stubs":[{"funcName":"GetKeysResource","metadata":{"export":"GetResource"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Returns vehicle key resource name.\r\n--- @return 'qb-vehiclekeys'|'qbx_vehiclekeys'|'qs-vehiclekeys'|'mk_vehiclekeys'|'0r-vehiclekeys'|'MrNewbVehicleKeys'|'t1ger_keys'|'mVehicle'|'okokGarage'|nil\nfunction LT.VehicleKeys.GetResource() end"},{"funcName":"SetKeysResource","metadata":{"export":"SetResource"},"stubCode":"--- **`VEHICLEKEYS` `CLIENT`**\n--- Force set vehicle key resource.\r\n--- Useful for config assignment.\r\n--- @param name 'qb-vehiclekeys'|'qbx_vehiclekeys'|'qs-vehiclekeys'|'mk_vehiclekeys'|'0r-vehiclekeys'|'MrNewbVehicleKeys'|'t1ger_keys'|'mVehicle'|'okokGarage'\nfunction LT.VehicleKeys.SetResource(name) end"}]},"server":null},"@Version/CheckDependency":{"ns":"Version","meta":{},"shared":{"code":"local function parseVersion(versionString)\r\n if not versionString then return nil end\r\n local parts = {}\r\n for num in string.gmatch(versionString, \"(%d+)\") do\r\n table.insert(parts, tonumber(num))\r\n end\r\n return {\r\n major = parts[1] or 0,\r\n minor = parts[2] or 0,\r\n patch = parts[3] or 0\r\n }\r\nend\r\nlocal function compareVersions(v1, v2)\r\n local ver1 = parseVersion(v1)\r\n local ver2 = parseVersion(v2)\r\n if not ver1 or not ver2 then return 0 end\r\n if ver1.major > ver2.major then return 1 end\r\n if ver1.major < ver2.major then return -1 end\r\n if ver1.minor > ver2.minor then return 1 end\r\n if ver1.minor < ver2.minor then return -1 end\r\n if ver1.patch > ver2.patch then return 1 end\r\n if ver1.patch < ver2.patch then return -1 end\r\n return 0\r\nend\r\nfunction CheckDependency(resourceName, minVersion)\r\n if not resourceName or not minVersion then return false end\r\n local isStarted = GetResourceState(resourceName) ~= 'missing'\r\n if not isStarted then return false end\r\n local currentVersion = GetResourceMetadata(resourceName, 'version', 0)\r\n if not currentVersion then return false end\r\n local comparison = compareVersions(currentVersion, minVersion)\r\n if comparison < 0 then\r\n printf('error', 'Dependency failed: ^3\\'%s\\'^7 ^1v%s^7 < ^2%s^7 (required)', resourceName, currentVersion, minVersion)\r\n return false\r\n end\r\n return true\r\nend","stubs":[{"funcName":"CheckDependency","metadata":{},"stubCode":"--- **`VERSION` `SHARED`**\n--- Check if a resource dependency is met.\r\n--- ```lua\r\n--- if not LT.Version.CheckDependency('resourceName', '1.0.0') then\r\n--- error()\r\n--- end\r\n--- ```\r\n--- @param resourceName string Resource to check\r\n--- @param minVersion string Minimum required version (e.g. \"1.0.0\")\r\n--- @return boolean\nfunction LT.Version.CheckDependency(resourceName, minVersion) end"}]},"client":null,"server":null},"@Version/CheckVersion":{"ns":"Version","meta":{},"shared":null,"client":null,"server":{"code":"local format = string.format\r\nlocal PerformHttpRequest = PerformHttpRequest\r\nlocal function resolvePrintFormats(messages)\r\n return {\r\n upToDate = (messages and messages.upToDate) or '^2[%s]^7 Up-to-date (v%s)',\r\n updateAvailable = (messages and messages.updateAvailable) or '^3[%s]^7 Update available: ^1v%s^7 → ^2v%s^7',\r\n download = (messages and messages.download) or ' Download: ^4%s^7',\r\n }\r\nend\r\nlocal function extractSemver(s)\r\n if not s then return nil end\r\n return s:match('%d+%.%d+%.%d+')\r\nend\r\nlocal function printVersionStatus(resourceName, msgs, currentShown, remoteShown, needsUpdate, downloadLink,\r\n sendUpToDate)\r\n if not needsUpdate then\r\n if sendUpToDate then\r\n print(format(msgs.upToDate, resourceName, currentShown))\r\n end\r\n return\r\n end\r\n print(format(msgs.updateAvailable, resourceName, currentShown, remoteShown))\r\n print(format(msgs.download, downloadLink))\r\nend\r\nlocal function parseRemoteFromUrlBody(fileType, body, resourceName)\r\n if fileType == 'JSON' then\r\n local decoded = json.decode(body)\r\n if not decoded or not decoded[resourceName] then\r\n printf('warning',\r\n 'Version check for %s resource failed. No matching version was found on the source, or the source URL could not be reached.',\r\n resourceName)\r\n return nil\r\n end\r\n return decoded[resourceName]\r\n end\r\n if fileType == 'PLAIN' then\r\n return tostring(body):gsub('%s+', '')\r\n end\r\n printf('warning', 'Invalid version file type: %s', fileType)\r\n return nil\r\nend\r\nfunction CheckVersion(data, messages)\r\n local resourceName <const> = (data and data.resourceName) or LT_RESOURCE_NAME\r\n local currentVersion <const> = GetResourceMetadata(resourceName, 'version', 0)\r\n if not currentVersion then\r\n return printf('warning', 'No version found for resource %s.', resourceName)\r\n end\r\n local msgs <const> = resolvePrintFormats(messages)\r\n local sendUpToDate <const> = data and data.sendUpToDate == true\r\n local repo <const> = data and (data.repository or data.repo) or nil\r\n if repo ~= nil then\r\n local currentSemver <const> = extractSemver(currentVersion)\r\n if not currentSemver then\r\n printf('warning', 'Unable to determine semantic version (x.y.z) for %s. Found: %s', resourceName,\r\n currentVersion)\r\n return\r\n end\r\n PerformHttpRequest(format('https://api.github.com/repos/%s/releases/latest', repo),\r\n function(statusCode, body)\r\n if statusCode ~= 200 then return end\r\n local payload = json.decode(body)\r\n if not payload or payload.prerelease or not payload.tag_name then return end\r\n local latestSemver = extractSemver(payload.tag_name)\r\n local needsUpdate = latestSemver ~= nil and latestSemver ~= currentSemver\r\n printVersionStatus(resourceName, msgs, currentSemver, latestSemver or '', needsUpdate,\r\n needsUpdate and (payload.html_url or '') or '', sendUpToDate)\r\n end, 'GET')\r\n return\r\n end\r\n local fileType = (data and data.fileType) or 'JSON'\r\n local url = data and data.url\r\n if not url then\r\n return printf('warning', 'No URL provided for resource version check %s.', resourceName)\r\n end\r\n local downloadURL <const> = (data and data.downloadUrl) or ''\r\n PerformHttpRequest(url, function(statusCode, body, _)\r\n if statusCode ~= 200 or not body then return end\r\n local remoteVersion = parseRemoteFromUrlBody(fileType, body, resourceName)\r\n if not remoteVersion or remoteVersion == '' then return end\r\n local needsUpdate = currentVersion ~= remoteVersion\r\n printVersionStatus(resourceName, msgs, currentVersion, remoteVersion, needsUpdate, downloadURL,\r\n sendUpToDate)\r\n end, 'GET')\r\nend","stubs":[{"funcName":"CheckVersion","metadata":{"export":"Check"},"stubCode":"--- **`VERSION` `SERVER`**\n--- Compares `GetResourceMetadata(..., 'version')` to GitHub latest release or a remote URL.\r\n---\r\n--- `data` (pick GitHub **or** URL mode):\r\n--- - `repository` / `repo`: `owner/repo`; semver from latest non-prerelease `tag_name`.\r\n--- - `url` + optional `fileType` (`JSON` default, or `PLAIN`): remote version string or JSON map keyed by `resourceName`.\r\n--- - `resourceName`, `downloadUrl`: optional overrides (name defaults to current resource).\r\n--- - `sendUpToDate`: set `true` to print when already current; default is silent (no up-to-date line).\r\n---\r\n--- `messages`: optional `{ upToDate, updateAvailable, download }` printf-style format strings.\r\n--- @param data table\r\n--- @param messages? table\nfunction LT.Version.Check(data, messages) end"}]}},"@Version/GetVersion":{"ns":"Version","meta":{},"shared":null,"client":null,"server":{"code":"function GetVersion(resourceName)\r\n local res = resourceName or LT_RESOURCE_NAME\r\n if GetResourceState(res) == 'missing' then return end\r\n return GetResourceMetadata(res, 'version', 0)\r\nend","stubs":[{"funcName":"GetVersion","metadata":{"export":"Get"},"stubCode":"--- **`VERSION` `SERVER`**\n--- Returns the specific resources version.\r\n--- @param resourceName? string Defaults to current resource name.\r\n--- @return string?\nfunction LT.Version.Get(resourceName) end"}]}},"__init__":{"ns":null,"meta":{},"shared":{"code":"LT_RESOURCE_NAME = GetCurrentResourceName()\r\nlocal print = print\r\nlocal format = string.format\r\nLT_DISABLE_DEBUG = false\r\nfunction printf(type, message, ...)\r\n if LT_DISABLE_DEBUG and type ~= 'error' then return end \n local prefix = {\r\n error = '^1[LTBRIDGE] ERROR:^7 ',\r\n warning = '^3[LTBRIDGE] WARN:^7 ',\r\n }\r\n print((prefix[type] and prefix[type] or '^7 ') .. format(message, ...) .. '^7')\r\nend","stubs":[{"funcName":"printf","metadata":{"internal":true},"stubCode":"--- **`GENERAL` `SHARED`**\n--- Internal print/debug function of LTBridge, use this and not the original `print()` when creating modules.\r\n--- @param type? 'error'|'warning'\r\n--- @param message string Print message\r\n--- @param ...? any Additional parameters\r\n--- @diagnostic disable-next-line: lowercase-global\nfunction LT.printf(type, message, ...) end"}]},"client":null,"server":null}},"exportMap":{"GetResource":["@Alert","@Dispatch","@Framework","@Fuel","@Input","@Inventory","@Menu","@Notify","@Phone","@Progress","@Target","@TextUI","@VehicleKeys"],"Alert.GetResource":["@Alert"],"GetAlertResource":["@Alert"],"SetResource":["@Alert","@Dispatch","@Fuel","@Input","@Inventory","@Menu","@Notify","@Phone","@Progress","@TextUI","@VehicleKeys"],"Alert.SetResource":["@Alert"],"SetAlertResource":["@Alert"],"Send":["@Alert","@Dispatch","@Notify","@NUI/Send"],"Alert.Send":["@Alert"],"SendAlert":["@Alert"],"Get":["@Cache","@Locale","@State/Get","@Version/GetVersion"],"Cache.Get":["@Cache"],"GetCache":["@Cache"],"OnChange":["@Cache","@State/OnChange"],"Cache.OnChange":["@Cache"],"OnCacheChange":["@Cache"],"Register":["@Callback","@Events/Register"],"Callback.Register":["@Callback"],"RegisterCallback":["@Callback"],"Await":["@Callback"],"Callback.Await":["@Callback"],"AwaitCallback":["@Callback"],"Trigger":["@Callback"],"Callback.Trigger":["@Callback"],"TriggerAsyncCallback":["@Callback"],"Create":["@Class","@Logger"],"Class.Create":["@Class"],"CreateClass":["@Class"],"Start":["@Cooldown","@Hooks/Start"],"Cooldown.Start":["@Cooldown"],"StartCooldown":["@Cooldown"],"Check":["@Cooldown","@NUI","@Version/CheckVersion"],"Cooldown.Check":["@Cooldown"],"CheckCooldown":["@Cooldown"],"Remaining":["@Cooldown"],"Cooldown.Remaining":["@Cooldown"],"GetCooldownRemaining":["@Cooldown"],"Clear":["@Cooldown"],"Cooldown.Clear":["@Cooldown"],"ClearCooldown":["@Cooldown"],"SetMode":["@Debug"],"Debug.SetMode":["@Debug"],"SetDebugMode":["@Debug"],"Detailed":["@Debug"],"Debug.Detailed":["@Debug"],"DebugDetailed":["@Debug"],"Print":["@Debug"],"Debug.Print":["@Debug"],"DebugPrint":["@Debug"],"Info":["@Debug"],"Debug.Info":["@Debug"],"DebugInfo":["@Debug"],"Success":["@Debug"],"Debug.Success":["@Debug"],"DebugSuccess":["@Debug"],"Error":["@Debug"],"Debug.Error":["@Debug"],"DebugError":["@Debug"],"Warn":["@Debug"],"Debug.Warn":["@Debug"],"DebugWarn":["@Debug"],"Verbose":["@Debug"],"Debug.Verbose":["@Debug"],"DebugVerbose":["@Debug"],"Dispatch.GetResource":["@Dispatch"],"GetDispatchResource":["@Dispatch"],"Dispatch.SetResource":["@Dispatch"],"SetDispatchResource":["@Dispatch"],"Dispatch.Send":["@Dispatch"],"SendDispatch":["@Dispatch"],"Emit":["@Events/Emit"],"Events.Emit":["@Events/Emit"],"EventEmit":["@Events/Emit"],"EmitNet":["@Events/EmitNet"],"Events.EmitNet":["@Events/EmitNet"],"EventEmitNet":["@Events/EmitNet"],"Events.Register":["@Events/Register"],"EventRegister":["@Events/Register"],"Framework.GetFrameworkJobs":["@Framework/GetFrameworkJobs"],"GetFrameworkJobs":["@Framework/GetFrameworkJobs"],"Framework.GetPlayerJobData":["@Framework/GetPlayerJobData"],"GetPlayerJobData":["@Framework/GetPlayerJobData"],"Framework.SetPlayerJob":["@Framework/SetPlayerJob"],"SetPlayerJob":["@Framework/SetPlayerJob"],"Framework.AddMoney":["@Framework/AddMoney"],"AddMoney":["@Framework/AddMoney"],"Framework.GetMoney":["@Framework/GetMoney"],"GetMoney":["@Framework/GetMoney"],"Framework.RemoveMoney":["@Framework/RemoveMoney"],"RemoveMoney":["@Framework/RemoveMoney"],"Framework.AddHunger":["@Framework/AddHunger"],"AddHunger":["@Framework/AddHunger"],"Framework.AddThirst":["@Framework/AddThirst"],"AddThirst":["@Framework/AddThirst"],"Framework.GetHunger":["@Framework/GetHunger"],"GetHunger":["@Framework/GetHunger"],"Framework.GetPlayerMetadata":["@Framework/GetPlayerMetadata"],"GetPlayerMetadata":["@Framework/GetPlayerMetadata"],"Framework.GetThirst":["@Framework/GetThirst"],"GetThirst":["@Framework/GetThirst"],"Framework.IsPlayerDead":["@Framework/IsPlayerDead"],"IsPlayerDead":["@Framework/IsPlayerDead"],"Framework.IsPlayerLoaded":["@Framework/IsPlayerLoaded"],"IsPlayerLoaded":["@Framework/IsPlayerLoaded"],"Framework.SetPlayerMetadata":["@Framework/SetPlayerMetadata"],"SetPlayerMetadata":["@Framework/SetPlayerMetadata"],"Framework.GetOwnedVehicles":["@Framework/GetOwnedVehicles"],"GetOwnedVehicles":["@Framework/GetOwnedVehicles"],"Framework.IsVehicleOwnedByPlayer":["@Framework/IsVehicleOwnedByPlayer"],"IsVehicleOwnedByPlayer":["@Framework/IsVehicleOwnedByPlayer"],"Framework.GetPlayer":["@Framework/GetPlayer"],"GetPlayer":["@Framework/GetPlayer","@State/GetPlayer"],"Framework.GetPlayerBirthdate":["@Framework/GetPlayerBirthdate"],"GetPlayerBirthdate":["@Framework/GetPlayerBirthdate"],"Framework.GetPlayerByCitizenId":["@Framework/GetPlayerByCitizenId"],"GetPlayerByCitizenId":["@Framework/GetPlayerByCitizenId"],"Framework.GetPlayerCitizenId":["@Framework/GetPlayerCitizenId"],"GetPlayerCitizenId":["@Framework/GetPlayerCitizenId"],"Framework.GetPlayerData":["@Framework/GetPlayerData"],"GetPlayerData":["@Framework/GetPlayerData"],"Framework.GetPlayerName":["@Framework/GetPlayerName"],"GetPlayerName":["@Framework/GetPlayerName"],"Framework.GetPlayerPhoneNumber":["@Framework/GetPlayerPhoneNumber"],"GetPlayerPhoneNumber":["@Framework/GetPlayerPhoneNumber"],"Framework.GetPlayers":["@Framework/GetPlayers"],"GetPlayers":["@Framework/GetPlayers"],"Framework.GetPlayerSourceByCitizenId":["@Framework/GetPlayerSourceByCitizenId"],"GetPlayerSourceByCitizenId":["@Framework/GetPlayerSourceByCitizenId"],"Framework.IsFrameworkAdmin":["@Framework/IsFrameworkAdmin"],"IsFrameworkAdmin":["@Framework/IsFrameworkAdmin"],"Framework.RegisterUsableItem":["@Framework/RegisterUsableItem"],"RegisterUsableItem":["@Framework/RegisterUsableItem"],"Framework.GetResource":["@Framework"],"GetFramework":["@Framework"],"Fuel.GetFuel":["@Fuel/GetFuel"],"GetFuel":["@Fuel/GetFuel"],"Fuel.SetFuel":["@Fuel/SetFuel"],"SetFuel":["@Fuel/SetFuel"],"Fuel.GetResource":["@Fuel"],"GetFuelResource":["@Fuel"],"Fuel.SetResource":["@Fuel"],"SetFuelResource":["@Fuel"],"Hooks.Start":["@Hooks/Start"],"OnResourceStart":["@Hooks/Start"],"Stop":["@Hooks/Stop"],"Hooks.Stop":["@Hooks/Stop"],"OnResourceStop":["@Hooks/Stop"],"Input.GetResource":["@Input"],"GetInputResource":["@Input"],"Input.SetResource":["@Input"],"SetInputResource":["@Input"],"Open":["@Input","@Menu","@Progress"],"Input.Open":["@Input"],"OpenInput":["@Input"],"Inventory.AddItem":["@Inventory/AddItem"],"AddItem":["@Inventory/AddItem"],"Inventory.CanCarryItem":["@Inventory/CanCarryItem"],"CanCarryItem":["@Inventory/CanCarryItem"],"Inventory.GetItemBySlot":["@Inventory/GetItemBySlot"],"GetItemBySlot":["@Inventory/GetItemBySlot"],"GetItemCount":["@Inventory/GetItemCount"],"Inventory.GetItemCount":["@Inventory/GetItemCount"],"GetItemCountClient":["@Inventory/GetItemCount"],"GetItemCountServer":["@Inventory/GetItemCount"],"Inventory.GetItemImage":["@Inventory/GetItemImage"],"GetItemImage":["@Inventory/GetItemImage"],"Inventory.GetItemInfo":["@Inventory/GetItemInfo"],"GetItemInfo":["@Inventory/GetItemInfo"],"Inventory.GetPlayerInventory":["@Inventory/GetPlayerInventory"],"GetPlayerInventory":["@Inventory/GetPlayerInventory"],"Inventory.HasItem":["@Inventory/HasItem"],"HasItem":["@Inventory/HasItem"],"Inventory.RemoveItem":["@Inventory/RemoveItem"],"RemoveItem":["@Inventory/RemoveItem"],"Inventory.SetItemMetadata":["@Inventory/SetItemMetadata"],"SetItemMetadata":["@Inventory/SetItemMetadata"],"Inventory.GetResource":["@Inventory"],"GetInventoryResource":["@Inventory"],"Inventory.SetResource":["@Inventory"],"SetInventoryResource":["@Inventory"],"OnPlayerLoad":["@LoadUnload"],"OnPlayerUnload":["@LoadUnload"],"Init":["@Locale","@Logger"],"Locale.Init":["@Locale"],"InitLocale":["@Locale"],"Locale.Get":["@Locale"],"GetString":["@Locale"],"GetAllStrings":["@Locale"],"Locale.GetAllStrings":["@Locale"],"GetLocaleStrings":["@Locale"],"GetCurrentKey":["@Locale"],"Locale.GetCurrentKey":["@Locale"],"GetCurrentLocaleKey":["@Locale"],"Logger.Init":["@Logger"],"InitLogger":["@Logger"],"Logger.Create":["@Logger"],"CreateLog":["@Logger"],"Clamp":["@Math/Clamp"],"Math.Clamp":["@Math/Clamp"],"MathClamp":["@Math/Clamp"],"FormatMoney":["@Math/FormatMoney"],"Math.FormatMoney":["@Math/FormatMoney"],"MathFormatMoney":["@Math/FormatMoney"],"FormatNumber":["@Math/FormatNumber"],"Math.FormatNumber":["@Math/FormatNumber"],"MathFormatNumber":["@Math/FormatNumber"],"Lerp":["@Math/Lerp"],"Math.Lerp":["@Math/Lerp"],"MathLerp":["@Math/Lerp"],"MapRange":["@Math/MapRange"],"Math.MapRange":["@Math/MapRange"],"MathMapRange":["@Math/MapRange"],"RandomFloat":["@Math/RandomFloat"],"Math.RandomFloat":["@Math/RandomFloat"],"MathRandomFloat":["@Math/RandomFloat"],"Round":["@Math/Round"],"Math.Round":["@Math/Round"],"MathRound":["@Math/Round"],"Menu.GetResource":["@Menu"],"GetMenuResource":["@Menu"],"Menu.SetResource":["@Menu"],"SetMenuResource":["@Menu"],"Menu.Open":["@Menu"],"OpenMenu":["@Menu"],"Notify.GetResource":["@Notify"],"GetNotifyResource":["@Notify"],"Notify.SetResource":["@Notify"],"SetNotifyResource":["@Notify"],"Notify.Send":["@Notify"],"SendNotify":["@Notify"],"Callback":["@NUI/Callback"],"NUI.Callback":["@NUI/Callback"],"NUICallback":["@NUI/Callback"],"Focus":["@NUI/Focus"],"NUI.Focus":["@NUI/Focus"],"NUIFocus":["@NUI/Focus"],"Request":["@NUI/Request"],"NUI.Request":["@NUI/Request"],"NUIRequest":["@NUI/Request"],"NUI.Send":["@NUI/Send"],"SendNUI":["@NUI/Send"],"CreateState":["@NUI/State"],"NUI.CreateState":["@NUI/State"],"CreateNUIState":["@NUI/State"],"NUI.Check":["@NUI"],"CheckNUI":["@NUI"],"IsLoaded":["@NUI"],"NUI.IsLoaded":["@NUI"],"IsNUILoaded":["@NUI"],"Phone.GetNumber":["@Phone/GetNumber"],"GetNumber":["@Phone/GetNumber"],"SendMail":["@Phone/SendMail"],"Phone.SendMail":["@Phone/SendMail"],"Phone.GetResource":["@Phone"],"GetPhoneResource":["@Phone"],"Phone.SetResource":["@Phone"],"SetPhoneResource":["@Phone"],"Progress.GetResource":["@Progress"],"GetProgressResource":["@Progress"],"Progress.SetResource":["@Progress"],"SetProgressResource":["@Progress"],"Progress.Open":["@Progress"],"OpenProgress":["@Progress"],"State.Get":["@State/Get"],"GetState":["@State/Get"],"State.GetPlayer":["@State/GetPlayer"],"GetPlayerState":["@State/GetPlayer"],"State.OnChange":["@State/OnChange"],"OnStateChange":["@State/OnChange"],"Set":["@State/Set"],"State.Set":["@State/Set"],"SetState":["@State/Set"],"SetPlayer":["@State/SetPlayer"],"State.SetPlayer":["@State/SetPlayer"],"SetPlayerState":["@State/SetPlayer"],"RequestAnimDict":["@Streaming/RequestAnimDict"],"Streaming.RequestAnimDict":["@Streaming/RequestAnimDict"],"StreamRequestAnimDict":["@Streaming/RequestAnimDict"],"RequestAnimSet":["@Streaming/RequestAnimSet"],"Streaming.RequestAnimSet":["@Streaming/RequestAnimSet"],"StreamRequestAnimSet":["@Streaming/RequestAnimSet"],"RequestClipSet":["@Streaming/RequestClipSet"],"Streaming.RequestClipSet":["@Streaming/RequestClipSet"],"StreamRequestClipSet":["@Streaming/RequestClipSet"],"RequestModel":["@Streaming/RequestModel"],"Streaming.RequestModel":["@Streaming/RequestModel"],"StreamRequestModel":["@Streaming/RequestModel"],"RequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"Streaming.RequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"StreamRequestPtfxAsset":["@Streaming/RequestPtfxAsset"],"RequestTexture":["@Streaming/RequestTexture"],"Streaming.RequestTexture":["@Streaming/RequestTexture"],"StreamRequestTexture":["@Streaming/RequestTexture"],"RequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"Streaming.RequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"StreamRequestWeaponAsset":["@Streaming/RequestWeaponAsset"],"Capitalize":["@String/Capitalize"],"String.Capitalize":["@String/Capitalize"],"StringCapitalize":["@String/Capitalize"],"EndsWith":["@String/EndsWith"],"String.EndsWith":["@String/EndsWith"],"StringEndsWith":["@String/EndsWith"],"Split":["@String/Split"],"String.Split":["@String/Split"],"StringSplit":["@String/Split"],"StartsWith":["@String/StartsWith"],"String.StartsWith":["@String/StartsWith"],"StringStartsWith":["@String/StartsWith"],"TitleCase":["@String/TitleCase"],"String.TitleCase":["@String/TitleCase"],"StringTitleCase":["@String/TitleCase"],"Trim":["@String/Trim"],"String.Trim":["@String/Trim"],"StringTrim":["@String/Trim"],"Contains":["@Table/Contains"],"Table.Contains":["@Table/Contains"],"TableContains":["@Table/Contains"],"DeepCopy":["@Table/DeepCopy"],"Table.DeepCopy":["@Table/DeepCopy"],"TableDeepCopy":["@Table/DeepCopy"],"Filter":["@Table/Filter"],"Table.Filter":["@Table/Filter"],"TableFilter":["@Table/Filter"],"Keys":["@Table/Keys"],"Table.Keys":["@Table/Keys"],"TableKeys":["@Table/Keys"],"Map":["@Table/Map"],"Table.Map":["@Table/Map"],"TableMap":["@Table/Map"],"Merge":["@Table/Merge"],"Table.Merge":["@Table/Merge"],"TableMerge":["@Table/Merge"],"Size":["@Table/Size"],"Table.Size":["@Table/Size"],"TableSize":["@Table/Size"],"Values":["@Table/Values"],"Table.Values":["@Table/Values"],"TableValues":["@Table/Values"],"Target.AddBoxZone":["@Target/AddBoxZone"],"AddBoxZone":["@Target/AddBoxZone"],"Target.AddGlobalPed":["@Target/AddGlobalPed"],"AddGlobalPed":["@Target/AddGlobalPed"],"Target.AddGlobalPlayer":["@Target/AddGlobalPlayer"],"AddGlobalPlayer":["@Target/AddGlobalPlayer"],"Target.AddGlobalVehicle":["@Target/AddGlobalVehicle"],"AddGlobalVehicle":["@Target/AddGlobalVehicle"],"Target.AddLocalEntity":["@Target/AddLocalEntity"],"AddLocalEntity":["@Target/AddLocalEntity"],"Target.AddModel":["@Target/AddModel"],"AddModel":["@Target/AddModel"],"Target.AddNetworkedEntity":["@Target/AddNetworkedEntity"],"AddNetworkedEntity":["@Target/AddNetworkedEntity"],"Target.AddSphereZone":["@Target/AddSphereZone"],"AddSphereZone":["@Target/AddSphereZone"],"Target.RemoveGlobalPed":["@Target/RemoveGlobalPed"],"RemoveGlobalPed":["@Target/RemoveGlobalPed"],"Target.RemoveGlobalPlayer":["@Target/RemoveGlobalPlayer"],"RemoveGlobalPlayer":["@Target/RemoveGlobalPlayer"],"Target.RemoveGlobalVehicle":["@Target/RemoveGlobalVehicle"],"RemoveGlobalVehicle":["@Target/RemoveGlobalVehicle"],"Target.RemoveLocalEntity":["@Target/RemoveLocalEntity"],"RemoveLocalEntity":["@Target/RemoveLocalEntity"],"Target.RemoveModel":["@Target/RemoveModel"],"RemoveModel":["@Target/RemoveModel"],"Target.RemoveNetworkedEntity":["@Target/RemoveNetworkedEntity"],"RemoveNetworkedEntity":["@Target/RemoveNetworkedEntity"],"Target.ToggleTargeting":["@Target/ToggleTargeting"],"ToggleTargeting":["@Target/ToggleTargeting"],"Target.GetResource":["@Target"],"GetTargetResource":["@Target"],"Target.RemoveZone":["@Target"],"RemoveZone":["@Target"],"Hide":["@TextUI/HideTextUI"],"TextUI.Hide":["@TextUI/HideTextUI"],"HideTextUI":["@TextUI/HideTextUI"],"Show":["@TextUI/ShowTextUI"],"TextUI.Show":["@TextUI/ShowTextUI"],"ShowTextUI":["@TextUI/ShowTextUI"],"TextUI.GetResource":["@TextUI"],"GetTextUIResource":["@TextUI"],"TextUI.SetResource":["@TextUI"],"SetTextUIResource":["@TextUI"],"GetClosestObject":["@Utils/GetClosestObject"],"Utils.GetClosestObject":["@Utils/GetClosestObject"],"GetClosestPed":["@Utils/GetClosestPed"],"Utils.GetClosestPed":["@Utils/GetClosestPed"],"GetClosestPlayer":["@Utils/GetClosestPlayer"],"Utils.GetClosestPlayer":["@Utils/GetClosestPlayer"],"GetClosestVehicle":["@Utils/GetClosestVehicle"],"Utils.GetClosestVehicle":["@Utils/GetClosestVehicle"],"GetPlayersInArea":["@Utils/GetPlayersInArea"],"Utils.GetPlayersInArea":["@Utils/GetPlayersInArea"],"Give":["@VehicleKeys/GiveKeys"],"VehicleKeys.Give":["@VehicleKeys/GiveKeys"],"GiveKeys":["@VehicleKeys/GiveKeys"],"Remove":["@VehicleKeys/RemoveKeys"],"VehicleKeys.Remove":["@VehicleKeys/RemoveKeys"],"RemoveKeys":["@VehicleKeys/RemoveKeys"],"VehicleKeys.GetResource":["@VehicleKeys"],"GetKeysResource":["@VehicleKeys"],"VehicleKeys.SetResource":["@VehicleKeys"],"SetKeysResource":["@VehicleKeys"],"Version.CheckDependency":["@Version/CheckDependency"],"CheckDependency":["@Version/CheckDependency"],"Version.Check":["@Version/CheckVersion"],"CheckVersion":["@Version/CheckVersion"],"Version.Get":["@Version/GetVersion"],"GetVersion":["@Version/GetVersion"]},"registry":{"@Alert":"@Alert/__init__","@Cache":"@Cache/__init__","@Callback":"@Callback/__init__","@Class":"@Class/__init__","@Cooldown":"@Cooldown/__init__","@Debug":"@Debug/__init__","@Dispatch":"@Dispatch/__init__","@Events/Emit":"@Events/Emit","@Events/EmitNet":"@Events/EmitNet","@Events/Register":"@Events/Register","@Events":"@Events/__init__","@Framework/GetFrameworkJobs":"@Framework/#Job/GetFrameworkJobs","@Framework/GetPlayerJobData":"@Framework/#Job/GetPlayerJobData","@Framework/SetPlayerJob":"@Framework/#Job/SetPlayerJob","@Framework/AddMoney":"@Framework/#Money/AddMoney","@Framework/GetMoney":"@Framework/#Money/GetMoney","@Framework/RemoveMoney":"@Framework/#Money/RemoveMoney","@Framework/AddHunger":"@Framework/#States/AddHunger","@Framework/AddThirst":"@Framework/#States/AddThirst","@Framework/GetHunger":"@Framework/#States/GetHunger","@Framework/GetPlayerMetadata":"@Framework/#States/GetPlayerMetadata","@Framework/GetThirst":"@Framework/#States/GetThirst","@Framework/IsPlayerDead":"@Framework/#States/IsPlayerDead","@Framework/IsPlayerLoaded":"@Framework/#States/IsPlayerLoaded","@Framework/SetPlayerMetadata":"@Framework/#States/SetPlayerMetadata","@Framework/GetOwnedVehicles":"@Framework/#Vehicle/GetOwnedVehicles","@Framework/IsVehicleOwnedByPlayer":"@Framework/#Vehicle/IsVehicleOwnedByPlayer","@Framework/GetPlayer":"@Framework/GetPlayer","@Framework/GetPlayerBirthdate":"@Framework/GetPlayerBirthdate","@Framework/GetPlayerByCitizenId":"@Framework/GetPlayerByCitizenId","@Framework/GetPlayerCitizenId":"@Framework/GetPlayerCitizenId","@Framework/GetPlayerData":"@Framework/GetPlayerData","@Framework/GetPlayerName":"@Framework/GetPlayerName","@Framework/GetPlayerPhoneNumber":"@Framework/GetPlayerPhoneNumber","@Framework/GetPlayers":"@Framework/GetPlayers","@Framework/GetPlayerSourceByCitizenId":"@Framework/GetPlayerSourceByCitizenId","@Framework/IsFrameworkAdmin":"@Framework/IsFrameworkAdmin","@Framework/RegisterUsableItem":"@Framework/RegisterUsableItem","@Framework":"@Framework/__init__","@Fuel/GetFuel":"@Fuel/GetFuel","@Fuel/SetFuel":"@Fuel/SetFuel","@Fuel":"@Fuel/__init__","@Helpers/DetectResource":"@Helpers/DetectResource","@Hooks/Start":"@Hooks/Start","@Hooks/Stop":"@Hooks/Stop","@Input":"@Input/__init__","@Inventory/AddItem":"@Inventory/AddItem","@Inventory/CanCarryItem":"@Inventory/CanCarryItem","@Inventory/GetItemBySlot":"@Inventory/GetItemBySlot","@Inventory/GetItemCount":"@Inventory/GetItemCount","@Inventory/GetItemImage":"@Inventory/GetItemImage","@Inventory/GetItemInfo":"@Inventory/GetItemInfo","@Inventory/GetPlayerInventory":"@Inventory/GetPlayerInventory","@Inventory/HasItem":"@Inventory/HasItem","@Inventory/RemoveItem":"@Inventory/RemoveItem","@Inventory/SetItemMetadata":"@Inventory/SetItemMetadata","@Inventory":"@Inventory/__init__","@LoadUnload":"@LoadUnload/__init__","@Locale":"@Locale/__init__","@Logger":"@Logger/__init__","@Math/Clamp":"@Math/Clamp","@Math/FormatMoney":"@Math/FormatMoney","@Math/FormatNumber":"@Math/FormatNumber","@Math/Lerp":"@Math/Lerp","@Math/MapRange":"@Math/MapRange","@Math/RandomFloat":"@Math/RandomFloat","@Math/Round":"@Math/Round","@Menu":"@Menu/__init__","@Notify":"@Notify/__init__","@NUI/Callback":"@NUI/Callback","@NUI/Focus":"@NUI/Focus","@NUI/Request":"@NUI/Request","@NUI/Send":"@NUI/Send","@NUI/State":"@NUI/State","@NUI":"@NUI/__init__","@Phone/GetNumber":"@Phone/GetNumber","@Phone/SendMail":"@Phone/SendMail","@Phone":"@Phone/__init__","@Progress":"@Progress/__init__","@State/Get":"@State/Get","@State/GetPlayer":"@State/GetPlayer","@State/OnChange":"@State/OnChange","@State/Set":"@State/Set","@State/SetPlayer":"@State/SetPlayer","@Streaming/RequestAnimDict":"@Streaming/RequestAnimDict","@Streaming/RequestAnimSet":"@Streaming/RequestAnimSet","@Streaming/RequestClipSet":"@Streaming/RequestClipSet","@Streaming/RequestModel":"@Streaming/RequestModel","@Streaming/RequestPtfxAsset":"@Streaming/RequestPtfxAsset","@Streaming/RequestTexture":"@Streaming/RequestTexture","@Streaming/RequestWeaponAsset":"@Streaming/RequestWeaponAsset","@Streaming":"@Streaming/__init__","@String/Capitalize":"@String/Capitalize","@String/EndsWith":"@String/EndsWith","@String/Split":"@String/Split","@String/StartsWith":"@String/StartsWith","@String/TitleCase":"@String/TitleCase","@String/Trim":"@String/Trim","@Table/Contains":"@Table/Contains","@Table/DeepCopy":"@Table/DeepCopy","@Table/Filter":"@Table/Filter","@Table/Keys":"@Table/Keys","@Table/Map":"@Table/Map","@Table/Merge":"@Table/Merge","@Table/Size":"@Table/Size","@Table/Values":"@Table/Values","@Target/AddBoxZone":"@Target/AddBoxZone","@Target/AddGlobalPed":"@Target/AddGlobalPed","@Target/AddGlobalPlayer":"@Target/AddGlobalPlayer","@Target/AddGlobalVehicle":"@Target/AddGlobalVehicle","@Target/AddLocalEntity":"@Target/AddLocalEntity","@Target/AddModel":"@Target/AddModel","@Target/AddNetworkedEntity":"@Target/AddNetworkedEntity","@Target/AddSphereZone":"@Target/AddSphereZone","@Target/FixOptions":"@Target/FixOptions","@Target/GetLargestDistance":"@Target/GetLargestDistance","@Target/RemoveGlobalPed":"@Target/RemoveGlobalPed","@Target/RemoveGlobalPlayer":"@Target/RemoveGlobalPlayer","@Target/RemoveGlobalVehicle":"@Target/RemoveGlobalVehicle","@Target/RemoveLocalEntity":"@Target/RemoveLocalEntity","@Target/RemoveModel":"@Target/RemoveModel","@Target/RemoveNetworkedEntity":"@Target/RemoveNetworkedEntity","@Target/ToggleTargeting":"@Target/ToggleTargeting","@Target":"@Target/__init__","@TextUI/HideTextUI":"@TextUI/HideTextUI","@TextUI/ShowTextUI":"@TextUI/ShowTextUI","@TextUI":"@TextUI/__init__","@Utils/GetClosestObject":"@Utils/GetClosestObject","@Utils/GetClosestPed":"@Utils/GetClosestPed","@Utils/GetClosestPlayer":"@Utils/GetClosestPlayer","@Utils/GetClosestVehicle":"@Utils/GetClosestVehicle","@Utils/GetPlayersInArea":"@Utils/GetPlayersInArea","@VehicleKeys/GiveKeys":"@VehicleKeys/GiveKeys","@VehicleKeys/RemoveKeys":"@VehicleKeys/RemoveKeys","@VehicleKeys":"@VehicleKeys/__init__","@Version/CheckDependency":"@Version/CheckDependency","@Version/CheckVersion":"@Version/CheckVersion","@Version/GetVersion":"@Version/GetVersion","__init__":"__init__"}}
|