Tudo que Elwyn postou
-
É possivel o triple bolt crossbow efetivamente atirar 3 bolts?
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.
-
Erro linux
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
-
Erro linux
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++
- Python IPChanger
- Python IPChanger
- Python IPChanger
-
Python IPChanger
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.
-
Python ou Java
Python é muito boa, em sintaxe e em performance.
-
Python IPChanger
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:
-
TFS 10.55/10.56 postar ou não postar?
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?
-
Python IPChanger
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:
-
Qual a melhor seção para postar um ip-changer em desenvolvimento?
Obrigado pela ajuda.
-
Qual a melhor seção para postar um ip-changer em desenvolvimento?
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.
-
(Resolvido)HELP NPC
(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"
-
(Resolvido)HELP NPC
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.
-
Criando arquivo makefile
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.
-
(Resolvido)HELP NPC
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.
-
(Resolvido)IPChanger - Ptrace
Farei isso.
-
(Resolvido)HELP NPC
(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.
-
(Resolvido)HELP NPC
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.
-
(Resolvido)IPChanger - Ptrace
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
-
(Resolvido)IPChanger - Ptrace
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)
-
(Resolvido)IPChanger - Ptrace
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.
-
TFS 10.55/10.56 postar ou não postar?
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.
-
TFS 10.55/10.56 postar ou não postar?
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.