OnCoderS

Sources e os melhores coders de jogos da atualidade estão aqui. MuOnline, Lineage II, FlyFF, AION, Ragnarok, GunBound, entre outros. Não deixe de conferir e aprender. -Variedades Infinitas de Programações como : C++, C#, ASM, PHP entre outros.


    [ASM] NPC de Teleport

    Compartilhe
    avatar
    Motto
    Fundador
    Fundador

    Mensagens : 37
    Data de inscrição : 30/08/2009
    Idade : 24
    Localização : Piracicaba

    [ASM] NPC de Teleport

    Mensagem  Motto em Seg Ago 31, 2009 7:48 pm

    Ao falar com o NPC Crossbow Guard irá ser teletransportado para Lorencia (152, 52)

    Use ASM Compiler, compile o arquivo e hook no GS
    Funciona corretamente no GS v.1.00.16 do Endi, Luciano e SCF.
    Se deseja por em outras versões, mude o offset do gObjTeleport..

    Poderá personalizar um NPC para outras funções

    .386
    .Model flat, StdCall
    Option CaseMap:none
    Include \masm32\include\windows.inc
    Include \masm32\include\user32.inc
    Include \masm32\include\kernel32.inc
    Include \masm32\include\masm32.inc
    IncludeLib \masm32\lib\user32.lib
    IncludeLib \masm32\lib\kernel32.lib
    IncludeLib \masm32\lib\masm32.lib

    .Const

    .Data
    gObjTeleport DD 004F6230H

    .Data?

    .Code
    DllEntry Proc hInstDLL: HINSTANCE, reason: DWord, reserved1: DWord
    Mov Eax, TRUE
    Ret
    DllEntry EndP

    NewNPC Proc
    Local PlayerID: DWord
    Local Map: DWord
    Local X: DWord
    Local Y: DWord
    Mov EAX, DWord Ptr SS: [EBP+ 8] //no código ASM o EAX é quem recebe o retorno do EBP, por isso todas as manipulação são feitas em cima dele
    Mov EDX, DWord Ptr DS: [EAX]
    Mov PlayerID, EDX
    Mov Map, 0
    Mov X, 98H
    Mov Y, 34H
    Mov EAX, Y
    Push EAX
    Mov ECX, X
    Push ECX
    Mov EDX, Map
    Push EDX
    Mov EAX, PlayerID
    Push EAX
    Call gObjTeleport
    Ret
    NewNPC EndP
    End DllEntry

    Procure pelo offset e hook o código do NewNPC aqui:

    00405AF6 $ /E9 75541400 JMP gameserv.NPCDeviasGuard

    Obs.: esse é o offset referente ao NPC Crossbow Guard, porem se deseja por outro offset de NPC e faça a ligação (hook) corretamente.


    Se tiver problemas vá em (aqui precisará ligar para o seu NPC proc, veja como foi apagado todas as linhas e adicionado uma chamada):
    Código:

    0054A306 |> \FF15 71A35B00 CALL DWORD PTR DS:[5BA371]
    0054A30C |. 90 NOP
    0054A30D |. 90 NOP
    0054A30E |. 90 NOP
    0054A30F |. 90 NOP
    0054A310 |. 90 NOP
    0054A311 |. 90 NOP
    0054A312 |. 90 NOP
    0054A313 |. 83C4 08 ADD ESP,8
    0054A316 |. 83F8 01 CMP EAX,1

    Precisa por o NPC no arquivo MonsterSetBase.txt:
    Código:

    247 1 "Xbow Guard"

    Um NPC tem apenas 1 função, onde 0 = enviar texto, 1 = teletransporte, 2 = dar item, 3 = pegar item, etc.

    Código:

    Ini1 DB "NewNPC", 0
    Ini2 DB "Function", 0
    IniPath DB "./NewNPC.ini", 0

    NewNPC Proc
    Invoke GetPrivateProfileInt, Addr Ini1, Addr Ini2, NULL, Addr IniPath
    Cmp eax, 0
    Je DisplayText
    Cmp eax, 1
    Je DoTeleport
    Cmp eax, 2
    Je GiveItem
    Cmp eax, 3
    Je TakeIitem
    ...

    DisplayText:
    (exibe o texto)
    Jmp TheEnd
    DoTeleport:
    (código do teleport)
    Jmp TheEnd
    ...

    TheEnd:
    Ret.

    E com este exemplo pode criar o NewNPC e configurar sua função no arquivo Newnpc.ini. O melhor é não usar os mesmos parâmetros para todas as ações.
    Exemplo. Newnpc.ini
    Código:

    [NewNPC]
    Action = 0 // 0 = enviar texto, 1 = teletransporte, 2 = dar item, 3 = tomar item

    [Text]
    Text1 = Blabla...
    Text2 = Blablabla...

    [Teleport]
    Map = 0 // 0 = lorencia, 1=..., etc
    X = 125 //coordenadas
    Y = 125 //coordenadas

    [Take Item]
    Item = AB //ID (em hex) do item
    Zen = 100000

    Créditos: Høl¥ (RG Int)

    Existe uma outra versão do código que também pode ser usada:
    Código:

    .386
    .Model flat, StdCall
    Option CaseMap:none
    Include \masm32\include\windows.inc
    Include \masm32\include\user32.inc
    Include \masm32\include\kernel32.inc
    Include \masm32\include\masm32.inc
    IncludeLib \masm32\lib\user32.lib
    IncludeLib \masm32\lib\kernel32.lib
    IncludeLib \masm32\lib\masm32.lib

    .Const

    .Data
    gObjTeleport DD 004F6230H

    .Data?

    .Code
    DllEntry Proc hInstDLL: HINSTANCE, reason: DWord, reserved1: DWord
    Mov Eax, TRUE
    Ret
    DllEntry EndP

    NewNPC Proc //mudança nos offsets de X, Y, mapa em gObj
    Push 034H
    Push 098H
    Push 0
    Mov Eax, DWord Ptr Ss:[Ebp + 8]
    Mov Eax, DWord Ptr Ds:[Eax]
    Push Eax
    Call gObjTeleport
    Ret
    NewNPC EndP

    End DllEntry

    Para compilar a DLL ASM
    1º. Instale o programa "MASM32" (se tiver problemas com o MASM use o FlatAssembler http://flatassembler.net/)

    2º. Abra a tela de comando
    "Menu Iniciar" (do Windows) ~> "Executar" ~> digite "cmd" e clique em Enter/Ok
    ou procure o "Prompt de comando" em "Menu Iniciar" ~> "Acessórios"

    3º. No prompt de comando (cmd) digite:
    \masm32\bin\ml /c /coff NPCTeleport.asm
    Esse comando irá criar o arquivo chamado NPCTeleport.obj

    4º. No mesmo prompt de comando (cmd) digite:
    \masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL GReset.obj
    Esse comando irá criar o arquivo chamado NPCTeleport.dll

    5º. Ligue o dll ao GS (hook)

    Criando NPC e add no jogo ~> http://www.ragezone.com.br/showthread.php?t=728
    Código NPC, Mobs e itens ~> http://www.ragezone.com.br/showthread.php?t=669

    Use/entenda ASM com C/C++ ~> http://www.ragezone.com.br/showthread.php?t=36834
    Há vários tipos de registradores, todos de 32 bits (em nosso estudo):
    - Registradores de uso geral, que são como variáveis e podem conter qualquer tipo de dados;
    - Registradores de segmento, nos computadores com arquitetura 16 bits, guardavam o endereço dos segmentos e, nesta série de artigos não serão usados, sendo matéria para um artigo posterior.
    - Registradores de propósito especial, que não podem ser manipulados(pelo menos diretamente), como é o caso do que mantém o endereço da próxima instrução a ser executada.

    Entre os de uso geral, há quatro que podem se usados de três maneiras diferentes. São eles:
    - EAX: conhecido como Acumulador, pois mantém os resultados das operações matemáticas;
    - EBX: conhecido como Base, pois ele é usado, geralmente, como ponteiro de uma string;
    - ECX: conhecido como Contador, pois o principal uso é em controlar loops e,
    - EDX: conhecido como registrador de Dados, isto é, pode conter um endereço que aponte para uma variável, uma string.

    Os Registradores SI, DI, BP e SP:
    - ESI: o Índice de Origem (Source Index), é usado geralmente para indicar o local de onde vem uma string, num comando de movimentação de dados.
    - EDI: o Índice de Destino (Destination Index), é usado geralmente para indicar o local onde uma string deve ser armazenada, num comando de movimentação de dos.
    - EBP: o Ponteiro de Base(Base Pointer), geralmente usado como um ponteiro numa pilha de dados para armazenar endereços de argumentos(passados por referência), valores de argumentos(passados por valor), endereço de retorno da função. Por isso, não brinque muito com esse registrador.
    - ESP: o Ponteiro de Pilha(Stack Pointer), outro registrador de pilha, que mantém o endereço atual da pilha – esse valor vai sempre diminuindo até chegar a zero(um caso extremo), quando o Windows ou qualquer outro Sistema Operacional vai reclamar de falta de memória. Não brinque muito com esse registrador, pois pode fazer seu programa travar.

      Data/hora atual: Sex Out 19, 2018 4:00 pm