Вопросы по CLEO-скриптингу

Spectrata

Новичок
27
0
Теперь делает так.

Это весь текст в .ini. Хотя раньше я как-то пробовал через 0BD7, тогда весь текст копировало, но игра просто alt + f4, без всяких причин. Потом в файле смотрел весь список.

Предприятие Объем Товар Цена за ед.
Тренировочный центр «AF Firearms» {D8A903}350{ffffff} ед. {abcdef}оружие {33aa33}5 $
Мастерс%s

Скриншот диалога:
sa-mp-023.png


Код:
{$CLEO}
{$USE ini}

0000:

:check_samp
repeat
    wait 0 ms
until samp.Available()
jump @next

:next
0B34: samp register_client_command "Data_Dialog" to_label @main
0BDE: pause_thread 0

:main
0050: gosub @write_data_to_ini 
0B43: samp cmd_ret

:write_data_to_ini
0AC8: 0@ = allocate_memory_size 5000
0A9A: 1@ = openfile "cleo\List_Of_Items.INI" mode "wt"
0BD7: samp get_dialog_text 0@
0AD9: write_formatted_text "%s" in_file 1@ 0@
0A9B: closefile 1@
0AC9: free_allocated_memory 0@
0051: return
 
Последнее редактирование:

hnnssy

Известный
Друг
2,684
2,762
Теперь делает так.

Это весь текст в .ini. Хотя раньше я как-то пробовал через 0BD7, тогда весь текст копировало, но игра просто alt + f4, без всяких причин. Потом в файле смотрел весь список.

Предприятие Объем Товар Цена за ед.
Тренировочный центр «AF Firearms» {D8A903}350{ffffff} ед. {abcdef}оружие {33aa33}5 $
Мастерс%s

Скриншот диалога:
Посмотреть вложение 130802

Код:
{$CLEO}
{$USE ini}

0000:

:check_samp
repeat
    wait 0 ms
until samp.Available()
jump @next

:next
0B34: samp register_client_command "Data_Dialog" to_label @main
0BDE: pause_thread 0

:main
0050: gosub @write_data_to_ini
0B43: samp cmd_ret

:write_data_to_ini
0AC8: 0@ = allocate_memory_size 5000
0A9A: 1@ = openfile "cleo\List_Of_Items.INI" mode "wt"
0BD7: samp get_dialog_text 0@
0AD9: write_formatted_text "%s" in_file 1@ 0@
0A9B: closefile 1@
0AC9: free_allocated_memory 0@
0051: return
вот так у меня когда-то работало точно
CLEO:
alloc 0@ 2048
    memset 0@ 0 2048
    alloc 1@ 256
    memset 1@ 0 256
    0A9A: 5@ = openfile "CLEO\MGP\[MGP] fakestat.txt" mode "wt"  // IF and SET
    0BD7: samp get_dialog_text 0@
    0BD8: samp get_dialog_caption 1@
    0AD8: write_string_to_file 5@ from 1@ //IF and SET
    0AD8: write_string_to_file 5@ from 0@
    0A9B: closefile 5@
    free 0@
    free 1@
 

Spectrata

Новичок
27
0
вот так у меня когда-то работало точно
CLEO:
alloc 0@ 2048
    memset 0@ 0 2048
    alloc 1@ 256
    memset 1@ 0 256
    0A9A: 5@ = openfile "CLEO\MGP\[MGP] fakestat.txt" mode "wt"  // IF and SET
    0BD7: samp get_dialog_text 0@
    0BD8: samp get_dialog_caption 1@
    0AD8: write_string_to_file 5@ from 1@ //IF and SET
    0AD8: write_string_to_file 5@ from 0@
    0A9B: closefile 5@
    free 0@
    free 1@
а что делает memset? Заполняет участок памяти(2048 байт присваиваются нулю начиная с адреса 0@)? То есть, инициализацию выделенной памяти обязательно нужно нулями заполнять?

Непонятно почему опкод "0B5B возвращает текст элемента из списка диалога." не работает так как должен; исходя из названия можно предположить что он должен считывать всю строку, может там вредные символы попадаются типа /r/t и он их игнорит?
 
Последнее редактирование:

hnnssy

Известный
Друг
2,684
2,762
а что делает memset? Заполняет участок памяти(2048 байт присваиваются нулю начиная с адреса 0@)? То есть, инициализацию выделенной памяти обязательно нужно нулями заполнять?

Непонятно почему опкод "0B5B возвращает текст элемента из списка диалога." не работает так как должен; исходя из названия можно предположить что он должен считывать всю строку, может там вредные символы попадаются типа /r/t и он их игнорит?
думаю он символы табуляции воспринимает концом строки
memset заполняет память, в данном случае нолями, просто очистка памяти от мусора
 

Manuel Leon

Известный
266
169
Как это в Lua выглядит?

CLEO:
0A96: 1@ = actor $PLAYER_ACTOR struct
1@ += 1376
write_memory 1@ size 4 value 30.0 virtual_protect 0
 

Spectrata

Новичок
27
0
думаю он символы табуляции воспринимает концом строки
memset заполняет память, в данном случае нолями, просто очистка памяти от мусора
А можно 0B5B оформить без сампфанкса?
Я просто не знаю как это сделать, был бы какой-то гайд по работе... Нам получается как-то нужно словить нужный диалог, потом вытащить оттуда текст, оформить посимвольное чтение строки диалога(если это возможно).
 

hnnssy

Известный
Друг
2,684
2,762
А можно 0B5B оформить без сампфанкса?
Я просто не знаю как это сделать, был бы какой-то гайд по работе... Нам получается как-то нужно словить нужный диалог, потом вытащить оттуда текст, оформить посимвольное чтение строки диалога(если это возможно).
так а ты смог получить полностью текст диалога? если да, то можешь же потом построчно считывать текст с txt и парсить каждую строку на нужные тебе данные, раз 0b5b выёбывается
без сф это все можно сделать канеш, но это вздрочь
 

Spectrata

Новичок
27
0
Не смог. Пробовал прочитать решение проблемы с 0b5b на ugbase там чел так и не получил ответа. Вот тема с подобной штукой btw
https://ugbase.eu/threads/get-selected-index-string-dialog-list.20705/
Максимум что мне удалось получить при помощи 0BD7 как ты посоветовал это...

Предприятие Объем Товар Цена за ед.
Тренировочный центр «AF Firearms» {D8A903}350{ffffff} ед. {abcdef}оружие {33aa33}5 $
Мастерс%s

Хотя раньше я юзал 0BD7, но тогда у меня получалось скопировать весь текст, при этом игра просто закрывалась без какого-либо краша. Текст в ini был скопирован на фулл. Со всеми {D8A903} и т.д

0B5B парсит только первую колонку так как видимо встречает какой-то символ (табуляции походу). А мне эта(всё что идёт после название бизнеса) херня нужна так как я хочу на основе этих данных делать остальные функции в помощнике.
 
Последнее редактирование:

hnnssy

Известный
Друг
2,684
2,762
Не смог. Пробовал прочитать решение проблемы с 0b5b на ugbase там чел так и не получил ответа. Вот тема с подобной штукой btw
https://ugbase.eu/threads/get-selected-index-string-dialog-list.20705/
Максимум что мне удалось получить при помощи 0BD7 как ты посоветовал это...

Предприятие Объем Товар Цена за ед.
Тренировочный центр «AF Firearms» {D8A903}350{ffffff} ед. {abcdef}оружие {33aa33}5 $
Мастерс%s

Хотя раньше я юзал 0BD7, но тогда у меня получалось скопировать весь текст, при этом игра просто закрывалась без какого-либо краша. Текст в ini был скопирован на фулл. Со всеми {D8A903} и т.д

0B5B парсит только первую колонку так как видимо встречает какой-то символ (табуляции походу). А мне эта(всё что идёт после название бизнеса) херня нужна так как я хочу на основе этих данных делать остальные функции в помощнике.
так, ладно, а с хуками дружишь в клео?
попробуй отловить rpcshowdialog и вывести текст куда-то
 

Spectrata

Новичок
27
0
Код:
{$CLEO}
{$USE ini}

0000:

0C6A: 25@ = create_custom_thread_at_label @write_ini

:start
wait 0 ms
0AFA: is_samp_available
jf @start
0AC8: 20@ = allocate_memory_size 4096 // 4096 bytes
0BE3: raknet setup_incoming_rpc_hook @hooked_data_dialog
0BDE: pause_thread 0

:hooked_data_dialog
0A9F: $PCurThread = current_thread_pointer
0BE5: raknet 0@ = get_hook_param 1 //  Packet ID
if  0@ == 61 // RPC_ShowDialog
then
    0BE5: raknet 0@ = get_hook_param 0 // get Bitstream
    0BF2: raknet 1@ = bit_stream 0@ get_read_offset
    0BED: raknet bit_stream 0@ set_read_offset 48 // we skip int16, int8, string8, button1, button2;
    0BE7: raknet 20@ = bit_stream_read 0@ type 5 // pointer on string 4096 bytes
    0BED: raknet bit_stream 0@ set_read_offset 1@ // 0@ current offset; 1@ safe offset
end

:write_ini // new thread
if  0ADC:   test_cheat "dialog"
then
    0C6D: 0@ = get_thread $PCurThread local_var 20
    0A9A: 1@ = openfile "cleo\list_of_items.INI" mode "wt"
    0AD9: write_formatted_text "%s" in_file 1@ 0@
    0A9B: closefile 1@
    0AC9: free_allocated_memory 0@
end
0A93: end_custom_thread

Не знаю почему крашит... Я не знаю доступна ли переменка 20@ в hooked_data_dialog
 

hnnssy

Известный
Друг
2,684
2,762
Код:
{$CLEO}
{$USE ini}

0000:

0C6A: 25@ = create_custom_thread_at_label @write_ini

:start
wait 0 ms
0AFA: is_samp_available
jf @start
0AC8: 20@ = allocate_memory_size 4096 // 4096 bytes
0BE3: raknet setup_incoming_rpc_hook @hooked_data_dialog
0BDE: pause_thread 0

:hooked_data_dialog
0A9F: $PCurThread = current_thread_pointer
0BE5: raknet 0@ = get_hook_param 1 //  Packet ID
if  0@ == 61 // RPC_ShowDialog
then
    0BE5: raknet 0@ = get_hook_param 0 // get Bitstream
    0BF2: raknet 1@ = bit_stream 0@ get_read_offset
    0BED: raknet bit_stream 0@ set_read_offset 48 // we skip int16, int8, string8, button1, button2;
    0BE7: raknet 20@ = bit_stream_read 0@ type 5 // pointer on string 4096 bytes
    0BED: raknet bit_stream 0@ set_read_offset 1@ // 0@ current offset; 1@ safe offset
end

:write_ini // new thread
if  0ADC:   test_cheat "dialog"
then
    0C6D: 0@ = get_thread $PCurThread local_var 20
    0A9A: 1@ = openfile "cleo\list_of_items.INI" mode "wt"
    0AD9: write_formatted_text "%s" in_file 1@ 0@
    0A9B: closefile 1@
    0AC9: free_allocated_memory 0@
end
0A93: end_custom_thread

Не знаю почему крашит... Я не знаю доступна ли переменка 20@ в hooked_data_dialog
зачем ты вообще создал отдельный поток под сохранение текста?
и текст через 0bf4 получать нужно
для начала просто выведи текст в консоль, потом уже сохранение
 

Spectrata

Новичок
27
0
в консоль это опкод 0665(не помню какой опкод за вывод в консоль отвечает) ?

0BF4: raknet bit_stream 0@ decode_string 1@ size 2@

decode_string это размер нашей выделенной строки в 4096 байтов? а что в size 2@ указывать?

Зачем поток создал? Хз(может чтобы удобнее читалось). Сейчас пропишу команду в том же потоке.

Или мы указываем allocate в 0BF4? типа decode_string 2@ size 4096 это тоже самое что 0AC8: 2@ = allocate_memory_size 4096?

Ладно, сейчас буду тестить


Код:
{$CLEO}
{$USE ini}

0000:

:start
wait 0 ms
0AFA: is_samp_available
jf @start
0BE3: raknet setup_incoming_rpc_hook @hooked_data_dialog
0BDE: pause_thread 0

:hooked_data_dialog
0BE5: raknet 0@ = get_hook_param 1 //  Packet ID
if  0@ == 61 // RPC_ShowDialog
then
    0BE5: raknet 0@ = get_hook_param 0 // get Bitstream
    0BF2: raknet 1@ = bit_stream 0@ get_read_offset
    0BED: raknet bit_stream 0@ set_read_offset 48 // we skip int16, int8, string8, button1, button2;
    0BF4: raknet bit_stream 0@ decode_string 2@ size 4096
    0BED: raknet bit_stream 0@ set_read_offset 1@ // 0@ current offset; 1@ safe offset
end

Крашит. А бля, возврата походу нет нихуя.
 
Последнее редактирование:

hnnssy

Известный
Друг
2,684
2,762
в консоль это опкод 0665(не помню какой опкод за вывод в консоль отвечает) ?

0BF4: raknet bit_stream 0@ decode_string 1@ size 2@

decode_string это размер нашей выделенной строки в 4096 байтов? а что в size 2@ указывать?

Зачем поток создал? Хз(может чтобы удобнее читалось). Сейчас пропишу команду в том же потоке.

Или мы указываем allocate в 0BF4? типа decode_string 2@ size 4096 это тоже самое что 0AC8: 2@ = allocate_memory_size 4096?

Ладно, сейчас буду тестить


Код:
{$CLEO}
{$USE ini}

0000:

:start
wait 0 ms
0AFA: is_samp_available
jf @start
0BE3: raknet setup_incoming_rpc_hook @hooked_data_dialog
0BDE: pause_thread 0

:hooked_data_dialog
0BE5: raknet 0@ = get_hook_param 1 //  Packet ID
if  0@ == 61 // RPC_ShowDialog
then
    0BE5: raknet 0@ = get_hook_param 0 // get Bitstream
    0BF2: raknet 1@ = bit_stream 0@ get_read_offset
    0BED: raknet bit_stream 0@ set_read_offset 48 // we skip int16, int8, string8, button1, button2;
    0BF4: raknet bit_stream 0@ decode_string 2@ size 4096
    0BED: raknet bit_stream 0@ set_read_offset 1@ // 0@ current offset; 1@ safe offset
end

Крашит.
0665 это получение скина, де ты ваще ищешь?
консоль - 0B78: log "SAMPFUNCS"
alloc 2@ 4096
0c11: 2@ 0x0 4096
0bf4: bit_stream 0@ decode_string 2@ size 4096
0b78: 2@
free 2@