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

SR_team

like pancake
BH Team
4,720
6,370
CLEO:
{$CLEO}
0000: NOP

repeat
wait 0
until SAMP.Available()

:1
wait 0
0B34: samp register_client_command "fakemess" to_label @2
jf @Reload
jump @2

:2
0AF8: samp add_message_to_chat "fake fakevoch 1" color 0xFFFFFF  
0AF8: samp add_message_to_chat "d" color 0xFFFFFF
0002: jump @1
jump @Reload

:Reload
0ADC:   test_cheat "0"
004D: jump_if_false @1
0A92: create_custom_thread "script.CS"
0A93: end_custom_thread
Крашит при кмд. В чем проблемма?
Да во всем в общем-то.
 

p1cador

cerf
Проверенный
220
359
Неплохо, я не додумался до такого. Почему тут крашит?
Условие, про которое я говорил, а еще в теле цикла for нету wait, из за этого и зависает.
И ебучий :label, который тут нахер не нужен, но это такое, проблем не создает, но глаза режет.
 

MelomanCool

Новичок
Проверенный
65
41
Условие, про которое я говорил, а еще в теле цикла for нету wait, из за этого и зависает.
И ебучий :label, который тут нахер не нужен, но это такое, проблем не создает, но глаза режет.
В цикле for можно не ставить wait, он не бесконечный. Но если цикл слишком долгий и начинает влиять на FPS, то лучше сделать несколько задержек. Скажем, каждые 100 игроков.

Спасибо вам обоим. Теперь вот думаю как русскую букву зависать в переменную. В первом примере надо заменить переменную 1@ на русскую букву. Или во втором варианте переменную 1@ на русскую букву
Способ зависит от того, куда ты будешь выводить. На экран? В чат?
 
  • Нравится
Реакции: Yanki и azdsfbzxv

p1cador

cerf
Проверенный
220
359
В цикле for можно не ставить wait, он не бесконечный. Но если цикл слишком долгий и начинает влиять на FPS, то лучше сделать несколько задержек. Скажем, каждые 100 игроков.
Да я понимаю, просто запустил его код, без wait 0 зависало, рил 1000 итераций подряд слишком много

Спасибо вам обоим. Теперь вот думаю как русскую букву зависать в переменную. В первом примере надо заменить переменную 1@ на русскую букву. Или во втором варианте переменную 1@ на русскую букву
только что придумал, прямо на ходу, способ очень зашкварный, даже выкладывать стыдно, но в теории рабочий)
Создаешь буфер
CLEO:
:buffer_mamki
hex
"А\0Б\0В\0Г\0Д\0Е\0Ж\0З\0И\0К\0Л\0М\0Н\0О\0П\0Р\0С\0Т\0У\0Ф\0Х\0Ц\0Ч\0Ш\0"  //A = 0, Б = 2, В = 4....
end

Далее просто обращаешься к нужному символу, в зависимости от местоположения на карте
CLEO:
0AC6: 0@ = label @buffer_mamki offset //0@ А, 0@+=2 Б, 0@+=4 В...
 
  • Нравится
Реакции: azdsfbzxv

azdsfbzxv

Новичок
73
6
В цикле for можно не ставить wait, он не бесконечный. Но если цикл слишком долгий и начинает влиять на FPS, то лучше сделать несколько задержек. Скажем, каждые 100 игроков.


Способ зависит от того, куда ты будешь выводить. На экран? В чат?
Ну вообще в оконцове в чат. Но пока для теста думал на экран. В чат лучше конечно
 

RedBoxWhite

Известный
337
27
Условие, про которое я говорил, а еще в теле цикла for нету wait, из за этого и зависает.
И ебучий :label, который тут нахер не нужен, но это такое, проблем не создает, но глаза режет.
Не понял, какой ещё wait? Типа после for - wait? Если да, то у меня не сработало. Условие поставил, а лабел прост с прошлого скрипта, я прост по-быстрому ctrl+c, ctrl+v.
 

MelomanCool

Новичок
Проверенный
65
41
Да я понимаю, просто запустил его код, без wait 0 зависало, рил 1000 итераций подряд слишком много
А если после каждого игрока ставить wait 0, то цикл будет выполняться за 1000 кадров. Это ~17 секунд при 60 FPS. При задержке после каждой сотни игроков цикл выполняется за 10 кадров, ~0.17 секунды при 60 FPS.
только что придумал, прямо на ходу, способ очень зашкварный, даже выкладывать стыдно, но в теории рабочий)
Создаешь буфер
CLEO:
:buffer_mamki
hex
"А\0Б\0В\0Г\0Д\0Е\0Ж\0З\0И\0К\0Л\0М\0Н\0О\0П\0Р\0С\0Т\0У\0Ф\0Х\0Ц\0Ч\0Ш\0"  //A = 0, Б = 2, В = 4....
end
Далее просто обращаешься к нужному символу, в зависимости от местоположения
CLEO:
0AC6: 0@ = label @buffer_mamki offset //0@ А, 0@+=2 Б, 0@+=4 В...
Способ самый обычный, но можно без нулевых символов обходиться, выводя не строку %s, а символ %c. Однако в таком случае нужно передавать не указатель на символ, а сам символ.
 
  • Нравится
Реакции: Yanki и azdsfbzxv

RedBoxWhite

Известный
337
27
Такой же, как и после while true
В теле цикла for, между
CLEO:
for 0@ = 0 to 999
и
CLEO:
if 0B23: samp is_player_connected 0@
Я так и сделал. Может я опять какую-то херню не туда вписал.
CLEO:
{$CLEO}
0000:
wait 2000

alloc 2@ 32
alloc 4@ 32

while true
wait 0
if 0ADC:   test_cheat "p"
then
    for 0@ = 0 to 999
    wait 0
        if 0B23: samp is_player_connected 0@
        then
            if 0B20: samp 1@ = actor_handle_by_samp_player_id 0@
            then
                if 056D:   actor 1@ defined
                then
                0B57: samp 3@ = player 0@ animation_id
                0B58: samp get_animation_name_to 4@ file_to 2@ by_id 3@
                    if 0C21: stricmp string1 2@ string2 "PED" // åñëè ñòðîêè ðàâíû
                    then
                    wait 2000
                    0AF8: "%d ... %s" -1 0@ 4@
                    end
                end
            end
        end
    end
end
end
 
  • Нравится
Реакции: p1cador

azdsfbzxv

Новичок
73
6
только что придумал, прямо на ходу, способ очень зашкварный, даже выкладывать стыдно, но в теории рабочий)
Создаешь буфер
CLEO:
:buffer_mamki
hex
"А\0Б\0В\0Г\0Д\0Е\0Ж\0З\0И\0К\0Л\0М\0Н\0О\0П\0Р\0С\0Т\0У\0Ф\0Х\0Ц\0Ч\0Ш\0"  //A = 0, Б = 2, В = 4....
end

Далее просто обращаешься к нужному символу, в зависимости от местоположения на карте
CLEO:
0AC6: 0@ = label @buffer_mamki offset //0@ А, 0@+=2 Б, 0@+=4 В...
Способ самый обычный, но можно без нулевых символов обходиться, выводя не строку %s, а символ %c. Однако в таком случае нужно передавать не указатель на символ, а сам символ.
Примерно понял о чём ты. Но на примере мне понятнее будет. Вот допустим должно быть такое соответствие:
Код:
1 = А
2 = Б
3 = В
4 = Г
5 = Д
6 = Ж
7 = З
8 = И
9 = К
10 = Л
11 =  М
12 =  Н
13 =  О
14 =  П
15 =  Р
16 = С
17 = Т
18 = У
19 = Ф
20 = Х
21 = Ц
22 = Ч
23 = Ш
24 = Я
Как мне это в точности записать в
Код:
hex
"..."
end
И вместе с этим
CLEO:
0AC6: 1@ = label @buffer_mamki offset
Всавить в код заменив кое что
CLEO:
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP

:Noname_10
8256:   not player $PLAYER_ACTOR defined
004D: jump_if_false @Noname_50
0001: wait 1000 ms
0002: jump @Noname_10

:Noname_50
0001: wait 0 ms
00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@
0AB1: call_scm_func @Noname_135 1 0@ 0@ 
0013: 1@ *= -1.0
0AB1: call_scm_func @Noname_135 1 1@ 1@ 
0AD1: show_formatted_text_highpriority "%d-%d" time 0 1@ 0@ 
0002: jump @Noname_50

:Noname_135
000B: 0@ += 3000.0
0017: 0@ /= 250.0
0C0A: math 0@ = ceil 0@ // (float)
0092: 0@ = float 0@ to_integer
0AB2: ret 1 0@
 

MelomanCool

Новичок
Проверенный
65
41
Примерно понял о чём ты. Но на примере мне понятнее будет.
Как-то так:
CLEO:
{$CLEO .cs}
0000:

while not Player.Defined($PLAYER_ACTOR)
    wait 100
end

0AA2: 30@ = load_library "kernel32.dll" // IF and SET
0AA4: 31@ = get_proc_address "GetModuleHandleA" library 30@ // IF and SET
0AA7: call_function 31@ num_params 1 pop 0 "samp.dll" 31@
0AA3: free_library 30@
if 31@ == 0
then
    0A93: end_custom_thread
end

while not SAMP.Available
    wait 100
end

while true
    wait 1000
    00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@
 
    0AB1: call @Convert 1 0@ to 0@ // X
 
    1@ *= -1.0
    0AB1: call @Convert 1 1@ to 1@ // Y
    1@ -= 1 // 1..24 -> 0..23
    0AC6: 2@ = label @Chars offset // получаем адрес массива букв
    0C0C: 1@ = struct 2@ offset 1@ size 1 // выбираем букву по номеру и читаем в 1@
 
    0AF8: samp add_message_to_chat "%c-%d" color -1 1@ 0@ // Y-X
end

:Convert
0@ += 3000.0
0@ /= 250.0
0C0A: math 0@ = ceil 0@
0092: 0@ = float 0@ to_integer
if 0@ < 1 // Добавил пару проверок
then 0@ = 1
end
if 0@ > 24
then 0@ = 24
end
0AB2: ret 1 0@

:Chars
hex
"АБВГДЖЗИКЛМНОПРСТУФХЦЧШЯ"
end
 
Последнее редактирование:
  • Нравится
Реакции: azdsfbzxv и Yanki

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Я так и сделал. Может я опять какую-то херню не туда вписал.
CLEO:
{$CLEO}
0000:
wait 2000

alloc 2@ 32
alloc 4@ 32

while true
wait 0
if 0ADC:   test_cheat "p"
then
    for 0@ = 0 to 999
    wait 0
        if 0B23: samp is_player_connected 0@
        then
            if 0B20: samp 1@ = actor_handle_by_samp_player_id 0@
            then
                if 056D:   actor 1@ defined
                then
                0B57: samp 3@ = player 0@ animation_id
                0B58: samp get_animation_name_to 4@ file_to 2@ by_id 3@
                    if 0C21: stricmp string1 2@ string2 "PED" // åñëè ñòðîêè ðàâíû
                    then
                    wait 2000
                    0AF8: "%d ... %s" -1 0@ 4@
                    end
                end
            end
        end
    end
end
end
Для удаленных игроков 0B57 высчитывает из структуры onFoot, т.е. те ид анимаций, которые установил сервер