-- =========================================================================== -- UX - melhorias de interface pedidas pelo dono em 21 e 22/10/2026 -- -- Lixeira do inventario: icone redondo que abre uma janela de confirmacao. "Limpar" avisa o servidor -- (UX_Confirmado 28) e manda /limparinv: o Confirmar.lua do servidor pula a pergunta do chat porque ela ja foi feita. -- -- O Lua desenha POR BAIXO das janelas do jogo (teste do dono de 21/10/2026: dentro do inventario a lixeira nao -- aparecia). Por isso ela fica FORA do inventario (decisao do dono, 22/10/2026): -- tela wide: logo abaixo do inventario (o inventario do S6 tem 429 de altura; abaixo dele, na wide, nao ha barra) -- tela 4:3: encostada a esquerda do inventario, no alto (abaixo dele fica a barra de baixo do jogo). Do lado -- esquerdo abrem bau, loja, troca, personagem e o banco de joias: com qualquer um aberto a lixeira some e -- nao aceita clique (senao um clique nessa janela abriria a limpeza sem querer). -- A caixinha do AutoPot dentro do Helper saiu (22/10/2026): o Helper vai ser refeito em Lua (card no Trello). -- -- Medida da tela: uma vez por entrada, manda UX_Tela ao servidor (linha [UXtela] no SCRIPT_LOG), para acertar as -- janelas nas telas wide e 4:3 (a janela de Novidades saiu torta na tela do Guilherme, 22/10/2026, sem print). -- =========================================================================== local IMG_LIXEIRA = 40040 -- Custom\Interface\UX_Lixeira.tga (64 x 128: normal e mouse em cima) local IMG_CAIXA = 40041 -- Custom\Interface\UX_Confirmar.tga (220 x 104) local IMG_BOTAO = 31326 -- botao vazio do jogo (108 x 87, 3 estados de 29) local LADO = 21 -- lixeira, lado do icone (17 era pequeno, dono 22/10/2026) local INV_ALTURA = 429 -- inventario do S6 (inferencia pelo cliente original; medir no teste) local CAIXA_W, CAIXA_H, CAIXA_Y = 220, 104, 150 -- janelas que encostam a esquerda do inventario local AO_LADO = { UIWarehouse, UIChaosBox, UITrade, UIShop, UIStore, UIOtherStore, UICharacter, UIExpandInventory, UIExpandWarehouse, UIPetInfo, UIGuildNpc, UIMuHelper } local TXT = { Titulo = { Por = "Limpar o invent\225rio?", Eng = "Clear the inventory?", Spn = "\191Limpiar el inventario?" }, Aviso = { Por = "Todos os itens da mochila somem.", Eng = "Every item in the bag is deleted.", Spn = "Todos los items se borran." }, Aviso2 = { Por = "N\227o d\225 para desfazer.", Eng = "This cannot be undone.", Spn = "No se puede deshacer." }, Limpar = { Por = "Limpar", Eng = "Clear", Spn = "Limpiar" }, Cancelar = { Por = "Cancelar", Eng = "Cancel", Spn = "Cancelar" }, } local UXs = { Modal = false, Areas = {}, Quadro = 0, Medido = false } UX = UXs local function T(chave) local ok, l = pcall(GetLanguage) local m = TXT[chave] return m[ok and l or "Eng"] or m.Eng end local function Pot2(n) local p = 1 while p < n do p = p * 2 end return p end local function Esticar(id, x, y, w, h, tw, th, recorte, v0) pcall(RenderImage2, id, x, y, w, h, 0, (v0 or 0) / Pot2(th), tw / Pot2(tw), (recorte or th) / Pot2(th), 1, 1, 1.0) end local function Dentro(a, x, y) return a and x >= a.x and x <= a.x + a.w and y >= a.y and y <= a.y + a.h end local function MouseEm(a) return Dentro(a, MousePosX(), MousePosY()) end -- Largura da tela pelo Scripts/Comum/Tela.lua (na 4:3 o GetWideX vale 640, nao 320: log de producao, 22/10/2026) local function ColunaDireita() return MO_InventarioX and MO_InventarioX() or (GetWideX() + 130) end local function CentroX() return MO_CentroX and MO_CentroX() or math.floor((GetWideX() + 320) / 2) end local function Num(f) local ok, v = pcall(f) return ok and tonumber(v) or -1 end -- Wide pela proporcao da janela em pixels; sem ela, pelo GetWideX (320 = tela 4:3 na medida de 21/10/2026) local function EhWide() local w, h = Num(WindowGetWidth), Num(WindowGetHeight) if w > 0 and h > 0 then return w / h > 1.45 end return (MO_LarguraTela and MO_LarguraTela() or GetWideX()) > 700 end local function Enviar(nome, valores) pcall(function() CreatePacket(nome, 1) for _, v in ipairs(valores or {}) do SetDwordPacket(nome, v) end SendPacket(nome) ClearPacket(nome) end) end local function AlgoAoLado() for _, id in ipairs(AO_LADO) do if id and CheckWindowOpen(id) == 1 then return true end end return MO_BancoAberto ~= nil and MO_BancoAberto() end local function Botao(id, x, y, w, h, texto) local a = { x = x, y = y, w = w, h = h } UXs.Areas[id] = a Esticar(IMG_BOTAO, x, y, w, h, 108, 87, 29, MouseEm(a) and 29 or 0) SetFontType(1); SetTextBg(0, 0, 0, 0); SetTextColor(255, 255, 255, 255) RenderText5(x, y + math.floor(h / 2) - 5, texto, w, 3) end ------------------------------------------------------------------------------- -- Desenho (a cada quadro) ------------------------------------------------------------------------------- function UX_Desenhar() UXs.Areas = {} UXs.Quadro = UXs.Quadro + 1 if not UXs.Medido and CheckWindowOpen(UIInventory) == 1 then -- 1a vez que abre o inventario: ja esta no jogo UXs.Medido = true Enviar("UX_Tela", { Num(GetWideX), Num(WindowGetWidth), Num(WindowGetHeight), Num(GetMainResolution), Num(GetWindowWidthAdd), Num(GetOpenGLWidth), EhWide() and 1 or 0 }) end local col = ColunaDireita() if CheckWindowOpen(UIInventory) == 1 then local a if EhWide() then a = { x = col + 8, y = INV_ALTURA + 4, w = LADO, h = LADO } elseif not AlgoAoLado() then a = { x = col - LADO - 4, y = 6, w = LADO, h = LADO } end if a then UXs.Areas.lixeira = a Esticar(IMG_LIXEIRA, a.x, a.y, a.w, a.h, 64, 128, 64, MouseEm(a) and 64 or 0) end elseif UXs.Modal then UXs.Modal = false end -- janela de confirmacao if UXs.Modal then local x = CentroX() - math.floor(CAIXA_W / 2) local y = CAIXA_Y UXs.Areas.caixa = { x = x, y = y, w = CAIXA_W, h = CAIXA_H } Esticar(IMG_CAIXA, x, y, CAIXA_W, CAIXA_H, 220, 104) SetFontType(1); SetTextBg(0, 0, 0, 0) SetTextColor(255, 189, 25, 255); RenderText5(x, y + 12, T("Titulo"), CAIXA_W, 3) SetTextColor(230, 230, 230, 255); RenderText5(x, y + 32, T("Aviso"), CAIXA_W, 3) RenderText5(x, y + 46, T("Aviso2"), CAIXA_W, 3) Botao("limpar", x + 20, y + 70, 85, 22, T("Limpar")) Botao("cancelar", x + CAIXA_W - 105, y + 70, 85, 22, T("Cancelar")) end end ------------------------------------------------------------------------------- -- Mouse e teclado ------------------------------------------------------------------------------- function UX_Mouse() if CheckReleasedKey(Keys.LButton) ~= 1 then return end local x, y = MousePosX(), MousePosY() local A = UXs.Areas if UXs.Modal then if Dentro(A.limpar, x, y) then UXs.Modal = false Enviar("UX_Confirmado", { 28 }) -- 28 = /limparinv no Data/Command.txt pcall(SendPlayerChat, "/limparinv") elseif Dentro(A.cancelar, x, y) then UXs.Modal = false end return end if Dentro(A.lixeira, x, y) then UXs.Modal = true end end function UX_Teclas() local A = UXs.Areas if UXs.Modal or MouseEm(A.lixeira) or MouseEm(A.caixa) then DisableClickClient() end if UXs.Modal and CheckPressedKey(Keys.Escape) == 1 then UXs.Modal = false end end function UX_Carregar() pcall(LoadBitmap, "Custom\\Interface\\UX_Lixeira.tga", IMG_LIXEIRA) pcall(LoadBitmap, "Custom\\Interface\\UX_Confirmar.tga", IMG_CAIXA) end BridgeFunctionAttach('MainLoader', 'UX_Carregar') BridgeFunctionAttach('MainInterfaceProcThread', 'UX_Desenhar') BridgeFunctionAttach('UpdateMouseEvent', 'UX_Mouse') BridgeFunctionAttach('UpdateKeyEvent', 'UX_Teclas')