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

Dark_Knight

Me, me and me.
Друг
4,078
2,095
Без кода тебе НИКТО не поможет. И все копирует нормально используй
Код:
[code=cleo]
[/code]
 

DarkP1xel

Сила воли наше всё.
BH Team
3,635
4,982
Код копируется зеркально, да еще и без переноса строк - нечитабельная херня, без кода всё же .-.
Не пизди. Всё нормально копируется, а если ты особо одаренный, то сохрани исходный код в txt и загрузи его куда-нибудь. Функция сохранения есть в SB.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Йопт, а догадаться тяжело что ли? Они игнорируются в командах, таймерах и везде, где SAMPUNCS обрабатывает тело по метке.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
CLEO:
while true { pause_thread 0 }
    wait 0
    if 0@ == 1
    then
        // code
        0@ = 0
    end
end

:cmd
0@ = 1
cmdret
 

san0

Известный
Друг
411
268
Почему при использовании четырёх actor.putAt подряд, но с интервалами по 500 мс, варпает только на последний - игнорируя три предшествующих + общую задержку в две секунды?
Так как установить задержку, если не с wait?
Вынести телепорт из метки команды в основной поток скрипта, который ты деактивировал.
Почему крашит при отсутствии игрока в стриме?
056D: actor 3@ defined удалить
if 0B20: samp 3@ = actor_handle_by_samp_player_id 1@ // или сверить 3@ с -1
then
Я реально не в курсе как это исправить, это мой первый скрипт .-.
отмазки
 

MelomanCool

Новичок
Проверенный
65
42
Я реально нуб, я не понял что ты имеешь ввиду. Какой поток я деактивировал?
Ты имеешь ввиду pause thread 0?
upd1
Эй, спасибо!
Я удалил defined и поставил проверку на получении ида - теперь не крашит, если игрок не в стриме!
CLEO:
{$CLEO .cs}
{$INCLUDE SF}

0000:nop
while not samp.Available()
  wait 1000
end
0af8: "wait for cmd" -1
0B34: samp register_client_command "k" to_label @k

0BDE: pause_thread 0
// сам скрипт перестает работать
// работает только вызов метки @k через команду /k

:k
0B35: samp 0@ = get_last_command_params
if 0AD4: 1@ = scan_string 0@ format "%d" 2@
then
//    0B20: samp 3@ = actor_handle_by_samp_player_id 2@
//    if 056D: actor 3@ defined
    if 0B20: samp 3@ = actor_handle_by_samp_player_id 2@ // фикс краша
    then
        0af8: "Игрок в зоне стрима!" -1 // thank for legend
        00A0: store_actor $PLAYER_ACTOR 13@ 14@ 15@
        04C4: store_coords_to 4@ 5@ 6@ from_actor 3@ with_offset 0.0 0.0 -3.0
        04C4: store_coords_to 7@ 8@ 9@ from_actor 3@ with_offset 0.0 0.0 -2.0
        04C4: store_coords_to 10@ 11@ 12@ from_actor 3@ with_offset 0.0 0.0 -1.0
    else
        0af8: "Вне стрима" -1
        if  actor.driving($PLAYER_ACTOR)
        then
            Actor.PutAt($PLAYER_ACTOR,4@,5@,6@)
            wait 500 // задержки игнорируются, если вызов метки произошел из команды
            Actor.PutAt($PLAYER_ACTOR,7@,8@,9@)
            wait 500
            Actor.PutAt($PLAYER_ACTOR,10@,11@,12@)
            wait 1000
            actor.PutAt($PLAYER_ACTOR,13@,14@,15@)
        else
            0af8: "car not found" -1
        end
    end
end
0B43: samp cmd_ret




/*0B35: samp 0@ = get_last_command_params
if 0AD4: 5@ = scan_string 0@ format "%d" 2@
then
0AD1: show_formatted_text_highpriority "Command accepted" time 500 0x0AD1
0B20: samp 1@ = actor_handle_by_samp_player_id 2@
0AD1: show_formatted_text_highpriority "Handle found" time 500 0x0AD1


end

Теперь давай распишу то, что тебе уже написал legend2360:

Если тебе нужна задержка, то нужно сделать так:
  1. Вместо остановки потока опкодом "0BDE: pause_thread 0" нужно делать бесконечный цикл с нулевой задержкой:
    CLEO:
    while true
        wait 0
    end
  2. Из метки @k перенести все кроме "0B43: samp cmd_ret" в бесконечный цикл (вставить после wait 0).
  3. Поставить перед всем этим перенесенным кодом проверку "if 29@ == 1", код запихнуть в "then".
  4. В самом конце then поставить "29@ = 0", чтобы при каждом вызове команды она выполнялась только один раз.
  5. Вместо того, что было в коде метки @k написать:
    CLEO:
    :k
    29@ = 1 // 29@ - любая нигде больше не используемая переменная
    0B43: samp cmd_ret

Еще желательно почитать CLEO | SAMPFUNCS' client commands, раздел "Встречаемые ошибки" и спойлер "Примеры ошибок".
 

ShadowBroker

Известный
110
27
Есть опкод проверяющий что игрок сел в машину? Не находится, не садится, а сел.
 

MelomanCool

Новичок
Проверенный
65
42
Есть опкод проверяющий что игрок сел в машину? Не находится, не садится, а сел.
Код не компилировал.
CLEO:
:GetActorCarStatus
if 0449: is_char_sitting_in_any_car 0@
then 1@ = 1 // в машине
else 1@ = 0 // не в машине
end

wait 0 // ждем один кадр

if 0449: is_char_sitting_in_any_car 0@
then 2@ = 1 // в машине
else 2@ = 0 // не в машине
end

if 1@ < 2@ // не сидел, а спустя кадр - сидит
then 0AB2: ret 1 0
end
if 1@ > 2@ // сидел, а спустя кадр - не сидит
then 0AB2: ret 1 1
end
if 1@ == 2@ // состояние не менялось
then 0AB2: ret 1 -1
end

Вызывать так:
CLEO:
0AB1: @GetActorCarStatus 1 actor $PLAYER_ACTOR ret 0@

В 0@ будет один из статусов:
0 - сел
1 - вышел
-1 - состояние не менялось

P.S. Так как в коде функции есть задержка, из главного цикла задержку нужно убрать. Либо запускать в бесконечном цикле в отдельном потоке (или скрипте), передавая состояние через 0AB3 и получая через 0AB4.
P.P.S. В клео, к сожалению, нет (или практически нет) событийных опкодов.
 
Последнее редактирование:
  • Нравится
Реакции: ShadowBroker

MelomanCool

Новичок
Проверенный
65
42
63495939.jpg

CLEO:
{$CLEO .cs}
{$INCLUDE SF}

0000:nop
while not samp.Available()
  wait 1000
end
0af8: "wait for cmd" -1
0B34: samp register_client_command "k" to_label @k

while true
    wait 0
    if 29@ == 1
    then
        29@ = 0
        0B35: samp 0@ = get_last_command_params
        if 0AD4: 1@ = scan_string 0@ format "%d" 2@
        then
            if 0B20: samp 3@ = actor_handle_by_samp_player_id 2@
            then
                0af8: "Игрок в зоне стрима!" -1 // thank for legend
                00A0: store_actor $PLAYER_ACTOR 13@ 14@ 15@
                04C4: store_coords_to 4@ 5@ 6@ from_actor 3@ with_offset 0.0 0.0 -3.0
                04C4: store_coords_to 7@ 8@ 9@ from_actor 3@ with_offset 0.0 0.0 -2.0
                04C4: store_coords_to 10@ 11@ 12@ from_actor 3@ with_offset 0.0 0.0 -1.0
            else
                0af8: "Вне стрима" -1
                if  actor.driving($PLAYER_ACTOR)
                then
                    Actor.PutAt($PLAYER_ACTOR,4@,5@,6@)
                    wait 500
                    Actor.PutAt($PLAYER_ACTOR,7@,8@,9@)
                    wait 500
                    Actor.PutAt($PLAYER_ACTOR,10@,11@,12@)
                    wait 1000
                    actor.PutAt($PLAYER_ACTOR,13@,14@,15@)
                else
                    0af8: "car not found" -1
                end
            end
        end
    end
end

:k
29@ = 1
0B43: samp cmd_ret

На логические ошибки не проверял. Кстати, тебе ускорение нужно, а не телепорт, думаю.
 
Последнее редактирование:

MelomanCool

Новичок
Проверенный
65
42
Если уж ты и впрямь такой знаток, не можешь мне рассказать под шум волны какие-нибудь основные правила построения скриптов, ну там - что с чем нельзя, что с чем можно?
И заранее прошу прощения за некорректный вопрос
Да, это кусок предыдущего сообщения приклеился как-то.

Почитай справку Санни Билдера, там очень много отличных статей. Сам на них учился.
 
  • Нравится
Реакции: ©Ded_Fedot и hnnssy

SR_team

like pancake
BH Team
4,798
6,470
Я там читал, но там ни строчки нету о СФ, а без него почти ничего не сделать, Мой принцип построения, по логике, должен был без ошибок работать именно в обычном клео, но в обычном клео нету опкода "зарегистрировать команду" - а мне нужно ид жертвы указывать .-.
большая кнопка WIKI вверху сайта для кого?
 

MelomanCool

Новичок
Проверенный
65
42
Я там читал, но там ни строчки нету о СФ, а без него почти ничего не сделать.
Ну, в плане работы с командами принцип простой: лучше (а если есть задержки в коде — обязательно) для каждой команды делать небольшой обработчик, а сам код выполнять в главном цикле (либо сделать отдельную scm-функцию, которая будет вызываться из главного цикла).
В смысле, "ускорение"?
Это производная от скорости.
Короче, твой код телепортирует тебя три раза под игрока, снизу вверх, и возвращает на место. Так работать не будет, я сам когда-то так пытался сделать. Телепорт просто поместит тебя в другого игрока.
Тебе нужно задать себе ускорение, velocity. И при этом нужно находиться чуть выше земли, думаю, чтобы не упереться в нее.
А, так ты завхатываешь. Я думал, тебе подбросить надо.

был я там, слишком тупой для вики.
Никто не подскажет, как получить координаты игрока с оффсетом по направлению камеры, направлению движения, по смещению координат игрока, или просто относительно тела, чтобы точка полученная была перед "лицом" педа?
Скрипт заработал, но всё херня. Я по прежнему никак не могу захватить игрока машиной, уже даже основа в бан улетела -.-
Ну, если я правильно помню, стандартный опкод для получения координат со смещением, как раз, получает их относительно того игрока, к которому применяется. Тебя интересует координата Y.
 
Последнее редактирование модератором: