Ir para conteúdo
Propaganda

Lehnox

Moderador
  • Total de Posts

    63
  • Registro em

  • Última visita

  • Dias Ganhos

    4

Other groups

Lehnox ganhou no último dia 21 de Novembro

Lehnox teve o conteúdo mais curtida!

5 Seguidores

Sobre Lehnox

Informações Pessoais

  • Eu sou:
    Programmer
  • Nome do Personagem:
    Lehnox

Últimos Visitantes

6207 visualizações

Lehnox's Achievements

Enthusiast

Enthusiast (6/14)

  • Very Popular Rara
  • One Year In
  • One Month Later
  • Week One Done
  • Dedicated

Emblemas Recentes

181

Reputação

  1. Opa, valeu! Sim, de fato. Preciso de feedbacks para poder começar a corrigir tudo.
  2. Boa! Mas preciso desses feedbacks para realizar as devidas modificações/atualizações.
  3. Fala tibianos e poketibianos... Estou disponibilizando um pequeno projeto meu para vocês, fiz durante algumas aulas de Python e tive ajuda da I.A para algumas duvidas/projeções. Porém, estou deixando-o no GitHub para melhoras e vou mantê-lo atualizado sempre que possível! Façam bom uso porém ainda não está 100%. ([Hidden Content]) 📘Editor OTUI - By Lehnox O Editor OTUI é um editor visual (GUI) desenvolvido em Python + PySide6 (Qt), projetado para criar e modificar arquivos OTUI e OTMD, amplamente utilizados em projetos como OpenTibia, OTClient e ambientes de modding similares. Ele oferece um fluxo completo de edição visual, gerenciamento de recursos e manipulação das propriedades de widgets. 🎨 Visão Geral O núcleo do editor é a classe OTUIEditor, derivada de QMainWindow, responsável por montar toda a interface: Barra de ferramentas de widgets: adiciona novos elementos OTUI. Canvas: área central de edição, com grade, zoom, pan e seleção. Painel direito: dividido entre editor de propriedades (PropertiesEditor) navegador de arquivos do módulo (.otui, .otmd, .lua). 🛠️ Componentes e Funcionalidades 1. 📂 Gerenciamento de Projeto (ModuleProject) A classe ModuleProject organiza toda a estrutura de um módulo OTClient: Estrutura do Projeto Root: diretório base do módulo. Parser de .otmod: extrai configurações, especialmente diretórios de imagens (images-dir). Indexação automática: localiza arquivos .otui, .otmd, .lua e diretórios de recursos. Resolução de Recursos O ResourceResolver converte caminhos relativos OTUI (image-source, icon-source) em caminhos absolutos no filesystem, garantindo que as texturas sejam carregadas corretamente pelo editor. Estado do Editor Armazena o histórico recente e o último arquivo editado em .otui_editor_state.json. 2. 🎛️ Edição Visual (Canvas + WidgetItem) Canvas Baseado em QGraphicsView. Possui grade, zoom, pan, seleção e histórico (undo/redo). Serializa e restaura todo o estado gráfico. WidgetItem Cada widget OTUI é representado visualmente por um QGraphicsObject com: Interação Movimentação com snapping (grid de 10px). Redimensionamento com 8 handles. Restrição automática se o widget estiver em layouts ou ancorado. Menu de contexto: trazer para frente / enviar para trás duplicar deletar definir layouts (vertical / horizontal) Renderização e Recursos Exibição de imagem, ícone, clipping, tinting e transformações. Suporte completo a nine-slice scaling (image-border) para janelas e painéis. Cores definidas por tipo (AppConstants.WIDGET_TYPE_COLORS). Hierarquia e Layouts Widgets filhos são organizados automaticamente conforme: layout: vertical layout: horizontal ausência de âncoras 3. ⚙️ Editor de Propriedades (PropertiesEditor) Exibe e edita dinamicamente todas as propriedades OTUI do widget selecionado: Principais Funções Atualização em tempo real conforme o usuário move ou redimensiona o widget. Campos estruturados para todas as propriedades padrão e customizadas. Suporte a editores específicos: Imagens: abre o ImageSourceBrowser Cores: QColorDialog Booleanos: QComboBox Botão “Adicionar Propriedade”, com lista de propriedades conhecidas (AppConstants.KNOWN_PROPERTIES). 4. 🖼️ Navegador de Imagens (ImageSourceBrowser) Ferramenta dedicada para navegação e seleção de imagens do módulo. Exibe diretórios e subpastas do images-dir. Mostra miniaturas em grade. Retorna o caminho relativo OTUI para ser aplicado ao widget. 5. 🧩 Parser e Serialização (OTUIParser e save_otui) OTUIParser Responsável por transformar texto OTUI em uma estrutura visual: Lê .otui e .otmd. Interpreta hierarquia por indentação. Cria widgets, propriedades, estados e eventos. Reconstrói automaticamente a árvore no Canvas. save_otui Gera o arquivo OTUI final: Percorre toda a hierarquia de WidgetItems. Escreve com indentação correta. Converte e copia imagens externas para o diretório do módulo. Usa caminhos relativos OTUI organizados e limpos. 🚀 Fluxo Geral de Uso Carregar módulo (load_client_module). Abrir um arquivo OTUI/OTMD pelo navegador lateral. Edição visual no Canvas: adicionar widgets mover / redimensionar aplicar layouts Configurar propriedades via PropertiesEditor. Salvar OTUI, gerando um arquivo formatado, com recursos organizados e paths relativo Seguem os prints abaixo:
  4. Tópico Aprovado! Somos gratos por sua contribuição ❤️ REP+
  5. 🎨 OTUI Editor Olá, comunidade do Tibia Devs! 👋 Tenho o prazer de apresentar a vocês o OTUI Editor, uma ferramenta desenvolvida especialmente para atender às necessidades de quem trabalha com OTClient e precisa manipular arquivos OTUI com mais praticidade, organização e eficiência. 🚀 O que é o OTUI Editor? O OTUI Editor é um ambiente de edição visual projetado para simplificar o processo de criação e gerenciamento de arquivos OTUI. Ao invés de lidar manualmente com linhas de código ou perder tempo buscando arquivos em diretórios, você terá uma interface intuitiva e funcionalidades automáticas que agilizam sua rotina de desenvolvimento. Com este editor, você pode criar novos arquivos OTUI, abrir projetos já existentes e continuar exatamente de onde parou, além de contar com recursos que organizam e otimizam o fluxo de trabalho. 🔹 Funcionalidades em Destaque ✔ Criação de OTUI Geração de novos arquivos OTUI de forma simples, mantendo uma estrutura organizada e padronizada. ✔ Abertura de Projetos Carregue arquivos OTUI existentes em poucos cliques e continue o trabalho sem precisar reconfigurar manualmente. ✔ Salvamento Inteligente O editor salva automaticamente o progresso junto com a pasta de imagens utilizada no projeto, garantindo que nada seja perdido. ✔ Gerenciamento Avançado de Imagens Busca imagens em múltiplos diretórios, incluindo a pasta data/ e todas as suas subpastas. Evita erros comuns ao carregar recursos e melhora a compatibilidade do seu projeto. ✔ Editor Visual de Widgets Manipule elementos OTUI de forma gráfica, com um editor visual intuitivo que permite organizar widgets com muito mais clareza. ✔ Reabertura Exata do Projeto O sistema lembra onde você parou, permitindo retomar o desenvolvimento exatamente do mesmo ponto, sem retrabalho. ✔ Interface Amigável e Moderna Design simples e objetivo, focado na produtividade, sem abrir mão da facilidade de uso. ✔ Performance Otimizada Projetado para oferecer rapidez e estabilidade, mesmo em projetos maiores. 🎁 Vantagens ao Adquirir Ao escolher o Editor, você terá: ✅ Suporte incluso para dúvidas e orientações sobre o uso da ferramenta. ✅ Atualizações contínuas do projeto, garantindo melhorias constantes e novas funcionalidades. ✅ Maior produtividade, com recursos que aceleram o desenvolvimento e organização dos seus projetos OTUI. ✅ Segurança, com salvamento automático e gerenciamento eficiente de imagens. 📌 Observação Importante Nesta versão, o editor abre e corrige apenas os arquivos que foram criados ou editados dentro dele. Em futuras atualizações, será adicionada a leitura completa do module do OTClient, permitindo compatibilidade total com projetos já existentes diretamente do OTC 📸 Demonstração 💬 Como Adquirir Entre em contato diretamente comigo para mais informações, valores e condições de aquisição: ⚡ Leve seu desenvolvimento no OTClient para outro nível. Com o OTUI Editor, você ganha tempo, organização e eficiência, além de contar com suporte e atualizações que garantem a evolução contínua do projeto.
  6. <?xml version="1.0" encoding="ISO-8859-1"?> <mod name="Perfect Auto Loot" version="2.0" author="Vodkart" contact="none.com" enabled="yes"> <config name="Loot_func"><![CDATA[ info = { distro = 1, -- 1 = TFS // 2 = talk modificada directory = "data/logs/autoloot", Warn_Bp_Slots = 5, Talkaction_delay = 5, BlockMonsters = {}, BlockItemsList = {2123,2515}, Money_ids = {2148, 2152, 2160}, -- moedas Max_Slots = {free = 3, premium = 5}, Storages = {988801, 988802, 988803, 988804, 988805, 988806, 988807} } Color_Loot = { [0] = {MESSAGE_EVENT_ORANGE, "Orange"}, [1] = {MESSAGE_STATUS_CONSOLE_BLUE, "Blue"}, [2] = {MESSAGE_INFO_DESCR, "Green"}, [3] = {MESSAGE_STATUS_CONSOLE_RED, "Red"}, [4] = {MESSAGE_STATUS_SMALL, "White"} } function getPlayerColorLootMessage(cid) return getPlayerStorageValue(cid, info.Storages[5]) <= 0 and 0 or getPlayerStorageValue(cid, info.Storages[5]) end -- funções de gerenciamento da lista function isInTable(cid, item) for _,i in pairs(getItensFromAutoloot(cid)) do if tonumber(i) == tonumber(item) then return true end end return false end function doremoveItemFromAutoloot(cid, itemid) local file, fileContent = io.open(info.directory.."/"..getCreatureName(cid)..".txt", 'r'),{} for line in file:lines() do if line ~= "" and tonumber(line) ~= tonumber(itemid) then fileContent[#fileContent + 1] = line end end io.close(file) file = io.open(info.directory.."/"..getCreatureName(cid)..".txt", 'w') for index, value in ipairs(fileContent) do file:write(value..'\n') end io.close(file) end function doAddItemFromAutoloot(cid, itemid) if not existsAutoloot(cid) then doCreateLootUserName(cid, itemid) return true end local file = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "a+") file:write('\n'..itemid) file:close() end function existsAutoloot(cid) local f = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "rb") if f then f:close() end return f ~= nil end function doCreateLootUserName(cid, itemid) newFile = io.open(info.directory.."/"..getCreatureName(cid)..".txt", "w+" ) newFile:write(itemid) newFile:close() end function getItensFromAutoloot(cid) if not existsAutoloot(cid) then return {} end lines = {} for line in io.lines(info.directory.."/"..getCreatureName(cid)..".txt") do if line ~= "" then lines[#lines + 1] = tonumber(line) end end return lines end function doCleanAutoloot(cid) return os.remove(info.directory.."/"..getCreatureName(cid)..".txt") end function ShowItemsTabble(cid) local auto_list = getItensFromAutoloot(cid) local n,str = 0,"[+] Auto Loot Commands [+]\n\n!autoloot item name --> To add ou Remove item from list.\n!autoloot money --> To collect gold automatically.\n!autoloot clear --> To clear the list.\n!autoloot on/off --> To enable or disable the collecting of items in the system.\n!autoloot message --> To enable or disable message from Collect items.\n!autoloot color --> To change Color message in Auto Loot Collect.\n!autoloot warn --> To enable or disable message warning of "..info.Warn_Bp_Slots.." or less slots in the backpack.\n!autoloot deposit --> To enable or disable automatic money deposit at the bank.\n\n[+] Auto Loot Info [+]\n\nSystem: "..(getPlayerStorageValue(cid, info.Storages[1]) <= 0 and "Activated" or "Disabled")..".\nGold Collecting: "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "Disabled")..".\nMessage: "..(getPlayerStorageValue(cid, info.Storages[6]) <= 0 and "Activated" or "Disabled")..".\nColor Message: "..Color_Loot[getPlayerColorLootMessage(cid)][2]..".\nWarn Backpack: "..(getPlayerStorageValue(cid, info.Storages[3]) <= 0 and "Activated" or "Disabled")..".\nAutomatic Gold Deposit: "..(getPlayerStorageValue(cid, info.Storages[4]) > 0 and "Activated" or "Disabled")..".\nTotal Bank Balance: ["..getPlayerBalance(cid).."]\nMaximum Slots: ["..#auto_list.."/"..(isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free).."]\n\n[+] Auto Loot Slots [+]\n\n" if #auto_list > 0 then for i = 1, #auto_list do n = n + 1 str = str.."Slot "..n.." - "..getItemNameById(auto_list[i]).."\n" end end return doPlayerPopupFYI(cid, str) end -- 🔧 função otimizada: limite de profundidade function getContainerItems(container, array, depth) array = array or {} depth = depth or 0 if depth > 3 then -- máximo 3 sub-bps return array end if not isContainer(container.uid) or getContainerSize(container.uid) == 0 then array[#array +1] = container else local size = getContainerSize(container.uid) for slot = 0, (size -1) do local item = getContainerItem(container.uid, slot) if item.itemid > 1 then getContainerItems(item, array, depth + 1) end end end return array end -- coleta item stackável (dinheiro etc) só na primeira BP function doPlayerAddItemStackable(cid, itemid, count) local bp = getPlayerSlotItem(cid, CONST_SLOT_BACKPACK) if bp.uid <= 0 then return doPlayerAddItem(cid, itemid, count) end for slot = 0, getContainerSize(bp.uid)-1 do local item = getContainerItem(bp.uid, slot) if item.itemid == itemid and item.type < 100 then local sum = item.type + count if sum <= 100 then return doTransformItem(item.uid, itemid, sum) else doTransformItem(item.uid, itemid, 100) return doPlayerAddItem(cid, itemid, sum - 100) end end end return doPlayerAddItem(cid, itemid, count) end -- depósito automático function AutomaticDeposit(cid, item, n) if isInArray(info.Money_ids, item) and getPlayerStorageValue(cid, info.Storages[4]) > 0 then local deposit = item == 2160 and (n*10000) or item == 2152 and (n*100) or n doPlayerDepositMoney(cid, deposit) end return true end -- slots livres function getAllContainerFree(cid) local containers,soma = {},0 for i = CONST_SLOT_FIRST, CONST_SLOT_LAST do local sitem = getPlayerSlotItem(cid, i) if sitem.uid > 0 then if isContainer(sitem.uid) then table.insert(containers, sitem.uid) soma = soma + getContainerCap(sitem.uid) - getContainerSize(sitem.uid) end end end return soma end -- retirar itens do corpo function corpseRetireItems(cid, pos) local check = false for i = 0, 255 do pos.stackpos = i tile = getTileThingByPos(pos) if tile.uid > 0 and isCorpse(tile.uid) then check = true break end end if check then local str, var = "", getContainerItems(tile) if var then local list = getItensFromAutoloot(cid) local slots = getAllContainerFree(cid) for _, item in pairs(var) do local id = item.itemid if (#list > 0 and isInArray(list, id)) or (getPlayerStorageValue(cid, info.Storages[2]) > 0 and isInArray(info.Money_ids, id)) then local infoItem = getItemInfo(id) local amount = isItemStackable(id) and item.type or 1 local total_cap = getItemWeight(item.uid)*amount if slots > 0 and getPlayerFreeCap(cid) >= total_cap then if isItemStackable(id) then str = str.." "..amount.." "..(amount > 1 and infoItem.plural or infoItem.name).."," doPlayerAddItemStackable(cid, id, amount) AutomaticDeposit(cid, id, amount) else str = str.." ".. infoItem.article.." " .. infoItem.name .."," doPlayerAddItem(cid, id) end doRemoveItem(item.uid) end end end if str ~= "" and getPlayerStorageValue(cid, info.Storages[6]) <= 0 then doPlayerSendTextMessage(cid, Color_Loot[getPlayerColorLootMessage(cid)][1],"[Auto Loot Collect]:"..string.sub(str, 1, -2)..".") end if getPlayerStorageValue(cid, info.Storages[3]) <= 0 and slots > 0 and slots <= info.Warn_Bp_Slots then doPlayerSendTextMessage(cid,18,"[Auto Loot Warn] You only have "..slots.." slots free in your backpack!") end end end end function ExistItemByName(name) local items = io.open("data/items/items.xml", "r"):read("*all") local get = items:lower():match('name="' .. name:lower() ..'"') if not get then return false end return true end ]]></config> <event type="login" name="LootLogin" event="script"><![CDATA[ domodlib('Loot_func') function onLogin(cid) registerCreatureEvent(cid, "LootEventKIll") if isPremium(cid) and getPlayerStorageValue(cid, 853608) <= 0 then setPlayerStorageValue(cid, 853608, 1) elseif getPlayerStorageValue(cid, 853608) > 0 and not isPremium(cid) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot] You premium is Over, Start a new list!") setPlayerStorageValue(cid, 853608, -1) doCleanAutoloot(cid) end return true end]]></event> <event type="kill" name="LootEventKIll" event="script"><![CDATA[ domodlib('Loot_func') function onKill(cid, target, lastHit) if isPlayer(cid) and getPlayerStorageValue(cid, info.Storages[1]) <= 0 and isMonster(target) and not isInArray(info.BlockMonsters, getCreatureName(target):lower()) then addEvent(corpseRetireItems, 0, cid ,getThingPos(target)) end return true end]]></event> <talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[ domodlib('Loot_func') local param, slots = param:lower(), isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free if not param or param == "" then ShowItemsTabble(cid) return true elseif tonumber(param) then doPlayerSendCancel(cid, "enter commands: !autoloot item name [+] !autoloot clean [+] !autoloot money [+] !autoloot on/off") return true elseif isInArray({"clean","limpar", "clear"}, param) then if existsAutoloot(cid) then doCleanAutoloot(cid) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Your list has been cleaned.") return true elseif isInArray({"start","stop","on","off"}, param) then setPlayerStorageValue(cid, info.Storages[1], getPlayerStorageValue(cid, info.Storages[1]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Auto Loot "..(getPlayerStorageValue(cid, info.Storages[1]) > 0 and "Stopped" or "Started")..".") return true elseif isInArray({"warn","aviso"}, param) then setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Auto Loot Backpack Warn "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "disabled" or "Activated")..".") return true elseif isInArray({"mensagem","message","mensagen","msg"}, param) then setPlayerStorageValue(cid, info.Storages[6], getPlayerStorageValue(cid, info.Storages[6]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Auto Loot Message "..(getPlayerStorageValue(cid, info.Storages[6]) > 0 and "disabled" or "Activated")..".") return true elseif isInArray({"cor","color","type"}, param) then setPlayerStorageValue(cid, info.Storages[5], getPlayerColorLootMessage(cid) == #Color_Loot and 0 or getPlayerColorLootMessage(cid)+1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Auto Loot Message Color Changed to "..Color_Loot[getPlayerColorLootMessage(cid)][2]..".") return true elseif isInArray({"money","gold","gps","dinheiro"}, param) then setPlayerStorageValue(cid, info.Storages[2], getPlayerStorageValue(cid, info.Storages[2]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Auto Loot Gold Colleting "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "disabled")..".") return true elseif isInArray({"deposito","bank","gbank","deposit","autodeposit"}, param) then setPlayerStorageValue(cid, info.Storages[4], getPlayerStorageValue(cid, info.Storages[4]) <= 0 and 1 or 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Automatic Gold Bank "..(getPlayerStorageValue(cid, info.Storages[4]) > 0 and "Activated" or "disabled")..".") return true end if info.distro ~= 1 then item = ExistItemByName(tostring(param)) if not item then doPlayerSendCancel(cid, "This item does not exist.") return true end item = getItemIdByName(tostring(param)) else item = getItemIdByName(param, false) if not item then doPlayerSendCancel(cid, "This item does not exist.") return true end end local var = isInTable(cid, item) if isInArray(info.Money_ids, item) then doPlayerSendTextMessage(cid, MESSAGE_FIRST, "Enter !autoloot money to add money in your list!") return true elseif isInArray(info.BlockItemsList, item) then doPlayerSendCancel(cid, "You can not add this item in the list!") return true elseif not var and #getItensFromAutoloot(cid) >= slots then doPlayerSendCancel(cid, "max "..slots.." from auto loot") return true elseif getPlayerStorageValue(cid, info.Storages[7]) - os.time() > 0 then doPlayerSendCancel(cid, "wait a second to use this command again") return true end if not var then doAddItemFromAutoloot(cid, item) else doremoveItemFromAutoloot(cid, item) end setPlayerStorageValue(cid, info.Storages[7], os.time()+info.Talkaction_delay) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,not var and "you added the item "..param.." in the list" or "you removed the item "..param.." from the list, please wait 5 seconds to save the directory.") return true]]></talkaction> </mod> Tenta ai agora para ver se funciona.
×
  • Criar Novo...