antiblock
Rodnia | Alpha & Omega

Search the Community

Showing results for tags '[TUTORIAL]'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Comunidade
    • Community Servers
    • Anúncios
    • Apresentações
    • Sugestões
    • Suporte (Tickets)
    • Lixeira do fórum
  • Patrocínios
  • Hardware e Software
    • Smartphones e Tablets
    • Desktops e Laptops
    • Sistemas Operativos
  • Ensino
    • Programação
    • Web Design
    • Ensino Escolar
  • Gaming
    • Gaming Mobile
    • Battle Royale
    • Ação e FPS
    • MOBA
    • RPG e MMORPG
    • Outros Géneros
    • Consolas
  • Gerenciamento de Servidores e Clientes
    • Metin2
    • Minecraft
    • Counter-Strike
    • FiveM
    • Browser
    • Outros Servidores
  • Design World
    • Geral e Galerias de Arte
    • Pedidos de Designer
    • Tutoriais e Recursos
  • WebMaster
    • Geral
    • Alojamento Web
    • Plataformas Web
  • Discussão Geral
    • Notícias
    • Computador
    • Video-Sharing e Streaming
    • Automóveis & Motos
    • Desporto
    • Entretenimento
    • Anúncios e Comércio
    • FunZone
    • Off-Tópic

Categories

  • DEVs/Resellers
    • Plechito
    • iBeast
    • dracaryS
    • Vegas
    • Dungeons
  • Leaks Metin2
    • C++ / C# / Python
    • Unpacked
    • ServerFiles
    • Programs and tools
  • Graphics & 3D & Costume
    • Maps
    • Npc & Mobs
    • Equipment
    • Websites, Designs and Scripts
  • FiveM
  • Windows
    • Releases
  • Música
    • Hip-Hop
  • Trash
    • Metin2
    • Android
    • Aplicações
    • WebMaster
    • Jogos PC

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Discord


E-mail


Website URL


Localizaçao


Sobre mim

Found 258 results

  1. Bem pessoal, há por aí um autopatcher, mas esse, muitas pessoas não o conseguem colocar a dar! Vamos ao tutorial agora! 1º Começamos por fazer o download do autopacter aqui: http://www.mediafire...bdfc51csi4pmhxc ; 2º Vamos ao servidor do autopatcher, ou o xampp, criamos uma pasta com o nome patcher (se for no xampp, essa pasta tem de estar dentro da pasta htdocs); 3º Extrai mos o ficheiro que foi transferido no passo 1 e copiamos tudo o que está dentro da pasta "Web(PHP)" e colocamos na pasta que foi criada no servidor ou no xampp; 4º Copiamos o cliente todo para a pasta que se chama cliente, situada na pasta que foi criada no servidor ou xampp; 5º Vamos ao browser e escrevemos o endereço do site (exemplo: patcher.testecyber.com/nome-da-pasta-criada-no-servidor/admincp.php); Imagem: PS: a pass default é admin! 6º Fazemos login nesse painel e vamos à opção Client Updater! Imagem: 7º Nessa página (Client Updater) irá aparecer uma coisa deste género: 8º Nessa mesma página, carregamos na opção "Dosyalari Guncelle"! Imagem: Pronto, temos o nosso cliente actualizado no patcher, agora falta configurar a parte do cliente! 1º Na pasta "client" situada no ficheiro que fizemos download, vamos copiar tudo para a pasta do cliente! Imagem do que temos de copiar: 2º Depois de copiado, vamos abrir o ficheiro patchconfig.cfg; 3º Depois de aberto, vamos editar o seguinte: 4º Abrir o Metin2.exe e testar se o autopatcher funciona! EDIT: Aconselho vos a não usar no xampp, pois irá dar um erro... usem num webhost free! Espero que tenham gostado como é claro! Caso não funcione, contactem me! Cumprimentos.
  2. Boas comunidade! Venho-vos apresentar um tutorial novo 100% feito por mim. Váh, vamos começar: 1º Passo: Procurar na pasta do vosso game o ficheiro com o nome config. 2º Passo: Abri-lo num programa de texto como por exemplo Notepad++ 3º Passo: No ficheiro procurar: MAX_LEVEL: 4º Passo: Alterar para MAX_LEVEL: "Nivel Máximo" (Tirar aspas e colocar o numero) !Atenção o Game têm de ter as tabelas de experiencia prontas para a troca de nivel. Créditos: [*]Base: Ymir Co. [*]Tutorial: Luis Bizarro [*]Softwere de edição: Notepad++ É tudo por agora, Luis Bizarro
  3. Tutorial 1 : Iniciar em Quest - Conceito básico: Quest é uma linguagem derivada de Lua em que as funções usadas dentro delas, são 'compreendidas' pelo ficheiro mestre(game) e o ficheiro acaba sendo separado em vários ficheiros dependendo dos "Eventos" que ocorrem dentro dele.(.script,.arg,.when,etc.) - Qual é o objectivo de 'programar' nesta linguagem ? Bem, as vantagens de 'programar' nesta linguagem, são a simplicidade dos comandos/funções e a capacidade de poder criar várias "Missões"/Eventos em Metin2. - Sim,mas como é que vamos programar nessa linguagem? Ah bom, estava a ver que nunca mais perguntavam Bem, para começar, vou vos mostrar como deve ser o ínicio do vosso 1º Ficheiro Quest. Quest primeiro_ficheiro beginstate start begin----------endend Explicação: Bem, vamos analisar estas 4 linhas de código. Linha 1 : Declaramos o nome da Quest. Linha 2 : Declaramos o nome do Estado ( PS: Todas as Quest's, têm como 'start' sendo o Estado Inicial, portanto todas as Quest's que um jogador 'entrar', vai entrar directamente no Estado de 'Start'. Os '-----' representam código, que no próximo Tutorial iremos falar mais. Linha 5: Representa o Fim do Estado. ( Todos os Estados;Quest's;Eventos(próximo tutorial);Condições devem ter um end para "dizer" à Máquina, que ali é o fim do Estado. Linha 6 : Representa o Fim da Quest. Tutorial #2 - Quest Events Bem, hoje vamos falar sobre os Quest Events.. Vocês devem-se estar a perguntar, o que é isso dos Quest Events? Bem, aqui fica uma breve Explicação: Um Quest Event, é sempre que um Jogador faz alguma coisa. Bem, há vários tipos de Quest Events - no fim do tópico está uma lista completa - mas nós hoje vamos falar dos mais importantes. Login: Logout: Letter: Use: Kill: Chat: A Lista de Quest's Events: Fonte:Tech-gamers Créditos:ReBirTH (menbro da Tech-Gamers) mokas2010 , Por transmitir á cyber-gamers. ;) Cumprimentos.
  4. Olá, Pediram para fazer um tutorial para implementar mobs, e aqui vai, tentarei ser o mais explícito possível. Portanto, já alguma vez devem ter visto o que contém a pasta de algum mob. Contém vários ficheiros (.gr2, .msa, .msm, .mse, .tga/.dds e o motlist.txt) [*]O GR2 é o que contém, digamos, a forma do mob, a sua estrutura e os movimentos do mesmo. [*]Os ficheiros .msm e/ou .msa servem para que se possa aplicar o GR2. [*]Os ficheiros .mse tratam dos efeitos do mob. [*]O .tga ou .dds é a textura do mob. [*]E o motlist.txt indica os movimentos correspondentes a cada gr2. Para colocarmos o mob temos antes que verificar se a sua pasta contém estes ficheiros todos. Agora, instalar a pasta do mob no cliente. Bem, a meu ver, é mais fácil fazer um .eix e .epk que contenha só os ficheiros do dito mob, mas podem sempre colocá-lo em outro ficheiro. Para saber onde colocar, abrem o .msm e irão encontrar um diretório. Por exemplo: BaseModelFileName "D:Ymir Workmonster2crustacean_bosscrustacean_boss.GR2" Esse diretório indica onde é que vai buscar o .gr2 do mob. Sendo assim, descompactam o monster2.eix/.epk e vão até: ymir workmonster2 E colocam lá a pasta do mob. Depois no ficheiro .xml, que foi criado na altura de descompactar o monster2, devem adicionar as linhas dos ficheiros adicionados para que se possa compactar também no ficheiro e não seja excluído. Por exemplo: É imprescindível ter o .xml do ficheiro(s) adicionado(s), caso contrário, a alteração/adição não será aplicada. Bem, até aqui simples. O que devem fazer a seguir, é descompactar o root.eix/.epk e procurar por um ficheiro denominado: npclist.txt. O que lá contém é: id_mob [tabulador] nome_msm Isto servirá para que consigam ver o mob. Exemplo: 7052 scorpionman_sword7053 scorpionman_bow7054 snakeman_sword É obrigatório estar separado o nome do .msm do id do mob pelo tabulador. Após isto, guardam o npclist.txt e voltam a compactar o root. Sendo assim, vamos à parte final. A query: Ora bem, para o mob existir, devem cria-lo no mob_proto do navicat, se não, os passos anteriores efetuados, apenas enchiam o cliente de murraça por um mob que não existe. Para facilitar a vida, deixarei aqui uma query (serverside/clientside) para usarem como base para o vosso novo mob. Esta query não tem nada editado, vem com os valores no mínimo, portanto vocês já editam o que quiserem nela. Navicat -> Player -> Query -> New Query: -> Run Na query vocês editam o ID e o nome_mob. E por último, vem o mob_proto do cliente. Descompactam o locale e, de seguida, o mob_proto. Depois no final, adicionam: Fecham e guardam o mob_proto, compactam, colocam de novo no locale e compactam-no. Depois, os ficheiros todos (monster2, root, locale) colocam na pasta pack do vosso cliente. Entram no vosso servidor, fazem /reload p e depois testam o vosso novo mob. (/m id_mob). É tudo! Espero ter sido explícito, qualquer dúvida não hesitem em perguntar. Cumprimentos e Boa sorte.
  5. Boas pessoal! Venho aqui apresentar um tutorial novo de como meter a percentagem na barra de loading! ROOT 1º Descompatar o Root 2º Abrir o introloading.py 3º Procurar: self.loadingImage.SetScale(width, height)4º Depois disso colocar: self.loadingGage.SetPercentage(2, 100)5º Procurar: self.loadingGage=self.GetChild("FullGage")6º Colocar depois da alinea anterior: self.loadingLoadingPercent=self.GetChild("LoadingPercent_Text")7º Procurar: self.loadingGage.SetPercentage(2+98*p/100, 100)8º Depois da alinea anterior colar: self.loadingLoadingPercent.SetText(str(2+98*p/100)+"%")9º Compatar o root UIScript 10º Descompactar o UIScript 11º Abrir o loadingwindow.py 12º Procurar por: "name" : "FullGage",13º Depois dessa secção colocar: { "name" : "LoadingPercent_Text", "type" : "text", "x" : 190, "y" : -20, "text" : "", "vertical_align" : "center", },14º Compatar o UIScript Créditos: [*]Ymir - Ofereceu a plataforma para testar. [*]Notepad++ - Software de edição. [*]Luis Bizarro - Tutorial. [*]MKMT2 - Client "Cobaia". Cumprimentos, Luis Bizarro
  6. Boas pessoal, venho aqui trazer uns novos fumos![download][/download] Fumo Azul com Bolhas Azuis Fumo Vermelho com Bolhas Vermelhas Fumo Rosa Leve com Bolhas Rosa Leve Fumo Branco com Bolhas Brancas Fumo Azul Claro com Bolhas Azul Claro Fumo Azul Claro com Bolhas Azul Claro Fumo Rosa Forte com Bolhas Rosa Forte Fumo Verde Claro com Bolhas Verde Claro Fumo Amarelo com Bolhas Amarelas Fumo Verde Escuro com Bolhas Verde Escuro playersettingmodule.py XML Credits do tópico e dos codigos .mse 100% de ρэdяø™ λκλ јuηκĩэ (Eu falta mudar nome aqui <.<)
  7. Vejo muita gente com dúvidas de como usar as files do Ivan [RAIN 2010 - Sistema reconfigurado], por isso vou fazer um breve tutorial para os demais: Para quem não entendeu essas files direito, só foi alterado o sistema LINUX e não o sistema METIN2, elas são apenas as files Rain 2010 sem nenhuma alteração (limpas, "instant server"). Existem 2 usuários na maquina virtual, "root" e "metin2", quando baixa as files, não deves entrar na conta "root" e nem alterar a rede, deixe "host-only, Virtual BOX adapter", quando aparecer-te o login, fazes: LOGIN: metin2 SENHA: changeme (Altere a sua senha com o comando "passwd".) Certo! Logou na máquina... Agora vamos fazer conexão com o banco dados (MySQL, "Navicat"): IP: 192.168.56.101 User: db_manage Pass: changeme Certo! Logou no MySQL... Agora vamos fazer conexão com o FTP ("Filezilla"): IP: 192.168.56.101 USER: metin2 PASS: changeme Pronto! Uma files comum como outra qualquer! E o que mudou? Os comandos da conta "metin2": inciar = INICIA O SERVIDOR. (6 SEC JÁ ESTÁ ON) parar = PARA O SERVIDOR. (3 SEC JÁ ESTÁ) reiniciar = COMANDO "reboot" MAS SEM REINICIAR O FREEBSD, VAI APENAS REINICIAR O JOGO. (10 SEC JÁ DEU REBOOT :D) reiniciar_soft = REINICIAR QUESTS E MAPAS (NÃO IRÁ REINICIAR O BANCO DE DADOS) status = VER OS STATUS DO SERVIDOR. (CHANNELS ON OU OFF) login = VAI PARA O LOGIN PARA PODER LOGAR OUTRA CONTA. Os comandos da conta "root": sysinstall = CONFIGURAÇÕES (NÃO NECESSÁRIO, NÃO FAÇAS ISSO, APENAS ALTERE QUANDO FOR COLOCAR EM DEDICADO). passwd = ALTERA A SENHA DA CONTA "root". login = VAI PARA O LOGIN PARA PODER LOGAR OUTRA CONTA. reboot = NÃO PRECISO EXPLICAR O QUE É REBOOT NÉ? Não está conseguindo logar no jogo? Mude o arquivo "serverinfo.py" PARA O IP: 192.168.56.101 (Cliente 2010) Cliente compatíveis: Clientes versão 2010, exemplo: sandoz 94 Versão do game: game_2098 O que já vem implementado? - Nada, é uma serverfiles RAIN, para você criar seu Metin2 do 0, mas com um sistema em FreeBSD 9.0 totalmente reconfigurado e optimizado. Por que usar essas files? - Utiliza 85% menos memória RAM e espaço em disco que as demais serverfiles. - Não gera grande número de logs Link do tópico da serverfiles: × Tópico ×
  8. >>> EFEITOS TYPE <<< Escolha do tipo de item padrão: 0- Item Inativado (sem subtypes, mantém 0) 1- Armas de Todos os Tipos, possui subtypes ! 2- Armaduras e Acessórios, possui subtypes ! 3- Itens Diversos, possui subtypes ! 5- Refines (sem subtypes, mantém 0) 6- Itens que possuem script (sem subtypes, mantém 0) 8- Livro da Sorte (sem subtypes, mantém 0) 9- Gold que pode ir ao chão (sem subtypes, mantém 0) 10- Jóias de Acoplar (sem subtypes, mantém 0) 11- Bolsa de Alquimia (sem subtypes, mantém 0) 12- Peixes, possui subtypes ! 13- Vara de Pescar (sem subtypes, mantém 0) 14- Materiais para Construção (sem subtypes, mantém 0) 15- Fogueira (sem subtypes, mantém 0) 16- Itens acoplaveis no Slot, possui subtypes ! 17- Livros de Skill (sem subtypes, mantém 0) 18- Itens que executam script, possui subtypes ! 19- Esfera Poliforma (sem subtypes, mantém 0) 20- Baús que possuem chave (sem subtypes, mantém 0) 21- Baús que possuem chave (sem subtypes, mantém 0) 22- Livro do Esquecimento (sem subtypes, mantém 0) 23- Caixas, baús sem chave (sem subtypes, mantém 0) 24- Picareta (sem subtypes, mantém 0) 25- Cabelo de Cash sem bonus (sem subtypes, mantém 0) 27- Poções Medicinais (sem subtypes, mantém 0) 28- Itens do Systema Costume Slot, possui subtypes ! >>> EFEITOS SUBTYPE <<< Ramificações da escolha de item padrão > SUBTYPE 1 < 0- Espadas 1- Adagas 2- Arcos 3- Esp 2Mãos 4- Sinos 5- Leques 6- Flechas > SUBTYPE 2 < 0- Armaduras 1- Elmos 2- Escudos 3- Braceletes 4- Sapatos 5- Colares 6- Brincos > SUBTYPE 3 < 0- Recebe algum benefício, HP, MP, etc... 1- Pergaminhos do Retorno 2- Pode ser arrastado à algum item 6- Iscas para pescaria 7- Poções com duração de tempo 8- Oferece algum bonus status e desaparece após consumido 9- Bolsa de Gemas 10- Fogos de Artificio, tintas, itens de evento... 11- Oferece bonus instantâneamente 12- Perca Grelhada 13- Oferece privilégio Mod, Bótia 14- Remove Jóias e deixa lascas, Pergaminho espiritual 17- Remove as lascas dos slots, Livro Arte em Pedra 18- Altera os adicionais, Aprimoramento 19- Cria um novo adicional, Novo Aprimoramento 20- Abre um novo slot, Diamente 21- Minerais 22- Adiciona o 5ª adicional, Benção 23- Receitas de Poções > SUBTYPE 12 < 0- Ao clicar o peixe fica Cru 1- Peixes que podem ser grelhados na fogueira > SUBTYPE 16 < 0- Comuns 1- Abrir loja com Bolsa de Seda > SUBTYPE 18 < 0- Costume System Part-Main little-version ou comuns 1- Costume System Part-Hair little-version 2- Costume System Part-Base little-version 10- Cabelo de Cash com bonus > SUBTYPE 28 < 0- Costume System Part-Main full-version 1- Costume System Part-Hair full-version 2- Costume System Part-Base full-version >>> EFEITOS WEIGHT <<< 0- Sempre ZERO ! Nunca vi outra coisa >>> EFEITOS SIZE <<< 0- Nunca igual a ZERO ! Se é um item, precisa ocupar lugar no inventório. 1- Ocupa 1 espaço no inventório 2- Ocupa 2 espaços no inventório (sempre na vertical) 3- Ocupa 3 espaços no inventório (sempre na vertical) >>> EFEITOS ANTIFLAG <<< Creio que as flags sejam a parte mais complicada de entender e de se usar! FLAG é o tipo de aplicação, ANTI é algo que "é contra" ANTIFLAG, seria a grosso modo, "ir contra a aplicação" ! As antiflags são elaboradas em potencia de 2, ou seja: ---> 2, 4, 8, 16, 32, 64, 128, 256... Cada potencia de 2 tem sua aplicação para ir contra, segue abaixo todas que vi: 1- Personagens "femininos" não podem usar isto. 2- Personagens "masculinos" não podem usar isto. 4- "Guerreiros" não podem usar isto. 8- "Ninjas" não podem usar isto. 16- "Shuras" não podem usar isto. 32- "Shamans" não podem usar isto. 64- ??? 128- Não pode ser jogado ao chão. 256- Não pode ser vendido em um NPC. 512- Reds não podem usar. 1024- Yellows não podem usar. 2048- Blues não podem usar. 4096- ??? 8192- Não passa por trade. 16384- Não pode ser dropado se estiver com Karma Negativo. 32768- Não pode ser empilhado. 65536- Não pode ser vendido em uma loja particular. 131072- Não pode ser colocado no Armazem. Agora para encontrar sua ANTIFLAG, some as potencias com as contra-aplicações que queres! Vamos pegar por exemplo a Armadura de Aço Negro+9 ! Na tabela ela está com antiflag = 312 Fatoramos o número 312: 312 | 2 156 | 2 78 | 2 36 | 2 18 | 2 9 | 3 3 | 3 1 Fatorado 312 = 2^5 + 3^2 Ou seja, 256 + 32 + 16 + 8 ! Pronto ! Você encontrou as 4 contra-aplicações ! São elas: Ninjas, Shuras e shamans não podem usar, além disso, não pode vender no NPC ! Sei que é meio complexo de entender por tutorial, mas se pesquisares outros exemplos com a prática se consegue. Outros exemplos: O smoking tem antiflag = 1 pois a unica contra-aplicação é que não pode ser usado por femininos. O vestido de noiva e os buques tem antiflag = 2 pois não pode ser usado por masculinos. Todas as armas de shamans tem antiflag = 28, pois fatorado é 16 + 8 + 4 *as outras 3 classes somadas* Caso mesmo assim não tenha entendido aqui vai um software que encontrei que faz a antiflag pra você ! DOWNLOAD VIA 4SHARED: CLICA! VERIFICAÇÃO VIRUS-TOTAL: CLICA! As flags e wearflags seguem este mesmo padrão ! Agora vou vou mostrar todas que tem: >>> EFEITOS WEARFLAG <<< Aqui é configurado o slot para onde o item irá ao utilizar ! Só que NÃO HÁ SOMA das potencias ! 0- Não utiliza slot 1- Slot das Armaduras 2- Slot dos Capacetes 4- Slot dos Sapatos 8- Slot dos Braceletes 16- Slot das Armas 32- Slot dos Colares 64- Slot dos Brincos 128- Slot dos itens premium 256- Slot dos Escudos 512- Slot das Flechas 1024-Cabelo de Cash Lembre-se que um valor errado em um desses campos pode causar problemas in game, erros infindáveis no Syserr do servidor e até o mal funcionamento do item, portanto muito cuidado e lembre-se de ter um backup das tabelas antes de praticar ! CRÉDITOS DO TUTORIAL: obetuno CRÉDITOS DO SOFTWARE: Não encontrei... se souberem podem editar isto. TÓPICO ORIGINAL DO SOFT : LF95 (Inforge) GOSTOU ? http://cyber-gamers.org/public/style_emoticons/default/451960.gif e obrigado :)
  9. Encontrei esse bot em uma comunidade e resolvi compartilhar aki Print: Tutorial: 1- ir ao root e abrir o arquivo game.py Localizar a linha "from _weakref import proxy" depois colar em baixo "from switchbot import Bot" 2- depois localizar "self.quickSlotPageIndex = 0" Colar abaixo self.switchbit = Bot() self.switchbot.hide() 3- Localizar onPressKeyDict[app.DIK_F4] =lambda : self.__PressQuickSlot(7) abaixo cole onPressKeyDict[app.DIK_F6] =lambda : self.__toogleSwitchbot() 4- no final do game.py cole isto # switchbot def __toggleSwitchbot(self): if self.switchbot.bot_shown == 1: self.switchbot.Hide() else: self.switchbot.Show() # end switchbot downlod swuitchbot.py Link1 Link2 Link3 Créditos: Mijago Tópico retirado da Epvp
  10. Hj venho apresentar o Sistema de Conquista. Sistema de Conquista, consiste em matar determinados mobs, pedras e com isso ganhar ponto, que apos ter o determinado tanto voçê troca seus pontos por itens, etc; (Tudo pod ser alterado o que ganhar, os mob que tem que matar pra ganhar os pontos). 1º- Prints de como ficara no final. 2º- É necessario fazer algumas editações no cliente, pro Sistema ficar certo, então fasa o donwload pra começar a por... '> https://mega.co.nz/#!u9B3XSCT!RTmrvWvl3X1d-prNn2S37mROZAdg9VAzOaPjJKYHZa4 https://www.virustotal.com/pt/file/e4aa27a23c9dbab4c1fee249cd9a7edada9344250d45d801e111029704798058/analysis/1365848870/ 3º- Bem vamos la, 1º na parte do cliente. Para começar No cliente editar os seguintes arquivos: -Root: dentro dos arquivos e game.py uiachievement.py (isso, vamos colocar-nos). -ETC: onde colocar os arquivos e achievement_small.dds achievement_small.sub -Uiscript: aqui e vai colocar o arquivo warteschleife.py achievementboard.py Primeiro começomos com o root,Descompacta seu root, e abra o arquivo e procurar game.py esta: def __ServerCommand_Build(self):Depois de achar procura : # Achievement System START "achievement" : self.__AchievementTest, "achievementpoints" : self.__ShowAchievementPoints, # Achievement System END Voçê vai em baixo do código assima e meta isso : # Achievement System STARTdef __ShowAchievementPoints(self, points): import uiAchievement import uiTaskbar self.uiAchievement = uiAchievement.AchievementDialog() uiAchievement.AchievementPoints = int(points)def __AchievementTest(self, archivement): import uiAchievement self.uiAchievement = uiAchievement.AchievementDialog() self.uiAchievement.Show(1, str(archivement)) self.uiAchievement.SetTop()# Achievement System ENDFicando assim : 4º- Entrar na pasta root e adiciona o arquivo "uiachievement.py" , depois adiciona a xml : <File archivedPath="uiachievement.py" type="2"><![CDATA[Source\uiachievement.py]]></File>5º- Decompilamos nosso etc, ir para o trabalho Ymir pasta / ui e colocamos os achievement_small.dds. Então vá para o trabalho Ymir pasta / ui / público e introduzir o achievement_small.sub. Por fim, adicione as xml:<File archivedPath="d:/ymir work/ui/public/achievement_small.sub" type="0"><![CDATA[Source\ymir work\ui\public\achievement_small.sub]]></File><File archivedPath="d:/ymir work/ui/achievement_small.dds" type="0"><![CDATA[Source\ymir work\ui\achievement_small.dds]]></File>6º- O último passo no cliente é o nosso descompilar uiscript e colocar o arquivo achievementboard.py warteschleife.py: na pasta. depois adiciona a xml e compacta: [/center]<File archivedPath="uiscript/achievementboard.py" type="2"><![CDATA[Source\uiscript\achievementboard.py]]></File><File archivedPath="uiscript/warteschleife.py" type="2"><![CDATA[Source\uiscript\warteschleife.py]]></File>[center] E nós já temos cliente tudo pronto: D Parte no servidor : 1º- Vá no diretorio do seu servidor é adiciona as quest : E não é para voçê ficar simplesmente recebendo a quest vo ta a explicar como funciona: 1º- A realização mais importante é que, quando voçê chega a um (por exemplo, matar o chefe orc) voçê ganha pontos por pc.setqf: when 691.kill beginlocal Reward = 2pc.setqf("achievement_points", actual_achievement_points + Reward)Como você vê o chefe orc aha (mob ID 691) atribuiu o valor de ponto com Recompensa Local = 2 e, em seguida, adicionar 2 pontos para o pc.setqf ("achievement_points" actual_achievement_points + recompensa (a recompensa, neste caso, seria um +2). Então, se você quiser adicionar outro mobs à lista de realizações só tem que fazer o seguinte: when idmob.kill begin local Reward = puntos -- Poneis cuantos puntos quereis que os de local Achievement = "Nombre del mob que saldra en el cliente" local killcount = pc.getqf("idmob") -- Se usa para que el juego lleve la cuenta de cuantas veces lo mataste local actual_achievement_points = pc.getqf("achievement_points") -- Calcula cuantos puntos tenes pc.setqf("693", killcount + 1) -- Aqui os suma 1 al numero de ese mob que llevais pc.setqf("achievement_points", actual_achievement_points + Reward) -- aqui te suma tus puntos por matarlo cmdchat("achievement ".. Achievement .."_derrotado#".. killcount + 1 .."%".. actual_achievement_points + Reward .."") -- Con esto te saldra la ventana en el cliente diciendo que lo mataste y cuantos puntos tenes endAgora eu ensin como são swaps. No meu caso, as trocas são feitas por um item, mas voçê pode fazer o que quiser iditem.use simplement Ao alterar um npc.chat quando. "Troca de Conquistas" ou como eu gosto. Eu vejo como eu tenho swaps: * Se voçê olhar a última opção na loja troca permite que você veja suas realizações, pois fez uma realização que você adicionar 0 pontos, mas ensina-lhe como : [/center]elseif p2 == 6 thenlocal Reward = 0local Achievement = "Ver_tus_logros"local killcount = pc.getqf("logros")local actual_achievement_points = pc.getqf("achievement_points")pc.setqf("achievement_points", actual_achievement_points + Reward)cmdchat("achievement ".. Achievement .."_derrotado#".. killcount + 1 .."%".. actual_achievement_points + Reward .."")[center] Então, se voçê precisa fazer a sua escolha para ver realizações Eis ^ ^ Como swaps, que são tudo, se voçê quiser fazer seus próprios negócios Faço aqui um pequeno script ou trocar para explicar como seria: when 20095.chat."Canjear mis logros" beginsay_title("Canjear mis logros")say("")say("Hola jugador, si tienes logros")say("yo te los puedo cambiar por cositas.")say("")say("Si no tienes intenta conseguir alguno")say("porque merece la pena")say("")say_reward("Quieres canjear tus punots?")local canje = select ("Si" , "No")if canje == 1 thensay_title("Canjes de logros")say("")say("Elige lo que quieras")local elegir = select ("Quinto bonus - 3 logros" , "Añadir 6-7 bonus - 4 logros" , "Cambiar 6-7 bonus - 5 logros" , "Caballo armado - 6 logros" , "Caballo militar - 8 logros" , "Cerrar")if elegir == 1 thenif pc . getqf ( "achievement_points" ) <= 2 thenchat( "Lo siento necesitas mas puntos" )returnendpc.give_item2("70024", 1)local actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 3 )returnelseif elegir == 2 thenif pc . getqf ( "achievement_points" ) <= 3 thenchat( "Lo siento necesitas mas puntos" )returnendpc.give_item2("71051", 1)local actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 4 )returnelseif elegir == 3 thenif pc . getqf ( "achievement_points" ) <= 4 thensay ( "Lo siento necesitas mas puntos" )returnendpc.give_item2("71052", 1)local actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 5 )returnelseif elegir == 4 thenif pc . getqf ( "achievement_points" ) <= 5 thenchat( "Lo siento necesitas mas puntos" )returnendlocal actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 6 )chat ( "Has recibido un caballo armado" )horse . set_level ( "11" )horse . unsummon ( )horse . summon ( )pc . give_item2 ( "50052" , 1 )returnelseif elegir == 5 thenelseif p == 2 thenif pc . getqf ( "achievement_points" ) <= 7 thensay ( "Lo siento necesitas mas puntos" )returnendlocal actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 8 )chat( "Has recibido un caballo militar" )horse . set_level ( "21" )horse . unsummon ( )horse . summon ( )pc . give_item2 ( "50053" , 1 )returnelseif elegir == 6 thenreturnendelseif canje == 2 thenreturnendendEste script é um pequeno presente para voçê , eu fiz por voçê agora pode usar outro se você não quer que ele tinha em êxtase. * Para colocá-lo em sua busca, voçê pode armazenar os meus swaps e cole este se você quiser, ou fazê-lo como uma busca separada. Finalmente eu explico como swaps de trabalhar com um exemplo: local p = select ( "Caballo armado - 5 logros")if p == 1 thenif pc . getqf ( "achievement_points" ) <= 4 thensay ( "Lo siento necesitas mas puntos" )returnendlocal actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 5 )say ( "Has recibido un caballo armado" )horse . set_level ( "11" )horse . unsummon ( )horse . summon ( )pc . give_item2 ( "50052" , 1 )returnComece com uma = local selecionar para que você escolher a sua recompensa e eu aconselho a colocar muitas realizações, há duro como eu fiz. Então eu coloquei uma restrição, de modo que se você tem menos pontos do que o item que pediu para não deixar de comprar: if pc . getqf ( "achievement_points" ) <= 2 thenchat( "Lo siento necesitas mas puntos" )returnendEle funciona da seguinte forma: onde diz <= 2 você tem que colocar um ponto a menos do que a pedir, porque diz que se você tem esses pontos ou menos não vai deixar de comprar. Após o final de retorno e você só tem que colocar o comando para remover os pontos que você é esta: local actual_achievement_points = pc . getqf ( "achievement_points" )pc . setqf ( "achievement_points" , actual_achievement_points - 5 ) --Poneis ahi los que quereis que quiteE o que você quer que eu dea logo abaixo estas duas linhas: pc.give_item2("71052", 1) --- Ahi poned lo que quereis que deaE isso é tudo cyberianos desfruem do sistema de conquista! : D Créditos: Keko por fazer as quest, eu por traduzir e postar aki, o criador do sistema no tópico ond eu peguei não cita ele. Não testei ainda, mais todos que testaram deu certo, desculpe si o português ta ruim mais foi o maximo que consegui pois tópico original era espanhol. C. Se ajudei não seja egoista da http://cyber-gamers.org/public/style_emoticons/default/451960.gif ae.
  11. Boas,vou ensinar alguns passos para quem quer instalar em dedicados FreeBSD.Não irei postar nada sobre libs,pois isto são alguns passos. É necessário o seguinte [*]Dedicada com FreeBSD 7.2 (32 Bit) [*]ServerFiles [*]WinSCP ou Putty [*]Navicat [*]Filezilla Primeiro vamos atualizar as portas (existem vários mÉtodos): Agora vamos instalar o MySQL Comandos MySQL:
  12. Olá cyber-gamers, hoje vou fazer o meu 1º Tuturial, aceito qualquer tipo críticas. Bem hoje vou ensinar como implementar o sistema "GM-Board" 1º - Extrair o root.eix & root.epk 2º- Procurar pelo game.py e abrir com o notepadd++ 3º Adicionar no game.py 4º - Agora no final de ter posto no game.py abra o uimessenger.py 5º - Agora peguem no uimessenger.py​ e substituem 6º - Metem o nome dos GMs na quest 7º - Guardem e metam em /home/game/share/locale/germany/quest 8º - Dão as permissões 777 9º - Vão a maquina virtual e fazem ./qc gm_list.quest 10º - Dão reboot ao servidor e prontos sistema adicionado 11º - Print Final Download e Virus Total da quest e uimessenger.py Download: http://www.mediafire.com/download/geq3ed77pjq385e/GM+Board%282%29.rar Virus Total: https://www.virustot...sis/1370669813/ Palavra-passe: cyber-gamers Se te ajudei da http://cyber-gamers.org/public/style_emoticons/default/451960.gif TuT Feito Por: мαя¢σs ๖ۣۣۜDaniel Créditos: Quest, Game.py , uimenssager.py fonte: (EPvP)
  13. Vi isso faz algum tempo e é bem legal ! Não é o mesmo daquele feito via quest... Ele usa a HORA DO COMPUTADOR ! O jogo automaticamente altera os céus para noite, manhã, dia, tarde, entardecer... E quantos mais quiser ! O trabalho principal é da EPVP, eu apenas acrescentei mais cenas... Deixei mais completo! Veja logo pelo amanhecer... #AMANHECER HORÁRIO (05, 06, 07) Manhã... Com sol mais alto #MANHÃ HORÁRIO (08, 09, 10) Dia com nuvens... #DIA HORÁRIO (11, 12, 13, 14, 15, 16) Anoitecendo... #ANOITECER HORÁRIO (19, 20) Noite com lua... #NOITE HORÁRIO (21, 22, 23, 00, 01, 02, 03, 04) COMO IMPLEMENTAR: Bem, uma parte é em Phyton, outra é os ficheiros que devem estar atualizados em "enviroment". Parte da programação phyton: PASSO 1 = Descompacte o ROOT.eix e ROOT.epk e extraia o ficheiro constinfo.py PASSO 2 = Logo nas primeiras linhas, acrescente as linhas com o caminho das texturas: Eu coloquei logo abaixo de: CAMERA_MAX_DISTANCE, dê um espaço de 1 linha, mas creio que qualquer lugar no início funciona. Depois salve o arquivo. PASSO 3 = Extraia o ficheiro game.py... Agora que vem a parte com o show: Logo no início, onde tem as linhas de importação, coloque abaixo das outras: Isso fará com que o game.py apresente o ficheiro day.py na programação. (DOWNLOAD DO day.py NO FINAL) PASSO 4 = Procurem pela linha: def __init__(self, stream): E abaixo acrescente: PASSO 5 = Procurem pela linha: Def OnUpdate(self): E abaixo acrescente: PASSO 6 = Desça até o final do arquivo... Depois da última linha. E abaixo acrescente: E assim a parte phyton está OK ! O resto é as texturas e os arquivos ".msenv" PASSO 7 = Como alguns clientes tem já isso pronto, outros tem só parte disso... Eu fiz upload de uma completa e pronta, basta colocar na pasta pack do client. Lá dentro tem os ficheiros .msenv já configurados e várias skybox diferentes para usar, não só as deste tópico! DOWNLOAD LINK: VIA 4SHARED DOWNLOAD DO ARQUIVO "day.py": CLICA ! VERIFICAÇÃO: CLICA ! SENHA PARA DESCOMPACTAR: cyber-gamers.org PASSO 8 = Abram o arquivo index que está na pasta pack e acrescentem: PS: TESTADO 100% ! Funciona perfeitamente em meu client. PS: Evitem os comandos /x 1 e /x 0. Isso pode gerar erros ! Os de neve não houveram conflitos. PS: Do dia pra noite e da noite para o dia, atualiza automaticamente, os outros vão atualizar depois de teleportar ou relogar. PS: Para testar, alterem a hora do computador ! Não se esqueçam que alguns tempos só vão atualizar após reiniciar o personagem ou teleportar. Qualquer dúvida que tiverem, postem aqui no tópico que vos ajudo sempre que puder... Ou então, e um obrigado ! CRÉDITOS: .Xero e xXPx (EPVP) TÓPICO: ToBii (EPVP) ADAPTAÇÃO: Obetuno
  14. Boas pessoal , muitos de vocês tiveram a mesma dúvida que eu tive quando tentei introduzir o calendário de eventos no meu Servidor. Uma coisa tão simples demorou a perceber ... mas pronto , está totalmente inserido sem quaisquer erros/bugs. 1º Faz o download disto > https://mega.co.nz/#!blIwRboC!zR9u3fXGPDQhqtzC_0Tp8rQCFfmWTMOJZYVIcge jJpc Pronto , agora no ficheiro root.eix/epk do teu Cliente , descompactas e vais ao ficheiro game.py e colocas isto : def Calendar(self):import calendarself.calendar = calendar.Calendar()self.calendar.Show() Depois procuras por isto: onPressKeyDict[app.DIK_F4] = lambda : self.__PressQuickSlot(7) E adicionas isto por baixo: onPressKeyDict[app.DIK_F6] = lambda : self.Calendar() * onde está F6 podes alterar para outra tecla * exemplo: onPressKeyDict[app.DIK_F9] = lambda : self.Calendar() Pronto , compactas o ficheiro root e colocas de novo no teu Cliente. Agora pegas no ficheiro que sacas-te calendar.eix/epk e colocas na pasta Pack do teu Cliente, vais a Index e adicionas uma nova linha, ex: calendar* Pronto , agora tens o ficheiro events.calendar , este é o problema de muitos de vocês , não sabem onde colocá-lo e eu respondo , sou um burro ! porque é tão simples . Bastou andar a ler um pouco nos ficheiros do calendar.eix/epk para saber onde colocá-lo. É na pasta inicial do Cliente , onde inicias o Jogo e tens o ficheiro config.exe ... tão simples. Colocas lá ele e voilá :) Vais ao Jogo clicas na tecla F6 (se alteras-te a tecla clicas na que escolheste) e tens ai o Calendário. Nota - Para alterar as imagens é no ficheiro calendar.eix/epk Espero que tenha ajudado, +1 se ajudei :$ Cumprimentos, Berry !
  15. Boas pessoal! Estou aqui para fazer um tutorial de como colocar uma "página" para mostrar os bónus! Imagem: Comecemos o tutorial. 1 - Extrair o root.epk/eix; 2 - Abrir o game.py 2.1 - Procurar por: testAlignment =0 ; 2.2 - Colocar isto abaixo: BPisLoaded=0 2.3 - Procurar por onPressKeyDict[app.DIK_F4] 2.4 - Colocar isto abaixo: onPressKeyDict[app.DIK_F5] = lambda: self.__BonusPage() de maneira a ficar assim: 2.5 - Procurar por def __PressNumKey(self,num): 2.6 - Colar isto abaixo... def __BonusPage(self): import uiBonusPage global BPisLoaded try: if BPisLoaded != 1: exec 'uiBonusPage.BonusBoardDialog().Show()' else: pass except ImportError: import dbg,app dbg.Trace('uiBonusPage.py Importing error') app.Abort() Deverá ficar assim: 2.7 - Guardar o game.py 3 - Abrir o ui.py; 3.1 - Procurar por: def SetOverVisual(self, filename): 3.2 - Colar isto abaixo: def GetText(self):if not self.ButtonText:return# ""return self.ButtonText.GetText() De maneira a ficar assim: 4 - Colocar o ficheiro que vão sacar dentro do root e fazer o seu devido XML; 5 - Compactar, meter na pasta pack do cliente, ir ao jogo e pressionar F5 para testar. PS: O ficheiro que está em download não está traduzido. Download: http://www.mediafire.../uibonuspage.py Scan: https://www.virustot...sis/1374524353/ Ficheiros traduzidos por Sopinhas10: Download: http://www.mediafire.com/download/hdapllub5ct83pl/uibonuspage.py Scan: https://www.virustotal.com/de/file/39b73fcabda9963930d33c355ab79d9b30cf70c17580f90546f589d8c9af25a6/analysis/1374529792/ Creditos: szybki19 (Penso) Fonte: mpcforum. Cumprimentos.
  16. Boas Familia Cyber, Hoje, venho ensinar de uma forma mais clara de como implementar as armas, armaduras e itens em geral nos files e cliente de metin2, Como meter no cliente (para que possa ser visto e usado) Simples... Siga abaixo o tutorial que não tem erro! Ps: Importante fazer back up dos seus arquivos eix e epk que estarão sendo modificados, para caso faça algo de errado, não tenha que recomeçar seu projeto novamente... Vamos lá: --> Icons: (são aqueles desenhos que ficam no seu inventário [em relação a itens]) Uma imagem para mostrar o que eu digo: Como exemplo, isso são icones , agora vamos para o proximo passo: - No seu cliente, abra a pasta Pack e dentro dele , procure o arquivo icon.eix e icon.epk e descompacte-o (ver tutorial do Origin caso não saiba descompactar arquivos Eix e Epk [ se me permite postar ] http://cyber-gamers....ctador-eix-epk/ ) - Depois de descompactado entre na pasta icon / item e jogue todos os icons das suas armaduras que queira implementar. - Após fazer este passo, compacte e jogue no seu cliente. -->Modelos e texturas: - No seu cliente, abra a pasta Pack e dentro dele , procure o arquivo item.eix e item.epk e descompacte-o - Depois de descompactado entre na pasta ymir work/item/weapon e jogar as texturas e os modelos pra lá - Após fazer este passo, compacte e jogue no seu cliente. --> Item Proto , sao nada mais que a leitura dos itens para isso veja como fazer abaixo: - no seu cliente , abra a pasta Pack e dentro dele , procure o arquivo locale_de.eix e locale_de.epk e descompacte-o ( a parte do _de vai depender de cada cliente , pode ser _br _it , etc) - Depois de descompactado, procure um arquivo chamado Item Proto e descompacte este arquivo (não é como descompactar os arquivos eix e epk, para isso usa este programa aqui >> http://www.mediafire...d2o2abj888d245b << ) PS: O programa não é dificil entender , mas caso precise de alguma ajuda, peça por PM aqui na Cyber mesmo , ou via Skype adicionado ao meu perfil - Após o item proto descompactado, adicionar os nomes ao item proto ( geralmente os autores dos itens já deixam pronto para adicionar, copie e cole e pronto, mas caso nao tenha , existe software que cria esses itens proto , o que agora nao tenho para download ) Veja um modelo do item proto (varia de cada item) <Item vnum="19" name="'µµ+9'" gb2312name=" Espada+9" type="1" subtype="0" weight="0" size="2" antiflag="32" flag="1" wearflag="16" immuneflag="0" gold="100" buy_price="750" limittype0="1" limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="7" applyvalue0="22" applytype1="0" applyvalue1="0" applytype2="0" applyvalue2="0" value0="0" value1="15" value2="19" value3="13" value4="15" value5="63" socket0="0" socket1="64992" socket2="127" socket3="64976" socket4="21631" socket5="4855" refine_vnum="0" refine_set="0" magic_pct="15" specular="100" socket_pct="1" /> - agora, nesta mesma pasta onde encontrou o Item proto ( locale eix e epk descompactado ) , localize o arquivo item_list.txt , e lá coloque o diretorio do Icone, um exemplo que eu peguei do meu servidor: Esclarescendo: 29110 e é o numero que segue na sequencia do anterior, no qual 29109 vinha anteriormente Weapon , é o tipo do item (acho que seja apenas para entendimento , mas sempre é bom especificar em inglês) icon/item/11000.tga , é o diretorio, no qual tem que esta no formato Pasta primaria (Icon) , pasta secundaria (item) , nome do icone (ex:11000) e a extensão dele ( .tga ) Geralmente os autores dos itens já facilitam e deixam ja prontos para adicionar, mas caso nao esteja faça como base o meu modelo acima. -> Para o ServerFiles: Ir no navicat, logar no seu servidor, entrar na aba player / queries , e clicar em New Query , colocar sua query la e apertar em Run e fechar (caso queira deixar visivel este query para futuramente modificar, aperte em Save As e coloque um nome que você saiba identificar o que é e logo que toda vez que entrar na aba queries, vai estar la para editar) se caso não saiba criar queries, baixe este programa criado pelo BiffJunior e upado para um novo host por mim http://www.mediafire...rnvp4qw01n515ng , la é só pegar seu item proto (do seu item que quer adicionar), colocar na janela de cima , clicar para converter, e por fim, copiar o que ele gerou, (mas geralmente vem com query, mas sempre tem uma excessão, rs) Imagem abaixo: Um modelo de query para que não se confundam ( cada query tem seu status , portanto toma-se isto como exemplo ) : INSERT INTO player.item_proto VALUES (3230, 'Espada do Valenza+0', 'Espada do Valenza+0', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3231, 0, 0, 15, 1, 85, 0, 0, 7, 10, 9, 10, 3, 2, 0, 280, 310, 400, 450, 22, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3231, 'Espada d oValenza+1', 'Espada do Valenza+1', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3232, 0, 0, 15, 1, 85, 0, 0, 7, 12, 9, 12, 3, 4, 0, 280, 310, 400, 450, 34, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3232, 'Espada doValenza+2', 'Espada do Valenza+2', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3233, 0, 0, 15, 1, 86, 0, 0, 7, 13, 9, 13, 3, 6, 0, 280, 310, 400, 450, 46, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3233, 'Espada do Valenza+3', 'Espada doValenza+3', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3234, 0, 0, 15, 1, 86, 0, 0, 7, 14, 9, 14, 3, 8, 0, 280, 310, 400, 450, 58, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3234, 'Espada do Valenza+4', 'Espada do Valenza+4', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3235, 0, 0, 15, 1, 87, 0, 0, 7, 16, 9, 16, 3, 10, 0, 280, 310, 400, 450, 60, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3235, 'Espada do Valenza+5', 'Espada do Valenza+5', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3236, 0, 0, 15, 1, 87, 0, 0, 7, 17, 9, 17, 3, 12, 0, 280, 310, 400, 450, 82, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3236, 'Espada do Valenza+6', 'Espada do Valenza+6', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3237, 0, 0, 15, 1, 88, 0, 0, 7, 18, 9, 18, 3, 14, 0, 280, 310, 400, 450, 94, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3237, 'Espada do Valenza+7', 'Espada do Valenza+7', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3238, 0, 0, 15, 1, 88, 0, 0, 7, 20, 9, 20, 3, 16, 0, 280, 310, 400, 450, 106, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3238, 'Espada do Valenza+8', 'Espada da Valenza+8', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 3239, 0, 0, 15, 1, 88, 0, 0, 7, 22, 9, 22, 3, 18, 0, 280, 310, 400, 450, 118, -1, -1, -1, -1, -1, -1, 0, 3, -1);INSERT INTO player.item_proto VALUES (3239, 'Espada do Valenza+9', 'Espada do Valenza+9', 1, 0, 0, 2, 32, 1, 16, 0, 10000, 10000, 0, 0, 0, 15, 1, 89, 0, 0, 7, 25, 9, 25, 3, 20, 0, 280, 310, 400, 450, 130, -1, -1, -1, -1, -1, -1, 0, 3, -1); e pronto, dê reboot e testem , o fim disto tudo é claro, muita perfeição e beleza! vejam um video de como que fica (não é tutorial de como implementar mas o resultado) http-~~-//www.youtube.com/watch?v=A_0i031LgIQ&feature=player_embedded Acho que não falta mais nada http://cyber-gamers.org/public/style_emoticons/default/laugh.png Créditos Valenza Cumprimentos,
  17. 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
  18. Após este tempo todo é que vi que o tópico anterior estava incompleto. É de notar que não tenho quaisquer créditos, apenas vou fazer copy & paste (deste vez como deve de ser) com tradução para português e adicionada a TAG [staff]. Chat Global (com opção de activação/desactivação no ficheiro CONFIG) 1º game/input_p2p.cpp 2º game/input_main.cpp 3º game/config.cpp 4º game/config.h 5º .../share/locale/???/ Ficheiros CONFIG Fonte: metin2dev
  19. Boas Pessoal . Estava eu a ver o cliente HabiraMt2 e notei que eles simplesmente mudam o tipo de ficheiro o arquivo continua o mesmo , eu depois de ver isso fui consultar o index e verifiquei que estão lá só o nome dos ficheiros sem o tipo . Ou seja não importa o tipo mas sim que o nome do ficheiro esteja lá . Decidi verificar um cliente que tinha no meu computador e verificar o tamanho dos ficheiros . Ao longo do tutorial iram perceber melhor , eu não quero só ensinar mas sim explicar como funciona . _______________________________________________________________________________________ Cliente usado durante o tutorial: Ficheiros usados para explicar: Bem como podemos verificar na imagem em cima os ficheiros foram alterados para : root.hab root.mt2 A verde o nome do ficheiro A vermelho o tipo de ficheiro Como podem também verificar o tamanho dos ficheiros é diferente e é por ai que vamos por os ficheiros com o tipo de ficheiro certo para descompactação . root.eix > 3 kb root.epk > 385 kb Alteram o nome dos ficheiros conforme o tamanho ou seja : root.mt2 = root.eix > 3 kb root.hab = root.epk > 385 kb Resumindo e concluindo : -Eles apenas alteram o tipo de ficheiro e o cliente só necessita do nome do ficheiro não do tipo esse é indiferente , conforme usei neste tutorial o cliente do HabiraMt2 vocês podem usar de outro cliente qualquer com o tipo de ficheiro alterado , o root.epk será sempre maior que o eix pois o epk e como fosse o suporte do ficheiro e o .eix o que permite descompactar . Depois é só descompactar normalmente . Tópico do melhor programa para descompactar que vi até hoje : http://cyber-gamers.org/index.php?/topic/1040-descompactador-eix-epk/ Créditos: 100% By Pastor Alemão# Conteúdo exclusivo Cyber-Gamers.Org Se este tópico foi útil reputa como agradecimento :) Cumprimentos Pastor Alemão#
  20. Vou explicar como criar um server de Metin2, com Sistema Operativo: FreeBSD, sem as files já prontas! Primeiro devem baixar o .txt com todos os links de download que serão usados neste tutorial! Clicando aqui: http://www.4shared.c...a_download.html Todos os links para download deste tutorial vão estar dentro do arquivo de texto que devem baixar, ai em cima :)-- Dificuldade do tutorial: Média/Dificil, apenas para membros mais avançados. 1. Bem, primeiro devem de baixar umas server files, por exemplo as do Daroo 2010 2. Com o FileZilla ou algum outro programa de sftp, extraiem a pasta /home/game para o Vosso PC. 3. Devem agora de instalar o FreeBSD , de preferencia 8.2 (para as files 2010). 4. Vamos proceder ao upload do /home/game para o VPS ou Dedicado, ou PC onde instalaram o FreeBSD 5. Para este processo ser mais rápido podem compactar o game em tar.gz antes de o extrairem das Files para fora, usando o comando: tar -zcf nome_arq.tar nome_dir_ou_arq_a_ser_compactado6. Agora no upload para descompactarem usam o comando: tar -xvzf nomedoarquivo.tar 7. Vamos agora instalar as Ports no FreeBSD. 1º devem de verificar se têm as mesmas já instaladas, efetuando o comando: cd /usr && ls -a 8. Verifiquem agora se existem alguma pasta chamada Ports, caso contrário vamos instalar.em 9. Executem o seguinte comando: portsnap fetch extract 10. Agora vamos instalar o MYSQL Server executando o seguinte comando: cd /usr/ports/databases/mysql50-server && make WITH_XCHARSET=all install clean Assim que instalar vamos digitar o seguinte comando: ee /etc/rc.conf Agora no fim escrevemos o seguinte: mysql_enable="YES" Damos ESC, salvamos e damos reboot na máquina! 11. Agora temos de ter as DBs. No server do Vosso PC efetuem o Backup das mesmas no Navicat. 12. Vamos antes habilitar o Login no Navicat. Usamos a seguinte série de comandos: /usr/local/etc/rc.d/mysql-server stop[/color]depoischown -R mysql /var/db/mysql && chgrp -R mysql /var/db/mysqldepois voltar a ligar o MYSQL/usr/local/etc/rc.d/mysql-server start---------------+-------------+Gestão da conta MYSQLEscrever: mysqladmin -u root password tuapass [enter]mysql -p [ENTEER]GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'tuapass' WITH GRANT OPTION;[color=#ff0000]13. Agora entramos e repomos o Backup[/color][color=#FF0000]14. Caso ainda não consigam entrar, vamos digitar o seguinte comando:[/color][CODE]mysql -uroot -pgrant all on *.* to NOMEUSER@"ENDEREÇO IP" identified by "PALAVRA PASSE";flush privileges;[/CODE][color=#ff0000]15. Agora vamos configurar o usuario padrão do Metin2 no MYSQL, com o seguinte comando:[/color][CODE]mysql -uroot -pgrant all on *.* to mt2@"localhost" identified by "mt2!@#"; Onde diz mt2 e mt2!@# , é o user e senha, podem ser difereentes dependendo de files para files. Para verem isso basta irem no /home/game/auth, no CONFIG, e tem la os dados do vosso server :) 16. Vamos baixar as libs. O link de download encontra-se no arquivo de texto que baixaram acima. 17. Vamos coloca-las no diretorio Libs do FreeBSD usando o Filezilla.. 18. Pronto! Agora damos cd /home/game && sh start.sh e o servidor vai iniciar :) Créditos: 100% BloodSky
  21. Olá Pessoal Sistema Oficial Crafting para compartilhar hoje Print: Download VT Bem vamos lá: Add game.py dragon_soul_refine_settings.py locale/de/ui dragonsoulrefinewindow.py locale/de/ui dragonsoulwindow.py root uidragonsoul.py .Down()self.deckTab[(page+1)%2].SetUp()self.RefreshEquipSlotWindow()# ¿ëÈ¥¼® È°¼ºÈ* °ü·Ãdef ActivateDragonSoulByExtern(self, deck):self.isActivated = TRUEself.activateButton.Down()self.deckPageIndex = deckself.deckTab[deck].Down()self.deckTab[(deck+1)%2].SetUp()self.RefreshEquipSlotWindow()def DeactivateDragonSoul(self):self.isActivated = FALSEself.activateButton.SetUp()def ActivateButtonClick(self):self.isActivated = self.isActivated ^ TRUEif self.isActivated:if self.__CanActivateDeck():net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))else:self.isActivated = FALSEself.activateButton.SetUp()else:net.SendChatPacket("/dragon_soul deactivate")def __CanActivateDeck(self):canActiveNum = 0for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)if itemVnum != 0:item.SelectItem(itemVnum)isNoLimit = TRUEfor i in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(i)# LIMIT_TIMER_BASED_ON_WEAR´Â ¼ÒÄÏ0¿¡ ³²Àº ½Ã°£À» ¹Ú´Â´Ù.# LIMIT_REAL_TIMEÀº ½Ã°£ ´Ù µÇ¸é ¾ÆÀÌÅÛÀÌ »ç¶óÁö¹Ç·Î ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.# LIMIT_REAL_TIME_START_FIRST_USE´Â ¼*¹ö¿¡ Á¦´ë·Î Á¤ÀǵÇÁö ¾Ê¾Æ ÀÏ´Ü ³ÀµĞ´Ù.if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:isNoLimit = FALSEremain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if 0 != remain_time:canActiveNum += 1break# ŸÀ̸Ӱ¡ ¾ø´Ù¸é ActivateÇÒ ¼ö ÀÖ´Â ¿ëÈ¥¼®.if isNoLimit:canActiveNum += 1return canActiveNum &--#62; 0# È°¼ºÈ* °ü·Ã ³¡# ½½·Ô highlight °ü·Ãdef __HighlightSlot_ClearCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.DeactivateSlot(i)self.listHighlightedSlot.remove(slotNumber)def __HighlightSlot_RefreshCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.ActivateSlot(i)def HighlightSlot(self, slot):if not slot in self.listHighlightedSlot:self.listHighlightedSlot.append (slot)# ½½·Ô highlight °ü·Ã ³¡def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):if app.ENABLE_DRAGON_SOUL_SYSTEM:from _weakref import proxyself.wndDragonSoulRefine = proxy(wndDragonSoulRefine)## °*È*ÇÒ ¼ö ¾ø´Â °æ¿ì ³¯¸®´Â ¿¹¿Ü#class DragonSoulRefineException(Exception):#passclass DragonSoulRefineWindow(ui.ScriptWindow):REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)DS_SUB_HEADER_DIC = {REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE}REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)INVALID_DRAGON_SOUL_INFO = -1def __init__(self):ui.ScriptWindow.__init__(self)self.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.refineChoiceButtonDict = Noneself.doRefineButton = Noneself.wndMoney = Noneself.SetWindowName("DragonSoulRefineWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")except:import exceptionexception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("DragonSoulRefineWindowBaseImage")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndRefineSlot = self.GetChild("RefineSlot")wndResultSlot = self.GetChild("ResultSlot")self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.refineChoiceButtonDict = {self.REFINE_TYPE_GRADE : self.GetChild("GradeButton"),self.REFINE_TYPE_STEP: self.GetChild("StepButton"),self.REFINE_TYPE_STRENGTH : self.GetChild("StrengthButton"),}self.doRefineButton = self.GetChild("DoRefineButton")self.wndMoney = self.GetChild("Money_Slot")except:import exceptionexception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")## Item SlotswndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))self.wndRefineSlot = wndRefineSlotself.wndResultSlot = wndResultSlot## Buttonself.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))self.doRefineButton.SetEvent(self.__PressDoRefineButton)## Dialogself.wndPopupDialog = uiCommon.PopupDialog()self.currentRefineType = self.REFINE_TYPE_GRADEself.refineItemInfo = {}self.resultItemInfo = {}self.currentRecipe = {}self.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.__Initialize()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.__FlushRefineItemSlot()player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)self.Hide()def Show(self):self.currentRefineType = self.REFINE_TYPE_GRADEself.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()self.Refresh()ui.ScriptWindow.Show(self)def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItem# ¹öÆ° ´*·Á ÀÖ´Â »óŸ¦ Á¦¿ÜÇÑ ¸ğµç °*È*â °ü·Ã º¯¼öµéÀ» ÃʱâÈ*.def __Initialize(self):self.currentRecipe = {}self.refineItemInfo = {}self.resultItemInfo = {}if self.REFINE_TYPE_STRENGTH == self.currentRefineType:self.refineSlotLockStartIndex = 2else:self.refineSlotLockStartIndex = 1for i in xrange(self.refineSlotLockStartIndex):self.wndRefineSlot.HideSlotBaseImage(i)self.wndMoney.SetText(locale.NumberToMoneyString(0))def __FlushRefineItemSlot(self):## Item slot settings# ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹for invenType, invenPos, itemCount in self.refineItemInfo.values():remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)self.__Initialize()def __ToggleUpButton(self, idx):#if self.REFINE_TYPE_GRADE == self.currentRefineType:self.refineChoiceButtonDict[idx].Down()def __ToggleDownGradeButton(self):if self.REFINE_TYPE_GRADE == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_GRADEself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStepButton(self):if self.REFINE_TYPE_STEP == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STEPself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStrengthButton(self):if self.REFINE_TYPE_STRENGTH == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STRENGTHself.__FlushRefineItemSlot()self.Refresh()def __PopUp(self, message):self.wndPopupDialog.SetText(message)self.wndPopupDialog.Open()def __SetItem(self, (invenType, invenPos), dstSlotIndex, itemCount):if dstSlotIndex &--#62;= self.refineSlotLockStartIndex:return FALSEitemVnum = player.GetItemIndex(invenType, invenPos)maxCount = player.GetItemCount(invenType, invenPos)if itemCount &--#62; maxCount:raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))#return FALSE# strength °*È*ÀÏ °æ¿ì, 0¹ø¿£ °*È*¼®, 1¹ø¿£ ¿ëÈ¥¼®À» ³õµµ·Ï °*Á¦ÇÔ.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if self.__IsDragonSoul(itemVnum):dstSlotIndex = 1else:dstSlotIndex = 0# ºó ½½·ÔÀ̾î¾ßÇÔ.if dstSlotIndex in self.refineItemInfo:return FALSE# °*È*â¿¡ ¿Ã¸± ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö °Ë»ç.if FALSE == self.__CheckCanRefine(itemVnum):return FALSE# ²ø¾î´Ù ³õÀº ¾ÆÀÌÅÛ Ä«¿îÆ®¸¸Å* ¿ø·¡ ÀÚ¸®ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® °¨¼Òplayer.SetItemCount(invenType, invenPos, maxCount - itemCount)self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)self.Refresh()return TRUE# °*È* °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö üũ# ¿ëÈ¥¼® °*È*´Â °*È* ·¹½ÃÇǸ¦ Á¤Çسõ°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó,# óÀ½¿¡ °*È*â¿¡ ¿Ã¸° ¿ëÈ¥¼®¿¡ ÀÇÇØ °*È* ·¹½ÃÇÇ°¡ °áÁ¤µÈ´Ù.# ±×·¡¼* __CanRefineGrade, __CanRefineStep, __CanRefineStrength ÇÔ¼ö¿¡¼*# °*È* ·¹½ÃÇÇ°¡ ¾ø´Ù¸é(óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀ̶ó¸é), °*È* ·¹½ÃÇǸ¦ ¼³Á¤ÇØÁÖ´Â ¿ªÇÒµµ ÇÑ´Ù.def __CheckCanRefine(self, vnum):if self.REFINE_TYPE_GRADE == self.currentRefineType:return self.__CanRefineGrade(vnum)elif self.REFINE_TYPE_STEP == self.currentRefineType:return self.__CanRefineStep(vnum)elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:return self.__CanRefineStrength(vnum)else:return FALSEreturn TRUEdef __CanRefineGrade (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, °*È* Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineGradeRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStep (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineStepRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStrength (self, vnum):# ¿ëÈ¥¼®ÀÎ °æ¿ì, ´õ ÀÌ»ó strength °*È*¸¦ ÇÒ ¼ö ¾ø´ÂÁö üũÇؾßÇÔ.if self.__IsDragonSoul(vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)import dragon_soul_refine_settingsif strength &--#62;= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE_MORE)return FALSEelse:return TRUE# strength °*È*ÀÇ °æ¿ì, refine_recipe°¡ ¿ëÈ¥¼®ÀÇ Á¾·ù°¡ ¾Æ´Ñ, °*È*¼®ÀÇ Á¾·ù¿¡ µû¶ó ´Ş¶óÁø´Ù.# µû¶ó¼* ¿ëÈ¥¼®ÀÌ ¾Æ´Ï¶ó¸é,# ÀÌ¹Ì ·¹½ÃÇÇ°¡ ÀÖ´Â °æ¿ì´Â, °*È*¼®ÀÌ °*È*â¿¡ ÀÖ´Ù´Â °ÍÀ̹ǷÎ, return FALSE# ·¹½ÃÇÇ°¡ ¾ø´Â °æ¿ì´Â, °*È*¼®ÀÎÁö È®ÀÎÇÏ°í, ·¹½ÃÇǸ¦ ¼ÂÆÃÇÑ´Ù.else:if self.currentRecipe:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEelse:refineRecipe = self.__GetRefineStrengthInfo(vnum)if refineRecipe:self.currentRecipe = refineRecipeself.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# ·¹½ÃÇǸ¦ ¼ÂÆÃÇÒ ¼ö ¾ø´Â °æ¿ìself.__PopUp(locale.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)return FALSEdef __GetRefineGradeRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]}except:return Nonedef __GetRefineStepRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]}except:return None# strength °*È*ÀÇ °æ¿ì, refineInfo´Â °*È*¼®¿¡ µû¶ó ´Ş¶óÁø´Ù.def __GetRefineStrengthInfo (self, itemVnum):try:# À̳ğÀÇ À§Ä¡¸¦ ¾îÂîÇÏÁö....# °*È*¼®ÀÌ ¾Æ´Ï¸é ¾ÈµÊ.item.SelectItem(itemVnum)if not (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):return Noneimport dragon_soul_refine_settingsreturn { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }except:return Nonedef __IsDragonSoul(self, vnum):item.SelectItem(vnum)return item.GetItemType() == item.ITEM_TYPE_DS# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...def __GetDragonSoulTypeInfo(self, vnum):if not self.__IsDragonSoul(vnum):return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFOds_type = vnum / 10000grade = vnum % 10000 /1000step = vnum % 1000 / 100strength = vnum % 100 / 10return (ds_type, grade, step, strength)def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10## ºó ½½·Ô ¼±Åà Eventdef __SelectRefineEmptySlot(self, selectedSlotPos):try:if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnif selectedSlotPos &--#62;= self.refineSlotLockStartIndex:returnif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnif TRUE == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):self.Refresh()except Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)# Ŭ¸¯À¸·Î ½½·Ô¿¡¼* »èÁ¦.def __SelectRefineItemSlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returntry:if not selectedSlotPos in self.refineItemInfo:# »õ·Î¿î ¾ÆÀÌÅÛÀ» °*È*â¿¡ ¿Ã¸®´Â ÀÛ¾÷.if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnself.AutoSetItem((attachedInvenType, attachedSlotPos), 1)returnelif mouseModule.mouseController.isAttached():returnattachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)# °*È*â¿¡¼* »èÁ¦ ¹× ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# °*È*âÀÌ ºñ¾ú´Ù¸é, ÃʱâÈ*if not self.refineItemInfo:self.__Initialize()else:item.SelectItem(selectedItemVnum)# ¾ø¾Ø ¾ÆÀÌÅÛÀÌ °*È*¼®À̾ú´Ù¸é °*È* ·¹Çǽà ÃʱâÈ*if (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):self.currentRecipe = {}self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))# ¿ëÈ¥¼®À̾ú´Ù¸é,# strength°*È*°¡ ¾Æ´Ñ °æ¿ì, °*È*â¿¡ ´Ù¸¥ ¿ëÈ¥¼®ÀÌ ³²¾ÆÀÖÀ¸¹Ç·Î, ·¹½ÃÇǸ¦ ÃʱâÈ*ÇÏ¸é ¾ÈµÊ.# strength°*È*ÀÇ °æ¿ì, °*È* ·¹½ÃÇÇ´Â °*È*¼®¿¡ Á¾¼ÓµÈ °ÍÀ̹ǷΠ´Ù¸¥ ó¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ½.else:passexcept Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)self.Refresh()def __OverInRefineItem(self, slotIndex):if self.refineItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverInResultItem(self, slotIndex):if self.resultItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverOutItem(self):if self.tooltipItem:self.tooltipItem.HideToolTip()def __PressDoRefineButton(self):for i in xrange(self.refineSlotLockStartIndex):if not i in self.refineItemInfo:self.wndPopupDialog.SetText(locale.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)self.wndPopupDialog.Open()returnplayer.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)def OnPressEscapeKey(self):self.Close()return TRUEdef Refresh(self):self.__RefreshRefineItemSlot()self.__ClearResultItemSlot()def __RefreshRefineItemSlot(self):try:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):self.wndRefineSlot.ClearSlot(slotPos)if slotPos &--#60; self.refineSlotLockStartIndex:# self.refineItemInfo[slotPos]ÀÇ Á¤º¸È®ÀÎ# (½ÇÁ¦·Î ¾ÆÀÌÅÛÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎ)# Á¸Àç -&--#62; ¾ÆÀÌÅÛ ¾ÆÀÌÄÜÀ» ½½·Ô¿¡ ¼ÂÆÃ.# ºñÁ¸Àç -&--#62; ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î °*È*â¿¡¼* »èÁ¦.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]itemVnum = player.GetItemIndex(invenType, invenPos)# if itemVnum:if itemVnum:self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)else:del self.refineItemInfo[slotPos]# ºó ½½·Ô¿¡ reference ¾ÆÀÌÄÜÀ» alpha 0.5·Î ¼ÂÆÃ.if not slotPos in self.refineItemInfo:try:reference_vnum = 0# strength °*È*ÀÏ ¶§´Â,# 0¹ø ½½·Ô¿¡ °*È*¼®À», 1¹ø ½½·Ô¿¡ ¿ëÈ¥¼®À» ³õ´Â´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:reference_vnum = 100300else:reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])if 0 != reference_vnum:item.SelectItem(reference_vnum)itemIcon = item.GetIconImage()(width, height) = item.GetItemSize()self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))# slot ¿ìÃø ÇÏ´Ü¿¡ ¼ıÀÚ ¶ß¸é ¾È ¿¹»İ...self.wndRefineSlot.SetSlotCount(slotPos, 0)except:pass# refineSlotLockStartIndex º¸´Ù ÀÛÀº ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©ÁÖ¸é ¾ÈµÊ.self.wndRefineSlot.HideSlotBaseImage(slotPos)# slotPos &--#62;= self.refineSlotLockStartIndex:else:# Á¤»óÀûÀÎ °æ¿ì¶ó¸é ÀÌ if¹®¿¡ µé¾î°¥ ÀÏÀº ¾ø°ÚÁö¸¸,# (¾ÖÃÊ¿¡ À妽º°¡ refineSlotLockStartIndex ÀÌ»óÀÎ ½½·Ô¿¡´Â ¾ÆÀÌÅÛÀ» ³ÖÁö ¸øÇÏ°Ô Ç߱⠶§¹®)# Ȥ½Ã ¸ğ¸¦ ¿¡·¯¿¡ ´ëºñÇÔ.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# refineSlotLockStartIndex ÀÌ»óÀÎ ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©Áà¾ßÇÔ.self.wndRefineSlot.ShowSlotBaseImage(slotPos)# °*È*â¿¡ ¾Æ¹«·± ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é, ÃʱâÈ*ÇØÁÜ.# À§¿¡¼* Áß°£ Áß°£¿¡ "del self.refineItemInfo[slotPos]"¸¦ Ç߱⠶§¹®¿¡,# ¿©±â¼* Çѹø üũÇØÁà¾ßÇÔ.if not self.refineItemInfo:self.__Initialize()self.wndRefineSlot.RefreshSlot()except Exception, e:import dbgdbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)def __GetEmptySlot(self, itemVnum = 0):# STRENGTH °*È*ÀÇ °æ¿ì, ¿ëÈ¥¼® ½½·Ô°ú °*È*¼® ½½·ÔÀÌ ±¸ºĞµÇ¾îÀֱ⠋š¹®¿¡# vnumÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if 0 == itemVnum:return -1if self.__IsDragonSoul(itemVnum):if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.DRAGON_SOUL_SLOTelse:if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.REFINE_STONE_SLOTelse:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):if not slotPos in self.refineItemInfo:return slotPosreturn -1def AutoSetItem(self, (invenType, invenPos), itemCount):itemVnum = player.GetItemIndex(invenType, invenPos)emptySlot = self.__GetEmptySlot(itemVnum)if -1 == emptySlot:returnself.__SetItem((invenType, invenPos), emptySlot, itemCount)def __ClearResultItemSlot(self):self.wndResultSlot.ClearSlot(0)self.resultItemInfo = {}def RefineSucceed(self, inven_type, inven_pos):self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)def RefineFail(self, reason, inven_type, inven_pos):if net.DS_SUB_HEADER_REFINE_ [img]import uiimport playerimport mouseModuleimport netimport appimport sndimport itemimport chatimport grpimport uiScriptLocaleimport uiRefineimport uiAttachMetinimport uiPickMoneyimport uiCommonimport uiPrivateShopBuilderimport localeimport constInfoimport imeimport uiInventoryimport sysITEM_FLAG_APPLICABLE = 1 &--#60;&--#60; 14# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...class DragonSoulWindow(ui.ScriptWindow):KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2,uiScriptLocale.DRAGONSOUL_TAP_TITLE_3, uiScriptLocale.DRAGONSOUL_TAP_TITLE_4, uiScriptLocale.DRAGONSOUL_TAP_TITLE_5, uiScriptLocale.DRAGONSOUL_TAP_TITLE_6]def __init__(self):ui.ScriptWindow.__init__(self)self.questionDialog = Noneself.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.isActivated = FALSEself.DSKindIndex = 0self.tabDict = Noneself.tabButtonDict = Noneself.deckPageIndex = 0self.inventoryPageIndex = 0self.SetWindowName("DragonSoulWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulwindow.py")except:import exceptionexception.Abort("dragonsoulwindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("Equipment_Base")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_01")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_02")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_03")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_04")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_05")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)self.board = self.GetChild("Tab_06")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndItem = self.GetChild("ItemSlot")wndEquip = self.GetChild("EquipmentSlot")self.activateButton = self.GetChild("activate")self.deckTab = []self.deckTab.append(self.GetChild("deck1"))self.deckTab.append(self.GetChild("deck2"))self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.inventoryTab = []self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))self.inventoryTab.append(self.GetChild("Inventory_Tab_05"))self.tabDict = {0 : self.GetChild("Tab_01"),1 : self.GetChild("Tab_02"),2 : self.GetChild("Tab_03"),3 : self.GetChild("Tab_04"),4 : self.GetChild("Tab_05"),5 : self.GetChild("Tab_06"),}self.tabButtonDict = {0 : self.GetChild("Tab_Button_01"),1 : self.GetChild("Tab_Button_02"),2 : self.GetChild("Tab_Button_03"),3 : self.GetChild("Tab_Button_04"),4 : self.GetChild("Tab_Button_05"),5 : self.GetChild("Tab_Button_06"),}self.tabText = self.GetChild("tab_text_area")except:import exceptionexception.Abort("InventoryWindow.LoadWindow.BindObject")## DragonSoul Kind Tapfor (tabKey, tabButton) in self.tabButtonDict.items():tabButton.SetEvent(ui.__mem_func__(self.SetDSKindIndex), tabKey)## ItemwndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))wndItem.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))wndItem.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))wndItem.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))wndItem.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))## EquipmentwndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptyEquipSlot))wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectEquipItemSlot))wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))wndEquip.SetUseSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))wndEquip.SetOverInItemEvent(ui.__mem_func__(self.OverInEquipItem))wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.OverOutEquipItem))## Deckself.deckTab[0].SetToggleDownEvent(lambda arg=0: self.SetDeckPage(arg))self.deckTab[1].SetToggleDownEvent(lambda arg=1: self.SetDeckPage(arg))self.deckTab[0].SetToggleUpEvent(lambda arg=0: self.__DeckButtonDown(arg))self.deckTab[1].SetToggleUpEvent(lambda arg=1: self.__DeckButtonDown(arg))self.deckTab[0].Down()## Grade buttonself.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))self.inventoryTab[4].SetEvent(lambda arg=4: self.SetInventoryPage(arg))self.inventoryTab[0].Down()## Etcself.wndItem = wndItemself.wndEquip = wndEquipself.dlgQuestion = uiCommon.QuestionDialog2()self.dlgQuestion.Close()self.activateButton.SetToggleDownEvent(ui.__mem_func__(self.ActivateButtonClick))self.activateButton.SetToggleUpEvent(ui.__mem_func__(self.ActivateButtonClick))self.wndPopupDialog = uiCommon.PopupDialog()##self.listHighlightedSlot = []## Refreshself.SetInventoryPage(0)self.RefreshItemSlot()self.RefreshEquipSlotWindow()self.RefreshBagSlotWindow()self.SetDSKindIndex(0)self.activateButton.Enable()self.deckTab[self.deckPageIndex].Down()self.activateButton.SetUp()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.Hide()def __DeckButtonDown(self, deck):self.deckTab[deck].Down()def SetInventoryPage(self, page):if self.inventoryPageIndex != page:self.__HighlightSlot_ClearCurrentPage()self.inventoryPageIndex = pageself.inventoryTab[(page+1)%5].SetUp()self.inventoryTab[(page+2)%5].SetUp()self.inventoryTab[(page+3)%5].SetUp()self.inventoryTab[(page+4)%5].SetUp()self.RefreshBagSlotWindow()def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItemdef RefreshItemSlot(self):self.RefreshBagSlotWindow()self.RefreshEquipSlotWindow()def RefreshEquipSlotWindow(self):for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)self.wndEquip.SetItemSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i, itemVnum, 0)self.wndEquip.EnableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)if itemVnum != 0:item.SelectItem(itemVnum)for j in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(j)# ¹Ø¿¡¼* remain_timeÀÌ 0ÀÌÇÏÀÎÁö üũ Çϱ⠶§¹®¿¡ ÀÓÀÇÀÇ ¾ç¼ö·Î ÃʱâÈ*remain_time = 999# ÀÏ´Ü ÇöÀç ŸÀ̸Ӵ ÀÌ ¼¼°³ »ÓÀÌ´Ù.if item.LIMIT_REAL_TIME == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if remain_time &--#60;= 0:self.wndEquip.DisableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)breakself.wndEquip.RefreshSlot()def RefreshStatus(self):self.RefreshItemSlot()def __InventoryLocalSlotPosToGlobalSlotPos(self, window_type, local_slot_pos):if player.INVENTORY == window_type:return self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + local_slot_posreturn (self.DSKindIndex * 5 * player.DRAGON_SOUL_PAGE_SIZE) + self.inventoryPageIndex * player.DRAGON_SOUL_PAGE_SIZE + local_slot_posdef RefreshBagSlotWindow(self):getItemVNum=player.GetItemIndexgetItemCount=player.GetItemCountsetItemVnum=self.wndItem.SetItemSlotfor i in xrange(player.DRAGON_SOUL_PAGE_SIZE):self.wndItem.EnableSlot(i)#&--#60;- dragon soul kindslotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)itemCount = getItemCount(player.DRAGON_SOUL_INVENTORY, slotNumber)if 0 == itemCount:self.wndItem.ClearSlot(i)continueelif 1 == itemCount:itemCount = 0itemVnum = getItemVNum(player.DRAGON_SOUL_INVENTORY, slotNumber)setItemVnum(i, itemVnum, itemCount)if itemVnum != 0:item.SelectItem(itemVnum)for j in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(j)# ¹Ø¿¡¼* remain_timeÀÌ À½¼öÀÎÁö üũ Çϱ⠶§¹®¿¡ ÀÓÀÇÀÇ ¾ç¼ö·Î ÃʱâÈ*remain_time = 999if item.LIMIT_REAL_TIME == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)if remain_time &--#60;= 0:self.wndItem.DisableSlot(i)breakself.__HighlightSlot_RefreshCurrentPage()self.wndItem.RefreshSlot()def ShowToolTip(self, window_type, slotIndex):if None != self.tooltipItem:if player.INVENTORY == window_type:self.tooltipItem.SetInventoryItem(slotIndex)else:self.tooltipItem.SetInventoryItem(slotIndex, player.DRAGON_SOUL_INVENTORY)def OnPressEscapeKey(self):self.Close()return TRUEdef OnTop(self):if None != self.tooltipItem:self.tooltipItem.SetTop()# item slot °ü·Ã ÇÔ¼ödef OverOutItem(self):self.wndItem.SetUsableItem(FALSE)if None != self.tooltipItem:self.tooltipItem.HideToolTip()def OverInItem(self, overSlotPos):self.wndItem.DeactivateSlot(overSlotPos)overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, overSlotPos)try:self.listHighlightedSlot.remove(overSlotPos)except:passself.wndItem.SetUsableItem(FALSE)self.ShowToolTip(player.DRAGON_SOUL_INVENTORY, overSlotPos)def __UseItem(self, slotIndex):ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotIndex, 0):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)self.wndPopupDialog.Open()returnself.__EquipItem(slotIndex)def __EquipItem(self, slotIndex):ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)item.SelectItem(ItemVNum)subType = item.GetItemSubType()equipSlotPos = player.DRAGON_SOUL_EQUIPMENT_SLOT_START + self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + subTypesrcItemPos = (player.DRAGON_SOUL_INVENTORY, slotIndex)dstItemPos = (player.INVENTORY, equipSlotPos)self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)def SelectItemSlot(self, itemSlotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnitemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.RESERVED_WINDOW != attachedInvenType:net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, itemSlotIndex)mouseModule.mouseController.DeattachObject()else:selectedItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)itemCount = player.GetItemCount(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)self.wndItem.SetUseMode(FALSE)snd.PlaySound("sound/ui/pick.wav")def SelectEmptySlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnselectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, selectedSlotPos)print "__debug", selectedSlotPosif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:mouseModule.mouseController.RunCallBack("INVENTORY")elif player.SLOT_TYPE_SHOP == attachedSlotType:net.SendShopBuyPacket(attachedSlotPos)elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:if player.ITEM_MONEY == attachedItemIndex:net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())snd.PlaySound("sound/ui/money.wav")else:net.SendSafeboxCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)elif player.SLOT_TYPE_MALL == attachedSlotType:net.SendMallCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)elif player.RESERVED_WINDOW != attachedInvenType:if player.IsDSEquipmentSlot(attachedInvenType, attachedSlotPos):srcItemPos = (attachedInvenType, attachedSlotPos)dstItemPos = (player.DRAGON_SOUL_INVENTORY, selectedSlotPos)self.__OpenQuestionDialog(FALSE, srcItemPos, dstItemPos)else:itemCount = player.GetItemCount(attachedInvenType, attachedSlotPos)attachedCount = mouseModule.mouseController.GetAttachedItemCount()self.__SendMoveItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos, attachedCount)mouseModule.mouseController.DeattachObject()def UseItemSlot(self, slotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():returnslotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex)try:# ¿ëÈ¥¼® °*È*âÀÌ ¿*·ÁÀÖÀ¸¸é, ¾ÆÀÌÅÛ ¿ìŬ¸¯ ½Ã ÀÚµ¿À¸·Î °*È*âÀ¸·Î µé¾î°¨.if self.wndDragonSoulRefine.IsShow():if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnself.wndDragonSoulRefine.AutoSetItem((player.DRAGON_SOUL_INVENTORY, slotIndex), 1)returnexcept:passself.__UseItem(slotIndex)mouseModule.mouseController.DeattachObject()self.OverOutItem()def __SendMoveItemPacket(self, srcSlotWindow, srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount):if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnnet.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount)# equip ½½·Ô °ü·Ã ÇÔ¼öµé.def OverOutEquipItem(self):self.OverOutItem()def OverInEquipItem(self, overSlotPos):overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, overSlotPos)self.wndItem.SetUsableItem(FALSE)self.ShowToolTip(player.INVENTORY, overSlotPos)def UseEquipItemSlot(self, slotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():returnslotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, slotIndex)self.__UseEquipItem(slotIndex)mouseModule.mouseController.DeattachObject()self.OverOutEquipItem()def __UseEquipItem(self, slotIndex):if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.USE_ITEM_FAILURE_PRIVATE_SHOP)returnself.__OpenQuestionDialog(FALSE, (player.INVENTORY, slotIndex), (1, 1))def SelectEquipItemSlot(self, itemSlotIndex):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnitemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, itemSlotIndex)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()# ÀÚ±â ÀÚ½ÅÀ» ÀÚ±â Àڽſ¡°Ô µå·¡±×ÇÏ´Â °æ¿ìif player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:returnattachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.RESERVED_WINDOW != attachedInvenType:net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.INVENTORY, itemSlotIndex)mouseModule.mouseController.DeattachObject()else:selectedItemVNum = player.GetItemIndex(player.INVENTORY, itemSlotIndex)itemCount = player.GetItemCount(player.INVENTORY, itemSlotIndex)mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)self.wndItem.SetUseMode(FALSE)snd.PlaySound("sound/ui/pick.wav")def SelectEmptyEquipSlot(self, selectedSlot):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnselectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, selectedSlot)if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()if player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, attachedSlotPos, 0):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)self.wndPopupDialog.Open()returnitem.SelectItem(attachedItemIndex)subType = item.GetItemSubType()if subType != (selectedSlot - player.DRAGON_SOUL_EQUIPMENT_SLOT_START):self.wndPopupDialog.SetText(locale.DRAGON_SOUL_UNMATCHED_SLOT)self.wndPopupDialog.Open()else:srcItemPos = (player.DRAGON_SOUL_INVENTORY, attachedSlotPos)dstItemPos = (player.INVENTORY, selectedSlotPos)self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)mouseModule.mouseController.DeattachObject()# equip ½½·Ô °ü·Ã ÇÔ¼öµé ³¡.# °æ°íâ °ü·Ãdef __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos):self.srcItemPos = srcItemPosself.dstItemPos = dstItemPosself.dlgQuestion.SetAcceptEvent(ui.__mem_func__(self.__Accept))self.dlgQuestion.SetCancelEvent(ui.__mem_func__(self.__Cancel))if Equip:self.dlgQuestion.SetText1(locale.DRAGON_SOUL_EQUIP_WARNING1)self.dlgQuestion.SetText2(locale.DRAGON_SOUL_EQUIP_WARNING2)else:self.dlgQuestion.SetText1(locale.DRAGON_SOUL_UNEQUIP_WARNING1)self.dlgQuestion.SetText2(locale.DRAGON_SOUL_UNEQUIP_WARNING2)self.dlgQuestion.Open()def __Accept(self):if (-1, -1) == self.dstItemPos:net.SendItemUsePacket(*srcItemPos)else:self.__SendMoveItemPacket(*(self.srcItemPos + self.dstItemPos + (0,)))self.dlgQuestion.Close()def __Cancel(self):self.srcItemPos = (0, 0)self.dstItemPos = (0, 0)self.dlgQuestion.Close()# °æ°íâ °ü·Ã ³¡def SetDSKindIndex(self, kindIndex):if self.DSKindIndex != kindIndex:self.__HighlightSlot_ClearCurrentPage()self.DSKindIndex = kindIndexfor (tabKey, tabButton) in self.tabButtonDict.items():if kindIndex!=tabKey:tabButton.SetUp()for tabValue in self.tabDict.itervalues():tabValue.Hide()self.tabDict[kindIndex].Show()self.tabText.SetText(DragonSoulWindow.KIND_TAP_TITLES[kindIndex])self.RefreshBagSlotWindow()def SetDeckPage(self, page):if page == self.deckPageIndex:returnif self.isActivated:self.DeactivateDragonSoul()net.SendChatPacket("/dragon_soul deactivate")self.deckPageIndex = pageself.deckTab .Down()self.deckTab[(page+1)%2].SetUp()self.RefreshEquipSlotWindow()# ¿ëÈ¥¼® È°¼ºÈ* °ü·Ãdef ActivateDragonSoulByExtern(self, deck):self.isActivated = TRUEself.activateButton.Down()self.deckPageIndex = deckself.deckTab[deck].Down()self.deckTab[(deck+1)%2].SetUp()self.RefreshEquipSlotWindow()def DeactivateDragonSoul(self):self.isActivated = FALSEself.activateButton.SetUp()def ActivateButtonClick(self):self.isActivated = self.isActivated ^ TRUEif self.isActivated:if self.__CanActivateDeck():net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))else:self.isActivated = FALSEself.activateButton.SetUp()else:net.SendChatPacket("/dragon_soul deactivate")def __CanActivateDeck(self):canActiveNum = 0for i in xrange(6):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)itemVnum = player.GetItemIndex(slotNumber)if itemVnum != 0:item.SelectItem(itemVnum)isNoLimit = TRUEfor i in xrange(item.LIMIT_MAX_NUM):(limitType, limitValue) = item.GetLimit(i)# LIMIT_TIMER_BASED_ON_WEAR´Â ¼ÒÄÏ0¿¡ ³²Àº ½Ã°£À» ¹Ú´Â´Ù.# LIMIT_REAL_TIMEÀº ½Ã°£ ´Ù µÇ¸é ¾ÆÀÌÅÛÀÌ »ç¶óÁö¹Ç·Î ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.# LIMIT_REAL_TIME_START_FIRST_USE´Â ¼*¹ö¿¡ Á¦´ë·Î Á¤ÀǵÇÁö ¾Ê¾Æ ÀÏ´Ü ³ÀµĞ´Ù.if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:isNoLimit = FALSEremain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)if 0 != remain_time:canActiveNum += 1break# ŸÀ̸Ӱ¡ ¾ø´Ù¸é ActivateÇÒ ¼ö ÀÖ´Â ¿ëÈ¥¼®.if isNoLimit:canActiveNum += 1return canActiveNum &--#62; 0# È°¼ºÈ* °ü·Ã ³¡# ½½·Ô highlight °ü·Ãdef __HighlightSlot_ClearCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.DeactivateSlot(i)self.listHighlightedSlot.remove(slotNumber)def __HighlightSlot_RefreshCurrentPage(self):for i in xrange(self.wndItem.GetSlotCount()):slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)if slotNumber in self.listHighlightedSlot:self.wndItem.ActivateSlot(i)def HighlightSlot(self, slot):if not slot in self.listHighlightedSlot:self.listHighlightedSlot.append (slot)# ½½·Ô highlight °ü·Ã ³¡def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):if app.ENABLE_DRAGON_SOUL_SYSTEM:from _weakref import proxyself.wndDragonSoulRefine = proxy(wndDragonSoulRefine)## °*È*ÇÒ ¼ö ¾ø´Â °æ¿ì ³¯¸®´Â ¿¹¿Ü#class DragonSoulRefineException(Exception):#passclass DragonSoulRefineWindow(ui.ScriptWindow):REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)DS_SUB_HEADER_DIC = {REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE}REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)INVALID_DRAGON_SOUL_INFO = -1def __init__(self):ui.ScriptWindow.__init__(self)self.tooltipItem = Noneself.sellingSlotNumber = -1self.isLoaded = 0self.refineChoiceButtonDict = Noneself.doRefineButton = Noneself.wndMoney = Noneself.SetWindowName("DragonSoulRefineWindow")self.__LoadWindow()def __del__(self):ui.ScriptWindow.__del__(self)def Show(self):self.__LoadWindow()ui.ScriptWindow.Show(self)def __LoadWindow(self):if self.isLoaded == 1:returnself.isLoaded = 1try:pyScrLoader = ui.PythonScriptLoader()pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")except:import exceptionexception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")try:if locale.IsARABIC():self.board = self.GetChild("DragonSoulRefineWindowBaseImage")self.board.SetScale(-1.0, 1.0)self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)wndRefineSlot = self.GetChild("RefineSlot")wndResultSlot = self.GetChild("ResultSlot")self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))self.refineChoiceButtonDict = {self.REFINE_TYPE_GRADE : self.GetChild("GradeButton"),self.REFINE_TYPE_STEP: self.GetChild("StepButton"),self.REFINE_TYPE_STRENGTH : self.GetChild("StrengthButton"),}self.doRefineButton = self.GetChild("DoRefineButton")self.wndMoney = self.GetChild("Money_Slot")except:import exceptionexception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")## Item SlotswndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))self.wndRefineSlot = wndRefineSlotself.wndResultSlot = wndResultSlot## Buttonself.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))self.doRefineButton.SetEvent(self.__PressDoRefineButton)## Dialogself.wndPopupDialog = uiCommon.PopupDialog()self.currentRefineType = self.REFINE_TYPE_GRADEself.refineItemInfo = {}self.resultItemInfo = {}self.currentRecipe = {}self.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.__Initialize()def Destroy(self):self.ClearDictionary()self.tooltipItem = Noneself.wndItem = 0self.wndEquip = 0self.activateButton = 0self.questionDialog = Noneself.mallButton = Noneself.inventoryTab = []self.deckTab = []self.equipmentTab = []self.tabDict = Noneself.tabButtonDict = Nonedef Close(self):if None != self.tooltipItem:self.tooltipItem.HideToolTip()self.__FlushRefineItemSlot()player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)self.Hide()def Show(self):self.currentRefineType = self.REFINE_TYPE_GRADEself.wndMoney.SetText(locale.NumberToMoneyString(0))self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()self.Refresh()ui.ScriptWindow.Show(self)def SetItemToolTip(self, tooltipItem):self.tooltipItem = tooltipItem# ¹öÆ° ´*·Á ÀÖ´Â »óŸ¦ Á¦¿ÜÇÑ ¸ğµç °*È*â °ü·Ã º¯¼öµéÀ» ÃʱâÈ*.def __Initialize(self):self.currentRecipe = {}self.refineItemInfo = {}self.resultItemInfo = {}if self.REFINE_TYPE_STRENGTH == self.currentRefineType:self.refineSlotLockStartIndex = 2else:self.refineSlotLockStartIndex = 1for i in xrange(self.refineSlotLockStartIndex):self.wndRefineSlot.HideSlotBaseImage(i)self.wndMoney.SetText(locale.NumberToMoneyString(0))def __FlushRefineItemSlot(self):## Item slot settings# ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹for invenType, invenPos, itemCount in self.refineItemInfo.values():remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)self.__Initialize()def __ToggleUpButton(self, idx):#if self.REFINE_TYPE_GRADE == self.currentRefineType:self.refineChoiceButtonDict[idx].Down()def __ToggleDownGradeButton(self):if self.REFINE_TYPE_GRADE == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_GRADEself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStepButton(self):if self.REFINE_TYPE_STEP == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STEPself.__FlushRefineItemSlot()self.Refresh()def __ToggleDownStrengthButton(self):if self.REFINE_TYPE_STRENGTH == self.currentRefineType:returnself.refineChoiceButtonDict[self.currentRefineType].SetUp()self.currentRefineType = self.REFINE_TYPE_STRENGTHself.__FlushRefineItemSlot()self.Refresh()def __PopUp(self, message):self.wndPopupDialog.SetText(message)self.wndPopupDialog.Open()def __SetItem(self, (invenType, invenPos), dstSlotIndex, itemCount):if dstSlotIndex &--#62;= self.refineSlotLockStartIndex:return FALSEitemVnum = player.GetItemIndex(invenType, invenPos)maxCount = player.GetItemCount(invenType, invenPos)if itemCount &--#62; maxCount:raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))#return FALSE# strength °*È*ÀÏ °æ¿ì, 0¹ø¿£ °*È*¼®, 1¹ø¿£ ¿ëÈ¥¼®À» ³õµµ·Ï °*Á¦ÇÔ.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if self.__IsDragonSoul(itemVnum):dstSlotIndex = 1else:dstSlotIndex = 0# ºó ½½·ÔÀ̾î¾ßÇÔ.if dstSlotIndex in self.refineItemInfo:return FALSE# °*È*â¿¡ ¿Ã¸± ¼ö ÀÖ´Â ¾ÆÀÌÅÛÀÎÁö °Ë»ç.if FALSE == self.__CheckCanRefine(itemVnum):return FALSE# ²ø¾î´Ù ³õÀº ¾ÆÀÌÅÛ Ä«¿îÆ®¸¸Å* ¿ø·¡ ÀÚ¸®ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® °¨¼Òplayer.SetItemCount(invenType, invenPos, maxCount - itemCount)self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)self.Refresh()return TRUE# °*È* °¡´ÉÇÑ ¾ÆÀÌÅÛÀÎÁö üũ# ¿ëÈ¥¼® °*È*´Â °*È* ·¹½ÃÇǸ¦ Á¤Çسõ°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó,# óÀ½¿¡ °*È*â¿¡ ¿Ã¸° ¿ëÈ¥¼®¿¡ ÀÇÇØ °*È* ·¹½ÃÇÇ°¡ °áÁ¤µÈ´Ù.# ±×·¡¼* __CanRefineGrade, __CanRefineStep, __CanRefineStrength ÇÔ¼ö¿¡¼*# °*È* ·¹½ÃÇÇ°¡ ¾ø´Ù¸é(óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀ̶ó¸é), °*È* ·¹½ÃÇǸ¦ ¼³Á¤ÇØÁÖ´Â ¿ªÇÒµµ ÇÑ´Ù.def __CheckCanRefine(self, vnum):if self.REFINE_TYPE_GRADE == self.currentRefineType:return self.__CanRefineGrade(vnum)elif self.REFINE_TYPE_STEP == self.currentRefineType:return self.__CanRefineStep(vnum)elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:return self.__CanRefineStrength(vnum)else:return FALSEreturn TRUEdef __CanRefineGrade (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, °*È* Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineGradeRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStep (self, vnum):ds_info = self.__GetDragonSoulTypeInfo(vnum)if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEif self.currentRecipe:ds_type, grade, step, strength = ds_infocur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)return FALSE# °*È* â¿¡ óÀ½ ¾ÆÀÌÅÛÀ» ¿Ã¸®´Â °æ¿ì, Àç·á¿¡ °üÇÑ Á¤º¸°¡ ¾ø´Ù.# ¿ëÈ¥¼® °*È*°¡, ·¹½ÃÇǸ¦ °¡Áö°í ½ÃÀÛÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, °*È*â¿¡ óÀ½ ¿Ã¸®´Â ¾ÆÀÌÅÛÀÌ ¹«¾ùÀ̳Ŀ¡ µû¶ó,# ¹«¾ùÀ» °*È*ÇÏ°í, Àç·á°¡ ¹«¾ùÀÎÁö(ÀÌÇÏ ·¹½ÃÇÇ)°¡ Á¤ÇØÁø´Ù.# ·¹½ÃÇÇ°¡ ¾ø´Ù¸é, óÀ½ ¿Ã¸° ¾ÆÀÌÅÛÀ̶ó »ı°¢ÇÏ°í, vnumÀ» ¹ÙÅÁÀ¸·Î ·¹½ÃÇǸ¦ ¼ÂÆÃ.else:self.currentRecipe = self.__GetRefineStepRecipe(vnum)if self.currentRecipe:self.refineSlotLockStartIndex = self.currentRecipe["need_count"]self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# °*È* Á¤º¸ ¼ÂÆÿ¡ ½ÇÆĞÇÏ¸é ¿Ã¸± ¼ö ¾ø´Â ¾ÆÀÌÅÛÀ¸·Î ÆÇ´Ü.self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)return FALSEdef __CanRefineStrength (self, vnum):# ¿ëÈ¥¼®ÀÎ °æ¿ì, ´õ ÀÌ»ó strength °*È*¸¦ ÇÒ ¼ö ¾ø´ÂÁö üũÇؾßÇÔ.if self.__IsDragonSoul(vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)import dragon_soul_refine_settingsif strength &--#62;= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE_MORE)return FALSEelse:return TRUE# strength °*È*ÀÇ °æ¿ì, refine_recipe°¡ ¿ëÈ¥¼®ÀÇ Á¾·ù°¡ ¾Æ´Ñ, °*È*¼®ÀÇ Á¾·ù¿¡ µû¶ó ´Ş¶óÁø´Ù.# µû¶ó¼* ¿ëÈ¥¼®ÀÌ ¾Æ´Ï¶ó¸é,# ÀÌ¹Ì ·¹½ÃÇÇ°¡ ÀÖ´Â °æ¿ì´Â, °*È*¼®ÀÌ °*È*â¿¡ ÀÖ´Ù´Â °ÍÀ̹ǷÎ, return FALSE# ·¹½ÃÇÇ°¡ ¾ø´Â °æ¿ì´Â, °*È*¼®ÀÎÁö È®ÀÎÇÏ°í, ·¹½ÃÇǸ¦ ¼ÂÆÃÇÑ´Ù.else:if self.currentRecipe:self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)return FALSEelse:refineRecipe = self.__GetRefineStrengthInfo(vnum)if refineRecipe:self.currentRecipe = refineRecipeself.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))return TRUEelse:# ·¹½ÃÇǸ¦ ¼ÂÆÃÇÒ ¼ö ¾ø´Â °æ¿ìself.__PopUp(locale.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)return FALSEdef __GetRefineGradeRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]}except:return Nonedef __GetRefineStepRecipe (self, vnum):ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)try:import dragon_soul_refine_settingsreturn {"ds_info" : (ds_type, grade, step, strength),"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]}except:return None# strength °*È*ÀÇ °æ¿ì, refineInfo´Â °*È*¼®¿¡ µû¶ó ´Ş¶óÁø´Ù.def __GetRefineStrengthInfo (self, itemVnum):try:# À̳ğÀÇ À§Ä¡¸¦ ¾îÂîÇÏÁö....# °*È*¼®ÀÌ ¾Æ´Ï¸é ¾ÈµÊ.item.SelectItem(itemVnum)if not (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):return Noneimport dragon_soul_refine_settingsreturn { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }except:return Nonedef __IsDragonSoul(self, vnum):item.SelectItem(vnum)return item.GetItemType() == item.ITEM_TYPE_DS# ¿ëÈ¥¼® Vnum¿¡ ´ëÇÑ comment# ITEM VNUMÀ» 10¸¸ ÀÚ¸®ºÎÅÍ, FEDCBA¶ó°í ÇÑ´Ù¸é# FE : ¿ëÈ¥¼® Á¾·ù. D : µî±Ş# C : ´Ü°è B : °*È*# A : ¿©¹úÀÇ ¹øÈ£µé...def __GetDragonSoulTypeInfo(self, vnum):if not self.__IsDragonSoul(vnum):return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFOds_type = vnum / 10000grade = vnum % 10000 /1000step = vnum % 1000 / 100strength = vnum % 100 / 10return (ds_type, grade, step, strength)def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10## ºó ½½·Ô ¼±Åà Eventdef __SelectRefineEmptySlot(self, selectedSlotPos):try:if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returnif selectedSlotPos &--#62;= self.refineSlotLockStartIndex:returnif mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnif TRUE == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):self.Refresh()except Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)# Ŭ¸¯À¸·Î ½½·Ô¿¡¼* »èÁ¦.def __SelectRefineItemSlot(self, selectedSlotPos):if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:returntry:if not selectedSlotPos in self.refineItemInfo:# »õ·Î¿î ¾ÆÀÌÅÛÀ» °*È*â¿¡ ¿Ã¸®´Â ÀÛ¾÷.if mouseModule.mouseController.isAttached():attachedSlotType = mouseModule.mouseController.GetAttachedType()attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()mouseModule.mouseController.DeattachObject()if uiPrivateShopBuilder.IsBuildingPrivateShop():chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)returnattachedInvenType = player.SlotTypeToInvenType(attachedSlotType)if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):returnif player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:returnself.AutoSetItem((attachedInvenType, attachedSlotPos), 1)returnelif mouseModule.mouseController.isAttached():returnattachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)# °*È*â¿¡¼* »èÁ¦ ¹× ¿ø·¡ Àκ¥ÀÇ ¾ÆÀÌÅÛ Ä«¿îÆ® ȸº¹invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# °*È*âÀÌ ºñ¾ú´Ù¸é, ÃʱâÈ*if not self.refineItemInfo:self.__Initialize()else:item.SelectItem(selectedItemVnum)# ¾ø¾Ø ¾ÆÀÌÅÛÀÌ °*È*¼®À̾ú´Ù¸é °*È* ·¹Çǽà ÃʱâÈ*if (item.ITEM_TYPE_MATERIAL == item.GetItemType()and (item.MATERIAL_DS_REFINE_NORMAL &--#60;= item.GetItemSubType() and item.GetItemSubType() &--#60;= item.MATERIAL_DS_REFINE_HOLLY)):self.currentRecipe = {}self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))# ¿ëÈ¥¼®À̾ú´Ù¸é,# strength°*È*°¡ ¾Æ´Ñ °æ¿ì, °*È*â¿¡ ´Ù¸¥ ¿ëÈ¥¼®ÀÌ ³²¾ÆÀÖÀ¸¹Ç·Î, ·¹½ÃÇǸ¦ ÃʱâÈ*ÇÏ¸é ¾ÈµÊ.# strength°*È*ÀÇ °æ¿ì, °*È* ·¹½ÃÇÇ´Â °*È*¼®¿¡ Á¾¼ÓµÈ °ÍÀ̹ǷΠ´Ù¸¥ ó¸®ÇÒ ÇÊ¿ä°¡ ¾øÀ½.else:passexcept Exception, e:import dbgdbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)self.Refresh()def __OverInRefineItem(self, slotIndex):if self.refineItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverInResultItem(self, slotIndex):if self.resultItemInfo.has_key(slotIndex):inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]self.tooltipItem.SetInventoryItem(inven_pos, inven_type)def __OverOutItem(self):if self.tooltipItem:self.tooltipItem.HideToolTip()def __PressDoRefineButton(self):for i in xrange(self.refineSlotLockStartIndex):if not i in self.refineItemInfo:self.wndPopupDialog.SetText(locale.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)self.wndPopupDialog.Open()returnplayer.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)def OnPressEscapeKey(self):self.Close()return TRUEdef Refresh(self):self.__RefreshRefineItemSlot()self.__ClearResultItemSlot()def __RefreshRefineItemSlot(self):try:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):self.wndRefineSlot.ClearSlot(slotPos)if slotPos &--#60; self.refineSlotLockStartIndex:# self.refineItemInfo[slotPos]ÀÇ Á¤º¸È®ÀÎ# (½ÇÁ¦·Î ¾ÆÀÌÅÛÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎ)# Á¸Àç -&--#62; ¾ÆÀÌÅÛ ¾ÆÀÌÄÜÀ» ½½·Ô¿¡ ¼ÂÆÃ.# ºñÁ¸Àç -&--#62; ¾ÆÀÌÅÛÀÌ ¾øÀ¸¹Ç·Î °*È*â¿¡¼* »èÁ¦.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]itemVnum = player.GetItemIndex(invenType, invenPos)# if itemVnum:if itemVnum:self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)else:del self.refineItemInfo[slotPos]# ºó ½½·Ô¿¡ reference ¾ÆÀÌÄÜÀ» alpha 0.5·Î ¼ÂÆÃ.if not slotPos in self.refineItemInfo:try:reference_vnum = 0# strength °*È*ÀÏ ¶§´Â,# 0¹ø ½½·Ô¿¡ °*È*¼®À», 1¹ø ½½·Ô¿¡ ¿ëÈ¥¼®À» ³õ´Â´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:reference_vnum = 100300else:reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])if 0 != reference_vnum:item.SelectItem(reference_vnum)itemIcon = item.GetIconImage()(width, height) = item.GetItemSize()self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))# slot ¿ìÃø ÇÏ´Ü¿¡ ¼ıÀÚ ¶ß¸é ¾È ¿¹»İ...self.wndRefineSlot.SetSlotCount(slotPos, 0)except:pass# refineSlotLockStartIndex º¸´Ù ÀÛÀº ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©ÁÖ¸é ¾ÈµÊ.self.wndRefineSlot.HideSlotBaseImage(slotPos)# slotPos &--#62;= self.refineSlotLockStartIndex:else:# Á¤»óÀûÀÎ °æ¿ì¶ó¸é ÀÌ if¹®¿¡ µé¾î°¥ ÀÏÀº ¾ø°ÚÁö¸¸,# (¾ÖÃÊ¿¡ À妽º°¡ refineSlotLockStartIndex ÀÌ»óÀÎ ½½·Ô¿¡´Â ¾ÆÀÌÅÛÀ» ³ÖÁö ¸øÇÏ°Ô Ç߱⠶§¹®)# Ȥ½Ã ¸ğ¸¦ ¿¡·¯¿¡ ´ëºñÇÔ.if slotPos in self.refineItemInfo:invenType, invenPos, itemCount = self.refineItemInfo[slotPos]remainCount = player.GetItemCount(invenType, invenPos)player.SetItemCount(invenType, invenPos, remainCount + itemCount)del self.refineItemInfo[selectedSlotPos]# refineSlotLockStartIndex ÀÌ»óÀÎ ½½·ÔÀº ´İÈù À̹ÌÁö¸¦ º¸¿©Áà¾ßÇÔ.self.wndRefineSlot.ShowSlotBaseImage(slotPos)# °*È*â¿¡ ¾Æ¹«·± ¾ÆÀÌÅÛÀÌ ¾ø´Ù¸é, ÃʱâÈ*ÇØÁÜ.# À§¿¡¼* Áß°£ Áß°£¿¡ "del self.refineItemInfo[slotPos]"¸¦ Ç߱⠶§¹®¿¡,# ¿©±â¼* Çѹø üũÇØÁà¾ßÇÔ.if not self.refineItemInfo:self.__Initialize()self.wndRefineSlot.RefreshSlot()except Exception, e:import dbgdbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)def __GetEmptySlot(self, itemVnum = 0):# STRENGTH °*È*ÀÇ °æ¿ì, ¿ëÈ¥¼® ½½·Ô°ú °*È*¼® ½½·ÔÀÌ ±¸ºĞµÇ¾îÀֱ⠋š¹®¿¡# vnumÀ» ¾Ë¾Æ¾ß ÇÑ´Ù.if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:if 0 == itemVnum:return -1if self.__IsDragonSoul(itemVnum):if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.DRAGON_SOUL_SLOTelse:if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:return DragonSoulRefineWindow.REFINE_STONE_SLOTelse:for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):if not slotPos in self.refineItemInfo:return slotPosreturn -1def AutoSetItem(self, (invenType, invenPos), itemCount):itemVnum = player.GetItemIndex(invenType, invenPos)emptySlot = self.__GetEmptySlot(itemVnum)if -1 == emptySlot:returnself.__SetItem((invenType, invenPos), emptySlot, itemCount)def __ClearResultItemSlot(self):self.wndResultSlot.ClearSlot(0)self.resultItemInfo = {}def RefineSucceed(self, inven_type, inven_pos):self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)def RefineFail(self, reason, inven_type, inven_pos):if net.DS_SUB_HEADER_REFINE_ [img]http://cyber-gamers.org/public/style_emoticons/<#EMO_DIR#>/55158.gif[/img]http://cyber-gamers.org/public/style_emoticons/<#EMO_DIR#>/55158.gif[/img] == reason:self.__Initialize()self.Refresh()itemCount = player.GetItemCount(inven_type, inven_pos)if itemCount &--#62; 0:self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)else:self.Refresh()def SetInventoryWindows(self, wndInventory, wndDragonSoul):self.wndInventory = wndInventoryself.wndDragonSoul = wndDragonSoul Adicionar game.py ## Inventory Suche Add Game.py # END_OF_CUBE Add Game.py onPressKeyDict[app.DIK_I] = lambda : self.interface.ToggleInventoryWindow() e adicioná-lo onPressKeyDict[app.DIK_O] = lambda : self.interface.ToggleDragonSoulWindowWithNoInfo() Add Game.py # UNKNOWN_UPDATE def BINARY_NEW_AddAffect(self, type, pointIdx, value, duration): self.affectShower.BINARY_NEW_AddAffect(type, pointIdx, value, duration) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulActivate(type - chr.NEW_AFFECT_DRAGON_SOUL_DECK1) elif chr.NEW_AFFECT_DRAGON_SOUL_QUALIFIED == type: self.BINARY_DragonSoulGiveQuilification() def BINARY_NEW_RemoveAffect(self, type, pointIdx): self.affectShower.BINARY_NEW_RemoveAffect(type, pointIdx) if chr.NEW_AFFECT_DRAGON_SOUL_DECK1 == type or chr.NEW_AFFECT_DRAGON_SOUL_DECK2 == type: self.interface.DragonSoulDeactivate() Fonte : EPVP Cumprimentos,
  22. Créditos : NãoHavia . Logo não os coloco . Cumprimentos .
  23. Para quem não quer/não consegue utilizar apenas a sql como base de dados para item e mob proto, deixo abaixo uma solução: O que faz? Acede à base de dados (podem verificar o script, não há acesso externo, por isso podem e devem utilizar a conta localhost para tal), lê o item e mob proto, converte-os para txt e guarda os txt no mesmo directório. Executar o seguinte comando na máquina: Editar esta linha no final dos ficheiros, com o vosso utilizador, password e tabela da base de dados, como por exemplo: Modificar o que está a azul. Colocar os ficheiros na vossa pasta db/conf (onde quer que tenham os txt) Correr os ficheiros utilizando a seguinte estrutura: Download ficheiros: Mirror: Mirror 2: Scan: Scan item.py Scan mob.py Nota: É necessário a máquina ter acesso à internet para poder instalar o MySQLdb para python.
  24. Boas pessoal ! Caminhando por ai encontrei um Costume Sistem "litte-version" alternativo ! Este é bem diferente e bem mais funcional, para aqueles que não tem o Full, na minha opinião esta é a melhor que vi até agora ! Já testei e está ativo em meu servidor 100% sem erros. Aqui tem um video mostrando como é: http-~~-//www.youtube.com/watch?v=PeB_n0qA3RQ Vejam como não tem o slot na window do costume, mas podes retirar clicando lá ! (é um quase full) Ahhh e o mais interessante, NÃO USA MYSQL TABLES ! http://cyber-gamers.org/public/style_emoticons/default/268839.gif Vou deixar tudo que precisa para implementar aqui em baixo. Se fizer tudo corretamente é certeza que funciona ! 1º passo: Descompacte a ROOT e extraia o ficheiro game.py Encontre esta linha: Logo abaixo escreva essas linhas: 2º passo: No final do ficheiro game.py coloque estas linhas, esta parte já é comum nos 2 sistemas: Podem perceber que se compararem os 2 sistemas, este agora contem uma linha com o "vnum" a mais ! Ai que vem a mágica :D 3º passo: Abra o constInfo.py e coloque estas linhas, (parecido como era no outro sistema) 4º passo: Abra o ficheiro interfacemodule.py e encontrem esta linha: E acrescentem estas linhas logo abaixo: 5º passo: Voltem no game.py e procurem esta linha: E acrescentem abaixo: 6º passo: baixe estes ficheiros que contem: DOWNLOAD VIA 4SHARED: CLICA! DOWNLOAD VIA DEPOSITFILES: CLICA! VIRUS-TOTAL: CLICA! CRÉDITOS: Next, »Sakazuki e .XXShuzZzle TÓPICO ORIGINAL: Next³ (EPVP) AGRADECIMENTOS: Danke e ProfessorEnte No tópico original tinham mais informações, porem filtrei só com as informações necessárias. Caso não consigam implementar, eu posso dispor dos ficheiros do meu servidor nesse mesmo tópico ! RESUMINDO... Não tem o sistema full que tem o slot ? esse é o melhor que há :D PS: Neste tópico não contem os ficheiros PACK nem MySQL querys ! Isto você pode pegar no tópico do outro sistema. Gostou do achado ? Lhe foi útil ? http://cyber-gamers.org/public/style_emoticons/default/451960.gif e obrigado !