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

hnnssy

Известный
Друг
2,684
2,748
Можно ли как то сделать скан диалога?
jSHbi2G.png
Да, весь текст диалога записываешь в .txt, считываешь построчно и сканируешь.
 

hnnssy

Известный
Друг
2,684
2,748
Можно по подробнее? С диалогами работаю 2-3 раз.
Запись текста диалога в файл dialogtext.txt
CLEO:
alloc 0@ 1024
  memset 0@ 0x0 1024
  0BD7: samp get_dialog_text 0@
  0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "wt"
  0AD8: write_string_to_file 1@ from 0@
  0A9B: closefile 1@
Потом открываешь файл через:
CLEO:
0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "rt"
Считываешь строку через:
CLEO:
0AD7: read_string_from_file 1@ to 2@ size 128
(память под 2@ выделять нужно)
И дальше уже сканируешь на что тебе нужно.
Считывать лучше циклом repeat - until. В качестве условия ставишь 0AD6: end_of_file 1@ reached
 

hnnssy

Известный
Друг
2,684
2,748
Всё пашет,но номер куста не тот.
3mowBgO.png

rGpN8K5.png
Код:
{$CLEO .cs}
0000: NOP                            

0662: printstring "kraft1k"  0x33FFCC

repeat
wait 0
until SAMP.Available()
0B34: samp register_client_command "drugsbot" to_label @Dialog

While True
wait 0
if 10@ == 1
then
say "/makedrugs"
if
SAMP.IsDialogActive(3684)
then
alloc 0@ 1024
  memset 0@ 0x0 1024
  0BD7: samp get_dialog_text 0@
  0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "wt"
  0AD8: write_string_to_file 1@ from 0@
  0A9B: closefile 1@
  wait 0
0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "rt"
0AC8: 2@ = allocate_memory_size 256
repeat
0AD7: read_string_from_file 1@ to 2@ size 256
until 0AD6: end_of_file 1@ reached
if 0AD4: 0@ = scan_string 2@ format "%d - ïîäëåæèò îáðàáîòêå" 3@
then
SAMP.SetDialogInputBoxText(3@)
SAMP.CloseDialog(3684)
0AC9: free_allocated_memory 2@
wait 30000
end
end
end
end

:Dialog
0B12: 10@ = 10@ XOR 1
if 10@ == 1
then
0acd: "[Kraft1k]GRUGS BOT ~r~ON" 1500
else
0acd: "[Kraft1k]DRUGS BOT ~r~OFF" 1500
end
SAMP.Cmdret()
Так ты сканируешь только последнюю строку текстовика же. И сканировать в этом случае нужно на "%d - {4BB85A}подлежит обработке{ffffff}".
 

hnnssy

Известный
Друг
2,684
2,748
Ясно, не подскажешь как реализовать какое-либо действие при нажатии на такой рендер текст?
Нужно рассчитать координаты площади, в которой находится текст, получить координаты курсора и сравнить их с координатами текста, и дальше просто отлавливать нажатие ЛКМ в этих координатах.
 
  • Нравится
Реакции: AWRage

hnnssy

Известный
Друг
2,684
2,748
Всё ещё маюсь с этим диалогом... Может кто посмотрит?
Код:
{$CLEO .cs}
0000: NOP                            

0662: printstring "kraft1k"  0x33FFCC

repeat
wait 0
until SAMP.Available()
0B34: samp register_client_command "drugsbot" to_label @Dialog

While True
wait 0
if 10@ == 1
then
say "/makedrugs"
wait 160
if
SAMP.IsDialogActive(3684)
then
alloc 0@ 1024
alloc 2@ 1024
alloc 3@ 1024
  memset 0@ 0x0 1024
  0BD7: samp get_dialog_text 0@
  0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "wt"
  0AD8: write_string_to_file 1@ from 0@
  0A9B: closefile 1@
if
SAMP.IsDialogActive(3684)
then
0A9A: 1@ = openfile "CLEO\dialogtext.txt" mode "rt"
repeat
0AD6: read_string_from_file 1@ size 1024
until 0AD6: end_of_file 1@ reached
if 0AD4: 1@ = scan_string 1@ format "%d - {4BB85A}ïîäëåæèò îáðàáîòêå{ffffff}" 3@
then
0B4A: samp 3@ = get_current_dialog_editbox_text
wait 30000
end
end
end
end
end


:Dialog
0B12: 10@ = 10@ XOR 1
if 10@ == 1
then
0acd: "[Kraft1k]DRUGS BOT ~r~ON" 1500
else
0acd: "[Kraft1k]DRUGS BOT ~r~OFF" 1500
end
SAMP.Cmdret()
Я же тебе уже сказал, что ты сканируешь только последнюю строку. Сканирование нужно делать внутри цикла repeat - until, и если нужный текст найден, то выйти из цикла, вставить полученный номер в диалог и закрыть его.
 

AWRage

Активный
642
141
Нужно рассчитать координаты площади, в которой находится текст, получить координаты курсора и сравнить их с координатами текста, и дальше просто отлавливать нажатие ЛКМ в этих координатах.
Спасибо. Не подскажешь как разделить строку на множество строк и записать их в разные переменные?
 

AWRage

Активный
642
141
Не знаете, почему не работает?
CLEO:
{$CLEO}
0000: 'AW_Rage'

repeat
wait 400
until SAMP.Available
0B34: samp register_client_command "phide" to_label @PlayerHide
0B34: samp register_client_command "pshow" to_label @PlayerShow
0B6D: render 10@ = create_font "Arial" height 10 flags 5

while true
if 25@ = true
then
  2@ = 500
  for 0@ = -1 to 999 step 1
    if and
    0B23: samp is_player_connected 0@
    0B64: samp is_player 0@ npc
    then
      0B20: samp 1@ = actor_handle_by_samp_player_id 0@
      if
      056D: actor 1@ defined
      then
        0B36: 1@ = get_player_nickname 0@
        0B6F: render font 10@ draw_text 1@ pos 50 2@ color 0xFFFFFFFF
        2@ += 10
      end
    end   
  end    
end
wait 0
end

:PlayerHide
25@ = false
cmdret

:PlayerShow
25@ = true
cmdret