Brazilian Modding Studio
Olá, seja bem vindo à Comunidade BMS!

Para se registrar no fórum, siga os passos:

1 - Clique em "Registrar-se" aqui em baixo;
2 - Aceite os termos de serviço;
3 - Escolha um nome de usuário e senha;
4 - Realize o login no fórum clicando em "Conectar-se".

Compartilhe
avatar
Programador - Avançado
Programador - Avançado
Mensagens : 18221
Reputação : 384
Desde : 04/05/2012
Idade : 21
Link : gtamodvicio.blogspot.com
Ver perfil do usuáriohttp://gtamodvicio.blogspot.com
  • Reputação da mensagem: 100% (1 votos)
em Sab 31 Mar 2018, 15:28
Para que serve:
Caso você queira criar um mod cleo, mas precise enviar uma função low level para alguma coisa e mesmo assim fazer as ações via CLEO, este código pode ser a solução.

Problemas conhecidos:
Não pode usar call function de dentro do próprio script para a função gerada, pois o código em questão usa uma "thread" de script separada e o sistema do jogo não foi feito para isso.
Pode bugar o log do SCRLog caso crashe no meio de uma callback.

Quem sabe eu melhore no futuro esse sistema, ou quem sabe seja incluído na CLEO algum dia.

Leia os comentários dentro dos códigos.

GTA3Script:
Código:

SCRIPT_START
{
    NOP // 2 bytes
gambiarra:
    LVAR_INT init generateFunctionCallback
    GET_LABEL_POINTER _initCPPCode init
    
// chama apenas uma vez e no início do código para inicializar o código C++
    CALL_FUNCTION init 0 0




// gambiarra para pegar o offset da label
    LVAR_INT label1, label2, function
    GET_LABEL_POINTER gambiarra label1
    GET_LABEL_POINTER nocheats label2

    label1 -= label2
    label1 -= 2 // Scripts externos/CLEO usam offset negativo




   // Exemplo de uso para desativar os cheats do jogo e mostrar "Cheats não são permitidos"
    CLEO_CALL generateFunctionCallback 0    label1 0 0   function // label offset, num parameters, pop bytes, retorna endereço da função

    LVAR_INT startCheatArray
    startCheatArray = 0x008A5B58

    WHILE startCheatArray < 0x008A5CC8
        WRITE_MEMORY startCheatArray 4 function 1
        startCheatArray += 4
    ENDWHILE




// Não finalize o script
ad_infinitum:
    WAIT 0x7FFFFFFF
    GOTO ad_infinitum
}
SCRIPT_END

{ // Exemplo de função
    LVAR_INT injector__regpackPointer // injector::reg_pack
    // Declare others parameters
nocheats:
    PRINT_STRING_NOW "Cheats nao sao permitidos" 5000
    WAIT 0
}


//
{
    LVAR_INT label, params, popbytes
    LVAR_INT callbackSizeFun callbackSize memory
    LVAR_INT generateFunction currentThreadPtr returnPointer
generateFunctionCallback: // {label, nparams, popbytes} -> Returns function address    
    GET_LABEL_POINTER _getCallBackSize  callbackSizeFun
    CALL_FUNCTION_RETURN callbackSizeFun 0 0  callbackSize
    ALLOCATE_MEMORY callbackSize memory // CLEO destruirá a alocação automaticamente ao recarregar o jogo
    GET_LABEL_POINTER _generateFunction  generateFunction
    GET_THIS_SCRIPT_STRUCT currentThreadPtr
    CALL_FUNCTION_RETURN generateFunction 5 5 popbytes params label currentThreadPtr memory  (returnPointer)
    CLEO_RETURN 0 returnPointer
}

{
DUMP
e8 01 00 00 00 c3 8b 04 24 83 e8 05 c3 55 31 c0 89 e5 8b 4d 08 53 8b 5d 0c 3b 45 10 74 09 8a 14 03 88 14 01 40 eb f2 5b 5d c3 55 89 e5 57 56 53 81 ec 0c 01 00 00 8b 5d 0c 8b 55 08 85
db 0f 84 33 01 00 00 8b 83 e8 00 00 00 83 78 10 00 0f 84 23 01 00 00 8d b5 0c ff ff ff 31 c0 b9 02 00 00 00 89 f7 f3 ab 8d 85 1c ff ff ff c7 85 04 ff ff ff 00 00 00 00 8d 4d 9c c7
85 08 ff ff ff 00 00 00 00 c7 85 14 ff ff ff 00 00 00 00 c7 85 18 ff ff ff 00 00 00 00 66 c7 85 3c ff ff ff 00 00 c6 45 c8 00 c6 45 c9 00 c6 45 ca 00 c6 45 cb 00 c6 45 cc 00 c6 45
cd ff c7 45 d0 00 00 00 00 66 c7 45 d4 00 00 c6 45 d6 00 c6 45 d7 01 c6 45 d8 00 c7 45 dc 00 00 00 00 c6 45 e0 00 66 c7 45 e2 ff ff c6 45 e4 00 c7 00 00 00 00 00 83 c0 04 39 c8 75
f3 8d 85 40 ff ff ff 8d 4d c0 c7 00 00 00 00 00 83 c0 04 39 c8 75 f3 c7 45 c4 00 00 00 00 8d 7b 04 b9 e1 00 00 00 c7 45 c0 00 00 00 00 8d b5 04 ff ff ff f3 a4 8b 83 e8 00 00 00 8b
40 10 c6 83 cb 00 00 00 01 c6 83 c8 00 00 00 01 89 53 40 89 43 14 8b 83 ec 00 00 00 89 43 18 8b 83 f0 00 00 00 c1 e0 02 89 44 24 08 8b 42 10 89 44 24 04 8d 43 44 83 c3 04 89 04 24
e8 9f fe ff ff 89 1c 24 ff 15 09 03 00 00 81 c4 0c 01 00 00 5b 5e 5f 5d c3
ENDDUMP

_getCallBackSize:
DUMP
55 b8 20 01 00 00 89 e5 5d c3
ENDDUMP

_generateFunction: // (cppToCleoCallback *nCallback, CRunningScript *owner, int atLabel, int nparams, int popBytes) -> Returns function address
DUMP
55 89 e5 57 56 53 83 ec 4c 8b 5d 08 8b 45 10 8b 4d 14 8b 55 0c 8d bb f4 00 00 00 89 7d c4 8d bb 0b 01 00 00 89 8b f0 00 00 00 89 c1 c1 f9 1f 31 c8 29 c8 03 42 10 89 1b 89 93 e8 00 00
00 89 83 ec 00 00 00 c6 83 f4 00 00 00 60 c6 83 f5 00 00 00 80 c7 83 f6 00 00 00 44 24 0c 04 c6 83 fa 00 00 00 9c c6 83 fb 00 00 00 54 c6 83 fc 00 00 00 68 89 9b fd 00 00 00 c6 83
01 01 00 00 68 c7 83 02 01 00 00 2a 00 00 00 c6 83 06 01 00 00 68 c7 83 07 01 00 00 00 00 00 00 c6 83 0b 01 00 00 e8 c7 83 0c 01 00 00 00 00 00 00 66 c7 83 10 01 00 00 83 c4 c6 83
12 01 00 00 10 c6 83 13 01 00 00 80 c7 83 14 01 00 00 6c 24 10 04 c6 83 18 01 00 00 9d c6 83 19 01 00 00 61 8b 45 18 80 3d 11 05 00 00 00 c6 83 1a 01 00 00 c2 66 89 83 1b 01 00 00
75 07 c6 05 11 05 00 00 01 8d 75 d8 8d 45 d0 89 74 24 04 89 04 24 c7 44 24 08 00 00 00 00 89 7d d8 e8 7e 01 00 00 8d 45 d4 89 f1 89 04 24 c7 44 24 04 00 00 00 00 89 45 c0 89 7d d4
e8 9b 00 00 00 89 f1 50 50 c6 83 0b 01 00 00 e8 bb 08 03 00 00 e8 da 00 00 00 8b 45 c0 8d 57 01 89 f1 29 fb c7 44 24 04 00 00 00 00 89 55 d4 89 04 24 e8 69 00 00 00 89 f1 50 50 89
5f 01 e8 b1 00 00 00 8b 45 c4 8d 65 f4 5b 5e 5f 5d c3 90 90 25 03 00 00 55 89 e5 8b 55 10 8b 45 0c 89 55 0c 8b 55 14 89 55 08 5d ff e0 90 90 90 83 3d 0d 05 00 00 00 55 89 e5 8b 4d
08 75 1a 80 3d 11 05 00 00 00 75 07 c6 05 11 05 00 00 01 c7 05 0d 05 00 00 00 9f 46 00 a1 0d 05 00 00 5d ff e0 90 90 90 55 89 e5 53 89 cb 83 ec 14 8b 45 0c c7 01 00 00 00 00 85 c0
75 06 c6 41 0c 00 eb 30 8b 55 08 8d 49 08 89 41 fc 8b 12 89 51 f8 89 4c 24 0c c7 44 24 08 40 00 00 00 89 44 24 04 89 14 24 ff 15 51 07 00 00 83 ec 10 85 c0 0f 95 43 0c 8b 5d fc c9
c2 08 00 90 80 79 0c 00 74 33 55 89 e5 53 83 ec 24 8b 51 04 8b 41 08 89 d3 8b 11 8d 4d f4 89 45 f4 89 5c 24 04 89 4c 24 0c 89 44 24 08 89 14 24 ff 15 51 07 00 00 8b 5d fc 83 ec 10
c9 c3 90 90 55 89 e5 53 83 ec 34 8b 45 08 8d 4d e8 8b 18 0f b6 45 0c 89 5d e4 89 44 24 04 8d 45 e4 89 04 24 e8 4b ff ff ff 8d 4d e8 50 50 8a 1b e8 93 ff ff ff 88 d8 8b 5d fc c9 c3
55 89 e5 57 56 53 83 ec 3c 8b 45 10 8b 5d 0c 8d 75 d8 8b 7d 08 0f b6 c8 89 45 c4 8b 03 89 4c 24 04 89 34 24 89 4d c0 89 45 d8 e8 99 ff ff ff 3c e8 0f 82 a3 00 00 00 3c e9 76 0c fe
c0 8b 4d c0 74 42 e9 93 00 00 00 8b 1b 80 7d c4 01 8d 43 05 89 45 c0 19 c0 f7 d0 83 e0 04 8d 4b 01 89 44 24 04 8d 45 d4 89 4d d4 89 f1 89 04 24 e8 c7 fe ff ff 51 51 89 f1 8b 5b 01
e8 0f ff ff ff 03 5d c0 89 1f eb 5c 8b 03 89 4c 24 04 89 34 24 40 89 45 d8 e8 32 ff ff ff 3c 15 74 04 3c 25 75 3c 80 7d c4 01 8b 13 19 c0 f7 d0 83 e0 04 8d 4a 02 89 44 24 04 8d 45
d4 89 04 24 89 4d d4 89 f1 89 55 c0 e8 73 fe ff ff 89 f1 52 52 8b 55 c0 8b 5a 02 e8 b8 fe ff ff 8b 03 89 07 eb 06 c7 07 00 00 00 00 8d 65 f4 89 f8 5b 5e 5f 5d c3 90 90 00 00 00 00
00 00 00 00 00 00 00 00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e 38 2e 31 00 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00
bc fd ff ff 15 00 00 00 00 41 0e 08 85 02 42 0d 05 50 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00 9c fd ff ff
31 00 00 00 00 48 0e 08 85 02 42 0d 05 65 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 98 fd ff ff 53 00 00 00
00 41 0e 08 85 02 42 0d 05 41 83 03 02 4c c5 c3 0c 04 04 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 b0 fd ff ff 3a 00 00 00
00 47 0e 08 85 02 42 0d 05 44 83 03 6c c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 d4 f9 ff ff 1d 00 00 00
00 41 0e 08 85 02 44 0d 05 44 83 03 52 c3 41 c5 0c 04 04 00 2c 00 00 00 40 00 00 00 b0 f9 ff ff 58 01 00 00 00 41 0e 08 85 02 42 0d 05 49 87 03 86 04 83 05 03 48 01 c3 41 c6 41 c7
41 c5 0c 04 04 00 00 00 1c 00 00 00 70 00 00 00 80 f9 ff ff 0a 00 00 00 00 41 0e 08 85 02 47 0d 05 41 c5 0c 04 04 00 00 2c 00 00 00 90 00 00 00 60 f9 ff ff 7b 01 00 00 00 41 0e 08
85 02 42 0d 05 46 87 03 86 04 83 05 03 6e 01 c3 41 c6 41 c7 41 c5 0c 04 04 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00
f4 fc ff ff 38 00 00 00 00 41 0e 08 85 02 42 0d 05 44 83 03 70 c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 28 00 00 00 1c 00 00 00
f0 fc ff ff ea 00 00 00 00 41 0e 08 85 02 42 0d 05 46 87 03 86 04 83 05 02 dd c3 41 c6 41 c7 41 c5 0c 04 04 2c 80 85 00 55 89 e5 83 ec 20 8b 45 08 89 45 f8 81 45 f8 bf 07 00 00 8b
45 f8 89 45 f4 c7 45 f0 0d 00 00 00 c7 45 fc 00 00 00 00 eb 37 8b 45 fc 8d 14 c5 00 00 00 00 8b 45 f4 01 d0 89 45 ec 8b 45 ec 8b 00 89 c2 8b 45 08 01 d0 89 45 e8 8b 45 ec 8b 40 04
89 c2 8b 45 08 01 c2 8b 45 e8 89 10 83 45 fc 01 8b 45 fc 3b 45 f0 7c c1 c9 c3 73 01 00 00 09 03 00 00 10 02 00 00 2a 00 00 00 6a 02 00 00 11 05 00 00 81 02 00 00 11 05 00 00 ca 02
00 00 08 03 00 00 09 03 00 00 25 03 00 00 27 03 00 00 0d 05 00 00 36 03 00 00 11 05 00 00 3f 03 00 00 11 05 00 00 46 03 00 00 0d 05 00 00 4f 03 00 00 0d 05 00 00 98 03 00 00 51 07
00 00 db 03 00 00 51 07 00 00 90 90 90 90 90 90 90 90
ENDDUMP

_initCPPCode:
DUMP
60 9c e8 ca f7 ff ff 50 e8 19 ff ff ff 83 c4 04 9d 61 c3
ENDDUMP
}


Sanny Builder:
Código:
{$CLEO .cs}

// Inicialização do código C/C++
0AC6: 0@ = label @_initCPPCode offset
0AA5: call_function 0@ num_params 0 pop 0



// Exemplo de uso para desativar os cheats do jogo e mostrar "Cheats não são permitidos"
0AB1: call_scm_func @generateFunctionCallback 3 @noCheats 0 0 -> 3@  // Label, num params, pop bytes; Retorna endereço da função
2@ = 0x008A5B58

while 2@ < 0x008A5CC8
    0A8C: write_memory 2@ size 4 value 3@ virtual_protect 1
    2@ += 4
end

// Não interrompa o script
while true
   wait 0x7FFFFFFF
end

// função de exemplo, 0@ contém o endereço para o injector::reg_pack
:noCheats
0AD1: show_formatted_text_highpriority "Cheats nao sao permitidos" time 5000
wait 0 // só serve para indicar que o sistema de script deve parar de processar e retornar, o código sempre volta ao início indicado


:generateFunctionCallback // {label, nparams, popbytes} -> Returns function address    
0AC6: 30@ = label @_getCallBackSize offset  
0AA7: call_function 30@ num_params 0 pop 0 -> 31@
0AC8: 29@ = allocate_memory_size 31@
0AC6: 10@ = label @_generateFunction offset
0A9F: 4@ = current_thread_pointer
0AA7: call_function 10@ num_params 5 pop 5 2@ 1@ 0@ 4@ 29@ -> 11@ // cleoToCppCallBackLabel
0AB2: ret 1 11@

HEX
e8 01 00 00 00 c3 8b 04 24 83 e8 05 c3 55 31 c0 89 e5 8b 4d 08 53 8b 5d 0c 3b 45 10 74 09 8a 14 03 88 14 01 40 eb f2 5b 5d c3 55 89 e5 57 56 53 81 ec 0c 01 00 00 8b 5d 0c 8b 55 08 85
db 0f 84 33 01 00 00 8b 83 e8 00 00 00 83 78 10 00 0f 84 23 01 00 00 8d b5 0c ff ff ff 31 c0 b9 02 00 00 00 89 f7 f3 ab 8d 85 1c ff ff ff c7 85 04 ff ff ff 00 00 00 00 8d 4d 9c c7
85 08 ff ff ff 00 00 00 00 c7 85 14 ff ff ff 00 00 00 00 c7 85 18 ff ff ff 00 00 00 00 66 c7 85 3c ff ff ff 00 00 c6 45 c8 00 c6 45 c9 00 c6 45 ca 00 c6 45 cb 00 c6 45 cc 00 c6 45
cd ff c7 45 d0 00 00 00 00 66 c7 45 d4 00 00 c6 45 d6 00 c6 45 d7 01 c6 45 d8 00 c7 45 dc 00 00 00 00 c6 45 e0 00 66 c7 45 e2 ff ff c6 45 e4 00 c7 00 00 00 00 00 83 c0 04 39 c8 75
f3 8d 85 40 ff ff ff 8d 4d c0 c7 00 00 00 00 00 83 c0 04 39 c8 75 f3 c7 45 c4 00 00 00 00 8d 7b 04 b9 e1 00 00 00 c7 45 c0 00 00 00 00 8d b5 04 ff ff ff f3 a4 8b 83 e8 00 00 00 8b
40 10 c6 83 cb 00 00 00 01 c6 83 c8 00 00 00 01 89 53 40 89 43 14 8b 83 ec 00 00 00 89 43 18 8b 83 f0 00 00 00 c1 e0 02 89 44 24 08 8b 42 10 89 44 24 04 8d 43 44 83 c3 04 89 04 24
e8 9f fe ff ff 89 1c 24 ff 15 09 03 00 00 81 c4 0c 01 00 00 5b 5e 5f 5d c3
END

:_getCallBackSize // (void) -> Returns struct size
HEX
55 b8 20 01 00 00 89 e5 5d c3
END

:_generateFunction // (cppToCleoCallback *nCallback, CRunningScript *owner, int atLabel, int nparams, int popBytes) -> Returns function address
HEX
55 89 e5 57 56 53 83 ec 4c 8b 5d 08 8b 45 10 8b 4d 14 8b 55 0c 8d bb f4 00 00 00 89 7d c4 8d bb 0b 01 00 00 89 8b f0 00 00 00 89 c1 c1 f9 1f 31 c8 29 c8 03 42 10 89 1b 89 93 e8 00 00
00 89 83 ec 00 00 00 c6 83 f4 00 00 00 60 c6 83 f5 00 00 00 80 c7 83 f6 00 00 00 44 24 0c 04 c6 83 fa 00 00 00 9c c6 83 fb 00 00 00 54 c6 83 fc 00 00 00 68 89 9b fd 00 00 00 c6 83
01 01 00 00 68 c7 83 02 01 00 00 2a 00 00 00 c6 83 06 01 00 00 68 c7 83 07 01 00 00 00 00 00 00 c6 83 0b 01 00 00 e8 c7 83 0c 01 00 00 00 00 00 00 66 c7 83 10 01 00 00 83 c4 c6 83
12 01 00 00 10 c6 83 13 01 00 00 80 c7 83 14 01 00 00 6c 24 10 04 c6 83 18 01 00 00 9d c6 83 19 01 00 00 61 8b 45 18 80 3d 11 05 00 00 00 c6 83 1a 01 00 00 c2 66 89 83 1b 01 00 00
75 07 c6 05 11 05 00 00 01 8d 75 d8 8d 45 d0 89 74 24 04 89 04 24 c7 44 24 08 00 00 00 00 89 7d d8 e8 7e 01 00 00 8d 45 d4 89 f1 89 04 24 c7 44 24 04 00 00 00 00 89 45 c0 89 7d d4
e8 9b 00 00 00 89 f1 50 50 c6 83 0b 01 00 00 e8 bb 08 03 00 00 e8 da 00 00 00 8b 45 c0 8d 57 01 89 f1 29 fb c7 44 24 04 00 00 00 00 89 55 d4 89 04 24 e8 69 00 00 00 89 f1 50 50 89
5f 01 e8 b1 00 00 00 8b 45 c4 8d 65 f4 5b 5e 5f 5d c3 90 90 25 03 00 00 55 89 e5 8b 55 10 8b 45 0c 89 55 0c 8b 55 14 89 55 08 5d ff e0 90 90 90 83 3d 0d 05 00 00 00 55 89 e5 8b 4d
08 75 1a 80 3d 11 05 00 00 00 75 07 c6 05 11 05 00 00 01 c7 05 0d 05 00 00 00 9f 46 00 a1 0d 05 00 00 5d ff e0 90 90 90 55 89 e5 53 89 cb 83 ec 14 8b 45 0c c7 01 00 00 00 00 85 c0
75 06 c6 41 0c 00 eb 30 8b 55 08 8d 49 08 89 41 fc 8b 12 89 51 f8 89 4c 24 0c c7 44 24 08 40 00 00 00 89 44 24 04 89 14 24 ff 15 51 07 00 00 83 ec 10 85 c0 0f 95 43 0c 8b 5d fc c9
c2 08 00 90 80 79 0c 00 74 33 55 89 e5 53 83 ec 24 8b 51 04 8b 41 08 89 d3 8b 11 8d 4d f4 89 45 f4 89 5c 24 04 89 4c 24 0c 89 44 24 08 89 14 24 ff 15 51 07 00 00 8b 5d fc 83 ec 10
c9 c3 90 90 55 89 e5 53 83 ec 34 8b 45 08 8d 4d e8 8b 18 0f b6 45 0c 89 5d e4 89 44 24 04 8d 45 e4 89 04 24 e8 4b ff ff ff 8d 4d e8 50 50 8a 1b e8 93 ff ff ff 88 d8 8b 5d fc c9 c3
55 89 e5 57 56 53 83 ec 3c 8b 45 10 8b 5d 0c 8d 75 d8 8b 7d 08 0f b6 c8 89 45 c4 8b 03 89 4c 24 04 89 34 24 89 4d c0 89 45 d8 e8 99 ff ff ff 3c e8 0f 82 a3 00 00 00 3c e9 76 0c fe
c0 8b 4d c0 74 42 e9 93 00 00 00 8b 1b 80 7d c4 01 8d 43 05 89 45 c0 19 c0 f7 d0 83 e0 04 8d 4b 01 89 44 24 04 8d 45 d4 89 4d d4 89 f1 89 04 24 e8 c7 fe ff ff 51 51 89 f1 8b 5b 01
e8 0f ff ff ff 03 5d c0 89 1f eb 5c 8b 03 89 4c 24 04 89 34 24 40 89 45 d8 e8 32 ff ff ff 3c 15 74 04 3c 25 75 3c 80 7d c4 01 8b 13 19 c0 f7 d0 83 e0 04 8d 4a 02 89 44 24 04 8d 45
d4 89 04 24 89 4d d4 89 f1 89 55 c0 e8 73 fe ff ff 89 f1 52 52 8b 55 c0 8b 5a 02 e8 b8 fe ff ff 8b 03 89 07 eb 06 c7 07 00 00 00 00 8d 65 f4 89 f8 5b 5e 5f 5d c3 90 90 00 00 00 00
00 00 00 00 00 00 00 00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e 38 2e 31 00 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00
bc fd ff ff 15 00 00 00 00 41 0e 08 85 02 42 0d 05 50 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00 9c fd ff ff
31 00 00 00 00 48 0e 08 85 02 42 0d 05 65 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 98 fd ff ff 53 00 00 00
00 41 0e 08 85 02 42 0d 05 41 83 03 02 4c c5 c3 0c 04 04 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 b0 fd ff ff 3a 00 00 00
00 47 0e 08 85 02 42 0d 05 44 83 03 6c c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 d4 f9 ff ff 1d 00 00 00
00 41 0e 08 85 02 44 0d 05 44 83 03 52 c3 41 c5 0c 04 04 00 2c 00 00 00 40 00 00 00 b0 f9 ff ff 58 01 00 00 00 41 0e 08 85 02 42 0d 05 49 87 03 86 04 83 05 03 48 01 c3 41 c6 41 c7
41 c5 0c 04 04 00 00 00 1c 00 00 00 70 00 00 00 80 f9 ff ff 0a 00 00 00 00 41 0e 08 85 02 47 0d 05 41 c5 0c 04 04 00 00 2c 00 00 00 90 00 00 00 60 f9 ff ff 7b 01 00 00 00 41 0e 08
85 02 42 0d 05 46 87 03 86 04 83 05 03 6e 01 c3 41 c6 41 c7 41 c5 0c 04 04 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00
f4 fc ff ff 38 00 00 00 00 41 0e 08 85 02 42 0d 05 44 83 03 70 c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 28 00 00 00 1c 00 00 00
f0 fc ff ff ea 00 00 00 00 41 0e 08 85 02 42 0d 05 46 87 03 86 04 83 05 02 dd c3 41 c6 41 c7 41 c5 0c 04 04 2c 80 85 00 55 89 e5 83 ec 20 8b 45 08 89 45 f8 81 45 f8 bf 07 00 00 8b
45 f8 89 45 f4 c7 45 f0 0d 00 00 00 c7 45 fc 00 00 00 00 eb 37 8b 45 fc 8d 14 c5 00 00 00 00 8b 45 f4 01 d0 89 45 ec 8b 45 ec 8b 00 89 c2 8b 45 08 01 d0 89 45 e8 8b 45 ec 8b 40 04
89 c2 8b 45 08 01 c2 8b 45 e8 89 10 83 45 fc 01 8b 45 fc 3b 45 f0 7c c1 c9 c3 73 01 00 00 09 03 00 00 10 02 00 00 2a 00 00 00 6a 02 00 00 11 05 00 00 81 02 00 00 11 05 00 00 ca 02
00 00 08 03 00 00 09 03 00 00 25 03 00 00 27 03 00 00 0d 05 00 00 36 03 00 00 11 05 00 00 3f 03 00 00 11 05 00 00 46 03 00 00 0d 05 00 00 4f 03 00 00 0d 05 00 00 98 03 00 00 51 07
00 00 db 03 00 00 51 07 00 00 90 90 90 90 90 90 90 90
END

:_initCPPCode
HEX
60 9c e8 ca f7 ff ff 50 e8 19 ff ff ff 83 c4 04 9d 61 c3
END



Source code:
.cpp:
Código:
/****************************************************************************
* http://bms.mixmods.com.br/t4721-
*
*
*/
#include <cstring> // Protótipos das funções de string de C, como por exemplo strcmp, entre outras.
#include <cstdint>
#include "dynamic_hooker.hpp"
#include "script.h"

extern "C" void *memcpy(void *destination, const void *source, size_t num)
{
   const uint8_t *src = (const uint8_t*)source;
   uint8_t *dest = (uint8_t*)destination;
   
   for (size_t i = 0; i < num; i++)
   {
      dest[i] = src[i];
   }
}

auto CRunningScript__Process = injector::thiscall<char(CRunningScript *)>::call<0x00469F00>;

struct cppToCleoCallback
{
   uintptr_t                     address;
   CRunningScript                  fakeScript;
   CRunningScript                  *owner;
   uint8_t                        *startIp;
   int                           nparams;


   injectcode::dynamic_hooker::newCode   myCode;

   void run(injector::reg_pack &c)
   {
      if (owner->baseIP == nullptr)
         return;

      fakeScript = CRunningScript();

      fakeScript.baseIP = owner->baseIP;
      fakeScript.curIP = startIp;

      fakeScript.IsExternalThread = true;
      fakeScript.isActive = true;
      fakeScript.tls[0].pParam = std::addressof(c);

      memcpy(&(fakeScript.tls[1]), (void*)(c.esp), nparams * 4);

      CRunningScript__Process(&fakeScript);
   }
};

extern "C" __declspec(dllexport) int getCallBackSize()
{
   return sizeof(cppToCleoCallback);
}

extern "C" void runCleoCallback(injector::reg_pack &c, uintptr_t address)
{
   cppToCleoCallback *cb = (cppToCleoCallback*)address;

   if (cb)
   {
      cb->run(c);
   }
}

extern "C" __declspec(dllexport) injectcode::dynamic_hooker::newCode* generateFunction(cppToCleoCallback *nCallback, CRunningScript *owner, int atLabel, int nparams, int popBytes)
{
   if (atLabel < 0)
   {
      atLabel = -atLabel;
   }
   
   nCallback->address = (uintptr_t)nCallback;
   //nCallback->baseIp = owner->baseIP;
   nCallback->owner = owner;
   nCallback->nparams = nparams;

   nCallback->startIp = std::addressof(owner->baseIP[atLabel]);

   memset(std::addressof(nCallback->myCode), 0, sizeof(nCallback->myCode));

   injectcode::dynamic_hooker::genDynamicCall(nCallback->myCode, nCallback->address, runCleoCallback, popBytes);

   return std::addressof(nCallback->myCode);
}

dyamic_hooker.h modificado:
Código:
#pragma once
#ifndef _LUA_HOOKER_DYNAMIC_HOOKER_H_
#define _LUA_HOOKER_DYNAMIC_HOOKER_H_
#include <cstdint>
#include <injector\calling.hpp>
#include <algorithm>
#include <string>
#include <vector>
#define PACKED __attribute__ ((packed))

namespace injector
{
   #pragma pack(push, 1)
    struct reg_pack
    {
        // The ordering is very important, don't change
        // The first field is the last to be pushed and first to be poped

        // PUSHFD / POPFD
        uint32_t ef;

        // PUSHAD/POPAD -- must be the lastest fields (because of esp)
        union
        {
            uint32_t arr[8];
            struct { uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; };
        };

      void *retn;
       
        enum reg_name {
            reg_edi, reg_esi, reg_ebp, reg_esp, reg_ebx, reg_edx, reg_ecx, reg_eax
        };
       
        enum ef_flag {
            carry_flag = 0, parity_flag = 2, adjust_flag = 4, zero_flag = 6, sign_flag = 7,
            direction_flag = 10, overflow_flag = 11
        };

        uint32_t& operator[](size_t i)
        { return this->arr[i]; }
        const uint32_t& operator[](size_t i) const
        { return this->arr[i]; }

        template<uint32_t bit>  // bit starts from 0, use ef_flag enum
        bool flag()
        {
            return (this->ef & (1 << bit)) != 0;
        }

        bool jnb()
        {
            return flag<carry_flag>() == false;
        }
    } PACKED;
   #pragma pack(pop)
}

namespace injectcode{
   typedef void(__cdecl *callback_t)(injector::reg_pack&, uintptr_t address);
   
   inline void callwrapper(uintptr_t retAddr, callback_t cb, uintptr_t address, injector::reg_pack *r)
   {
      cb(*r, address);
   }

   class dynamic_hooker{

   public:
   #pragma pack(push, 1)
      struct newCode
      {
         uint8_t pushad; // pushad

         // add[esp + 12], 4
         uint8_t add;
         uint32_t data;

         uint8_t pushfd; // pushfd

         uint8_t pushesp; // push esp

         uint8_t push;
         uintptr_t pushaddr;
         uint8_t push2;
         uintptr_t useraddr;
         uint8_t push3;
         uintptr_t retaddr;

         // call callwrapper
         uint8_t call;
         uint32_t addr;

         // add esp, 16
         uint16_t addesp;
         uint8_t addespnum;

         // sub[esp + 12 + 4], 4
         uint8_t sub;
         uint32_t data1;


         uint8_t popfd; // popfd
         uint8_t popad; // popad


         // retn x
         uint8_t retn;
         uint16_t retnsiz;
      } PACKED;

   #pragma pack(pop)

   public:
      static void genDynamicCall(newCode &myCode, uintptr_t address, callback_t c, uintptr_t popBytes)
      {
         myCode = newCode{
            0x60,            // pushad
            0x80, 0x040C2444u,  // add[esp + 12], 4
            0x9C,             // pushfd

            0x54,           // push esp

            0x68, address,      // push address
            0x68, uintptr_t(c), // push c
            0x68, 0x00,        // push <retnaddr>

            0xE8, 0x00,         // call callwrapper
            0xC483, 0x10,      // add esp, 16
            0x80, 0x0410246Cu, // sub[esp + 12 + 4], 4
            0x9D,            // popfd
            0x61,            // popad
            0xC2, 0x00         // retn x
         };

         myCode.retnsiz = popBytes;
         injector::MakeCALL(&(myCode.call), callwrapper, false);
      }

      inline dynamic_hooker()
      {

      }

      inline ~dynamic_hooker()
      {

      }
   } PACKED;


}

#endif



script.h
Código:
#include <cstdint>
#include <Windows.h>
#include <algorithm>

union SCRIPT_VAR
{
   unsigned   dwParam;
   int         nParam;
   float      fParam;
   void      *pParam;
   char      *szParam;
};

struct CRunningScript
{
   CRunningScript   *next;
   CRunningScript   *prev;
   char         threadName[8];
   uint8_t         *baseIP;
   uint8_t         *curIP;         
   uint8_t         *gosubStack[8];
   uint16_t      gosubStackLevel;
   uint16_t         _f3A;
   SCRIPT_VAR      tls[32];   
   DWORD         timers[2];   
   bool         isActive;
   bool         condResult;   
   bool         MissionCleanUpFlag;
   bool         IsExternalThread;
   BYTE         _fC8;
   char         _fC9;
   BYTE         _fCA;
   BYTE         _fCB;
   DWORD         wakeTime;
   WORD         logicalOp;
   bool         notFlag;
   bool         wastedBustedCheckEnabled;
   bool         wastedOrBusted;
   BYTE         _fD5;
   WORD         _fD6;
   DWORD         sceneSkipOffset;
   bool         missionFlag;
   // bellow is align in 4 bytes
   WORD         scmFunction;
   BYTE         IsCustom;
public:
   CRunningScript() :
      next(nullptr), prev(nullptr), baseIP(nullptr), curIP(nullptr), gosubStackLevel(0),
      isActive(false), condResult(false), MissionCleanUpFlag(false),
      IsExternalThread(false), _fC8(0), _fC9(-1), wakeTime(0), logicalOp(0),
      notFlag(false),   wastedBustedCheckEnabled(true),
      wastedOrBusted(false), sceneSkipOffset(0), missionFlag(false), scmFunction(-1),
      IsCustom(0)
   {
      std::fill(threadName, threadName + sizeof(threadName), '\0');
      std::fill(gosubStack, gosubStack + sizeof(gosubStack), nullptr);
      for (SCRIPT_VAR& var : tls) var.dwParam = 0;         // clear variables
      timers[0] = timers[1] = 0;                        // clear timers
   }
};

static_assert(sizeof(CRunningScript) != 224, "deu pau");


O source requer algumas edições no Injector do LINK/2012, pois deve ser compilado usando o MinGW.
http://brmodstudio.forumeiros.com/t6996-avancado-facilitador-de-conversao-de-c-c-para-assembly-para-scripts-cleo-gta3script-2-0

______________________________

Modifico quase qualquer coisa.   :)
------------------>>>http://gtamodvicio.blogspot.com/<<<------------------

Meu PC:
Spoiler:

Configurações PC:
*Processador: Intel Core i7 4790K 4.00GHz LGA1150
*Placa Mãe: GIGABYTE GA-H97M-D3H Intel (LGA1150)
*HD: 1TB Seagate Barracuda 64MB Sata III 7200RPM (2x - RAID 0)
*HD²: SAMSUNG M3 Externo USB 5400RPM 1TB
*Placa de vídeo: Nvidia GTX660 2GB DDR5 192bit EVGA
*RAM: 8GB DDR3 1600MHZ Kingston HYPER X BEAST (2x4GB)
*Fonte: Corsair 600W Reais CX600M Modular - CP-9020060-WW (80 Plus Bronze)
*Gabinete: Gabinete Raidmax Super Hurricane Branco - 248WB
*Monitor: LG 23MP55HQ Full HD HDMI 23'
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Mensagens : 846
Reputação : 134
Desde : 22/09/2015
Ver perfil do usuário
  • Reputação da mensagem: 100% (1 votos)
em Dom 01 Abr 2018, 23:10
Extremamente útil. :)

Fiz uns testes usando a função CPad::DoCheats().
Exemplo simples que faz o jogo aceitar o teclado numérico nos cheats:
Código:
{$Cleo}
// Inicialização do código C/C++
0AC6: 0@ = label @_initCPPCode offset
0AA5: call_function 0@ num_params 0 pop 0

0AB1: call_scm_func @generateFunctionCallback 3 @Numpad_Cheats 0 0 -> 3@  // Label, num params, pop bytes; Retorna endereço da função
0AB1: call_scm_func @MakeJMP 3 at 0x00439AF0 dest 3@ vp 1

// Não interrompa o script
while true
   wait 0x7FFFFFFF
end

// Faz o jogo aceitar numpads na cheat_string
:Numpad_Cheats
for 1@ = 0 to 510 step 2
    if 1@ <= 18
    then
        0A8E: 2@ = 1@ + 0x00B733D0
        0A8E: 3@ = 1@ + 0x00B73160
    else
        0A8E: 2@ = 1@ + 0x00B731A8
        0A8E: 3@ = 1@ + 0x00B72F38
    end
        
    0A8D: 2@ = read_memory 2@ size 2 vp 0
    0A8D: 3@ = read_memory 3@ size 2 vp 0
    
    if and
    2@ > 0
    3@ == 0
    then
        if 1@ == 18
        then 4@ = 0x30
        else
            0085: 4@ = 1@
            4@ /= 2
            
            if 1@ <= 16                
            then 4@ += 0x31
            end
        end
        
        0AA5: call 0x00438480 num_params 1 pop 1 4@        
    end      
end

wait 0 // só serve para indicar que o sistema de script deve parar de processar e retornar, o código sempre volta ao início indicado

:MakeJMP
0A8C: write_memory 0@ size 1 value 0xB8 vp 2@
0@++
0A8C: write_memory 0@ size 4 value 1@ vp 2@
0@ += 0x04
0A8C: write_memory 0@ size 2 value 0xE0FF vp 2@

{
    mov eax, dest
    jmp eax
}

0AB2: ret 0

:generateFunctionCallback // {label, nparams, popbytes} -> Returns function address    
0AC6: 30@ = label @_getCallBackSize offset  
0AA7: call_function 30@ num_params 0 pop 0 -> 31@
0AC8: 29@ = allocate_memory_size 31@
0AC6: 10@ = label @_generateFunction offset
0A9F: 4@ = current_thread_pointer
0AA7: call_function 10@ num_params 5 pop 5 2@ 1@ 0@ 4@ 29@ -> 11@ // cleoToCppCallBackLabel
0AB2: ret 1 11@

HEX
e8 01 00 00 00 c3 8b 04 24 83 e8 05 c3 55 31 c0 89 e5 8b 4d 08 53 8b 5d 0c 3b 45 10 74 09 8a 14 03 88 14 01 40 eb f2 5b 5d c3 55 89 e5 57 56 53 81 ec 0c 01 00 00 8b 5d 0c 8b 55 08 85
db 0f 84 33 01 00 00 8b 83 e8 00 00 00 83 78 10 00 0f 84 23 01 00 00 8d b5 0c ff ff ff 31 c0 b9 02 00 00 00 89 f7 f3 ab 8d 85 1c ff ff ff c7 85 04 ff ff ff 00 00 00 00 8d 4d 9c c7
85 08 ff ff ff 00 00 00 00 c7 85 14 ff ff ff 00 00 00 00 c7 85 18 ff ff ff 00 00 00 00 66 c7 85 3c ff ff ff 00 00 c6 45 c8 00 c6 45 c9 00 c6 45 ca 00 c6 45 cb 00 c6 45 cc 00 c6 45
cd ff c7 45 d0 00 00 00 00 66 c7 45 d4 00 00 c6 45 d6 00 c6 45 d7 01 c6 45 d8 00 c7 45 dc 00 00 00 00 c6 45 e0 00 66 c7 45 e2 ff ff c6 45 e4 00 c7 00 00 00 00 00 83 c0 04 39 c8 75
f3 8d 85 40 ff ff ff 8d 4d c0 c7 00 00 00 00 00 83 c0 04 39 c8 75 f3 c7 45 c4 00 00 00 00 8d 7b 04 b9 e1 00 00 00 c7 45 c0 00 00 00 00 8d b5 04 ff ff ff f3 a4 8b 83 e8 00 00 00 8b
40 10 c6 83 cb 00 00 00 01 c6 83 c8 00 00 00 01 89 53 40 89 43 14 8b 83 ec 00 00 00 89 43 18 8b 83 f0 00 00 00 c1 e0 02 89 44 24 08 8b 42 10 89 44 24 04 8d 43 44 83 c3 04 89 04 24
e8 9f fe ff ff 89 1c 24 ff 15 09 03 00 00 81 c4 0c 01 00 00 5b 5e 5f 5d c3
END

:_getCallBackSize // (void) -> Returns struct size
HEX
55 b8 20 01 00 00 89 e5 5d c3
END

:_generateFunction // (cppToCleoCallback *nCallback, CRunningScript *owner, int atLabel, int nparams, int popBytes) -> Returns function address
HEX
55 89 e5 57 56 53 83 ec 4c 8b 5d 08 8b 45 10 8b 4d 14 8b 55 0c 8d bb f4 00 00 00 89 7d c4 8d bb 0b 01 00 00 89 8b f0 00 00 00 89 c1 c1 f9 1f 31 c8 29 c8 03 42 10 89 1b 89 93 e8 00 00
00 89 83 ec 00 00 00 c6 83 f4 00 00 00 60 c6 83 f5 00 00 00 80 c7 83 f6 00 00 00 44 24 0c 04 c6 83 fa 00 00 00 9c c6 83 fb 00 00 00 54 c6 83 fc 00 00 00 68 89 9b fd 00 00 00 c6 83
01 01 00 00 68 c7 83 02 01 00 00 2a 00 00 00 c6 83 06 01 00 00 68 c7 83 07 01 00 00 00 00 00 00 c6 83 0b 01 00 00 e8 c7 83 0c 01 00 00 00 00 00 00 66 c7 83 10 01 00 00 83 c4 c6 83
12 01 00 00 10 c6 83 13 01 00 00 80 c7 83 14 01 00 00 6c 24 10 04 c6 83 18 01 00 00 9d c6 83 19 01 00 00 61 8b 45 18 80 3d 11 05 00 00 00 c6 83 1a 01 00 00 c2 66 89 83 1b 01 00 00
75 07 c6 05 11 05 00 00 01 8d 75 d8 8d 45 d0 89 74 24 04 89 04 24 c7 44 24 08 00 00 00 00 89 7d d8 e8 7e 01 00 00 8d 45 d4 89 f1 89 04 24 c7 44 24 04 00 00 00 00 89 45 c0 89 7d d4
e8 9b 00 00 00 89 f1 50 50 c6 83 0b 01 00 00 e8 bb 08 03 00 00 e8 da 00 00 00 8b 45 c0 8d 57 01 89 f1 29 fb c7 44 24 04 00 00 00 00 89 55 d4 89 04 24 e8 69 00 00 00 89 f1 50 50 89
5f 01 e8 b1 00 00 00 8b 45 c4 8d 65 f4 5b 5e 5f 5d c3 90 90 25 03 00 00 55 89 e5 8b 55 10 8b 45 0c 89 55 0c 8b 55 14 89 55 08 5d ff e0 90 90 90 83 3d 0d 05 00 00 00 55 89 e5 8b 4d
08 75 1a 80 3d 11 05 00 00 00 75 07 c6 05 11 05 00 00 01 c7 05 0d 05 00 00 00 9f 46 00 a1 0d 05 00 00 5d ff e0 90 90 90 55 89 e5 53 89 cb 83 ec 14 8b 45 0c c7 01 00 00 00 00 85 c0
75 06 c6 41 0c 00 eb 30 8b 55 08 8d 49 08 89 41 fc 8b 12 89 51 f8 89 4c 24 0c c7 44 24 08 40 00 00 00 89 44 24 04 89 14 24 ff 15 51 07 00 00 83 ec 10 85 c0 0f 95 43 0c 8b 5d fc c9
c2 08 00 90 80 79 0c 00 74 33 55 89 e5 53 83 ec 24 8b 51 04 8b 41 08 89 d3 8b 11 8d 4d f4 89 45 f4 89 5c 24 04 89 4c 24 0c 89 44 24 08 89 14 24 ff 15 51 07 00 00 8b 5d fc 83 ec 10
c9 c3 90 90 55 89 e5 53 83 ec 34 8b 45 08 8d 4d e8 8b 18 0f b6 45 0c 89 5d e4 89 44 24 04 8d 45 e4 89 04 24 e8 4b ff ff ff 8d 4d e8 50 50 8a 1b e8 93 ff ff ff 88 d8 8b 5d fc c9 c3
55 89 e5 57 56 53 83 ec 3c 8b 45 10 8b 5d 0c 8d 75 d8 8b 7d 08 0f b6 c8 89 45 c4 8b 03 89 4c 24 04 89 34 24 89 4d c0 89 45 d8 e8 99 ff ff ff 3c e8 0f 82 a3 00 00 00 3c e9 76 0c fe
c0 8b 4d c0 74 42 e9 93 00 00 00 8b 1b 80 7d c4 01 8d 43 05 89 45 c0 19 c0 f7 d0 83 e0 04 8d 4b 01 89 44 24 04 8d 45 d4 89 4d d4 89 f1 89 04 24 e8 c7 fe ff ff 51 51 89 f1 8b 5b 01
e8 0f ff ff ff 03 5d c0 89 1f eb 5c 8b 03 89 4c 24 04 89 34 24 40 89 45 d8 e8 32 ff ff ff 3c 15 74 04 3c 25 75 3c 80 7d c4 01 8b 13 19 c0 f7 d0 83 e0 04 8d 4a 02 89 44 24 04 8d 45
d4 89 04 24 89 4d d4 89 f1 89 55 c0 e8 73 fe ff ff 89 f1 52 52 8b 55 c0 8b 5a 02 e8 b8 fe ff ff 8b 03 89 07 eb 06 c7 07 00 00 00 00 8d 65 f4 89 f8 5b 5e 5f 5d c3 90 90 00 00 00 00
00 00 00 00 00 00 00 00 47 43 43 3a 20 28 47 4e 55 29 20 34 2e 38 2e 31 00 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00
bc fd ff ff 15 00 00 00 00 41 0e 08 85 02 42 0d 05 50 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 1c 00 00 00 1c 00 00 00 9c fd ff ff
31 00 00 00 00 48 0e 08 85 02 42 0d 05 65 c5 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 98 fd ff ff 53 00 00 00
00 41 0e 08 85 02 42 0d 05 41 83 03 02 4c c5 c3 0c 04 04 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 b0 fd ff ff 3a 00 00 00
00 47 0e 08 85 02 42 0d 05 44 83 03 6c c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00 d4 f9 ff ff 1d 00 00 00
00 41 0e 08 85 02 44 0d 05 44 83 03 52 c3 41 c5 0c 04 04 00 2c 00 00 00 40 00 00 00 b0 f9 ff ff 58 01 00 00 00 41 0e 08 85 02 42 0d 05 49 87 03 86 04 83 05 03 48 01 c3 41 c6 41 c7
41 c5 0c 04 04 00 00 00 1c 00 00 00 70 00 00 00 80 f9 ff ff 0a 00 00 00 00 41 0e 08 85 02 47 0d 05 41 c5 0c 04 04 00 00 2c 00 00 00 90 00 00 00 60 f9 ff ff 7b 01 00 00 00 41 0e 08
85 02 42 0d 05 46 87 03 86 04 83 05 03 6e 01 c3 41 c6 41 c7 41 c5 0c 04 04 00 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 20 00 00 00 1c 00 00 00
f4 fc ff ff 38 00 00 00 00 41 0e 08 85 02 42 0d 05 44 83 03 70 c5 c3 0c 04 04 00 00 14 00 00 00 00 00 00 00 01 7a 52 00 01 7c 08 01 1b 0c 04 04 88 01 00 00 28 00 00 00 1c 00 00 00
f0 fc ff ff ea 00 00 00 00 41 0e 08 85 02 42 0d 05 46 87 03 86 04 83 05 02 dd c3 41 c6 41 c7 41 c5 0c 04 04 2c 80 85 00 55 89 e5 83 ec 20 8b 45 08 89 45 f8 81 45 f8 bf 07 00 00 8b
45 f8 89 45 f4 c7 45 f0 0d 00 00 00 c7 45 fc 00 00 00 00 eb 37 8b 45 fc 8d 14 c5 00 00 00 00 8b 45 f4 01 d0 89 45 ec 8b 45 ec 8b 00 89 c2 8b 45 08 01 d0 89 45 e8 8b 45 ec 8b 40 04
89 c2 8b 45 08 01 c2 8b 45 e8 89 10 83 45 fc 01 8b 45 fc 3b 45 f0 7c c1 c9 c3 73 01 00 00 09 03 00 00 10 02 00 00 2a 00 00 00 6a 02 00 00 11 05 00 00 81 02 00 00 11 05 00 00 ca 02
00 00 08 03 00 00 09 03 00 00 25 03 00 00 27 03 00 00 0d 05 00 00 36 03 00 00 11 05 00 00 3f 03 00 00 11 05 00 00 46 03 00 00 0d 05 00 00 4f 03 00 00 0d 05 00 00 98 03 00 00 51 07
00 00 db 03 00 00 51 07 00 00 90 90 90 90 90 90 90 90
END

:_initCPPCode
HEX
60 9c e8 ca f7 ff ff 50 e8 19 ff ff ff 83 c4 04 9d 61 c3
END

Realmente bem interessante. Belo trabalho. :v:

______________________________
Everyone gonna remember my name !
avatar
Programador - Avançado
Programador - Avançado
Mensagens : 18221
Reputação : 384
Desde : 04/05/2012
Idade : 21
Link : gtamodvicio.blogspot.com
Ver perfil do usuáriohttp://gtamodvicio.blogspot.com
em Dom 01 Abr 2018, 23:18
Vlw :v:

Só uma dúvida, isso está certo mesmo?
Código:
0A8C: write_memory 0@ size 2 value 0xE0FF vp 2@
philosoraptor

Pois já que é Little Endian vai escrever FF E0
philosoraptor

______________________________

Modifico quase qualquer coisa.   :)
------------------>>>http://gtamodvicio.blogspot.com/<<<------------------

Meu PC:
Spoiler:

Configurações PC:
*Processador: Intel Core i7 4790K 4.00GHz LGA1150
*Placa Mãe: GIGABYTE GA-H97M-D3H Intel (LGA1150)
*HD: 1TB Seagate Barracuda 64MB Sata III 7200RPM (2x - RAID 0)
*HD²: SAMSUNG M3 Externo USB 5400RPM 1TB
*Placa de vídeo: Nvidia GTX660 2GB DDR5 192bit EVGA
*RAM: 8GB DDR3 1600MHZ Kingston HYPER X BEAST (2x4GB)
*Fonte: Corsair 600W Reais CX600M Modular - CP-9020060-WW (80 Plus Bronze)
*Gabinete: Gabinete Raidmax Super Hurricane Branco - 248WB
*Monitor: LG 23MP55HQ Full HD HDMI 23'
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Mensagens : 846
Reputação : 134
Desde : 22/09/2015
Ver perfil do usuário
em Dom 01 Abr 2018, 23:53
@Fabio escreveu:Vlw :v:

Só uma dúvida, isso está certo mesmo?
Código:
0A8C: write_memory 0@ size 2 value 0xE0FF vp 2@
philosoraptor

Pois já que é Little Endian vai escrever FF E0
philosoraptor
Sim. FF E0 é o bytecode para jmp eax
Eu deixei comentado com o código assembly, logo abaixo desse write_memory.

Código:
{
    mov eax, dest
    jmp eax
}

______________________________
Everyone gonna remember my name !
avatar
Programador - Avançado
Programador - Avançado
Mensagens : 18221
Reputação : 384
Desde : 04/05/2012
Idade : 21
Link : gtamodvicio.blogspot.com
Ver perfil do usuáriohttp://gtamodvicio.blogspot.com
em Seg 02 Abr 2018, 16:14
@Israel escreveu:
Eu deixei comentado com o código assembly, logo abaixo desse write_memory.

Código:
{
    mov eax, dest
    jmp eax
}

Eu vi :) :) :)

______________________________

Modifico quase qualquer coisa.   :)
------------------>>>http://gtamodvicio.blogspot.com/<<<------------------

Meu PC:
Spoiler:

Configurações PC:
*Processador: Intel Core i7 4790K 4.00GHz LGA1150
*Placa Mãe: GIGABYTE GA-H97M-D3H Intel (LGA1150)
*HD: 1TB Seagate Barracuda 64MB Sata III 7200RPM (2x - RAID 0)
*HD²: SAMSUNG M3 Externo USB 5400RPM 1TB
*Placa de vídeo: Nvidia GTX660 2GB DDR5 192bit EVGA
*RAM: 8GB DDR3 1600MHZ Kingston HYPER X BEAST (2x4GB)
*Fonte: Corsair 600W Reais CX600M Modular - CP-9020060-WW (80 Plus Bronze)
*Gabinete: Gabinete Raidmax Super Hurricane Branco - 248WB
*Monitor: LG 23MP55HQ Full HD HDMI 23'
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Mensagens : 846
Reputação : 134
Desde : 22/09/2015
Ver perfil do usuário
em Seg 02 Abr 2018, 18:26
Também tenho uma dúvida. Por que isto ?
Código:
// Não interrompa o script
while true
   wait 0x7FFFFFFF
end
Mesmo usando 0A93: end_custom_thread, o script ainda continua na memória.
É para futuras versões da cleo ou algo assim, ou o quê ?

______________________________
Everyone gonna remember my name !
avatar
Programador - Avançado
Programador - Avançado
Mensagens : 18221
Reputação : 384
Desde : 04/05/2012
Idade : 21
Link : gtamodvicio.blogspot.com
Ver perfil do usuáriohttp://gtamodvicio.blogspot.com
em Seg 02 Abr 2018, 21:30
@Israel escreveu:Também tenho uma dúvida. Por que isto ?
Código:
// Não interrompa o script
while true
   wait 0x7FFFFFFF
end
Mesmo usando 0A93: end_custom_thread, o script ainda continua na memória.
É para futuras versões da cleo ou algo assim, ou o quê ?

Podem ser deletados logo em seguida, não se sabe.

Tem algumas versões da CLEO que usam delete logo em seguida, pelo menos assim estava com alguns commits no repositório da CLEO. (E na 4.2a também)

______________________________

Modifico quase qualquer coisa.   :)
------------------>>>http://gtamodvicio.blogspot.com/<<<------------------

Meu PC:
Spoiler:

Configurações PC:
*Processador: Intel Core i7 4790K 4.00GHz LGA1150
*Placa Mãe: GIGABYTE GA-H97M-D3H Intel (LGA1150)
*HD: 1TB Seagate Barracuda 64MB Sata III 7200RPM (2x - RAID 0)
*HD²: SAMSUNG M3 Externo USB 5400RPM 1TB
*Placa de vídeo: Nvidia GTX660 2GB DDR5 192bit EVGA
*RAM: 8GB DDR3 1600MHZ Kingston HYPER X BEAST (2x4GB)
*Fonte: Corsair 600W Reais CX600M Modular - CP-9020060-WW (80 Plus Bronze)
*Gabinete: Gabinete Raidmax Super Hurricane Branco - 248WB
*Monitor: LG 23MP55HQ Full HD HDMI 23'
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Mensagens : 846
Reputação : 134
Desde : 22/09/2015
Ver perfil do usuário
em Seg 02 Abr 2018, 21:45
@Fabio escreveu:
@Israel escreveu:Também tenho uma dúvida. Por que isto ?
Código:
// Não interrompa o script
while true
   wait 0x7FFFFFFF
end
Mesmo usando 0A93: end_custom_thread, o script ainda continua na memória.
É para futuras versões da cleo ou algo assim, ou o quê ?

Podem ser deletados logo em seguida, não se sabe.

Tem algumas versões da CLEO que usam delete logo em seguida, pelo menos assim estava com alguns commits no repositório da CLEO.
Código:
//0A93=0,end_custom_thread
OpcodeResult STDCALL opcode_0A93(CScriptThread *thread)
{
    CCustomScript *cs = reinterpret_cast<CCustomScript *>(thread);
    if (thread->missionFlag || !thread->IsCustom)
    {
        TRACE("[0A93] Incorrect usage of opcode from thread %s",
        thread->threadName);
        return OR_CONTINUE;
    }
    GetThisInstance().scriptEngine.RemoveCustomScript(cs);
    delete cs;
    return OR_INTERRUPT;
}

:)
http://13.sannybuilder.com/files/SA/scripts/gta_sa_cleo4/CLEO4_setup/cleo-4.2a-src/src/CustomOpcodeSystem.cpp

______________________________
Everyone gonna remember my name !
avatar
Programador - Avançado
Programador - Avançado
Mensagens : 18221
Reputação : 384
Desde : 04/05/2012
Idade : 21
Link : gtamodvicio.blogspot.com
Ver perfil do usuáriohttp://gtamodvicio.blogspot.com
em Seg 02 Abr 2018, 21:46
@Israel escreveu:
@Fabio escreveu:
@Israel escreveu:Também tenho uma dúvida. Por que isto ?
Código:
// Não interrompa o script
while true
   wait 0x7FFFFFFF
end
Mesmo usando 0A93: end_custom_thread, o script ainda continua na memória.
É para futuras versões da cleo ou algo assim, ou o quê ?

Podem ser deletados logo em seguida, não se sabe.

Tem algumas versões da CLEO que usam delete logo em seguida, pelo menos assim estava com alguns commits no repositório da CLEO.
Spoiler:

Código:
//0A93=0,end_custom_thread
OpcodeResult STDCALL opcode_0A93(CScriptThread *thread)
{//0A93=0,end_custom_thread
OpcodeResult STDCALL opcode_0A93(CScriptThread *thread)
{
    CCustomScript *cs = reinterpret_cast<CCustomScript *>(thread);
    if (thread->missionFlag || !thread->IsCustom)
    {
        TRACE("[0A93] Incorrect usage of opcode from thread %s",
        thread->threadName);
        return OR_CONTINUE;
    }
    GetThisInstance().scriptEngine.RemoveCustomScript(cs);
    delete cs;
    return OR_INTERRUPT;
}

:)
http://13.sannybuilder.com/files/SA/scripts/gta_sa_cleo4/CLEO4_setup/cleo-4.2a-src/src/CustomOpcodeSystem.cpp

Eu lembrei dela, acabei olhando aqui e editando antes de você enviar sua mensagem. :) :) :)
Código:
delete cs;

Então é bom já prevenir esse tipo de coisa tendo certeza que o script continuará na memória.

______________________________

Modifico quase qualquer coisa.   :)
------------------>>>http://gtamodvicio.blogspot.com/<<<------------------

Meu PC:
Spoiler:

Configurações PC:
*Processador: Intel Core i7 4790K 4.00GHz LGA1150
*Placa Mãe: GIGABYTE GA-H97M-D3H Intel (LGA1150)
*HD: 1TB Seagate Barracuda 64MB Sata III 7200RPM (2x - RAID 0)
*HD²: SAMSUNG M3 Externo USB 5400RPM 1TB
*Placa de vídeo: Nvidia GTX660 2GB DDR5 192bit EVGA
*RAM: 8GB DDR3 1600MHZ Kingston HYPER X BEAST (2x4GB)
*Fonte: Corsair 600W Reais CX600M Modular - CP-9020060-WW (80 Plus Bronze)
*Gabinete: Gabinete Raidmax Super Hurricane Branco - 248WB
*Monitor: LG 23MP55HQ Full HD HDMI 23'
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Mensagens : 846
Reputação : 134
Desde : 22/09/2015
Ver perfil do usuário
em Seg 02 Abr 2018, 21:49
@Fabio escreveu:Então é bom já prevenir esse tipo de coisa tendo certeza que o script continuará na memória.
Entendi. Faz sentido. :) :)

______________________________
Everyone gonna remember my name !
Conteúdo patrocinado
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum