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

VADE

Новичок
36
1
Как можно с помощью команды включать и выключать RAKNET?
CLEO:
{$CLEO}
{$INCLUDE SF}
0000: NOP

repeat
wait 400
until 0AFA:  is_samp_available

0BE3: raknet setup_incoming_rpc_hook @in_rpc // подготавливаем хук
0BDE: pause_thread 0

:in_rpc
0BE5: raknet 0@ = get_hook_param PARAM_PACKETID // Получаем ИД RPC
if 0@ == RPC_SCRSERVERJOIN // сверяем с необходимым ID
then
    0BE5: raknet 1@ = get_hook_param PARAM_BITSTREAM // Получаем битстрим
    if 0@ == RPC_SCRSERVERJOIN
    then
        0BE7: raknet 2@ = bit_stream_read 1@ type BS_TYPE_SHORT // ид подключившегося игрока
        0BE7: raknet 3@ = bit_stream_read 1@ type BS_TYPE_INT // цвет никнейма
        0BE7: raknet 4@ = bit_stream_read 1@ type BS_TYPE_BYTE // игрок NPC(true - да, false - нет)
        0BE7: raknet 5@ = bit_stream_read 1@ type BS_TYPE_BYTE // длина ника

        0AC8: 6@ = allocate_memory_size 25 // буфер
        0BE8: raknet bit_stream 1@ read_array 6@ size 5@ // копируем никнейм с указанной длиной в буфер
        0C1E: array 6@ element 5@ el_size 1 = 0 // обрезаем буфер нулевым символом(т.к. нулевой символ - конец строки), чтобы при чтении не попадало лишних символов
        0AF8: samp add_message_to_chat "%s[%d] подключился на сервер." color -1 params 6@ 2@ // выводим сообщение в чат
        0AC9: free_allocated_memory 6@
    end
end
0BE0: raknet hook_ret true // принимаем RPC, false - не принимать
 
Последнее редактирование:

Clopster

Известный
143
96
Как можно полученное из чата слово найти в txt файле, если оно было записано туда ранее? Какие опкоды мне использовать?
p.s. И как из всей строки взять только одно слово, а не от этого слова и до конца ( как это 0c18 делает)
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Я тебе уже во многом благодарен, но не мог бы ты показать на примере того кода, который я скидывал выше?)
Я тебе и на примере показал. Ты не можешь заменить последню строку в хуке и зарегистрировать команду и найти опкоды?
 

VADE

Новичок
36
1
Я тебе и на примере показал. Ты не можешь заменить последню строку в хуке и зарегистрировать команду и найти опкоды?
Слушай, а почему если я ставлю за место -90 другое значение, глубина не изменяется?
CLEO:
{$CLEO}
{$INCLUDE SF}
0000: NOP

repeat
wait 400
until 0AFA:  is_samp_available

cmd "invisible" @invisible
0BDE: pause_thread 0

:invisible
0B12: 20@ = 20@ XOR 1
if 20@ == 1
then
    msg "Invisible - {00ff00}On!" -1
    0BE2: raknet setup_outcoming_packet_hook @out_packet // Подготавливаем хук
end
if 20@ == 0
then
    msg "Invisible - {00ff00}Off!" -1
end
cmd_ret

:out_packet
if 20@ == 1
    then
    0BE5: raknet 0@ = get_hook_param PARAM_PACKETID // Получаем ИД пакета
    if 0@ == PACKET_PLAYER_SYNC // Сравниваем
    then
        0BE5: raknet 1@ = get_hook_param PARAM_BITSTREAM // Получаем битстрим

        0AC8: alloc 2@ 69 // sizeof(onFootData) + packetId // выделяем память для хранения данных битстрима
        0BE8: raknet bit_stream 1@ read_array 2@ size 69 // записываем в выделенную память(первый байт - ид пакета, всё остальное - синхронизация игрока(68 байт))

        0C0D: struct 2@ offset 15 size 4 = -90.0 // в данные битстрима установим значение -90.0. Это будет координата Z в синхронизации.

        0BEA: raknet bit_stream 1@ reset_write_pointer // сбрасываем указатель записи в битстриме
        0B40: raknet bit_stream 1@ write 2@ type BS_TYPE_ARRAY size 69 // записываем новые данные

        0AC9: free 2@ // освобождаем, т.к. выделенная память больше не нужна, все данные уже хранятся в перезаписанном битстриме
    end
    0BE0: raknet hook_ret 20@
end
cmd_ret

--- Сообщение обновлено ---
Как можно полученное из чата слово найти в txt файле, если оно было записано туда ранее? Какие опкоды мне использовать?
p.s. И как из всей строки взять только одно слово, а не от этого слова и до конца ( как это 0c18 делает)
Если я тебя правильно понял, то вот!
(P.S. 0C18 Так не делает.)

CLEO:
{$CLEO}
0000: NOP

repeat
wait 400
until 0AFA:  is_samp_available

:basis
wait 0
alloc 1@ 256
alloc 10@ 256
0AF4: 10@ = read_string_from_ini_file "CLEO\config.ini" section "MAIN" key "WORD"   // Считываем слово с .ini файла
0B75: samp get_chat_string 99 text_to 1@ prefix_to 3@ color_to 4@ prefix_color_to 25@   // Возвращаем параметры строки чата                
if
0C18: 9@ = strstr string1 1@ string2 10@    // Ищем подстроку в строке c учетом регистра. (Проверка, на наличие слова)
jf @basis   // Если слово не найдено, прыгает на лабел @basis
jump @act   // Если найдено, прыгает на лабел @act
jump @free

:act
wait 1000
// Сюда вставляешь действие. (Что будет происходить, если слово найдено)
jump @basis

:free
free 1@ // Очищаем память в переменной
free 10@    // Очищаем память в переменной
jump @basis
 
Последнее редактирование:

Clopster

Известный
143
96
Если я тебя правильно понял, то вот!

Спасибо, пригодится, а так это не совсем то. Если конкретно, то мне для скрипта, который добавляет ники игроков в .txt файл (1 ник - 1строка), нужно сделать такую проверку, чтобы в этом файле ники не повторялись.
У меня вся проблема как раз в проверке. Не получается ее сделать, чтобы все работало
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Спасибо, пригодится, а так это не совсем то. Если конкретно, то мне для скрипта, который добавляет ники игроков в .txt файл (1 ник - 1строка), нужно сделать такую проверку, чтобы в этом файле ники не повторялись.
У меня вся проблема как раз в проверке. Не получается ее сделать, чтобы все работало
Массив стринговый заюзай.
 

BlackKnigga

Известный
BH Team
922
444
Поч крашит?

CLEO:
{$CLEO}
0000:

repeat
wait 0
until samp.Available()
0B34: samp register_client_command "pick_m" to_label @pick_m
0B6D: render 8@ = create_font "Consolas" height 10 flags 5

while 9@ == 1
wait 0
    for 0@ = 0 to 4096 [STEP = 1]
        if 0B51: samp 1@ = pickup_handle_by_id 0@
        then
        065B: store_pickup 1@ position_to 2@ 3@ 4@
        0AC8: 5@ = allocate_memory_size 260
        0AD3: 5@ = format "{4CAF50}Pickup ID: %d" 0@
        0B55: convert_3D_coords {X}2@ {X}3@ {Z}4@ to_screen {X}6@ {Y}7@
        0B6F: render font 1@ draw_text 5@ pos {X}6@ {Y}7@ color 0xFFFFFF
        0AC9: free_allocated_memory 5@
        end
    end
end

:pick_m
0B12: 9@ = 9@ XOR 1
samp.CmdRet()
После запуска сразу прыгает на pick_m минуя цикл, переменная 9 же не равна единице. А там цмдрет и краш.
 

VADE

Новичок
36
1
Поч не работает, бля чот не так....

CLEO:
{$CLEO}
0000:

repeat
wait 0
until samp.Available()
0B34: samp register_client_command "fbot" to_label @farm_bot

while true
wait 0
    if 0B3C:  samp is_dialog_responded id 1 button 3@ list_item 4@ input_text 0
    then
        if 3@ == 1
        then
            if 4@ == 1
            then 0B12: 5@ = 5@ XOR 1
            end
        end
    end
  
    if 5@ == 1
    then
    wait 100
    0972: put_actor $PLAYER_ACTOR at -106.1755 100.723 3.1172 no_offset
    wait 100
    0972: put_actor $PLAYER_ACTOR at -104.637 104.38 3.1172 no_offset
    wait 100
    0972: put_actor $PLAYER_ACTOR at -48.9112 26.3239 3.1172 no_offset
    6@ += 1
    end
  
    if 6@ > 1
    then
        if 003B: 6@ == 1@
        then
        5@ = false
        6@ = false
        0AC8: 7@ = allocate_memory_size 260
        0AD3: 7@ = format "Áîò óñïåøíî çàêîí÷èë ñâîþ ðàáîòó!%cÊðóãîâ ïðîéäåíî: %d%cÍå çàáóäü ïîäïèñàòüñÿ íà êàíàë!%cÏîñòàâèòü ëàéê!" 0xA 6@ 0xA 0xA
        0B3B: samp show_dialog id 0 caption "Farm Bot" text 7@ button_1 "ÎÊ" button_2 "" style 0
        0AC9: free_allocated_memory 7@
        end
    end
end

:farm_bot
0B35: samp 0@ = get_last_command_params
0AD4: 0@ = scan_string 0@ format "%d" 1@
if 1@ > 0
then
    if 5@ == 1
    then
    0AC6: 2@ = label @Main_1 offset
    0B3B: samp show_dialog id 1 caption "{FFA500}Farm {FFFFFF}Bot" text 2@ button_1 "Âûáðàòü" button_2 "Âûõîä" style 2
    else
    0AC6: 2@ = label @Main_2 offset
    0B3B: samp show_dialog id 1 caption "{FFA500}Farm {FFFFFF}Bot" text 2@ button_1 "Âûáðàòü" button_2 "Âûõîä" style 2
    end
end
samp.CmdRet()

:Main_1
hex
    "{FFA500}Í{FFFFFF}àñòðîéêè:" A
    "{FFA500}Ñ{FFFFFF}òàòóñ áîòà: {00FF00}ON" 0
end

:Main_2
hex
    "{FFA500}Í{FFFFFF}àñòðîéêè:" A
    "{FFA500}Ñ{FFFFFF}òàòóñ áîòà: {FF0000}OFF" 0
end
Попробуй так:
CLEO:
{$CLEO}
0000: NOP

repeat 
wait 400
until 0AFA:  is_samp_available

0B34: samp register_client_command "fbot" to_label @farm_bot

while true
wait 0
    if 0B3C:  samp is_dialog_responded id 1 button 3@ list_item 4@ input_text 0
    then
        if 3@ == 1
        then
            if 4@ == 1
            then 0B12: 5@ = 5@ XOR 1
            end
        end
    end
   
    if 5@ == 1
    then
    wait 100
    00a1: put_actor $PLAYER_ACTOR at -106.1755 100.723 3.1172
    wait 100
    00a1: put_actor $PLAYER_ACTOR at -104.637 104.38 3.1172
    wait 100
    00a1: put_actor $PLAYER_ACTOR at -48.9112 26.3239 3.1172
    6@ += 1
    end
   
    if 6@ > 1
    then
        if 003B: 6@ == 1@
        then
        5@ = false
        6@ = false
        0AC8: 7@ = allocate_memory_size 260
        0AD3: 7@ = format "Áîò óñïåøíî çàêîí÷èë ñâîþ ðàáîòó!%cÊðóãîâ ïðîéäåíî: %d%cÍå çàáóäü ïîäïèñàòüñÿ íà êàíàë!%cÏîñòàâèòü ëàéê!" 0xA 6@ 0xA 0xA
        0B3B: samp show_dialog id 0 caption "Farm Bot" text 7@ button_1 "ÎÊ" button_2 "" style 0
        0AC9: free_allocated_memory 7@
        end
    end
end

:farm_bot
0B35: samp 0@ = get_last_command_params
0AD4: 0@ = scan_string 0@ format "%d" 1@
if 1@ > 0
then
    if 5@ == 1
    then
    0AC6: 2@ = label @Main_1 offset
    0B3B: samp show_dialog id 1 caption "{FFA500}Farm {FFFFFF}Bot" text 2@ button_1 "Âûáðàòü" button_2 "Âûõîä" style 2
    else
    0AC6: 2@ = label @Main_2 offset
    0B3B: samp show_dialog id 1 caption "{FFA500}Farm {FFFFFF}Bot" text 2@ button_1 "Âûáðàòü" button_2 "Âûõîä" style 2
    end
end
samp.CmdRet()

:Main_1
hex
    "{FFA500}Í{FFFFFF}àñòðîéêè:" A
    "{FFA500}Ñ{FFFFFF}òàòóñ áîòà: {00FF00}ON" 0
end

:Main_2
hex
    "{FFA500}Í{FFFFFF}àñòðîéêè:" A
    "{FFA500}Ñ{FFFFFF}òàòóñ áîòà: {FF0000}OFF" 0
end
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Та не,команда то регистрируется. В переменную 5 нихуя не записывается
Попробуй вот так :
CLEO:
0B12: 5@ = 2 XOR 1
и пропиши ниже
CLEO:
if 5@ == 2
then
0AF8: "Номер два" 0xffffff
end
if 5@ == 1
then
0AF8: "Номер один" 0xffffff
end
И измени условие в строке if 5@ == 1 then на 3 допустим, я обычно использую 0AF8 для отладки
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
CLEO:
if 0B3C:  samp is_dialog_responded id 1 button 3@ list_item 4@ input_text 0
    then
        if 3@ == 1
        then
            if 4@ == 1
            then 0B12: 5@ = 5@ XOR 1
            end
        end
    end
где присвоение? я чет слепой, опкод 0B12 присваевает переменной 5@ значение, допустим 0B12: 5@ = 2 XOR 1 будет записывать в 5@ число либо 2, либо 1 методом рандома, а в 5@ у тебя нет значенияи ты пытаешься присвоить либо 1, либо nil.