
DragonBoss
Membro
-
Registro em
-
Última visita
Histórico de Curtidas
-
DragonBoss recebeu reputação de rahim901 em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss deu reputação a Tryller em PokemonApi v1.1=================================================
PokemonAPI v1.1 para PokeXGames client
=================================================
Sobre este Release
Adicionado packet.dll para hooking packets.
Corrigido uma série de bugs, incluindo a plena luz.
Corrigido PokemonAPI_Inject (retirada de algumas partes).
Corrigido turn pack, agora ele é enviado usando packet.dll.
Corrigido move packet, agora é enviado usando packet.dll.
Removidos Ícones, Skins e ContextMenus, precisamos verificar o que está falhando deste cliente no arranque. Nós adicionamos novamente asisjm que possivel.
Aicionado mais funções para Battlelist class.
Corrigido numero e nome dos slots.
Trocado Mana, ManaMax por Pokemons, PokemonsMax.
Trocado Capacity por PokemonsCount.
Removido as funções que não fazem parte do Tibia 8.1.
Sobre a PokemonAPI
PokemonAPI é uma DLL .NET para escrever programas que interagem com o Cliente PokeXGames.
Os programadores: Se você estiver interessado em ajudar com PokemonAPI (adição para a biblioteca, correções de bugs, etc) por favor me familiarizar com a DLL e usá-lo para escrever programas. Depois de criar um programa usando PokemonAPI e publicá-lo, estaremos mais do que felizes em ter você se juntar à equipe.
PokemonAPI é open source e lcalizada no Google Code http://code.google.com/p/pokemonapi
Authors: Tryller, com agradecimentos muito especiais para os desenvolvedores da TibiaAPI e outros.
Downloads
Lista Completa
PokemonAPI v1.1 DLL - Dentro de você encontrará um readme para uso com o Visual Studio.
Issues e Ideas
Por favor: Veja Aqui
Change Log
Ver changelog completo
-
DragonBoss recebeu reputação de crocklinux em Função de Hotkey (Simula pressionamento de hotkeys no tibia)Falaaaa galeraa...
Dando continuidade aos meus tutoriais de programação SEM TIBIAAPI, vou postar agora mais uma função que pode ser util a vocês x.x
Ela trabalha de uma forma simples, só ve qual o texto que foi inserido na função, e trabalha a partir disso (se digitei F1 ele vai usar F1 na janela do tibia)...
Um exemplo de utilização é pra healer... por exemplo (em pseucodes ):
se player.vida <= vida.paraHealar então
Hotkey('F1');
Vamos la:
A função é a seguinte:
function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112; if x ='F2' then i := 113; if x ='F3' then i := 114; if x ='F4' then i := 115; if x ='F5' then i := 116; if x ='F6' then i := 117; if x ='F7' then i := 118; if x ='F8' then i := 119; if x ='F9' then i := 120; if x ='F10' then i := 121; if x ='F11' then i := 122; if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end; Obs: coloque a função abaixo do Implementation, e você pode usa-la no decorrer do programa. Analisando a função ( como sempre x.X ): Ou seja, vamos usar ela assim: Lembrando que o code é bem simples, e só funciona com hotkeys do F1 ao F12 (é só ver o code...mas é fácil adaptar para usar ctrl + F's ) Você pode usar também a função com um edit ou outra coisa do tipo (que seja string)... ou seja: Se no edit1.text tiver escrito F1, ele pressiona essa hotkey no tibia. =] Um code simples, mas, espero que seja util, e que dê ideias de como vocês podem fazer outros sistemas "indetectáveis" pro tibia. flw, abraços galera #Edit Seguindo a sugestão do Flamer para um menor consumo de processamento, fiz uma versão com else if... a função não altera muito (acredito que só seu consumo de processador), ou seja, a utilização fica da mesma forma, se alguém quiser testar a nova função para ver se há mudanças... é a seguinte (só troque a função por essa) : function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112 else if x ='F2' then i := 113 else if x ='F3' then i := 114 else if x ='F4' then i := 115 else if x ='F5' then i := 116 else if x ='F6' then i := 117 else if x ='F7' then i := 118 else if x ='F8' then i := 119 else if x ='F9' then i := 120 else if x ='F10' then i := 121 else if x ='F11' then i := 122 else if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end;
Flw², Abraços²
-
DragonBoss recebeu reputação de aLD em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss recebeu reputação de Augusto em Função de Hotkey (Simula pressionamento de hotkeys no tibia)Falaaaa galeraa...
Dando continuidade aos meus tutoriais de programação SEM TIBIAAPI, vou postar agora mais uma função que pode ser util a vocês x.x
Ela trabalha de uma forma simples, só ve qual o texto que foi inserido na função, e trabalha a partir disso (se digitei F1 ele vai usar F1 na janela do tibia)...
Um exemplo de utilização é pra healer... por exemplo (em pseucodes ):
se player.vida <= vida.paraHealar então
Hotkey('F1');
Vamos la:
A função é a seguinte:
function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112; if x ='F2' then i := 113; if x ='F3' then i := 114; if x ='F4' then i := 115; if x ='F5' then i := 116; if x ='F6' then i := 117; if x ='F7' then i := 118; if x ='F8' then i := 119; if x ='F9' then i := 120; if x ='F10' then i := 121; if x ='F11' then i := 122; if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end; Obs: coloque a função abaixo do Implementation, e você pode usa-la no decorrer do programa. Analisando a função ( como sempre x.X ): Ou seja, vamos usar ela assim: Lembrando que o code é bem simples, e só funciona com hotkeys do F1 ao F12 (é só ver o code...mas é fácil adaptar para usar ctrl + F's ) Você pode usar também a função com um edit ou outra coisa do tipo (que seja string)... ou seja: Se no edit1.text tiver escrito F1, ele pressiona essa hotkey no tibia. =] Um code simples, mas, espero que seja util, e que dê ideias de como vocês podem fazer outros sistemas "indetectáveis" pro tibia. flw, abraços galera #Edit Seguindo a sugestão do Flamer para um menor consumo de processamento, fiz uma versão com else if... a função não altera muito (acredito que só seu consumo de processador), ou seja, a utilização fica da mesma forma, se alguém quiser testar a nova função para ver se há mudanças... é a seguinte (só troque a função por essa) : function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112 else if x ='F2' then i := 113 else if x ='F3' then i := 114 else if x ='F4' then i := 115 else if x ='F5' then i := 116 else if x ='F6' then i := 117 else if x ='F7' then i := 118 else if x ='F8' then i := 119 else if x ='F9' then i := 120 else if x ='F10' then i := 121 else if x ='F11' then i := 122 else if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end;
Flw², Abraços²
-
DragonBoss recebeu reputação de Grippe em ReadProcessMemory - Lendo Valores de memoria sem TibiaAPIAew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.
Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).
Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...
Vamos lá:
ReadProcessMemory
É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.
Entãao... hora de programar \o/
Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...
Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:
PH : THandle; PID, ThID: DWORD; H : THandle; Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...) Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler... function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/ Agora sim vo explicar x.X Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria.... No código da função, começamos com a linha : H := FindWindow(nil, 'Tibia'); A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory. Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo: se eu usar: H := FindWindow('Tibiaclient', nil); // classe da janela do tibia nesse caso, é a mesma coisa de usar: H := FindWindow(nil, 'Tibia'); //nome da janela do tibia Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )... PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... ) ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); E temos o resultado: Result:=value; Analisando a função minha, temos isso: function LerInt(Address: Integer): Integer; Ou seja, LerInt(Address) retornando valor integer... Assim nosso timer atualiza o valor, com o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); // address de vida do tibia 8.7 (se meu address não estiver errado ;P) Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ ).... Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =] Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) vida: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PH : THandle; PID, ThID: DWORD; H : THandle; implementation function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); end; end.
OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...
flw, abraços....
Qualquer duvida, sugestão ou correção... podem falar =]
-
DragonBoss recebeu reputação de Grippe em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss recebeu reputação de Grippe em Função de Hotkey (Simula pressionamento de hotkeys no tibia)Falaaaa galeraa...
Dando continuidade aos meus tutoriais de programação SEM TIBIAAPI, vou postar agora mais uma função que pode ser util a vocês x.x
Ela trabalha de uma forma simples, só ve qual o texto que foi inserido na função, e trabalha a partir disso (se digitei F1 ele vai usar F1 na janela do tibia)...
Um exemplo de utilização é pra healer... por exemplo (em pseucodes ):
se player.vida <= vida.paraHealar então
Hotkey('F1');
Vamos la:
A função é a seguinte:
function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112; if x ='F2' then i := 113; if x ='F3' then i := 114; if x ='F4' then i := 115; if x ='F5' then i := 116; if x ='F6' then i := 117; if x ='F7' then i := 118; if x ='F8' then i := 119; if x ='F9' then i := 120; if x ='F10' then i := 121; if x ='F11' then i := 122; if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end; Obs: coloque a função abaixo do Implementation, e você pode usa-la no decorrer do programa. Analisando a função ( como sempre x.X ): Ou seja, vamos usar ela assim: Lembrando que o code é bem simples, e só funciona com hotkeys do F1 ao F12 (é só ver o code...mas é fácil adaptar para usar ctrl + F's ) Você pode usar também a função com um edit ou outra coisa do tipo (que seja string)... ou seja: Se no edit1.text tiver escrito F1, ele pressiona essa hotkey no tibia. =] Um code simples, mas, espero que seja util, e que dê ideias de como vocês podem fazer outros sistemas "indetectáveis" pro tibia. flw, abraços galera #Edit Seguindo a sugestão do Flamer para um menor consumo de processamento, fiz uma versão com else if... a função não altera muito (acredito que só seu consumo de processador), ou seja, a utilização fica da mesma forma, se alguém quiser testar a nova função para ver se há mudanças... é a seguinte (só troque a função por essa) : function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112 else if x ='F2' then i := 113 else if x ='F3' then i := 114 else if x ='F4' then i := 115 else if x ='F5' then i := 116 else if x ='F6' then i := 117 else if x ='F7' then i := 118 else if x ='F8' then i := 119 else if x ='F9' then i := 120 else if x ='F10' then i := 121 else if x ='F11' then i := 122 else if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end;
Flw², Abraços²
-
DragonBoss recebeu reputação de Renato em ReadProcessMemory - Lendo Valores de memoria sem TibiaAPIAew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.
Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).
Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...
Vamos lá:
ReadProcessMemory
É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.
Entãao... hora de programar \o/
Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...
Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:
PH : THandle; PID, ThID: DWORD; H : THandle; Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...) Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler... function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/ Agora sim vo explicar x.X Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria.... No código da função, começamos com a linha : H := FindWindow(nil, 'Tibia'); A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory. Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo: se eu usar: H := FindWindow('Tibiaclient', nil); // classe da janela do tibia nesse caso, é a mesma coisa de usar: H := FindWindow(nil, 'Tibia'); //nome da janela do tibia Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )... PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... ) ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); E temos o resultado: Result:=value; Analisando a função minha, temos isso: function LerInt(Address: Integer): Integer; Ou seja, LerInt(Address) retornando valor integer... Assim nosso timer atualiza o valor, com o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); // address de vida do tibia 8.7 (se meu address não estiver errado ;P) Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ ).... Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =] Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) vida: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PH : THandle; PID, ThID: DWORD; H : THandle; implementation function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); end; end.
OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...
flw, abraços....
Qualquer duvida, sugestão ou correção... podem falar =]
-
DragonBoss recebeu reputação de EdsonJunior em Função de Hotkey (Simula pressionamento de hotkeys no tibia)Falaaaa galeraa...
Dando continuidade aos meus tutoriais de programação SEM TIBIAAPI, vou postar agora mais uma função que pode ser util a vocês x.x
Ela trabalha de uma forma simples, só ve qual o texto que foi inserido na função, e trabalha a partir disso (se digitei F1 ele vai usar F1 na janela do tibia)...
Um exemplo de utilização é pra healer... por exemplo (em pseucodes ):
se player.vida <= vida.paraHealar então
Hotkey('F1');
Vamos la:
A função é a seguinte:
function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112; if x ='F2' then i := 113; if x ='F3' then i := 114; if x ='F4' then i := 115; if x ='F5' then i := 116; if x ='F6' then i := 117; if x ='F7' then i := 118; if x ='F8' then i := 119; if x ='F9' then i := 120; if x ='F10' then i := 121; if x ='F11' then i := 122; if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end; Obs: coloque a função abaixo do Implementation, e você pode usa-la no decorrer do programa. Analisando a função ( como sempre x.X ): Ou seja, vamos usar ela assim: Lembrando que o code é bem simples, e só funciona com hotkeys do F1 ao F12 (é só ver o code...mas é fácil adaptar para usar ctrl + F's ) Você pode usar também a função com um edit ou outra coisa do tipo (que seja string)... ou seja: Se no edit1.text tiver escrito F1, ele pressiona essa hotkey no tibia. =] Um code simples, mas, espero que seja util, e que dê ideias de como vocês podem fazer outros sistemas "indetectáveis" pro tibia. flw, abraços galera #Edit Seguindo a sugestão do Flamer para um menor consumo de processamento, fiz uma versão com else if... a função não altera muito (acredito que só seu consumo de processador), ou seja, a utilização fica da mesma forma, se alguém quiser testar a nova função para ver se há mudanças... é a seguinte (só troque a função por essa) : function hotkey(x :string): string; var h: HWND; i : integer; begin if x ='F1' then i := 112 else if x ='F2' then i := 113 else if x ='F3' then i := 114 else if x ='F4' then i := 115 else if x ='F5' then i := 116 else if x ='F6' then i := 117 else if x ='F7' then i := 118 else if x ='F8' then i := 119 else if x ='F9' then i := 120 else if x ='F10' then i := 121 else if x ='F11' then i := 122 else if x ='F12' then i := 123; h := FindWindow(nil, 'Tibia'); // acha a janela do tibia SendMessage(h, WM_KEYdown, i, 0); //pressiona a tecla SendMessage(h, WM_KEYUP, i, 0); //solta tecla end;
Flw², Abraços²
-
DragonBoss deu reputação a Renato em [TibiaAPI] Player (Tutorial)Ola Tbnet!
Aqui vou trazer para vocês algumas funções do player, as bem básicas.
Para que possam usar em seus bots!
Lembrando que usarei exemplos com a variável "p"
Dim p As PlayerSe o seu for player As Player, edite todos os p. por player.
p.Mana - se refere á mana do player, você pode usálo em um mana restore com timer e if.
Exemplo em if:
If p.Mana <= TextBox1.Text ThenSe a mana do player for menor ou igual ao texto do TextBox1, então..
p.Health - se refere ao health do player, você pode usárlo em um Heal com timer e if
Exemplo em if:
If p.Health <= TextBox1.Text ThenSe a hp do player for menor ou igual ao texto do TextBox1, então..
p.TargetId - se refere ao target do player, ou seja, o player ou bixo que ele está atacando.
Exemplo em if:
If p.TargetId = 0Se o target do player for igual a 0 (0 é o valor dado quando o player não está atacando ninguém)
If p.Target > 0 Se o target do player for maior que 0 (1 ou mais é o valor dado quando o player está atacando alguém)
p.Walk - se refere á onde o player andar.
Exemplo em ação:
p.Walk(Direction.Down) Player mova para baixo.
p.Walk(Direction.Up) Player mova para cima.
p.Walk(Direction.Left) Player mova para esquerda.
p.Walk(Direction.Right) Player mova para direita.
//usando em um botão por exemplo no event click, ao clicar no botão o player irá andar um sqm para a direção definida.
p.Turn - se refere para onde o player está virado.
Exemplo em ação:
p.Turn(Direction.Down) Player vire para baixo.
//não tem segredo, é igual o Walk só que aqui ele vai virar e não dar.
p.BlackSquare - se refere ao ataque contra você [o quadrado preto]
Exemplo em if:
If p.BlackSquare = 1 Then Se o 'blacksquare' for igual a 1 então.. (1 é quando alguém atacou você, seja player ou monstro)
If p.BlackSquare = 0 Then Se o blacksquare for igual a 0 então... (0 é quando ninguém está te atacando, seja player ou monstro)
p.Capacity - se refere ao 'cap' do personagel
Exemplo em if:
If p.Capacity <= TextBox1.Text Se o cap do player foi menor ou igual ao texto do textbox1 então..
// da pra fazer um alert usando Process.Start("C:\...\tibiabotsnet.wav") ou My.Computer.Audio.Play(Application.StartupPath & "\tibiabotsnet.wav")
• Skill
Valor bruto:
p.Level - Se refere ao level do player.
p.Stamina - Se refere á stamina do player.
p.Axe - Se refere ao axe skill do player.
p.Club - Se refere ao club skill do player.
p.Sword - Se refere ao sword skill do player.
p.MagicLevel - Se refere ao magic level skill do player.
p.Fist - Se refere ao fist skill do player.
p.Fishing - Se refere ao fishing skill do player
p.Shielding - Se refere ao shielding skill do player
Valor porcentagem:
p.LevelPercent - Se refere á valor da porcentagem do level.
p.AxePercent - Se refere á valor da porcentagem do axe fighting.
p.ClubPercent - Se refere á valor da porcentagem do club fighting
p.SwordPercent - Se refere á valor da porcentagem do sword fighting.
p.MagicLevelPercent - Se refere á valor da porcentagem do magic level.
p.FistPercent - Se refere á valor da porcentagem do fist fighting.
p.FishingPercent - Se refere á valor da porcentagem do fishing.
p.ShieldingPercent - Se refere á valor da porcentagem do shielding.
//com isto da pra você simular o skill do player no bot, parecido com o FerumbrasBot.
• Posições.
p.Location - Se refere á localização do personagem.
Valores:
p.Location.X - Se refere á localização X do personagem (x é a coordenada horizontal)
p.Location.Y - Se refere á localização Y do personagem (y é a coordenada vertical)
p.Location.Z - Se refere á localização Z do personagem (z é o floor, "andar")
//da pra criar um tipo de "verificar coordenadas" no seu bot, em tempo real usando timer (Label1.Text = p.Location.X & p.Location.Y & p.Location.Z) e no load do form (Timer1.Start())
• Set Outfit
Cores:
p.HeadColor - Se refere á cor do cabelo.
p.BodyColor - Se refere á cor da camisa.
p.LegsColor - se refere á cor da calça.
p.FeetColor - Se refere á cor do 'tenis'.
//da pra mudar a cor usando este exemplo em uma ação: p.HeadColor = Tibia.Constants.OutfitColor.Black
Outfit:
p.OutfitType - Se refere ao type do outfit do player.
//da pra mudar o outfit usando este exemplo em uma ação: p.OutfitType = OutfitType.AssassinMale ou p.OutfitType = OutfitType.Demon
Addon:
p.Addon - Se refere ao addon do player.
//da pra trocar o addon usando este exemplo em uma ação: p.Addon = OutfitAddon.Addon1 ou p.Addon = OutfitAddon.Addon2 ou p.Addon = OutfitAddon.Both
• Executando uma Ação
Is:
p.IsAttacking() - o player está full attack.
p.IsBlocking - o player está full block.
p.IsReachable() - se o player está na tela.
p.IsSelf() - não sei oque é.
p.IsVisible - se o player está visível.
p.IsWalking - se o player está andando.
Por enquanto é isso!
-
DragonBoss recebeu reputação de Augusto em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss recebeu reputação de Rick Martin em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss recebeu reputação de Puncker em Função Say para o Tibia (Sem TibiaAPI)Falaaa galera x.x
Tentando dar uma continuidade à programação para tibia sem uso de tibiaapi, vo postar uma função aqui (meio que 'gambiarra', mas, funciona)...
No outro tutorial eu expliquei um pouco sobre leitura de memoria.. esse aqui não tem muito a ver, mas, complementa aquele pra quem quer fazer bot sem TibiaAPI x.X
Primeira observação: As funções são declaradas abaixo do implementation, e ae podem ser usadas somente completando os argumentos delas... como de costume, minhas funções usam argumentos simples.
Segunda observação: Essa função vai digitar letra por letra da mensagem e depois dar um enter.
Função Say:
function say(mensagem: string):string; var h: HWND; letra: Integer; B: Byte; begin h := FindWindow(nil, 'tibia'); for letra := 1 to Length(mensagem) do begin B := Byte(mensagem[letra]); SendMessage(h, WM_CHAR, B, 0); end; SendMessage(h, WM_CHAR, 13, 0); end; Analisando a função: H = janela do tibia. Mensagem = mensagem que a função vai digitar no tibia. as variáveis Letra e B trabalharam assim: a letra vai de 1 até a quantia de caracteres da mensagem, e o B se torna o byte da letra a ser enviada... e ele envia com a API SendMessage (é uma API do windows, e NÃO tem nada a ver com TibiaAPI ). No fim temos: SendMessage(h, WM_CHAR, 13, 0); Isso será responsável por apertar um Enter após ele terminar de digitar a mensagem ( 13 = VK_return = Enter ). Olhando a primeira linha, vemos como podemos usa-la: function say(mensagem: string):string; Ou seja, é só usar assim: Say('mensagem aqui'); ou com um edit: Say(edit1.text);
Pode usar de diversas formas, desde que ele trabalhe com uma string =]
Segue em Anexo a source de um projeto somente com a função, e um exemplo de usa-la, com um edit e um botão (você digita a mensagem no edit, e clica no botão.. e ele envia pro tibia \o/ )....
Flw galera, abraços...
Sei que tá bem simples, mas, espero que ajude vocês.
_____________________________________________________________
Usando Função Say.rar
-
DragonBoss recebeu reputação de Augusto em ReadProcessMemory - Lendo Valores de memoria sem TibiaAPIAew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.
Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).
Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...
Vamos lá:
ReadProcessMemory
É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.
Entãao... hora de programar \o/
Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...
Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:
PH : THandle; PID, ThID: DWORD; H : THandle; Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...) Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler... function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/ Agora sim vo explicar x.X Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria.... No código da função, começamos com a linha : H := FindWindow(nil, 'Tibia'); A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory. Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo: se eu usar: H := FindWindow('Tibiaclient', nil); // classe da janela do tibia nesse caso, é a mesma coisa de usar: H := FindWindow(nil, 'Tibia'); //nome da janela do tibia Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )... PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... ) ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); E temos o resultado: Result:=value; Analisando a função minha, temos isso: function LerInt(Address: Integer): Integer; Ou seja, LerInt(Address) retornando valor integer... Assim nosso timer atualiza o valor, com o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); // address de vida do tibia 8.7 (se meu address não estiver errado ;P) Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ ).... Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =] Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) vida: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PH : THandle; PID, ThID: DWORD; H : THandle; implementation function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); end; end.
OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...
flw, abraços....
Qualquer duvida, sugestão ou correção... podem falar =]
-
DragonBoss recebeu reputação de Puncker em ReadProcessMemory - Lendo Valores de memoria sem TibiaAPIAew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.
Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).
Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...
Vamos lá:
ReadProcessMemory
É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.
Entãao... hora de programar \o/
Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...
Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:
PH : THandle; PID, ThID: DWORD; H : THandle; Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...) Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler... function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/ Agora sim vo explicar x.X Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria.... No código da função, começamos com a linha : H := FindWindow(nil, 'Tibia'); A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory. Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo: se eu usar: H := FindWindow('Tibiaclient', nil); // classe da janela do tibia nesse caso, é a mesma coisa de usar: H := FindWindow(nil, 'Tibia'); //nome da janela do tibia Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )... PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... ) ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); E temos o resultado: Result:=value; Analisando a função minha, temos isso: function LerInt(Address: Integer): Integer; Ou seja, LerInt(Address) retornando valor integer... Assim nosso timer atualiza o valor, com o seguinte código: vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); // address de vida do tibia 8.7 (se meu address não estiver errado ;P) Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ ).... Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =] Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) vida: TLabel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; PH : THandle; PID, ThID: DWORD; H : THandle; implementation function LerInt(Address: Integer): Integer; var value:integer; ler :dword; begin H := FindWindow(nil, 'Tibia'); ThID := GetWindowThreadProcessId(H, @PID); PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID); ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); Result:=value; end; {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); begin vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C)); end; end.
OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...
flw, abraços....
Qualquer duvida, sugestão ou correção... podem falar =]
-
DragonBoss deu reputação a Ink em [Tutorial] MontariasBoa noite pessoal!
É com prazer que apresento meu primeiro e mais simples tutorial!
Você não é premmy e queria ter uma montaria!? Esse código é sua solução
Bom galera como é de costume de todo bom programador, vou listar todos os objetos que vou utilizar no tutorial, seus respectivos nomes e texto exibido.
1 Label = lbltitulo = Selecione a montaria desejada:
1 Combo Box = cmbmont = - Nenhuma -
1 Botão = cmdmontar = Montar
Agora já com os objetos listados vamos programar.
Vamos começar pelo Combo Box.
Selecione o cmblista e nas suas propriedades do lado direito do monitor localize a propriedade Items, clique no botão e uma janela vai aparecer.
Digite a lista de montarias.
- Nenhuma - Black Sheep Blazebringer Draptor Midnight Panther Rapid Bird Rapid Boar Stampor Tin Lizzard Titanica Undead Cavebear War Bear Widow Queen Agora em Text coloque: - Nenhuma - E na propriedade Sorted coloque True, assim a lista vai ficar em ordem alfabética. Feito isso de um duplo clique no cmdmontar e vamos aos códigos. If c.LoggedIn Then If cmbmont.Text = "Widow Queen" Then p.MountId = 368 End If If cmbmont.Text = "Rapid Bird" Then p.MountId = 369 End If If cmbmont.Text = "War Bear" Then p.MountId = 370 End If If cmbmont.Text = "Black Sheep" Then p.MountId = 371 End If If cmbmont.Text = "Midnight Panther" Then p.MountId = 372 End If If cmbmont.Text = "Draptor" Then p.MountId = 373 End If If cmbmont.Text = "Titanica" Then p.MountId = 374 End If If cmbmont.Text = "Tin Lizzard" Then p.MountId = 375 End If If cmbmont.Text = "Blazebringer" Then p.MountId = 376 End If If cmbmont.Text = "Rapid Boar" Then p.MountId = 377 End If If cmbmont.Text = "Stampor" Then p.MountId = 378 End If If cmbmont.Text = "Undead Cavebear" Then p.MountId = 379 End If If cmbmont.Text = "- Nenhuma -" Then p.MountId = 0 End If End if
Vou explicar o código por partes.
If c.LoggedIn Then - Uma condição para que as funções que vem abaixo dela sejam executadas sem problemas maiores, nesse caso ele valida se o player está ou não OnLine.
If cmbmont.Text = "Nome da montaria" Then - Outra condição, está define o id de cada montaria. Eu poderia ter usado Select Case preferi usar if pois o tutorial é para iniciantes.
p.MountId = ID - Essa função é aonde o seu char "monta", ela edita o Look do seu char para que ele monte o monstro selecionado na cmbmont
If cmbmont.Text = "- Nenhuma -" Then p.MountId = 0 - Faz seu personagem ficar sem montaria nenhuma.
End If - Fecha as condições.
Bom galera é isso.
Espero que vocês possam usar isso no seus Bot's
Qualquer dúvida eu respondo por mp ou postem ai!
Abraços!
Ink