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

bereg101

Участник
55
0
Давно не занимался клео скриптингом, но вдруг понадобилось. Как можно отслеживать в чате появление определенного сообщения и как можно выбирать в диалоговом окне определенный пункт?
 

grandpafromghetto

НАСТАЯЩИЙ ДАГИСТАНИЦ
Проверенный
335
119
0b49 выбор в диалоге определенного пункта, а отслеживание сначала через
0B75
потом в условии
0C18
 

Kotovasya

Участник
85
13
Объясните, как правильно рассчитать расстояние между мною и игроком? Весь форум облазил, везде разные решения, и под мой скрипт ну никак не подходят. Может я тупой, попробуйте помочь :3

Код:
{$CLEO}

0000:
repeat
    wait 400
until 0AFA:
0B34: samp register_client_command "azz" to_label @azz

WHILE TRUE
wait 0
if 10@ = 1
then
    00A0: store_actor $PLAYER_ACTOR position_to 7@ 8@ 9@
    for 0@ = 0 to 1000 [step = 1]
        if 0B23: samp is_player_connected 0@
        then
            if 0B20: samp 1@ = actor_handle_by_samp_player_id 0@
            then
                00A0: store_actor 1@ position_to 2@ 3@ 4@
                050A: 5@ = distance_between_XYZ 7@ 8@ 9@ and_XYZ 2@ 3@ 4@
                if 5@ <= 5.0
                then
                    say "/iznas %d" 0@
                end
            end
        end
    end
end
END

:azz
if 10@ = 0
then
    10@ = 1
else
    10@ = 0
end
samp.CmdRet()

P.S. Код сырой еще
 
Последнее редактирование:

Kotovasya

Участник
85
13
$player_actor - это ты, а не другой игрок
Код:
for 0@ = 0 to 1000 [step = 1]
0B20: samp 1@ = actor_handle_by_samp_player_id 0@
00A0: store_actor 1@ position_to 2@ 3@ 4@                 
050A: 5@ = distance_between_XYZ 7@ 8@ 9@ and_XYZ 2@ 3@ 4@
Special for you
0@ - id игроков, перебираются циклом for
1@ - хендл получаем из id
2@ 3@ 4@ - координаты XYZ полученного игрока
5@ - расстояние от координат 7@ 8@ 9@ (моего местоположения) и до 2@ 3@ 4@ (местоположения игрока)
 

Musaigen

shitposter
Проверенный
1,659
1,476
Объясните, как правильно рассчитать расстояние между мною и игроком? Весь форум облазил, везде разные решения, и под мой скрипт ну никак не подходят. Может я тупой, попробуйте помочь :3
Не знаю, будет ли работать. Времени проверять нету.
CLEO:
{$CLEO}
0000:

repeat
wait 0 
until Samp.Available()

0B34: samp register_client_command "azz" to_label @azz

while true
wait 0
    if 1@ == 1
    then
        0A8E: 2@ = 2@ + 1
        if not 8039: 2@ == 1001
        then
            if and
            0B23:  samp is_player_connected 2@
            8B64:  not samp is_player 2@ npc
            then
                0B20: samp 3@ = actor_handle_by_samp_player_id 2@
                if
                Player.Defined(3@)
                then
                    Actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
                    Actor.StorePos(3@, 7@, 8@, 9@)
                    050A: 10@ = distance_between_XYZ 4@ 5@ 6@ and_XYZ 7@ 8@ 9@
                    if 10@ <= 5.0
                    then
                        say "/iznas %d" 2@
                    end
                end
            end
        else 2@ = 0
        end
    end
end                       


       






:azz
0B12: 0@ = 0@ XOR 1
if 0@ == 1
then
    1@ = 1
else
    1@ = 0
end
samp.CmdRet()
 

bereg101

Участник
55
0
Подскажите почему не выбирает пункт в диалоговом окне?
И вопрос можно ли читать пункты в диалоговом окне чтоб выбирать нужный по названию?
И почему задержка тут не работает?

я не знаю какой опкод нужен 47 или 49 и попробовал оба, но оба у меня не работают
wait 2000
0AF9: samp say_msg "/menu"
wait 100
0B49: samp set_current_dialog_list_item 2
wait 1000
0B47: samp close_current_dialog_with_button 2
 

fiendshadow

3LFhocV726q7pKWWky2vv3W38Dm9sGJV86
Проверенный
455
122
мм, обрезки кода, как мы любим, задержка в теле скрипта только работает. По поводу диалогов - хуй его, вроде точно так же работало раньше
 

bereg101

Участник
55
0
мм, обрезки кода, как мы любим
Ну не работает только он)

Все что выше работает

Код:
    0C29: 5@ = stristr string1 4@ string2 "New"
    if 5@ <> 0
    then

        0AF9: samp say_msg "/menu" // работает
       // а дальше не работает
        wait 100
        0B49: samp set_current_dialog_list_item 2
        wait 1000
        0B47: samp close_current_dialog_with_button 2

   
    end
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,469
Подскажите почему не выбирает пункт в диалоговом окне?
Возможно то, что диалог имеет тип таблиц (несколько колонок), который не обрабатывается SAMPFUNCS'ом.
И вопрос можно ли читать пункты в диалоговом окне чтоб выбирать нужный по названию?
opcodes:0b54
opcodes:0b5b
И почему задержка тут не работает?
Задержки не работают в колбэках (команда, таймер).
 

bereg101

Участник
55
0
Возможно то, что диалог имеет тип таблиц (несколько колонок), который не обрабатывается SAMPFUNCS'ом.
Обычный диалог как /mm на всех серверах. Я думал мб окно еще не успевает прогрузится, как срабатывает опкод выбора. Может такое быть?
И что делать то в итоге эмуляцию нажатия клавиш или что то еще?
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,469
Обычный диалог как /mm на всех серверах. Я думал мб окно еще не успевает прогрузится, как срабатывает опкод выбора. Может такое быть?
И что делать то в итоге эмуляцию нажатия клавиш или что то еще?
Понятия не имею. Ты задал вопросы, приложил код. По этому коду и говорим проблему.
 

bereg101

Участник
55
0
Понятия не имею. Ты задал вопросы, приложил код. По этому коду и говорим проблему.
Вот весь код, осталось сделать чтоб он выбирал пункт в диалоговом меню (/mm) и все, но почему то не выходит
Код:
{$CLEO}
{$INCLUDE SF}

0001: wait 0 ms

while not SAMP.Available()
    wait 400
end

0BE3: raknet setup_incoming_rpc_hook @in_rpc

0@ = 0 // счетчик
0BFA: push_vars // сохраняем
while true
    wait 0
    0BFB: pop_vars // восстанавливаем
    0@++
    0AD1: show_formatted_text_highpriority "~p~Count ~g~%d" time 0 0@
    0BFA: push_vars // снова сохраняем
end

:in_rpc                  
0BE5: raknet 0@ = get_hook_param PARAM_PACKETID
if 0@ == RPC_SCRCLIENTMESSAGE
then
    0BE5: raknet 1@ = get_hook_param PARAM_BITSTREAM
    0BE7: raknet 2@ = bit_stream_read 1@ type BS_TYPE_INT
    0BE7: raknet 3@ = bit_stream_read 1@ type BS_TYPE_INT
   
    0AC8: 4@ = allocate_memory_size 145
    0BE8: raknet bit_stream 1@ read_array 4@ size 3@ // сообщение
    0C0D: struct 4@ offset 3@ size 1 = 0

    0C29: 5@ = stristr string1 4@ string2 "Вы" // проверка на содержание нужных слов
    if 5@ <> 0 // если слово найдено 
    then
        // 0AF9: samp say_msg "ждем"
        0AF9: samp say_msg "/mm"
        0B49: samp set_current_dialog_list_item 2
        0B47: samp close_current_dialog_with_button 2

    end

    0AC9: free_allocated_memory 4@
end
0BE0: raknet hook_ret true
 

Kotovasya

Участник
85
13
Вот весь код, осталось сделать чтоб он выбирал пункт в диалоговом меню (/mm) и все, но почему то не выходит
Код:
{$CLEO}
{$INCLUDE SF}

0001: wait 0 ms

while not SAMP.Available()
    wait 400
end

0BE3: raknet setup_incoming_rpc_hook @in_rpc

0@ = 0 // счетчик
0BFA: push_vars // сохраняем
while true
    wait 0
    0BFB: pop_vars // восстанавливаем
    0@++
    0AD1: show_formatted_text_highpriority "~p~Count ~g~%d" time 0 0@
    0BFA: push_vars // снова сохраняем
end

:in_rpc             
0BE5: raknet 0@ = get_hook_param PARAM_PACKETID
if 0@ == RPC_SCRCLIENTMESSAGE
then
    0BE5: raknet 1@ = get_hook_param PARAM_BITSTREAM
    0BE7: raknet 2@ = bit_stream_read 1@ type BS_TYPE_INT
    0BE7: raknet 3@ = bit_stream_read 1@ type BS_TYPE_INT
 
    0AC8: 4@ = allocate_memory_size 145
    0BE8: raknet bit_stream 1@ read_array 4@ size 3@ // сообщение
    0C0D: struct 4@ offset 3@ size 1 = 0

    0C29: 5@ = stristr string1 4@ string2 "Вы" // проверка на содержание нужных слов
    if 5@ <> 0 // если слово найдено
    then
        // 0AF9: samp say_msg "ждем"
        0AF9: samp say_msg "/mm"
        0B49: samp set_current_dialog_list_item 2
        0B47: samp close_current_dialog_with_button 2

    end

    0AC9: free_allocated_memory 4@
end
0BE0: raknet hook_ret true
Я думал мб окно еще не успевает прогрузится, как срабатывает опкод выбор
Именно так. Для этого надо сделать цикл на проверку того, что диалог открылся. Т.е. юзать repeat-until.
Т.к. у тебя все это дело происходит в хуке, а циклов там быть не может, то выводи ввод команды и последующие действия с диалогом в основной цикл, а там уже добавь после
Код:
0AF9: samp say_msg "/mm"
Это

Код:
repeat
   wait 100
until 0B4C: samp is_dialog_active -1
 
Последнее редактирование:
  • Нравится
Реакции: bereg101