Página 1 de 2 • 1, 2 

TUTORIAL REVISADO E MOVIDO

Não tem algo errado aqui?

______________________________

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'
Exato.@Matheus Rivaldo escreveu:O erro é que ele não deveria ter aumentado 4 bytes pra escrever o valor "100", né?

______________________________
Everyone gonna remember my name !
Isto é mais útil e mais fácil do que parece (acho que quem me apresentou isto foi o @Fabio até)
Já me salvou varias vezes estes 00 00 00 00
Até aprendi sobre allocate_memory, mas prefiro este método.
Já me salvou varias vezes estes 00 00 00 00

Até aprendi sobre allocate_memory, mas prefiro este método.
Caramba, os Programadores veem a palavra limite e riem.
vamos deixar o limite em aberto, quando atingirmos o limite dobraremos o limite
______________________________
Certa vez perguntaram ao Dalai Lama:
Oque mais te decepciona em Custom Scripts ?
E ele respondeu:
reached maximum local variable limit (32).
Nem toquei nesse assunto, porque é difícil alguém preferir isso. Isso é até assunto de necessidade e não preferência.@Um Geek escreveu:Até aprendi sobre allocate_memory, mas prefiro este método.
Esse método é aconselhável para coisas maiores e principalmente variáveis, por exemplo:
Imagine que você esteja carregando todos os arquivos .txt de uma pasta para a memória. Você tem um número variável de arquivos, pode ter 5 ou 10... ou 50, então é interessante você usar este método, pois você pode ir alocando mais memória quando necessário, até acabar a RAM disponível

No thread memory é diferente pois você tem uma quantidade fixa de bytes disponíveis. Os bytes estão lá dentro do .cs (e serão "copiados" para a memória RAM). Se você cria um thread memory de 128 bytes, quer dizer que seu script estará 128 bytes mais "pesado" pra memória RAM... Porra, o que são 128 bytes?
Ou seja, é raro alguém precisar disso (eu mesmo, juro, só usei isso 1 vez na vida, e nem foi o comando da CLEO, foi a função direta no .exe mesmo). Isso pode ser pra algum tutorial mais no futuro.
Como é o caso do meu Veh Renamer, que não dá para pressupor o conteúdo do arquivo .fxt. Sendo assim não é possível usar "thread memory", tendo de optar por alocação.@Junior_Djjr escreveu:[...] Isso é até assunto de necessidade e não preferência. [...]
SB Code :
- Código:
{$Cleo}
/* Veh Renamer
By : Israel */
const
NULL 0x00
isnumpad 10@
spacerep 15@
renamer_Flag 20@v
VK_BACK 0x08
VK_RETURN 0x0D
VK_SHIFT 0x10
VK_CAPITAL 0x14
cheat_string 0x969110
CPad__AddToCheatString 0x438480
StartNewScript 0x464C20
GetKeyState 0x81E64C
strlen 0x826330
strcmp 0x8263C0
end
if 8AF4: renamer_Flag = read_string_from_ini_file "Cleo\Renamer.ini" section "Settings" key "Rename Command"
then
renamer_Flag = "Rename" // default
end
0AB1: call_scm_func @StartNewThread 1 labelName @NumpadCheats
while true
wait 0
if and
0ADC: test_cheat renamer_Flag
Actor.Driving($Player_Actor)
jf continue
25@ = 0x36
Player.CanMove(0, 0)
0AC6: 0@ = label @Buffer offset // pTempbuffer
0A8E: 25@ = 0@ + 25@ // pMainbuffer
repeat
wait 0
0A8D: 1@ = read_memory cheat_string size 1 virtual_protect 0
if and
1@ >= 0x30
1@ <= 0x39
8AB0: not key_pressed 1@
then
1@ += 0x30 // to key
isnumpad = true
else
isnumpad = false
end
if 0AB0: key_pressed 1@
then
0AB1: call_scm_func @KeyWait 1 key1 1@
if isnumpad == true
then
1@ -= 0x30 // to char
end
0AA7: call_function GetKeyState num_params 1 pop 0 VK_CAPITAL -> 2@
if 1@ == 0x20
then
1@ = 0xFF // spaces do hide the text on the screen
spacerep = true
end
if or
1@ < 0x30
1@ > 0x39
then
if and
2@ == 0
8AB0: not key_pressed VK_SHIFT
then
1@ += 0x20 // lowercase
end
end
if 3@ < 40 // max_length
then
0A8C: write_memory 0@ size 1 value 1@ virtual_protect 0
0@++
if spacerep == true
then
0A8C: write_memory 25@ size 1 value 0x20 virtual_protect 0
spacerep = false
else
0A8C: write_memory 25@ size 1 value 1@ virtual_protect 0
end
25@++
end
end
0AC6: 2@ = label @Buffer offset
0AA7: call_function strlen num_params 1 pop 1 2@ -> 3@
if 0AB0: key_pressed VK_BACK
then
if 3@ > 0
then
0@--
25@--
0A8C: write_memory 0@ size 1 value NULL virtual_protect 0
0A8C: write_memory 25@ size 1 value NULL virtual_protect 0
else
break
end
end
0AB1: call_scm_func @KeyWait 1 key1 VK_BACK
0AD1: show_formatted_text_highpriority "~g~Nome: ~s~%s" time 250 2@
until 0AB0: key_pressed VK_RETURN
if 3@ > 0
then
0@ = Actor.CurrentCar($Player_Actor)
0@ = Car.Model(0@)
0ADB: 0@s = car_model 0@ name
2@ += 0x36 // pMainbuffer
3@ = File.Open("Cleo\Cleo_Text\Renamer.fxt", "r")
0A9C: 4@ = file 3@ size
4@ += 50 // max_length per line
0AC8: 5@ = malloc 4@
0A8C: write_memory 5@ size 4@ value NULL virtual_protect 0
6@ = 0x36
0A8E: 6@ = 2@ + 6@ // pFxtLinebuffer
while File.ReadString(3@, 6@, 50)
0AD4: 33@ = scan_string 6@ format "%s" 7@s // split first word
0AA7: call strcmp num_params 2 pop 2 0@s 7@s -> 9@
if 9@ <> 0
then
0AD3: 5@ = format "%s%s" 5@ 6@
end
end
33@ = 0x0A // LF
0AD3: 5@ = format "%s%s %s%s" 5@ 0@s 2@ 33@s
File.Close(3@)
10@ = File.Open("Cleo\Cleo_Text\Renamer.fxt", "w")
File.WriteString(10@, 5@)
File.Close(10@)
0AC9: free 5@
2@ -= 0x36
0A8C: write_memory 2@ size 120 value NULL virtual_protect 0 // clear main/temp buffers
0ACD: show_text_highpriority "~g~Renomeado." time 1000
else
0ACD: show_text_highpriority "~r~Cancelado." time 1000
end
0AB1: call_scm_func @KeyWait 1 key1 VK_RETURN
Player.CanMove(0, 1)
end
:StartNewThread
0AC6: 1@ = label 0@ offset
0AA7: call_function StartNewScript num_params 1 pop 1 1@ -> 2@
2@ += 0x10 // CRunningScript->baseIp
005A: 1@ += 0@
0A8C: write_memory 2@ size 4 value 1@ virtual_protect 0
2@ += 0xB7
0A8C: write_memory 2@ size 1 value 1 virtual_protect 0
0AB2: ret 0
:NumpadCheats
0AAA: 0@ = thread 'nCheats' pointer
if or
0@ <> NULL
0AAB: file_exists "Cleo\CPad.DoCheats_Numpad_and_KeyPressedFlag.cs"
then
end_thread // do not duplicate numpad cheats
end
thread 'nCheats'
while true
wait 0
for 1@ = 0x60 to 0x69
0AB0: key_pressed 1@
jf continue
0A8F: 2@ = 1@ - 0x30
0AA5: call_function CPad__AddToCheatString num_params 1 pop 1 2@
0AB1: call_scm_func @KeyWait 1 key1 1@
end
end
:KeyWait
repeat
while 0AB0: key_pressed 0@(31@,1i)
wait 0
end
31@++
until 0@(31@,1i) == NULL
0AB2: ret 0
:Buffer
hex
// temp buffer
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// main buffer
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
// fxt_line buffer
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
end
______________________________
Everyone gonna remember my name !
Por que não implementar uma extensão pra alocar essa memória estática com uma sintaxe familiar, em vez de meter um monte de zero? Algo como:
Ou até:
@LINK/2012
Eu posso forkar o negócio e implementar isso eu mesmo?
- Código:
Memory:
DUMP(16) 00 ENDDUMP
Ou até:
- Código:
Memory:
DUMP
RESERVE(16)
ENDDUMP
@LINK/2012
Eu posso forkar o negócio e implementar isso eu mesmo?
↑ Isso seria bom.
E o DUMP é coisa à parte do GTA3script original da Rockstar, então acredito que não há "regras" de implementação.
Ah, e fale direto com o LINK no face, melhor.
E o DUMP é coisa à parte do GTA3script original da Rockstar, então acredito que não há "regras" de implementação.
Ah, e fale direto com o LINK no face, melhor.
Curti mais esse.@Thelost escreveu:
- Código:
Memory:
DUMP
RESERVE(16)
ENDDUMP
Thelost, você que curte tanto programação, tente continuar umas coisas que o LINK/2012 não fez por falta de tempo.
Falta, por exemplo, implementar a possibilidade de escrever strings dentro do DUMP...ENDDUMP
Falta, por exemplo, implementar a possibilidade de escrever strings dentro do DUMP...ENDDUMP
- Código:
DUMP
"STRING" 00
ENDDUMP
Nex' escreveu:Curti mais esse.@Thelost escreveu:
- Código:
Memory:
DUMP
RESERVE(16)
ENDDUMP
Seria bom especificar o número a ser preenchido.
- Código:
RESERVE(16, 0x00)
RESERVE(16, 0xFF)
______________________________

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'
@Fabio escreveu:
Seria bom especificar o número a ser preenchido.
- Código:
RESERVE(16, 0x00)
RESERVE(16, 0xFF)
Aí seria FILL, RESERVE significa deixar um espaço válido ali.
Ah sim, verdade.
Aproveitando o post, eu atualizei o tópico: http://brmodstudio.forumeiros.com/t4721-avancado-facilitador-de-conversao-de-c-para-assembly-para-usar-em-scripts-cleo-scm
______________________________

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'
@Junior_Djjr escreveu:Thelost, você que curte tanto programação, tente continuar umas coisas que o LINK/2012 não fez por falta de tempo.
Falta, por exemplo, implementar a possibilidade de escrever strings dentro do DUMP...ENDDUMP(sinto falta disto)
- Código:
DUMP
"STRING" 00
ENDDUMP
https://github.com/thelink2012/gta3sc/pull/116
Boa.
E esqueci dessa coisa de especificar o valor que o Fabio falou, é útil também.
Por exemplo se você quer guardar handle dos carros, você tem que usar FF para dizer "vazio", pois o handle do primeiro carro que aparecer no jogo terá o valor "0", se você tratar "0" como vazio, vai bugar pro primeiro carro que aparecer no jogo.
E esqueci dessa coisa de especificar o valor que o Fabio falou, é útil também.
Por exemplo se você quer guardar handle dos carros, você tem que usar FF para dizer "vazio", pois o handle do primeiro carro que aparecer no jogo terá o valor "0", se você tratar "0" como vazio, vai bugar pro primeiro carro que aparecer no jogo.
Aproveitando o tópico: Junior, você pensa em fazer um tutorial novo de engenharia reversa, para os novos programadores de GTA3Script que não entendem a sintaxe do Sanny Builder?
E mudaria o quê?@Matheus Rivaldo escreveu:Junior, você pensa em fazer um tutorial novo de engenharia reversa, para os novos programadores de GTA3Script que não entendem a sintaxe do Sanny Builder?
O tutorial de engenharia reversa tem o objetivo de usar o IDA Pro para encontrar endereços de memória, só.
@Junior_Djjr escreveu:Boa.
E esqueci dessa coisa de especificar o valor que o Fabio falou, é útil também.
Por exemplo se você quer guardar handle dos carros, você tem que usar FF para dizer "vazio", pois o handle do primeiro carro que aparecer no jogo terá o valor "0", se você tratar "0" como vazio, vai bugar pro primeiro carro que aparecer no jogo.
Eu deixei um issue aqui, tou com preguiça de fazer, outra hora faço.
E foi fechado. Até justo mesmo...
Vamos esperar pelo aumento das variáveis, uma coisa que vai mudar muita coisa no nosso modo de criar os mods.
Vamos esperar pelo aumento das variáveis, uma coisa que vai mudar muita coisa no nosso modo de criar os mods.
No exemplo do buffer você usou & invés de $. Confundiu com o reference operator do C++, né?
OpsNex' escreveu:No exemplo do buffer você usou & invés de $. Confundiu com o reference operator do C++, né?

Eu também faço esse erro enquanto codando... Ainda mais pelo costume do Sanny Builder que me fez ver "$" como uma coisa errada.
@Junior_Djjr escreveu:Ainda mais pelo costume do Sanny Builder que me fez ver "$" como uma coisa errada.
Não vai chegar perto do PHP então

______________________________

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'
Página 1 de 2 • 1, 2 

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum
|
|