antiblock
diamwall

Owsap

Membro
  • Content Count

    231
  • Joined

  • Last visited

  • Days Won

    9

Everything posted by Owsap

  1. Imagens: https://imgur.com/a/4DLTdc6 Link (MEGA) : https://mega.nz/file/HIhWFADJ#lXIzfDHcbiQll7OGVm0FolUNmSMlWndurv-YsT8natY
  2. Olá comunidade! Venho partilhar a minha quest que criei para o GM servindo de um painel com opções de GM. Eu já sei que existe vários paneis de gm por aí mas eu acho que a minha ainda poderá facilitar mais a vida dos gms. Como o título diz, o painel é avançado, quer dizer que a quest tem várias opções para o GM. Então quais opções tem este painel? Imagem: • Gerir Eventos - Podes gerir eventos através do painel do gm. • Dar bónus a qualquer reino - Podes dar um ou mais bónus a qualquer reino por um determinado tempo. • Cofre do GM - Itens de GM - Bónus de GM - Habilidades P. • Opções de GM - Desligar o Servidor - Mostrar uma mensagem de aviso de manutenção ao fazer login. - Bloquear/Desbloquear conta de um jogador - Bloquear/Desbloquear chat de um jogador • Outros - Tempo (Ajustar horas de amanhecer e anoitecer) - Teleportes (Básico) • Mais informções: - Idioma da quest: pt-PT - Várias vezes testada, 100% a funcionar - Manter o ficheiro ox_event.quest junto com o gm_panel.quest - Palavra secreta é pedida por motivos de segurança (Editar Linha 23) • Como instalar: 1. Coloca o ficheiro GM no directório das quests e depois abre o ficheiro quest_list e adicionas as linhas: GM/gm_panel.quest GM/ox_event.quest 2. Na maquina: cd (DirectórioDasQuests) && ./qc GM/gm_panel.quest cd (DirectórioDasQuests) && ./qc GM/ox_event.quest 3. Se houver qualquer problema, na maquina: cd (DirectórioDasQuests) && sh make.sh 4. Se houver problemas com permissão, na maquina: chmod -R 770 DirectórioDasQuests/GM 5. Para quem não sabe onde fica o directório das quests: /usr/home/game/share/locale/germany/quest • Download: - https://mega.co.nz/#!3NoGlbgB!szqQgB6R2kPuTH2wri6mE6dRuodc2Q88Fun1EIlI8vM - https://dl.dropboxusercontent.com/u/104961902/metin2/GM.zip • VirusTotal: - https://www.virustotal.com/pt/file/bdd212f4adb43c4a82e0de1daafc4e58978fa66523bad88a07c821545716be19/analysis/1434206061/ • CRÉDITOS: - A quest foi 100% criada por mim desde a linha 0 por isso se não for muito, deixem os meus créditos na quest para mostrar o respeito pelo meu trabalho. - O ficheiro ox_event.quest não foi criado por mim, apenas o editei para funcionar com a minha quest. Espero que gostem da quest e que facilita as vossas vidas
  3. Version 1.0.0

    53 downloads

    Olá comunidade, quero-vos apresentar o antigo, e primeiro layout da página web do Metin2 (Gameforge) em 2006. Este layout só foi utilizado no Metin2 PT em 17 de Junho de 2007 (Data do lançamento em Portugal). Como sabem, estamos em 2016 e este layout já tem 10 anos desde que foi utilizado. De acordo com o Internet Archive, o ultimo registo da utilização deste layout foi em JANEIRO 20, 2009 às 21:28:32. Muitos de nós gostamos de ver as coisas como eram antes, e então, pensei, e decidi em criar um novo projecto no qual é trazer esta página web de volta totalmente a funcionar... Felizmente consegui terminar este projecto e venho cá partilhar o projecto com a comunidade! • Recursos utilizados para o desenvolvimento do projecto: - Internet Archive; - HTML & CSS Original; - Imagens Oficiais Este projecto foi totalmente desenvolvido por mim na parte da programação PHP e em outros, o resto foi utilizando os recursos referidos acima. Palavra-Passe de Extracção: owsap
  4. Olá comunidade, venho partilhar mais uma ferramenta que eu criei para a área de Esta ferramenta converte o item_proto.xml e mob_proto.xml para o formato SQL. ? Tens o item_proto e mob_proto do cliente todo traduzido mas o da base de dados não? - Não te preocupes, basta converteres o XML para SQL com a ferramenta.. • Então como funciona? - Simples, basta descompactares o item_proto ou mob_proto do teu cliente e abrir a ferramenta e depois clicar em Load para abrir o proto que queiras converter para SQL. Depois de abrir o ficheiro, a ferramenta vai automaticamente criar um ficheiro proto.sql e começar a converter o XML para SQL. - Depois da conversão completar poderás abrir o ficheiro proto.sql e copiar tudo o que está lá e colocar na base de dados e correr a query. • Essa ferramenta funciona com todas as versões? - Não, apenas funciona com a versão rev_40k. • Download: [MEGA] / [DROPBOX] • VirusTotal: Clique aqui Tool by Owsap © 2015
  5. pkg install -y openssl compat8x-amd64
  6. Aqui tens um exemplo, espero que te ajude. # # Title: Expanded Window # Date: 2021.03.16 # Author: Owsap import app import ui BUTTON_COUNT = 4 class TestWindow(ui.BoardWithTitleBar): def __init__(self): ui.BoardWithTitleBar.__init__(self) self.isLoaded = False self.btnExpanded = False self.btnList = [] if not self.isLoaded: self.__LoadBoard() def __del__(self): ui.BoardWithTitleBar.__del__(self) def __LoadBoard(self): self.SetSize(95, 210) self.SetCenterPosition() self.AddFlag('movable') self.SetTitleName("Test") self.SetCloseEvent(self.Close) textLineGuide = ui.TextLine() textLineGuide.SetParent(self) textLineGuide.SetPosition(45, 185) textLineGuide.SetText(".") textLineGuide.Show() self.textLineGuide = textLineGuide btnExpand = ui.Button() btnExpand.SetParent(self) btnExpand.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub") btnExpand.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub") btnExpand.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub") btnExpand.SetText("+") btnExpand.SetPosition(25, 160) btnExpand.SetEvent(self.__OnClickExpand) btnExpand.Show() self.btnExpand = btnExpand (xLocal, yLocal) = self.btnExpand.GetLocalPosition() btnGroup = ui.Window() btnGroup.SetParent(self) btnGroup.SetPosition(xLocal, yLocal - 0 - (30 * BUTTON_COUNT)) btnGroup.SetSize(40, 30 * BUTTON_COUNT) btnGroup.Hide() self.btnGroup = btnGroup for btnIdx in xrange(BUTTON_COUNT): btn = ui.Button() btn.SetParent(self.btnGroup) btn.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub") btn.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub") btn.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub") btn.SetText("{}".format(btnIdx)) btn.SetPosition(0, (30 * btnIdx)) btn.SetEvent(lambda arg = btnIdx: self.__OnClickExpandedBtn(arg)) btn.Show() self.btnList.append(btn) def __OnClickExpand(self): if not self.btnExpanded: self.btnExpanded = True self.btnGroup.Show() if self.btnExpand: self.btnExpand.SetText("-") else: self.btnExpanded = False self.btnGroup.Hide() if self.btnExpand: self.btnExpand.SetText("+") if self.textLineGuide: self.textLineGuide.SetText(".") def __OnClickExpandedBtn(self, arg): if self.textLineGuide: self.textLineGuide.SetText("{}".format(arg)) def Open(self): self.Show() def Close(self): self.Hide() def OnPressEscapeKey(self): self.Close() return True def OnPressExitKey(self): self.Close() return True
  7. Por padrão já existe uma função em que verifique a versão do cliente com a versão do servidor, funciona por tempo, ou seja, se a data de execução for maior que a data limite que está configurada no servidor, o jogador será desconectado do servidor. Agora fica como queres verificar esta "chave" ou data de limite da versão / "licença". /// 1. @ Server/Game/input_login.cpp // Procura if (g_bCheckClientVersion) { [ ... ] } // Altere tudo por (verificar por data limite) if (g_bCheckClientVersion) { sys_log(0, "VERSION CHECK %s %s", g_stClientVersion.c_str(), d->GetClientVersion()); if (!d->GetClientVersion()) { d->DelayedDisconnect(10); } else { if (d->GetClientVersion() >= g_stClientVersion) { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Ŭ¶óÀ̾ðÆ® ¹öÀüÀÌ Æ²·Á ·Î±×¾Æ¿ô µË´Ï´Ù. Á¤»óÀûÀ¸·Î ÆÐÄ¡ ÈÄ Á¢¼ÓÇϼ¼¿ä.")); d->DelayedDisconnect(0); LogManager::instance().HackLog("VERSION_CONFLICT", ch); sys_log(0, "VERSION : WRONG VERSION USER : account:%s name:%s hostName:%s server_version:%s client_version:%s", d->GetAccountTable().login, ch->GetName(), d->GetHostName(), g_stClientVersion.c_str(), d->GetClientVersion()); } } } else { sys_log(0, "VERSION : NO CHECK"); } // Ou altere por (verificar um valor fixo) if (g_bCheckClientVersion) { sys_log(0, "VERSION CHECK %s %s", g_stClientVersion.c_str(), d->GetClientVersion()); if (!d->GetClientVersion()) { d->DelayedDisconnect(10); } else { if (0 != g_stClientVersion.compare(d->GetClientVersion())) { ch->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Ŭ¶óÀ̾ðÆ® ¹öÀüÀÌ Æ²·Á ·Î±×¾Æ¿ô µË´Ï´Ù. Á¤»óÀûÀ¸·Î ÆÐÄ¡ ÈÄ Á¢¼ÓÇϼ¼¿ä.")); d->DelayedDisconnect(0); LogManager::instance().HackLog("VERSION_CONFLICT", ch); sys_log(0, "VERSION : WRONG VERSION USER : account:%s name:%s hostName:%s server_version:%s client_version:%s", d->GetAccountTable().login, ch->GetName(), d->GetHostName(), g_stClientVersion.c_str(), d->GetClientVersion()); } } } else { sys_log(0, "VERSION : NO CHECK"); } Eis algumas coisas que tens que considerar também; no ficheiro Server/Game /config.cpp tens que ativar esta verificação e também tens que alterar a "chave" ou data limite da versão / "licença". /// 1. @ Server/Game/config.cpp // Procura e confirme, altere g_stClientVersion conforme as tuas preferências. bool g_bCheckClientVersion = true; // true = verificar | false = não verificar std::string g_stClientVersion = "1640998800"; // Sat Jan 01 2022 01:00:00 GMT+0000 Também podes criar um ficheiro "VERSION" junto a ficheiro "CONFIG" no diretório dos teus canais e adicionar o valor lá em vez de modificares o código fonte sempre que queres alterar a "chave" ou data limite da versão / "licença". Para isso também deves confirmar que essa função seja chamada. /// 1. @ Server/Game/config.cpp // Procura LoadValidCRCList(); LoadStateUserCount(); // Adiciona abaixo LoadClientVersion(); Finalmente na source do teu cliente terás que fazer algumas alterações também. /// 1. @ Client/UserInterface/PythonNetworkPhaseGame.cpp // Procura strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp) - 1); // # python time.time ¾ÕÀÚ¸® // Altere para (verificar por data limite) strncpy(kVersionPacket.timestamp, static_cast<std::time_t>(std::time(0)), sizeof(kVersionPacket.timestamp) - 1); // Ou altere para (verificar um valor fixo) strncpy(kVersionPacket.timestamp, "1234567890", sizeof(kVersionPacket.timestamp) - 1); O que deves saber sobre essas alterações. 1. Nem todos os clientes em que toca o código fonte são iguais, por isso deves-te guiar pela semelhança do código. 2. Este método apenas desconecta o jogador após entrar no jogo caso haja conflito entre a "chave" ou data limite da versão / "licença". 3. Há melhores formas de verificares o que pretendes, este é apenas o mais semelhante à tua pergunta e o mais simples que já existe no código fonte. Cumprimentos, Owsap.
  8. Owsap

    PEDIDO

    Depende onde tens o boss mas em geral, se o boss for "padrão" e estiver no seu mapa official é da seguinte forma, Nos ficheiros do teu servidor, localizado no mapa que contém o boss, no ficheiro boss.txt ou regen.txt, depende onde possa estar. Resumindo, ../share/locale/x/map/(nome_do_mapa)/boss.txt ou ../share/locale/x/map/(nome_do_mapa)/regen.txt Irás encontrar o boss pelo ID no ficheiros de texto. Exemplo: Vou alterar o tempo de respawn da Tartaruga no deserto. 1. ../share/locale/master/map/metin2_map_n_desert_01/boss.txt Irás encontrar uma linha separada por vários valores. m 869 658 100 100 0 0 7200s 100 1 2191 Como podes reparar tens um valor com "s", neste caso 7200s. Então tens aí o valor do respawn do boss em segundos. Depois de mudares o valor, reinicia o servidor.
  9. Provalvalemnte não tens a função "ThinBoardClosed" no "ui.py". import ui import wndMgr class AllenTeste(ui.Window): def __init__(self): ui.Window.__init__(self) self.__LoadMainBoards() def __del__(self): ui.Window.__del__(self) def __LoadMainBoards(self): self.FunctionalBoard = ui.ThinBoard() self.FunctionalBoard.SetParent(self) self.FunctionalBoard.SetSize(100, 300) self.FunctionalBoard.SetPosition(0, 0) self.FunctionalBoard.Show() start = AllenTeste() start.Show()
  10. Ocultar arma ao atuar emoções Repositório Git common/service.h game/char.cpp game/char.h game/cmd_emotion.cpp
  11. Antes de tudo, eu sei que isso é um pouco inútil, mas para ativar e desativar o efeito a piscar nos botões, decidi usar a função de flash padrão, porque não conhecia uma maneira mais fácil. Como um exemplo, aqui está uma demonstração do efeito do flash.
  12. Em char_item.cpp // Procura em "case ITEM_METIN:" // ¼® È®·ü if (number(1, 100) <= 30) // Substitui por // ¼® È®·ü if (number(1, 100) <= 100)
  13. Version 1.0.0

    79 downloads

    Uma simples ferramenta que criei em Python para converter texto simples em formato hexadecimal e binário. Notas Todos os packs têm de ser compactados com as novas keys. Para quem usa o "EterNexus" deverá sempre abrir o menu das configurações para carregar o ficheiro "CONFIG" caso contrário os packs serão compactados com as chaves padrão. Caso haja algum problema com a ferramenta por favor entre em contacto comigo através de MP Aproveita a ferramenta para proteger o teu cliente...
  14. Correção de código de cor no quadro de avisos e de dicas (notice / big_notice) Antes: Depois: root/constInfo.py root/uiTip.py
  15. Comando de GM para derrotar todos os jogadores à sua volta. game/src/cmd.cpp game/src/cmd_gm.cpp
  16. O 1º com um fundo mais escuro dava aquele extra toque.
  17. locale\ui\webwindow.py
  18. Version

    15 downloads

    Gameforge Root 02.02.2018
  19. Olá comunidade, venho lançar a minha ferramenta que eu criei em C# que converte os ficheiros do Metin2 como o item_proto e mob_proto para .sql, .xml e .txt. Esta ferramenta ainda está em fase de desenvolvimento por isso pode haver uma atualização a qualquer momento. O idioma oficial do cliente está em inglês mas existe uma opção de idioma que muda para português de portugal. A ferramenta consegue extrair a tabela item_proto e mob_proto da base de dados `player` para o formato xml. Também é possível converter o item_proto.xml para sql(query). Ainda não é possível fazer tal como o mob_proto porque ainda não está completo. Para haver uma conversão de xml para sql é necessário escolher uma versão do metin2. Por exemplo, nem todas as tabelas item_proto da base de dados `player` de todas as versões do metin2 são iguais. Por isso é necessário escolher a versão do jogo que utiliza para que o xml seja convertido corretamente. ! Para pessoas com tabelas modificadas: Em breve vai haver uma opção em que o utilizador coloca a estrutura da sua tabela item_proto ou mob_proto numa grelha ou campo de texto. Futuramente também vai ser possível converter o item_proto e mob_proto para a parte do servidor. (34k+) Então como funciona esta ferramenta? A interface é muito simples. Se quiseres converter um ficheiro para .xml basta ires ao menu M2>Converter para...>XML. (Para haver uma conversão de SQL para XML, é necessário fazer uma conexão à sua base de dados para recolher os dados da tabela e depois converter para um ficheiro .xml) E para converter para um ficheiro .sql? Existe 2 maneiras de fazer essa conversão, ou copia e cola o xml na área de texto ou então vaia no menu M2>Converter para...>SQL. Depois vai ser mostrado uma caixa de diálogo que terás de escolher o ficheiro xml para ser convertido para sql. Mega: https://mega.co.nz/#...kXC60khvhiCP3WM Link²: https://dl.dropboxus... Converters.rar Virustotal: https://www.virustot...sis/1431543265/ Espero que esta ferramenta ajuda muitas pessoa e que poupe alguns dias de trabalho. Se gostas-te da minha ferramenta e que te deu jeito, não custa dar +1 pela partilha. Esta ferramenta está protegida contra direitos de autor por isso eu não vou partilhar a minha source mesmo tendo uma conexão com mysql. Se houver algum bug, por favor manda-me MP para eu o resolver. #OWSAP © 2015 Cumprimentos,
  20. QUEST1 quest quest1_test begin state start begin when 8010.kill with not npc.is_pc() begin mob.spawn(180, pc.get_x(), pc.get_y(), 0, 0) -- spawn mob vnum 180 @ pc x & y end end end QUEST2 quest quest2_test begin state start begin when BOSS_VNUM.kill with not npc.is_pc() begin local village = {1, 21, 41} -- metin2_map_a1, metin2_map_b1, metin2_map_c1 if pc.get_map_index() != village[pc.get_empire()] then if pc.get_empire() == 1 then -- shinsoo player local shinsoo_costume = {41033, 41034} -- costumes vnum's game.drop_item_with_ownership(shinsoo_costume[math.random(0, table.getn(costume))]) -- 1 item vnum 41033 ~ 41034 elseif pc.get_empire() == 2 then -- chunjo player local chunjo_costume = {41035, 41036} -- costumes vnum's game.drop_item_with_ownership(shinsoo_costume[math.random(0, table.getn(costume))]) -- 1 item vnum 41035 ~ 41036 elseif pc.get_empire() == 3 then -- jinno player local chunjo_costume = {41037, 41038} -- costumes vnum's game.drop_item_with_ownership(shinsoo_costume[math.random(0, table.getn(costume))]) -- 1 item vnum 41037 ~ 41038 end end end end end
  21. Olá comunidade, vejo muitas pessoas com dificuldades em adicionar ou configurar um patcher para o seu cliente e então resolvi em criar este tópico como tutorial. Bem, como muitos de vocês já sabem, é possível abrir o launcher oficial com o 7zip e editar o TorrentPatch.url. A este momento vocês já devem de ter percebido que vamos utilizar o launcher oficial do Metin2, então vamos lá começar. • PARTE 1 Primeiramente vão fazer download dos ficheiros necessários abaixo. - MEGA: https://mega.nz/#!iUxVTbJJ!_w-m6MKyy4ZL-9MH6vJQBw8XOBkiLPjotNFbosqEl2k - ou Dropbox: https://dl.dropboxusercontent.com/u/104961902/metin2/metin2_patcher.rar - Virustotal: https://www.virustotal.com/pt/file/8e84765a7a2457bc453cb016003a130b70fcc53bf4fca0c2438749b964b91b88/analysis/1443994933/ Depois de concluírem o download vão extrair o ficheiro .rar para o vosso ambiente de trabalho ou para qualquer outro lugar. Agora vão abrir a pasta 'launcher/patcher_assets' e vão abrir o ficheiro 'TorrentPatch.url' com o Notepad++ ou mesmo o bloco de notas. Depois de abrirem o ficheiro, vão alterar o que está abaixo para o vosso domínio de patch. remoteConfigPath="http://localhost/metin2/patch/metin2torrent.config.xml" Agora vão abrir o ficheiro 'TorrentPatch.locale' e alteram a linha 22 (LAUNCHER_IFRAME) com o vosso domínio do patch. <string key="LAUNCHER_IFRAME">http://localhost/metin2/patch/</string> Se precisarem de editar mais alguma coisa façam e depois guardam. Depois vão à pasta 'launcher' e executem o ficheiro 'config_patch'. Um executável do launcher será criado. • PARTE 2 Agora vão abrir a pasta 'patch' e depois abrir o ficheiro 'metin2torrent.config' e editar o seguinte: run_path="metin2client.bin" notice_url="http://localhost/metin2/patch/metin2_accept/" <foreground_patch crcpatch_url="http://localhost/metin2/patch/" crcversion="0.0.0.3"/> run_patch = Ficheiro para ser executado depois do patcher. notice_url = Informe os termos de uso e as regras do jogo quando o launcher é executado pela primeira vez. crcpatch_url = URL do domínio do patch. Depois de estar tudo configurado, vão copiar tudo o que está na pasta patch e vão colocar no vosso domínio de patch. • PARTE 3 PMF (Perguntas mais frequentes) 1. Como comprimo um ficheiro para .lz? - Abra o ficheiro 'patcher_tool' que está na pasta 'patch/0.0.0.3' e clica na aba LZpack. Path to In folder = Diretório dos ficheiros a serem comprimidos para .lz Path to Out folder = Diretório da pasta onde será guardado os ficheiros .lz 2. Como crio a lista crclist? - Abra o ficheiro 'patcher_tool' que está na pasta 'patch/0.0.0.3' e clica na aba CRC list. Clique nos 3 pontos e selecione o diretório onde se localiza os ficheiros .lz e depois clica no botão Hash para criar a lista crclist. Depois da lista ser criada, é obrigatório colocar atrás do nome do ficheiro o diretório onde ele pertence. Por exemplo, 915875c4 8996 30461970 3298966880 locale_pt.eix terá que ficar, 915875c4 8996 30461970 3298966880 pack\locale_pt.eix porque o ficheiro locale pertence à pasta pack. O mesmo acontece para os outros. 3. Onde coloco os ficheiro .lz? - Todos os ficheiros .lz devem ser organizados da mesma forma que o cliente na pasta 0.0.0.3. Por exemplo, o ficheiro locale.epk.lz deve estar na pasta 0.0.0.3/pack. A ferramenta patcher_tool foi criada pelo balika01 e pode ser encontrada na EPVP. *The tool in this topic wich can be found on EPVP was created by the rightful owner balika01. Espero que este tópico foi útil e que ajude muitos. Cumprimentos, OWSAP
  22. Owsap

    enhanceMT (CMake)

    Version 40250

    6 downloads

    Código fonte original da YMIR com patches de terceiros (enhanceMT) Revision 40K (2013 ~ 2014) Pacote necessário para a compilações do código fonte do servidor — CMake (pkg_add -r cmake) Eu não dou qualquer tipo de suporte aos ficheiros contidos no download.
  23. Cliente locale/inventorywindow.py import uiScriptLocale import item EQUIPMENT_START_INDEX = 0 window = { "name" : "InventoryWindow", ## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px) "x" : SCREEN_WIDTH - 176, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 176, "height" : 565, "children" : ( ## Inventory, Equipment Slots { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 176, "height" : 565, "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 8, "y" : 7, "width" : 161, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":77, "y":3, "text":uiScriptLocale.INVENTORY_TITLE, "text_horizontal_align":"center" }, ), }, ## Equipment Slot { "name" : "Equipment_Base", "type" : "image", "x" : 10, "y" : 33, "image" : "d:/ymir work/ui/equipment_bg_with_ring.tga", "children" : ( { "name" : "EquipmentSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 150, "height" : 182, "slot" : ( {"index":EQUIPMENT_START_INDEX+0, "x":39, "y":37, "width":32, "height":64}, {"index":EQUIPMENT_START_INDEX+1, "x":39, "y":2, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+2, "x":39, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+3, "x":75, "y":67, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+4, "x":3, "y":3, "width":32, "height":96}, {"index":EQUIPMENT_START_INDEX+5, "x":114, "y":67, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+6, "x":114, "y":35, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+7, "x":2, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+8, "x":75, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+9, "x":114, "y":2, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32}, ## »õ ¹ÝÁö1 {"index":item.EQUIPMENT_RING1, "x":2, "y":106, "width":32, "height":32}, ## »õ ¹ÝÁö2 {"index":item.EQUIPMENT_RING2, "x":75, "y":106, "width":32, "height":32}, ## »õ º§Æ® {"index":item.EQUIPMENT_BELT, "x":39, "y":106, "width":32, "height":32}, ), }, ## Dragon Soul Button { "name" : "DSSButton", "type" : "button", "x" : 114, "y" : 107, "tooltip_text" : uiScriptLocale.TASKBAR_DRAGON_SOUL, "default_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_01.tga", "over_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_02.tga", "down_image" : "d:/ymir work/ui/dragonsoul/dss_inventory_button_03.tga", }, ## MallButton { "name" : "MallButton", "type" : "button", "x" : 118, "y" : 148, "tooltip_text" : uiScriptLocale.MALL_TITLE, "default_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_01.tga", "over_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_02.tga", "down_image" : "d:/ymir work/ui/game/TaskBar/Mall_Button_03.tga", }, ## CostumeButton { "name" : "CostumeButton", "type" : "button", "x" : 78, "y" : 5, "tooltip_text" : uiScriptLocale.COSTUME_TITLE, "default_image" : "d:/ymir work/ui/game/taskbar/costume_Button_01.tga", "over_image" : "d:/ymir work/ui/game/taskbar/costume_Button_02.tga", "down_image" : "d:/ymir work/ui/game/taskbar/costume_Button_03.tga", }, { "name" : "Equipment_Tab_01", "type" : "radio_button", "x" : 86, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Equipment_Tab_02", "type" : "radio_button", "x" : 86 + 32, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, ), }, { "name" : "Inventory_Tab_01", "type" : "radio_button", "x" : 10, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1, "children" : ( { "name" : "Inventory_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Inventory_Tab_02", "type" : "radio_button", #"x" : 10 + 78, "x" : 10 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2, "children" : ( { "name" : "Inventory_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, { "name" : "Inventory_Tab_03", "type" : "radio_button", "x" : 10 + 39 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_3, "children" : ( { "name" : "Inventory_Tab_03_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "III", }, ), }, { "name" : "Inventory_Tab_04", "type" : "radio_button", "x" : 10 + 39 + 39 + 39, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_half_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_4, "children" : ( { "name" : "Inventory_Tab_04_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "IV", }, ), }, ## Item Slot { "name" : "ItemSlot", "type" : "grid_table", "x" : 8, "y" : 246, "start_index" : 0, "x_count" : 5, "y_count" : 9, "x_step" : 32, "y_step" : 32, "image" : "d:/ymir work/ui/public/Slot_Base.sub" }, ## Print { "name":"Money_Slot", "type":"button", "x":8, "y":28, "horizontal_align":"center", "vertical_align":"bottom", "default_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "over_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "down_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "children" : ( { "name":"Money_Icon", "type":"image", "x":-18, "y":2, "image":"d:/ymir work/ui/game/windows/money_icon.sub", }, { "name" : "Money", "type" : "text", "x" : 3, "y" : 3, "horizontal_align" : "right", "text_horizontal_align" : "right", "text" : "123456789", }, ), }, ), }, ), } locale/locale_interface.txt INVENTORY_PAGE_BUTTON_TOOLTIP_1 1º Inventário INVENTORY_PAGE_BUTTON_TOOLTIP_2 2º Inventário INVENTORY_PAGE_BUTTON_TOOLTIP_3 3º Inventário INVENTORY_PAGE_BUTTON_TOOLTIP_4 4º Inventário uiscript/inventorywindow.py import uiScriptLocale import item EQUIPMENT_START_INDEX = 90 window = { "name" : "InventoryWindow", ## 600 - (width + ¿À¸¥ÂÊÀ¸·Î ºÎÅÍ ¶ç¿ì±â 24 px) "x" : SCREEN_WIDTH - 176 - 200, "y" : SCREEN_HEIGHT - 37 - 565, "style" : ("movable", "float",), "width" : 176, "height" : 565, "children" : ( { "name" : "board", "type" : "board", "style" : ("attach",), "x" : 0, "y" : 0, "width" : 176, "height" : 565, "children" : ( ## Title { "name" : "TitleBar", "type" : "titlebar", "style" : ("attach",), "x" : 8, "y" : 7, "width" : 161, "color" : "yellow", "children" : ( { "name":"TitleName", "type":"text", "x":77, "y":3, "text":uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2, "text_horizontal_align":"center" }, ), }, ## Equipment Slot { "name" : "Equipment_Base", "type" : "image", "x" : 10, "y" : 33, "image" : "d:/ymir work/ui/game/windows/equipment_base.sub", "children" : ( { "name" : "EquipmentSlot", "type" : "slot", "x" : 3, "y" : 3, "width" : 150, "height" : 182, "slot" : ( {"index":EQUIPMENT_START_INDEX+0, "x":39, "y":37, "width":32, "height":64}, {"index":EQUIPMENT_START_INDEX+1, "x":39, "y":2, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+2, "x":39, "y":145, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+3, "x":75, "y":67, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+4, "x":3, "y":3, "width":32, "height":96}, {"index":EQUIPMENT_START_INDEX+5, "x":114, "y":84, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+6, "x":114, "y":52, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+7, "x":2, "y":113, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+8, "x":75, "y":113, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+9, "x":114, "y":1, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32}, {"index":EQUIPMENT_START_INDEX+10, "x":75, "y":35, "width":32, "height":32}, ## »õ ¹ÝÁö1 {"index":item.EQUIPMENT_RING1, "x":2, "y":106, "width":32, "height":32}, ## »õ ¹ÝÁö2 {"index":item.EQUIPMENT_RING2, "x":75, "y":106, "width":32, "height":32}, ## »õ º§Æ® {"index":item.EQUIPMENT_BELT, "x":39, "y":106, "width":32, "height":32}, ), }, { "name" : "Equipment_Tab_01", "type" : "radio_button", "x" : 86, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Equipment_Tab_02", "type" : "radio_button", "x" : 86 + 32, "y" : 161, "default_image" : "d:/ymir work/ui/game/windows/tab_button_small_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_small_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_small_03.sub", "children" : ( { "name" : "Equipment_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, ), }, { "name" : "Inventory_Tab_01", "type" : "radio_button", "x" : 10, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_1, "children" : ( { "name" : "Inventory_Tab_01_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "I", }, ), }, { "name" : "Inventory_Tab_02", "type" : "radio_button", "x" : 10 + 78, "y" : 33 + 191, "default_image" : "d:/ymir work/ui/game/windows/tab_button_large_01.sub", "over_image" : "d:/ymir work/ui/game/windows/tab_button_large_02.sub", "down_image" : "d:/ymir work/ui/game/windows/tab_button_large_03.sub", "tooltip_text" : uiScriptLocale.INVENTORY_PAGE_BUTTON_TOOLTIP_2, "children" : ( { "name" : "Inventory_Tab_02_Print", "type" : "text", "x" : 0, "y" : 0, "all_align" : "center", "text" : "II", }, ), }, ## Item Slot { "name" : "ItemSlot", "type" : "grid_table", "x" : 8, "y" : 246, "start_index" : 0, "x_count" : 5, "y_count" : 9, "x_step" : 32, "y_step" : 32, "image" : "d:/ymir work/ui/public/Slot_Base.sub" }, ## Print { "name":"Money_Slot", "type":"button", "x":8, "y":28, "horizontal_align":"center", "vertical_align":"bottom", "default_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "over_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "down_image" : "d:/ymir work/ui/public/parameter_slot_05.sub", "children" : ( { "name":"Money_Icon", "type":"image", "x":-18, "y":20, "image":"d:/ymir work/ui/game/windows/money_icon.sub", }, { "name" : "Money", "type" : "text", "x" : 3, "y" : 3, "horizontal_align" : "right", "text_horizontal_align" : "right", "text" : "123456789", }, ), }, ), }, ), } Source (Em caso se tiveres) UserInterface/Locale_inc.h Adiciona se não tiver. #define ENABLE_NEW_EQUIPMENT_SYSTEM
  24. FreeBSD ee /usr/local/etc/apache24/httpd.conf Procura: Adiciona: /* a) leave editor a) save changes */ service apache24 restart * Tira uma captura do ecrã com o erro/problema para ser mais fácil ajudarem-te.