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

hnnssy

Известный
Друг
2,684
2,748
Тогда еще пару вопросов.

В чем отличие данных опкодов?

004F: create_thread @MS_BIKE_MISSIONS

0C6A: 1@ = create_custom_thread_at_label 0@

0A92: create_custom_thread "ShowTextBox.s"

0C6B: 1@ = create_custom_thread_at_pointer 0@
[004F: create_thread @MS_BIKE_MISSIONS] - начинает новый поток,
[0C6A: 1@ = create_custom_thread_at_label 0@] - начинает по сути отдельный клео скрипт, но в этом же файле,
[0C6B: 1@ = create_custom_thread_at_pointer 0@] - то-же что и 0C6A, только используется указатель на код CLEO-скрипта в памяти,
[0A92: create_custom_thread "ShowTextBox.s"] - то-же что и 0C6A/0C6B, только в скобках указывается путь к другому скрипту.
не совсем так
создаёт поток с метки
создает поток с метки, получая указатель на него
запускает скрипт по имени
запускает поток по указателю на участок в памяти и получает указатель на новый поток
а ваще вот - https://wiki.blast.hk/gta-sa/opcodes/0c6a
 
  • Нравится
Реакции: New_J3rs3y1337 и Spectrata

Spectrata

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

0000:

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

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

:main
0AF9: samp say_msg "/route"
0B4E: samp 0@ = get_current_dialog_id
IF 
    0@ == 3360 
THEN
    0050: gosub @Write_Data_To_Ini 
END    
0B43: samp cmd_ret

:Write_Data_To_Ini
0AC8: 1@ = allocate_memory_size 50
0A9A: 2@ = openfile "cleo\List_Of_Items.INI" mode "wt"
for 3@ = 0 to 14 step 1
    0B5B: samp get_listbox_item 3@ text_to 1@
    0AD9: write_formatted_text "%s %c" in_file 2@ 1@ 0xA
end
0A9B: closefile 2@ 
0AC9: free_allocated_memory 1@
0051: return

Как правильно парсить весь текст диалога?

Вот что на серваке в диалоге рисуется.

sa-mp-020.png



А вот что мне в файл List_Of_Items.INI пишет :

Магазин «AF ammunation #3»
Магазин «AF ammunation #1»
Тренировочный центр «AF Firearms»
Мастерская «PAY N SPRAY #5»
Закусочная «Burger Shot #5»
Магазин DS #3
Ресторан «Pastageddon»
Аптека «Angel Pine»
Частный клуб «Club LV»
Закусочная «Cluckin' Bell #6»
Магазин «Whetstone 24 / 7»
Магазин «Highway 24 / 7»
Частный клуб «China Sauna Club»
Частный клуб «Chabanais»
Мастерская «PAY N SPRAY #9»

Кто-то понимает в чём проблема?
 

hnnssy

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

0000:

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

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

:main
0AF9: samp say_msg "/route"
0B4E: samp 0@ = get_current_dialog_id
IF
    0@ == 3360
THEN
    0050: gosub @Write_Data_To_Ini
END   
0B43: samp cmd_ret

:Write_Data_To_Ini
0AC8: 1@ = allocate_memory_size 50
0A9A: 2@ = openfile "cleo\List_Of_Items.INI" mode "wt"
for 3@ = 0 to 14 step 1
    0B5B: samp get_listbox_item 3@ text_to 1@
    0AD9: write_formatted_text "%s %c" in_file 2@ 1@ 0xA
end
0A9B: closefile 2@
0AC9: free_allocated_memory 1@
0051: return

Как правильно парсить весь текст диалога?

Вот что на серваке в диалоге рисуется.

Посмотреть вложение 130784


А вот что мне в файл List_Of_Items.INI пишет :

Магазин «AF ammunation #3»
Магазин «AF ammunation #1»
Тренировочный центр «AF Firearms»
Мастерская «PAY N SPRAY #5»
Закусочная «Burger Shot #5»
Магазин DS #3
Ресторан «Pastageddon»
Аптека «Angel Pine»
Частный клуб «Club LV»
Закусочная «Cluckin' Bell #6»
Магазин «Whetstone 24 / 7»
Магазин «Highway 24 / 7»
Частный клуб «China Sauna Club»
Частный клуб «Chabanais»
Мастерская «PAY N SPRAY #9»

Кто-то понимает в чём проблема?
через 0BD7: samp get_dialog_text 0@ попробуй получить текст и запиши его в txt, может так получится
память только выдели
 

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,748
Теперь делает так.

Это весь текст в .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,748
а что делает memset? Заполняет участок памяти(2048 байт присваиваются нулю начиная с адреса 0@)? То есть, инициализацию выделенной памяти обязательно нужно нулями заполнять?

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

Manuel Leon

Известный
266
166
Как это в 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,748
А можно 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,748
Не смог. Пробовал прочитать решение проблемы с 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