From 56ef3b75b21022e161d604e762fe502123a4d071 Mon Sep 17 00:00:00 2001 From: Jim Shield Date: Mon, 14 Apr 2025 21:58:38 +0100 Subject: [PATCH] Fix change dui functions --- shared/duifunctions.lua | 301 ++++++++++++++++++++-------------------- 1 file changed, 147 insertions(+), 154 deletions(-) diff --git a/shared/duifunctions.lua b/shared/duifunctions.lua index ea9ffc1..e346aca 100644 --- a/shared/duifunctions.lua +++ b/shared/duifunctions.lua @@ -1,168 +1,161 @@ if gameName ~= "rdr3" then ---[[ - DUI Module (Experimental) - -------------------------- - This module handles the creation, modification, and removal of custom DUI (Display UI) - elements using runtime textures. It supports both client and server functionality to update DUI - images dynamically. - ]] + --[[ + DUI Module (Experimental) + -------------------------- + This module handles the creation, modification, and removal of custom DUI (Display UI) + elements using runtime textures. It supports both client and server functionality to update DUI + images dynamically. + ]] - -- Create a runtime texture dictionary on the client if not running on the server. - scriptTxd = not isServer() and CreateRuntimeTxd(getScript()..'scriptTxd') or nil - customDUIList = {} + -- Create a runtime texture dictionary on the client if not running on the server. + scriptTxd = not isServer() and CreateRuntimeTxd(getScript()..'scriptTxd') or nil + customDUIList = {} - ------------------------------------------------------------- - -- DUI Client Functions - ------------------------------------------------------------- + ------------------------------------------------------------- + -- DUI Client Functions + ------------------------------------------------------------- - --- Creates or updates a DUI element. - --- - --- @param name string The unique name for the DUI element. - --- @param http string The URL to load into the DUI. - --- @param size table A table with .x and .y fields specifying the DUI dimensions. - --- @param txd table The runtime texture dictionary where the DUI texture will be created. - --- @usage - --- ```lua - --- createDui("logo", "https://example.com/logo.png", { x = 512, y = 256 }, scriptTxd) - --- ``` - function createDui(name, http, size, txd) - if not customDUIList[name] then - local newDui = CreateDui(http, math.floor(size.x), math.floor(size.y)) - while not GetDuiHandle(newDui) do Wait(0) end - CreateRuntimeTextureFromDuiHandle(txd, name, GetDuiHandle(newDui)) - customDUIList[name] = newDui - SetDuiUrl(customDUIList[name], http) - else - SetDuiUrl(customDUIList[name], http) - end - end - - --- Opens a DUI selection input allowing the user to change the DUI image URL. - --- - --- @param data table A table containing DUI data: - --- - name: The key name in the DUI list. - --- - texn: The texture name. - --- - texd: The texture dictionary. - --- - size: A table with .x and .y dimensions. - --- - --- @usage - --- ```lua - --- DuiSelect({ name = "logo", texn = "logoTex", texd = "someTxd", size = { x = 512, y = 256 } }) - --- ``` - function DuiSelect(data) - local imagePreview = "" - for k, v in pairs(duiList[data.name]) do - if v.tex.texn == data.texn and duiList[data.name][k] then - imagePreview = "
- Current Image -
" .. - "
" .. - "Size: ["..math.floor(data.size.x)..", "..math.floor(data.size.y).."]

" + --- Creates or updates a DUI element. + --- + --- @param name string The unique name for the DUI element. + --- @param http string The URL to load into the DUI. + --- @param size table A table with .x and .y fields specifying the DUI dimensions. + --- @param txd table The runtime texture dictionary where the DUI texture will be created. + --- @usage + --- ```lua + --- createDui("logo", "https://example.com/logo.png", { x = 512, y = 256 }, scriptTxd) + --- ``` + function createDui(name, http, size, txd) + if not customDUIList[name] then + local newDui = CreateDui(http, math.floor(size.x), math.floor(size.y)) + while not GetDuiHandle(newDui) do Wait(0) end + CreateRuntimeTextureFromDuiHandle(txd, name, GetDuiHandle(newDui)) + customDUIList[name] = newDui + SetDuiUrl(customDUIList[name], http) + else + SetDuiUrl(customDUIList[name], http) end end - local dialog = exports['qb-input']:ShowInput({ - header = imagePreview..Loc[Config.Lan].menu["dui_new"], - submitText = Loc[Config.Lan].menu["dui_change"], - inputs = { { type = 'text', isRequired = true, name = 'url', text = Loc[Config.Lan].menu["dui_url"] } } - }) - if dialog and dialog.url then - data.url = dialog.url - -- Scan URL for valid image extension and banned words. - local searchList = { "png", "jpg", "jpeg", "gif", "webp", "bmp" } - local banList = { "porn" } - local searchFound = false - for _, ext in pairs(searchList) do - if string.find(tostring(data.url), ext) then - searchFound = true - break + + --- Opens a DUI selection input allowing the user to change the DUI image URL. + --- + --- @param data table A table containing DUI data: + --- - name: The key name in the DUI list. + --- - texn: The texture name. + --- - texd: The texture dictionary. + --- - size: A table with .x and .y dimensions. + --- + --- @usage + --- ```lua + --- DuiSelect({ name = "logo", texn = "logoTex", texd = "someTxd", size = { x = 512, y = 256 } }) + --- ``` + function DuiSelect(data) + local imagePreview = "![test]("..data.url..")" + --local imagePreview = "
- Current Image -
" .. + -- "
" .. + -- "Size: ["..math.floor(data.size.x)..", "..math.floor(data.size.y).."]

" + + local dialog = createInput(imagePreview, { + { type = "text", text = "dui_url", name = "url", isRequired = true }, + }) + + if dialog then + data.url = dialog.url or dialog[1] + -- Scan URL for valid image extension and banned words. + local searchList = { "png", "jpg", "jpeg", "gif", "webp", "bmp" } + local banList = { "porn" } + local searchFound = false + for _, ext in pairs(searchList) do + if string.find(tostring(data.url), ext) then + searchFound = true + break + end end - end - for _, banned in pairs(banList) do - if string.find(tostring(data.url), banned) then - searchFound = false - print("BANNED WORD: "..banned) - break + for _, banned in pairs(banList) do + if string.find(tostring(data.url), banned) then + searchFound = false + print("BANNED WORD: "..banned) + break + end end - end - if searchFound then - TriggerServerEvent(getScript()..":Server:ChangeDUI", data) - end - end - end - - --- Client event handler to update DUI elements. - RegisterNetEvent(getScript()..":Client:ChangeDUI", function(data) - debugPrint("^6Bridge^7: ^2Receiving new DUI ^7- ^6"..data.url.."^7") - if tostring(data.url) ~= "-" then - createDui(data.texn, tostring(data.url), data.size, scriptTxd) - AddReplaceTexture(tostring(data.texd), tostring(data.texn), getScript().."scriptTxd", tostring(data.texn)) - end - end) - - --- Client event handler to clear DUI elements. - RegisterNetEvent(getScript()..":Client:ClearDUI", function(data) - if customDUIList[tostring(data.texn)] then - RemoveReplaceTexture(tostring(data.texd), tostring(data.texn)) - if IsDuiAvailable(customDUIList[tostring(data.texn)]) then - SetDuiUrl(customDUIList[data.name], nil) - end - end - end) - - ------------------------------------------------------------- - -- DUI Server Functions - ------------------------------------------------------------- - - --- Server event handler to change DUI settings. - --- If no URL is provided, resets to the preset value. - RegisterNetEvent(getScript()..":Server:ChangeDUI", function(data) - if not data.url then - for k, v in pairs(duiList[data.name]) do - if v.tex.texn == data.texn then - debugPrint("^6Bridge^7: ^2Preset: ^6"..tostring(duiList[data.name][k].preset).."^7") - data.url = duiList[data.name][k].preset + if searchFound then + TriggerServerEvent(getScript()..":Server:ChangeDUI", data) end end end - for k, v in pairs(duiList[data.name]) do - if v.tex.texn == data.texn then - duiList[data.name][k].url = data.url + + --- Client event handler to update DUI elements. + RegisterNetEvent(getScript()..":Client:ChangeDUI", function(data) + debugPrint("^6Bridge^7: ^2Receiving new DUI ^7- ^6"..data.url.."^7") + if tostring(data.url) ~= "-" then + createDui(data.texn, tostring(data.url), data.size, scriptTxd) + AddReplaceTexture(tostring(data.texd), tostring(data.texn), getScript().."scriptTxd", tostring(data.texn)) end - end - debugPrint("^6Bridge^7: ^3DUI^2 Sending new DUI to all players^7 - ^6"..data.url.."^7") - TriggerClientEvent(getScript()..":Client:ChangeDUI", -1, data) - end) - - --- Server event handler to clear DUI settings. - RegisterNetEvent(getScript()..":Server:ClearDUI", function(data) - if data.url == "-" then - for k, v in pairs(duiList[data.name]) do - if v.tex.texn == data.texn then - duiList[data.name][k].url = "-" - end - end - end - TriggerClientEvent(getScript()..":Client:ClearDUI", -1, data) - end) - - ------------------------------------------------------------- - -- Resource Cleanup - ------------------------------------------------------------- - - onResourceStop(function() - for k, v in pairs(duiList or {}) do - for i = 1, #v do - RemoveReplaceTexture(tostring(v[i].tex.texd), tostring(v[i].tex.texn)) - end - end - end, true) - - ------------------------------------------------------------- - -- DUI List Callback (Server) - ------------------------------------------------------------- - - if isServer() then - createCallback(getScript()..":Server:duiList", function(source) - return duiList end) - end -end \ No newline at end of file + --- Client event handler to clear DUI elements. + RegisterNetEvent(getScript()..":Client:ClearDUI", function(data) + if customDUIList[tostring(data.texn)] then + RemoveReplaceTexture(tostring(data.texd), tostring(data.texn)) + if IsDuiAvailable(customDUIList[tostring(data.texn)]) then + SetDuiUrl(customDUIList[data.name], nil) + end + end + end) + + ------------------------------------------------------------- + -- DUI Server Functions + ------------------------------------------------------------- + + --- Server event handler to change DUI settings. + --- If no URL is provided, resets to the preset value. + RegisterNetEvent(getScript()..":Server:ChangeDUI", function(data) + if not data.url then + debugPrint("^6Bridge^7: ^2Preset: ^6"..tostring(data.preset).."^7") + data.url = data.preset + else + for k, v in pairs(Locations[data.name].duiList) do + if v.tex.texn == data.texn then + Locations[data.name].duiList[k].url = data.url + end + end + end + debugPrint("^6Bridge^7: ^3DUI^2 Sending new DUI to all players^7 - ^6"..data.url.."^7") + TriggerClientEvent(getScript()..":Client:ChangeDUI", -1, data) + end) + + --- Server event handler to clear DUI settings. + RegisterNetEvent(getScript()..":Server:ClearDUI", function(data) + if data.url == "-" then + for k, v in pairs(Locations[data.name].duiList) do + if v.tex.texn == data.texn then + Locations[data.name].duiList[k].url = "-" + end + end + end + TriggerClientEvent(getScript()..":Client:ClearDUI", -1, data) + end) + + ------------------------------------------------------------- + -- Resource Cleanup + ------------------------------------------------------------- + + onResourceStop(function() + for k, v in pairs(duiList or {}) do + for i = 1, #v do + RemoveReplaceTexture(tostring(v[i].tex.texd), tostring(v[i].tex.texn)) + end + end + end, true) + + ------------------------------------------------------------- + -- DUI List Callback (Server) + ------------------------------------------------------------- + + if isServer() then + createCallback(getScript()..":Server:duiList", function(source) + return duiList + end) + end + + end \ No newline at end of file