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

Woofing Giraffe

Активный
402
49
Шо не так? Игра просто вылетает, даже не краш, а просто вылет.
CLEO:
{$CLEO}
0000:
wait 2000

0AC8: 10@ = allocate_memory_size 256
0AC8: 11@ = allocate_memory_size 128
0AC8: 12@ = allocate_memory_size 128

while true
wait 0
0B75: get_chat_string 99 text_to 10@ prefix_to 0 color_to 0 prefix_color_to 0
if 0C18: 0 = strstr string1 10@ string2 "[O]"
then
0AA5: call 0x8220AD num_params 4 pop 4 params 12@ 11@ "%s: %s" 10@
    for 1@ = 0 to 999
    if 0B23:  samp is_player_connected 1@
    then
    0B36: samp 2@ = get_player_nickname 1@
    0C16: 16@ = strtok string1 11@ string2 "["
        if 0C21: stricmp string1 16@ string2 2@
        then
        0AF8: "%d" -1 1@
        end
    end
    end
end
wait 0
end
Уже нашёл ошибку, исправил. Но почему очень медленно срабатывает?
Хук поставь лучше
 

RedBoxWhite

Известный
337
27
Хук поставь лучше
Да я уже исправил)

Шо не так? Игра просто вылетает, даже не краш, а просто вылет.
CLEO:
{$CLEO}
0000:
wait 2000

0AC8: 10@ = allocate_memory_size 256
0AC8: 11@ = allocate_memory_size 128
0AC8: 12@ = allocate_memory_size 128

while true
wait 0
0B75: get_chat_string 99 text_to 10@ prefix_to 0 color_to 0 prefix_color_to 0
if 0C18: 0 = strstr string1 10@ string2 "[O]"
then
0AA5: call 0x8220AD num_params 4 pop 4 params 12@ 11@ "%s: %s" 10@
    for 1@ = 0 to 999
    if 0B23:  samp is_player_connected 1@
    then
    0B36: samp 2@ = get_player_nickname 1@
    0C16: 16@ = strtok string1 11@ string2 "["
        if 0C21: stricmp string1 16@ string2 2@
        then
        0AF8: "%d" -1 1@
        end
    end
    end
end
wait 0
end
Уже нашёл ошибку, исправил. Но почему очень медленно срабатывает?
Как в этом скрипте сделать так, чтобы ты вводишь команду /repeat id, потом опкодом получаем ник по ид, после скрипт срабатывает, но считывает строки с ником, который мы получили.
 
Последнее редактирование модератором:

Trashmas

Новичок
40
0
Есть несколько точек (координат) Как можно определить ближайшую точку к игроку?
 

Enotawer

Новичок
24
2
Почему когда я запускаю своё клео у меня моргает экран,при этом происходит какой-то автореспавн после логина снова кидает на иесто на пляже, пробывал repeat првда там end поставил потому что until false пишет неизвестная команда, воспользовался while true end но все ровно моргает.
 

Woofing Giraffe

Активный
402
49
Почему когда я запускаю своё клео у меня моргает экран,при этом происходит какой-то автореспавн после логина снова кидает на иесто на пляже, пробывал repeat првда там end поставил потому что until false пишет неизвестная команда, воспользовался while true end но все ровно моргает.
Скрипт кривой. Код сюда.
 

Enotawer

Новичок
24
2
Скрипт кривой. Код сюда.
Не суди строго это мой первый самостоятельный клео скрипт и он подразумевает fake chat я хотел чтобы он в готовом тексте изменял параметры в некоторых местах и наверно вот из-за этого и кривизна.

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

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

while true
wait 0
    if 0@ == true
    then
    SAMP.IsCommandTyped(1@)
        if 0ad4: 4@ = scan_string 1@ format "%s %s %s" 5@ 6@ 7@
        then
            if and
            6@ > 0
            6@ < 1000
            then
            chatmsg "5@[6@]: 7@"
            else 
            chatmsg "[EditText]: /edittext Nick_Name[ID от 1 до 1000]: Text"
            0@ = false
            end
        else chatmsg "[EditText]: /edittext Nick_Name[ID]: Text"
        end
end

:ETEXT
0@ = true
SAMP.CmdRet()
 
Последнее редактирование:

Trashmas

Новичок
40
0
Как считать несколько строк из TXT файла в разные переменные?
И как вообще считать определенную строку, к примеру третью.

Напиши функцию получения расстояния между собой и точкой и циклом пройдись по координатам
Спасибо, попробую
 

azdsfbzxv

Новичок
73
6
В GTA есть переменная которая хранит ID текущей погоды. В сингле её можно изменить на свой ID и погода поменяется а вот в сампе если поменяем то мы увидим её на 1 мс потому что самп в в бесконечном цикле восстанавливает погоду из своей переменной. Эта переменная находится в структуре stServerPresents (byteWeather) вот её нужно изменять.


VirtualProtect ставится на код
Я тоже не знал как вернуть погоду которая на сервере. Делал проще. Просто включал солнечную погоду:

CLEO:
{$CLEO .cs}
0000: NOP

0001: wait 0 ms

while not SAMP.Available()
    wait 400
end

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

while true
    wait 0
    if
        8B21: not samp is_chat_opened
    then
        if 0AB0: key_pressed 72 // Клавиша H
        then
            01B6: set_weather 9 // Туман
        end
        if 0AB0: key_pressed 74 // Клавиша J
        then
            01B6: set_weather 16 // Дождь с грозой
        end
        if 0AB0: key_pressed 75 // Клавиша K
        then
            01B6: set_weather 19 // Песчаная буря
        end
        if 0AB0: key_pressed 76 // Клавиша L
        then
            01B6: set_weather 19 // Солнечная погода
        end
    end
end
 

Woofing Giraffe

Активный
402
49
Не суди строго это мой первый самостоятельный клео скрипт и он подразумевает fake chat я хотел чтобы он в готовом тексте изменял параметры в некоторых местах и наверно вот из-за этого и кривизна.

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

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

while true
wait 0
    if 0@ == true
    then
    SAMP.IsCommandTyped(1@)
        if 0ad4: 4@ = scan_string 1@ format "%s %s %s" 5@ 6@ 7@
        then
            if and
            6@ > 0
            6@ < 1000
            then
            chatmsg "5@[6@]: 7@"
            else
            chatmsg "[EditText]: /edittext Nick_Name[ID от 1 до 1000]: Text"
            0@ = false
            end
        else chatmsg "[EditText]: /edittext Nick_Name[ID]: Text"
        end
end

:ETEXT
0@ = true
SAMP.CmdRet()
Ну во 1, 0ad4 не сможет тебе сканировать строку длиннее чем 17 символов вроде, надо sscanf юзать
Во 2, ты неправильно используешь chatmsg
В 3, ты не выделяешь память (alloc) под ник и текст сообщения
В 4, ид может быть не от 1 до 999, а от 0 до 1000
В 5, все это можно выполнить в теле команды
 

Enotawer

Новичок
24
2
Ну во 1, 0ad4 не сможет тебе сканировать строку длиннее чем 17 символов вроде, надо sscanf юзать
Во 2, ты неправильно используешь chatmsg
В 3, ты не выделяешь память (alloc) под ник и текст сообщения
В 4, ид может быть не от 1 до 999, а от 0 до 1000
В 5, все это можно выполнить в теле команды
У меня наверно 2 последних вопроса. Как правильно использовать chatmsg или чем его заменить? Что означает выполнить в теле команды? Т.е через меню?
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,339
У меня наверно 2 последних вопроса. Как правильно использовать chatmsg или чем его заменить? Что означает выполнить в теле команды? Т.е через меню?

1-chatmsg "5@[6@]: 7@" -Неправильно, правильно:chatmsg "%s[%d]:%s " 5@ 6@ 7@
2-Тело команды в твоем случае это :
CLEO:
:ETEXT
0@ = true
SAMP.CmdRet()

Если будут вопросы по выводу переменных, то стучись в ЛС
 

RedBoxWhite

Известный
337
27
Шо не так?
CLEO:
:repeat
0B35: 0@ = get_last_command_params
0C1A: 0@ = atoi 0@
format 0@ = "%d%d" 5@ 6@


if and
not 5@ == 1
not 5@ == 2
then
0AF8: "/repeat [1/2] [ID]" 0xFF0000
end

if 5@ == 1
then
    if 0029:   6@ >= 0
    then
    0B36: samp 22@ = get_player_nickname 6@
    0AF8: "%s." 0xFF0000 22@
    0006: 25@ = true
    end
end

if 5@ == 2
then
0006: 25@ = false
end
cmdret
 

Woofing Giraffe

Активный
402
49
Шо не так?
CLEO:
:repeat
0B35: 0@ = get_last_command_params
0C1A: 0@ = atoi 0@
format 0@ = "%d%d" 5@ 6@


if and
not 5@ == 1
not 5@ == 2
then
0AF8: "/repeat [1/2] [ID]" 0xFF0000
end

if 5@ == 1
then
    if 0029:   6@ >= 0
    then
    0B36: samp 22@ = get_player_nickname 6@
    0AF8: "%s." 0xFF0000 22@
    0006: 25@ = true
    end
end

if 5@ == 2
then
0006: 25@ = false
end
cmdret
Под 0@ память выделил?
 

Enotawer

Новичок
24
2
О опкоде
0AD4: 4@ = scan_string 0@v format "%d + %d = %d" 5@ 6@ 7@ //IF and SET
можно ли записать так? "%s + %d = %s%d" 5@
просто хочу узнать можно ли и будет ли это работать?