а точно правильно все делал?Пробовал, крашит без какой-либо причины. Тупа вылет из игры.
{$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
вот так у меня когда-то работало точноТеперь делает так.
Это весь текст в .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
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@)? То есть, инициализацию выделенной памяти обязательно нужно нулями заполнять?вот так у меня когда-то работало точно
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 и он их игнорит?
0A96: 1@ = actor $PLAYER_ACTOR struct
1@ += 1376
write_memory 1@ size 4 value 30.0 virtual_protect 0
А можно 0B5B оформить без сампфанкса?думаю он символы табуляции воспринимает концом строки
memset заполняет память, в данном случае нолями, просто очистка памяти от мусора
так а ты смог получить полностью текст диалога? если да, то можешь же потом построчно считывать текст с txt и парсить каждую строку на нужные тебе данные, раз 0b5b выёбываетсяА можно 0B5B оформить без сампфанкса?
Я просто не знаю как это сделать, был бы какой-то гайд по работе... Нам получается как-то нужно словить нужный диалог, потом вытащить оттуда текст, оформить посимвольное чтение строки диалога(если это возможно).
так, ладно, а с хуками дружишь в клео?Не смог. Пробовал прочитать решение проблемы с 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 парсит только первую колонку так как видимо встречает какой-то символ (табуляции походу). А мне эта(всё что идёт после название бизнеса) херня нужна так как я хочу на основе этих данных делать остальные функции в помощнике.
{$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
зачем ты вообще создал отдельный поток под сохранение текста?Код:{$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
{$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 это получение скина, де ты ваще ищешь?в консоль это опкод 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
Крашит.