Ir para conteúdo

Elwyn

Membro
  • Registro em

  • Última visita

Tudo que Elwyn postou

  1. O que você quer fazer seria isso? Se for, é possível. Inclusive no TFS 1.0 que só tem as funções mais básicas. Basta usar onUseWeapon.
  2. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Roda então antes do autogen.sh esse comando: $ ./configure --enable-mysql Apesar que para compilar não precisei rodar o autogen hora nenhuma, apenas fiz ./configure && ./build.sh
  3. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Usa Ubuntu/Debian ou seu Linux suporta apt-get? Se sim rode esse comando: $ sudo apt-get install automake autoconf build-essential Por você estar tendo este erro me parece que você não instalou todas dependências necessárias para compilar as sources. As dependências para compilar um TFS 1.0 são: $ sudo apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmysqlclient-dev libboost-system-dev Abaixo disso talvez seja necessário a instalação da libcrypto++
  4. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Funcionando em todas as versões. Com interface gráfica minima. Atualmente estou estudando a portabilidade para Windows.
  5. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Assim que esse IPChanger estiver pronto, totalmente funcional e com interface gráfica. Começarei a fazer uma portabilidade para Windows, em um repositório no github também para aceitar contribuições.
  6. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    O código tem 100 linhas, mas para windows teria muito mais. Posso pesquisar como fazer para windows antes de começar a fazer a interface gráfica, mas é provável que não fique tão bom como esse ficou.
  7. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    O problema não é nem compilar ele para windows, é a forma em que processos são tratados no windows e linux. Assim como a diferença entre escrever e ler um endereço na memória de um certo processo. No linux dá para usar ptrace, no windows teria que usar outra biblioteca com outras funções.
  8. Elwyn postou uma resposta no tópico em Playground (Off-topic)
    Python é muito boa, em sintaxe e em performance.
  9. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Veja o lado bom, eu e o Milice atualizamos constantemente o ipchanger do Kiltera, então vocês não vão ficar sem suporte por muito tempo. Esse ipchanger foi feito mais pra galera do Linux que não tem opção além de usar otclient. Mas eu vou falar com o Milice e passar para ele o algoritimo que tornou esse IPChanger universal e ele atualizar o IPChanger do Kiltera para ser universal também. Edit: Imagem do ipchanger funcionando:
  10. Se você usa linux, o meu ipchanger funciona pra 10.57 @Topic A propósito. Também estou atualizando o TFS para 10.55~10.57 Eu percebi que toda vez que o player morre, agora ele recebe um debug. Vocês conseguiram resolver isso?
  11. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Estou, juntamente com o Lordfire, desenvolvendo um IPChanger para Tibia em python. A versão que se encontra agora no repositório é uma versão em fase de desenvolvimento e não está completa. Não recomendo utilizar por enquanto. O IPChanger está sendo feito usando a biblioteca python-ptrace, para python 3. Mais pra frente do desenvolvimento será adicionado uma interface gráfica feita em GTK. Suporte para Windows por enquanto está fora de cogitação. Este IPChanger tem o intuito de ser anonimo e independente de atualização, então estamos fazendo ele de forma que não importa a versão ele irá funcionar sem problemas. Assim não será necessário esperar uma equipe, ou pessoa, com acesso as sources e conhecimento para atualizar pra versão mais nova do Tibia, será apenas necessário atualizar o seu OTServer e tentar conectar. Repositório: https://github.com/gugahoa/ipchanger-otbr Desculpa o tópico curto, não tenho experiencia apresentando projetos e programas, além que o ipchanger ainda não tem muita coisa para se apresentar além do repositório. Estamos abertos a sugestões e críticas. Funcionando para todas as versões agora. Imagem do ipchanger funcionando:
  12. Obrigado pela ajuda.
  13. Não encontrei uma seção em que eu possa fazer um tópico sobre o ip-changer que estou desenvolvendo atualmente em Python. Qual a seção mais aceitável para postar esse tipo de assunto? Tem a seção de "Desenvolvimento e Programação" mas ela não tem o fórum para Python.
  14. (O código está no "Spoiler", se quiser entender o que eu fiz, leia abaixo) Então, dessa vez existiam muitos erros de lógica então eu fiz um novo. Eu percebi que quando você fala "collect" pela primeira vez, tem um texto, da segunda em diante outra. E que você usa um storage para saber onde da quest está o player, então eu fiz o seguinte: if msgcontains(msg, "collect") then npcHandler.topic[cid] = 2 if player:getStorageValue(15434) < 1 then npcHandler:say({ 'I collect everything that reflects light in strange ways. However, I am bored by my collection. And there wasn\'t anything new to add for years. ...', 'I like pearls for example - but I have already enough. I also like shells - but I can\'t even count how many I already own. ...', 'If you find anything of REAL VALUE - bring it to me. I will reward you well. You don\'t already have something for me by chance?' }, cid) else npcHandler:say("Have you got anything for me today?", cid) end end Se a storage que você está usando ainda não tiver sido inicializada, ele fala a mensagem inicial, se não, a segunda. Para entrar em "collect" eu botei para não precisar falar "help" para poupar tempo do player. Agora sobre o tratamento da mensagem "yes", eu fiz o seguinte: Ele só vai entrar no bloco de código para o "yes" se já tiver passado pelo "collect", ou seja, o npcHandler.topic[cid] == 2. E dentro do bloco de código para o "yes" eu verifiquei com if e elseif em qual parte da quest o player está para dar o storage correto ao player. Dessa forma: elseif msgcontains(msg, "yes") and npcHandler.topic[cid] == 2 then if player:getStorageValue(15434) < 1 then if player:getItemCount(15435) > 0 then npcHandler.topic[cid] = 0 npcHandler:say("Great! Let me see. Amazing! I will take this, thank you!", cid) player:setStorageValue(15434, 2) player:removeItem(15435, 1) else npcHandler:say("You don\'t have anything with a REAL VALUE for me!", cid) end elseif player:getStorageValue(15434) == 2 then if player:getItemCount(15436) > 0 then npcHandler.topic[cid] = 0 npcHandler:say("Great! Let me see. Amazing! I will take this, thank you!", cid) player:setStorageValue(15434, 3) player:removeItem(15436, 1) else npcHandler:say("You don\'t have anything with a REAL VALUE for me!", cid) end elseif player:getStorageValue(15434) == 3 then if player:getItemCount(15434) > 0 then npcHandler.topic[cid] = 0 npcHandler:say("Great! Let me see. Amazing! I will take this, thank you!", cid) player:setStorageValue(15434, 4) player:removeItem(15434, 1) else npcHandler:say("You don\'t have anything with a REAL VALUE for me!", cid) end elseif player:getStorageValue(15434) == 4 then npcHandler.topic[cid] = 0 player:addAchievement('Spolium Profundis') player:addOutfitAddon(463, 1) player:addOutfitAddon(464, 1) player:setStorageValue(15434, 5) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) npcHandler:say({ 'Have you got anything... what? You want what? A reward? HAHAHAHAAAA!! ...', 'No I\'m just teasing you. I\'m really happy about my collection now. ... ', 'Well, I found some kind of weapon a long time ago. I believe it may be especially helpful underwater as it is from the deep folk. In any case it is of more use for you than it would be for me.' }, cid) elseif player:getStorageValue(15434) == 5 then npcHandler:say("You already got your reward.", cid) end end Botei um detalhe também no final, para quando o player já pegou o reward dele, o npc avisar se ele falar outro "collect / yes"
  15. Tem um detalhe só, se o player ficar repetindo "yes", o item vai ser removido mais de uma vez. Nada demais, mas que é bom consertar.
  16. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Você pode rodar servidores 32bits em máquinas 64bits sem problemas, apesar que é recomendado compilar um 64bits. Nas versões mais novas do TFS você não vai precisar checar nada, ele faz tudo automaticamente para você, sem chance de erro da parte do Makefile ou cmake. No caso de versões antigas e você estiver no linux é só rodar no terminal ./autogen.sh && ./configure --enable-mysql && make -j4 Se você não quiser usar mysql e sim sql, a flag é --enable-sqlite se não me engano. Se você estiver no windows, manda o Makefile aqui para eu ver como te ajudar.
  17. Desculpa, não entendi direito sua duvida. Você quis dizer que ele não vai entrar em "Segundo Código" com a keyword 'yes'? Se for o caso, ele deverá entrar se você na primeira parte mudar o npc.Handler.topic[cid] para 2 e ele falar 'yes' novamente.
  18. (O código está no "Spoiler", se quiser entender o que você errou leia abaixo) Mesmo erro que o anterior. Vário elseifs iguais, logo nunca vai passar do primeiro. Ajuda bastante para você pode procurar erros se você identar o código, fica mais perceptível o que cada bloco do código faz. O que estou falando de vários elseif iguais é isso que você está fazendo: if msgconstains(msg, 'yes') then -- Código elseif msgcontains(msg, 'yes') then -- Segundo Código end Se você fizer isso, ele nunca vai entrar no bloco do "Segundo Código", sempre parando no primeiro. Você tem que fazer assim, por exemplo: if msgcontains(msg, 'yes') then if npcHandler.topic[cid] == 1 then -- Código elseif npcHandler.topic[cid] == 2 then -- Segundo Código end end Lembrando que os if npcHandler.topic tem que ser elseif, se não o player pode falar um yes e acabar percorrendo o diálogo inteiro do npc sem querer. Ah, e nos seus dois códigos agora o player pode pegar o item várias vezes apenas repetindo "yes", é bom você por uma restrição nos ifs para isso não acontecer. Nos dois códigos eu tomei a liberdade e fiz isso, adicionando o "and player:getStorageValue(value) ~= 1" E quando o player já tem esse storage e mesmo assim falar "yes" é bom você fazer o npc falar algo tipo "Você já esteve aqui" ou "Você já aceitou a quest" e derivados, para o player não ficar no vento sem saber se ele pegou tudo que podia ou não.
  19. local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local function creatureSayCallback(cid, type, msg) if not npcHandler:isFocused(cid) then return false end local player = Player(cid) if msgcontains(msg, "help") then if npcHandler.topic[cid] == 0 then npcHandler.topic[cid] = 1 npcHandler:say("Yeah yeah, you can help me actually. You know, I feel some bad vibes coming out of the earth, recently. I think there's something wrong with the creatures of the deep. Care to join me?", cid) else npcHandler:say('I don\'t know what you are talking about.', cid) end elseif msgcontains(msg, 'yes') then if npcHandler.topic[cid] == 1 then npcHandler.topic[cid] = 2 npcHandler:say({ 'Great, great. There is something going on, you know? I can feel it in my bones. There really are some bad spirits down there. ...', 'See, a long time ago I acquired these nets. They are called soul nets. Do you know what they can do? Neither do I. ...', 'What I know is they vibrate when evil is near. Yeah, vibration man. ...', 'They also let evil glow in a deep red. Glowing red stuff. So next time you go down there, just take one with you and when you find evil spirits - catch them with the net. ...', 'They will vanish in an instant. But - you will have to take care that all bad spirits in the near vicinity vanish almost instantaneously or they will regenerate. ...', 'So you might need some help down there, my friend. Ready to do this?' }, cid) elseif npcHandler.topic[cid] == 2 and player:getStorageValue(15433) ~= 1 then player:setStorageValue(15433, 1) player:addItem(15433, 1) npcHandler:say("Good, I hope this will help you keeping the spirits away.", cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setMessage(MESSAGE_GREET, "Hi there |PLAYERNAME|, and welcome to the gray island.") npcHandler:setMessage(MESSAGE_FAREWELL, "See you, |PLAYERNAME|.") npcHandler:setMessage(MESSAGE_WALKAWAY, "See you, |PLAYERNAME|.") npcHandler:addModule(FocusModule:new()) Você tinha dois elseifs iguais, então o segundo nunca era checado na prática.
  20. Estou atualizando ele para 10.56 agora. A versão que eu botei no github ainda está incompleta e é um protótipo mas funciona para 8.6, falta a parte de trocar rsa key e interface gráfica. https://github.com/gugahoa/ipchanger-otbr/tree/master
  21. Resolvido. A versão correta estava em outra parte da memória. O executável fica em duas partes da memória, creio que um seja o esqueleto e outro seja o corpo atual do programa. 08048000-0841f000 r-xp 00000000 08:04 9438516 /home/gugah/devel/cpp/tibia/tibia-client/860/Tibia 0841f000-08420000 rw-p 003d7000 08:04 9438516 /home/gugah/devel/cpp/tibia/tibia-client/860/Tibia Em 0841f000-08420000 fica o corpo do programa depois de substituir todos %s e %d se eu estiver correto. Um pequeno programa em python mostrando o funcionamento: import ptrace import os import binascii process = os.popen("pidof -s Tibia") pid = process.readlines() pid = int(pid[0]) print pid ptrace.attach(pid) base_addr = 0x841f000 data = ptrace.peekdata(pid, base_addr + 0x9213 + 8) data = hex(data) data = binascii.unhexlify(data[2:]) data = ''.join(reversed(data)) data = data[:4] print data ptrace.detach(pid, 18)
  22. Se eles souberem sobre Python e não for muito incomodo, pergunta também se eles conhecem alguma lib para process tracing em windows. A que estou usando funciona apenas para linux. E se ele conhece algum método bom de se conseguir o pid de um processo através do nome dele, o atual método que estou usando é baseado no ipchanger do Lordfire em C++, iterando sobre todos os processos procurando aquele que tem o nome Tibia.
  23. Então é provável que eles consertem no próximo patch como você disse, ou lancem algum hotfix assim que algum player reportar esse debug.
  24. Se não está resolvido no 10.56, provavelmente não vai estar no 10.57 Não deve ser um bug não intencional. A CipSoft deve ter feito dessa maneira porque de um jeito ou de outro ela não quer players com mais de 50 mounts.

Informação Importante

Confirmação de Termo