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

RedBoxWhite

Известный
337
27
Почему крашит? Когда убираю проверку ников, всё нормально. И да, поставил опкод 0C21, но мне требуется игнорирование, исправьте на нужный опкод.
CLEO:
while true
wait 0
if 0ADC:   test_cheat "DA"
then
00A0: store_actor $PLAYER_ACTOR position_to 10@ 9@ 8@
for 0@ = 0 to 999
    if 0B23: samp is_player_connected 0@
    then
    0B20: samp 1@ = actor_handle_by_samp_player_id 0@
        if 056D:   actor 1@ defined
        then
            if 00EC:   actor 1@ sphere 0 near_point 10@ 9@ radius 140.0 140.0
            then
                for 21@ = 0 to 25
                0AD3: string_format 4@v format "%d" 21@
                    if 0AF4: 15@ = read_string_from_ini_file "cleo\plys.ini" section "plys" key 4@v
                    then
                    0B36: samp 5@ = get_player_nickname 0@
                        if 0C21: stristr string1 4@ string2 5@
                        then
                        0AF8: "%d" -1 0@
                        wait 1000
                        end
                    end
                end
            end
        end
    end
end
end
 

SR_team

like pancake
BH Team
4,809
6,492
CLEO:
0AD4: 29@ = scan_string 0@ format "%[^:]: %[^\n]" 1@ 2@
Должно работать. Тестировал тут: http://ideone.com/N4my10

Насчет %[] можно почитать, например, здесь: http://lord-n.narod.ru/download/books/walla/programming/Spr_po_C/13/scanf.htm
Называется эта штука "scanset".
знал бы я в свое время, что scanf так умеет, не потратил бы 2 часа своей жизни на регулярки :(
 

MelomanCool

Новичок
Проверенный
65
42
знал бы я в свое время, что scanf так умеет, не потратил бы 2 часа своей жизни на регулярки :(
Да я сам узнал недели две назад. А разве в сях есть нормальные регулярки?

Хочу написать скрипт, что бы в нём определялись квадраты на карте.
Вот, набросал на плюсах: http://ideone.com/eDZd32
Завтра перенесу на клео.
CLEO:
{$CLEO .cs}
0000:

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

while true
    wait 0
    00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@
    0AB1: call @Convert 1 0@ to 0@ // X
    1@ *= -1.0 // инвертируем направление оси Y (или знак координаты)
    0AB1: call @Convert 1 1@ to 1@ // Y
    0AD1: show_formatted_text_highpriority "%d-%d" time 0 0@ 1@
end

:Convert
0@ += 3000.0 // смещаем координатную ось
0@ /= 250.0 // 6000/24 - карта, поделенная на 24 куска = размер куска
0C0A: math 0@ = ceil 0@ // округляем в большую сторону для точности
0092: 0@ = float 0@ to_integer
0AB2: ret 1 0@
 
Последнее редактирование:
  • Нравится
Реакции: azdsfbzxv и Yanki

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Если игрок всё это время был в стриме - да.
 

RedBoxWhite

Известный
337
27
Есть ли опкод, который проверяет название файла анимации у игрока?
Типа 0611, но только с проверкой названия файла.
 

MelomanCool

Новичок
Проверенный
65
42
Есть ли опкод, который проверяет название файла анимации у игрока?
Типа 0611, но только с проверкой названия файла.
CLEO:
0AC8: 1@ = allocate_memory_size 32
0AC8: 2@ = allocate_memory_size 16
0B2B: samp 0@ = get_player_id_by_actor_handle $PLAYER_ACTOR
0B57: samp 0@ = player 0@ animation_id
0B58: samp get_animation_name_to 1@ file_to 2@ by_id 0@
if 0C21: stricmp string1 2@ string2 "PED" // если строки равны
then
...
end
0AC9: free_memory 1@
0AC9: free_memory 2@
 
  • Нравится
Реакции: Yanki

azdsfbzxv

Новичок
73
6
Вот функа, преобразовывает первый вариант координат во второй
sXbiAUv_mGg.jpg


Затем возвращает номер квадрата по X и Y соответственно
так например верхняя левая часть карты это 1,1,а нижняя правая это 24,24

код функи
Код:
GetCoordOfSection
10@ = 3000.0 // X
11@ = 3000.0 // Y
Actor.StorePos($player_actor, 1@, 2@, 3@)

//перевод системы координат
//X
if 1@ > 0.0
then
    005B: 10@ += 1@
else
    0013: 1@ *= -1.0 // модуль числа
    0063: 10@ -= 1@
end
//Y
if 2@ > 0.0
then
    0063: 11@ -= 2@
else
    0013: 2@ *= -1.0 // модуль числа
    005B: 11@ += 2@
end

// 24x24=576
// координатное поле от верхнего левого угла начиная с 0 до 6000.0 (3000.0+3000.0)  с шагом квадратом по 250
10@ /= 250.0
0AB1: @GetFloatToTwoInt 1 float 10@ store_2_int 33@ 5@
if 5@ > 0
then
    0092: 3@ = float 10@ to_integer
    000A: 3@ += 1
else
    0092: 3@ = float 10@ to_integer
end
11@ /= 250.0
0AB1: @GetFloatToTwoInt 1 float 11@ store_2_int 33@ 5@
if 5@ > 0
then
    0092: 1@ = float 11@ to_integer
    000A: 1@ += 1
else
    0092: 1@ = float 11@ to_integer
end
0AB2: ret 2 1@ 3@

:GetFloatToTwoInt  // 11.22
0092: 1@ = float 0@ to_integer  // 11
0093: 2@ = integer 1@ to_float // 11.00
0063: 0@ -= 2@ // 11.22 - 11.00 = 0.22
0@ *= 100.0  // 0.22 * 100.0 = 22.0
0092: 2@ = float 0@ to_integer  // 22
0AB2: ret 2 1@ 2@

Код:
{$CLEO}

0000:
while 8AFA: not is_samp_available // repeat
    wait 0
end

while true
    wait 0
    0AB1: call_scm_func @GetCoordOfSection 0 store_X_to 1@ Y_to 2@
    0AD1: show_formatted_text_highpriority "X=%i / Y=%i" time 100 1@ 2@
end

:GetCoordOfSection
10@ = 3000.0 // X
11@ = 3000.0 // Y
Actor.StorePos($player_actor, 1@, 2@, 3@)

//перевод системы координат
//X
if 1@ > 0.0
then
    005B: 10@ += 1@
else
    0013: 1@ *= -1.0 // модуль числа
    0063: 10@ -= 1@
end
//Y
if 2@ > 0.0
then
    0063: 11@ -= 2@
else
    0013: 2@ *= -1.0 // модуль числа
    005B: 11@ += 2@
end

// 24x24=576
// координатное поле от верхнего левого угла начиная с 0 до 6000.0 (3000.0+3000.0)  с шагом квадратом по 250
10@ /= 250.0
0AB1: @GetFloatToTwoInt 1 float 10@ store_2_int 33@ 5@
if 5@ > 0
then
    0092: 3@ = float 10@ to_integer
    000A: 3@ += 1
else
    0092: 3@ = float 10@ to_integer
end
11@ /= 250.0
0AB1: @GetFloatToTwoInt 1 float 11@ store_2_int 33@ 5@
if 5@ > 0
then
    0092: 1@ = float 11@ to_integer
    000A: 1@ += 1
else
    0092: 1@ = float 11@ to_integer
end
0AB2: ret 2 1@ 3@

:GetFloatToTwoInt  // 11.22
0092: 1@ = float 0@ to_integer  // 11
0093: 2@ = integer 1@ to_float // 11.00
0063: 0@ -= 2@ // 11.22 - 11.00 = 0.22
0@ *= 100.0  // 0.22 * 100.0 = 22.0
0092: 2@ = float 0@ to_integer  // 22
0AB2: ret 2 1@ 2@

Дальше думай сам как будешь вычислять "квадраты"
Да я сам узнал недели две назад. А разве в сях есть нормальные регулярки?


Вот, набросал на плюсах: http://ideone.com/eDZd32
Завтра перенесу на клео.
CLEO:
{$CLEO .cs}
0000:

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

while true
    wait 0
    00A0: store_actor $PLAYER_ACTOR position_to 0@ 1@ 2@
    0AB1: call @Convert 1 0@ to 0@ // X
    1@ *= -1.0 // инвертируем направление оси Y (или знак координаты)
    0AB1: call @Convert 1 1@ to 1@ // Y
    0AD1: show_formatted_text_highpriority "%d-%d" time 0 0@ 1@
end

:Convert
0@ += 3000.0 // смещаем координатную ось
0@ /= 250.0 // 6000/24 - карта, поделенная на 24 куска = размер куска
0C0A: math 0@ = ceil 0@ // округляем в большую сторону для точности
0092: 0@ = float 0@ to_integer
0AB2: ret 1 0@
Спасибо вам обоим. Теперь вот думаю как русскую букву зависать в переменную. В первом примере надо заменить переменную 1@ на русскую букву. Или во втором варианте переменную 1@ на русскую букву
 

RedBoxWhite

Известный
337
27
CLEO:
0AC8: 1@ = allocate_memory_size 32
0AC8: 2@ = allocate_memory_size 16
0B2B: samp 0@ = get_player_id_by_actor_handle $PLAYER_ACTOR
0B57: samp 0@ = player 0@ animation_id
0B58: samp get_animation_name_to 1@ file_to 2@ by_id 0@
if 0C21: stricmp string1 2@ string2 "PED" // если строки равны
then
...
end
0AC9: free_memory 1@
0AC9: free_memory 2@
Неплохо, я не додумался до такого. Почему тут крашит?
CLEO:
{$CLEO}
0000:
wait 2000

alloc 2@ 32
alloc 4@ 32


:test
while true
wait 0
if 0ADC:   test_cheat "p"
then
for 0@ = 0 to 999
    if 0B23: samp is_player_connected 0@
    then
    0B20: samp 1@ = actor_handle_by_samp_player_id 0@
        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
            free 4@
            free 2@
        end
    end
end
end
end
 

lolka19

Участник
30
2
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
Крашит при кмд. В чем проблемма?
 

SR_team

like pancake
BH Team
4,809
6,492
Неплохо, я не додумался до такого. Почему тут крашит?
CLEO:
{$CLEO}
0000:
wait 2000

alloc 2@ 32
alloc 4@ 32


:test
while true
wait 0
if 0ADC:   test_cheat "p"
then
for 0@ = 0 to 999
    if 0B23: samp is_player_connected 0@
    then
    0B20: samp 1@ = actor_handle_by_samp_player_id 0@
        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
            free 4@
            free 2@
        end
    end
end
end
end
ты память объявляешь 1 раз, а выгружаешь после каждого игрока.
Убери:
free 4@
free 2@