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

Balonboy

Известный
14
1
CLEO:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0662: printstring "SYSTEMAIN.3DN.RU"
thread "$PLAYER_ACTOR"

:$PLAYER_ACTOR_37
wait 0
if
   Player.Defined($PLAYER_CHAR)
jf @$PLAYER_ACTOR_37
if
key_down 113
jf @$PLAYER_ACTOR_37
0@ = 22
0@ += 36
0@ *= 112
0@ += 13150904
0@ += 34
0A8D: 20@ = read_memory 0@ size 2 virtual_protect 0
0A8C: write_memory 0@ size 2 value 15 virtual_protect 0
1@ = 23
1@ += 36
1@ *= 112
1@ += 13150904
1@ += 34
0A8D: 21@ = read_memory 1@ size 2 virtual_protect 0
0A8C: write_memory 1@ size 2 value 20 virtual_protect 0
2@ = 24
2@ += 36
2@ *= 112
2@ += 13150904
2@ += 34
0A8D: 22@ = read_memory 2@ size 2 virtual_protect 0
0A8C: write_memory 2@ size 2 value 90 virtual_protect 0
3@ = 25
3@ += 36
3@ *= 112
3@ += 13150904
3@ += 34
0A8D: 23@ = read_memory 3@ size 2 virtual_protect 0
0A8C: write_memory 3@ size 2 value 5 virtual_protect 0
4@ = 27
4@ += 36
4@ *= 112
4@ += 13150904
4@ += 34
0A8D: 24@ = read_memory 4@ size 2 virtual_protect 0
0A8C: write_memory 4@ size 2 value 7 virtual_protect 0
5@ = 29
5@ *= 112
5@ += 13150904
5@ += 34
0A8D: 25@ = read_memory 5@ size 2 virtual_protect 0
0A8C: write_memory 5@ size 2 value 9 virtual_protect 0
6@ = 30
6@ += 36
6@ *= 112
6@ += 13150904
6@ += 34
0A8D: 26@ = read_memory 6@ size 2 virtual_protect 0
0A8C: write_memory 6@ size 2 value 15 virtual_protect 0
7@ = 31
7@ += 36
7@ *= 112
7@ += 13150904
7@ += 34
0A8D: 27@ = read_memory 7@ size 2 virtual_protect 0
0A8C: write_memory 7@ size 2 value 15 virtual_protect 0
8@ = 33
8@ *= 112
8@ += 13150904
8@ += 34
0A8D: 28@ = read_memory 8@ size 2 virtual_protect 0
0A8C: write_memory 8@ size 2 value 30 virtual_protect 0
9@ = 34
9@ *= 112
9@ += 13150904
9@ += 34
0A8D: 29@ = read_memory 9@ size 2 virtual_protect 0
0A8C: write_memory 9@ size 2 value 50 virtual_protect 0
10@ = 28
10@ += 36
10@ *= 112
10@ += 13150904
10@ += 34
0A8D: 30@ = read_memory 10@ size 2 virtual_protect 0
0A8C: write_memory 10@ size 2 value 10 virtual_protect 0
11@ = 32
11@ += 36
11@ *= 112
11@ += 13150904
11@ += 34
0A8D: 31@ = read_memory 11@ size 2 virtual_protect 0
0A8C: write_memory 11@ size 2 value 10 virtual_protect 0
12@ = 37
12@ *= 112
12@ += 13150904
12@ += 34
0A8D: TIMERA = read_memory 12@ size 2 virtual_protect 0
0A8C: write_memory 12@ size 2 value 25 virtual_protect 0
13@ = 38
13@ += 36
13@ *= 112
13@ += 13150904
13@ += 34
0A8D: TIMERB = read_memory 13@ size 2 virtual_protect 0
0A8C: write_memory 13@ size 2 value 25 virtual_protect 0
14@ = 26
14@ += 36
14@ *= 112
14@ += 13150904
14@ += 34
0A8D: 34@ = read_memory 14@ size 2 virtual_protect 0
0A8C: write_memory 14@ size 2 value 6 virtual_protect 0
018C: play_sound 1085 at 0.0 0.0 0.0
wait 50
018C: play_sound 1085 at 0.0 0.0 0.0
wait 50
018C: play_sound 1085 at 0.0 0.0 0.0
00BC: show_text_highpriority GXT 'CHEAT1' time 1000 flag 1  // Trapaœa Ativada

:$PLAYER_ACTOR_1043
wait 0
if
   not key_down 113
jf @$PLAYER_ACTOR_1043

:$PLAYER_ACTOR_1062
wait 0
if
key_down 113
jf @$PLAYER_ACTOR_1062
0A8C: write_memory 0@ size 2 value 20@ virtual_protect 0
0A8C: write_memory 1@ size 2 value 21@ virtual_protect 0
0A8C: write_memory 2@ size 2 value 22@ virtual_protect 0
0A8C: write_memory 3@ size 2 value 23@ virtual_protect 0
0A8C: write_memory 4@ size 2 value 24@ virtual_protect 0
0A8C: write_memory 5@ size 2 value 25@ virtual_protect 0
0A8C: write_memory 6@ size 2 value 26@ virtual_protect 0
0A8C: write_memory 7@ size 2 value 27@ virtual_protect 0
0A8C: write_memory 8@ size 2 value 28@ virtual_protect 0
0A8C: write_memory 9@ size 2 value 29@ virtual_protect 0
0A8C: write_memory 10@ size 2 value 30@ virtual_protect 0
0A8C: write_memory 11@ size 2 value 31@ virtual_protect 0
0A8C: write_memory 12@ size 2 value TIMERA virtual_protect 0
0A8C: write_memory 13@ size 2 value TIMERB virtual_protect 0
0A8C: write_memory 14@ size 2 value 34@ virtual_protect 0
018C: play_sound 1084 at 0.0 0.0 0.0
wait 50
018C: play_sound 1084 at 0.0 0.0 0.0
wait 50
018C: play_sound 1084 at 0.0 0.0 0.0
00BC: show_text_highpriority GXT 'CHEAT8' time 1000 flag 1  // Trapaœa Desativada

:$PLAYER_ACTOR_1345
wait 0
if
   not key_down 113
jf @$PLAYER_ACTOR_1345
goto @$PLAYER_ACTOR_37

Can you solve the bug of this script that when I disable I die with 1 shot for the enemies?

Можете ли вы решить ошибку этого скрипта, что при отключении я умираю с 1 выстрела по врагам?
 
Последнее редактирование модератором:

New_J3rs3y1337

Известный
148
102
А какой опкод на то, что игрок не находится во всех т/с ?
1658167907465.png

Не совсем тебя понял. Типо этого?
 

F.SKY

Участник
36
9
Наверное да... но не уверен напишу точнее.
Это для скрипта который ты отправлял ранее "проверка двери по команде". Я хотел сделать если игрок находится в авто то писалось как под цифрой 1. Если игрок не в т/с то под цифрой 2. И как сделать чтоб проверка двигателя не работала когда игрок не на водительском месте.


IMG_20220718_222028.jpg

Посмотреть вложение 158095
Не совсем тебя понял. Типо этого?
 

New_J3rs3y1337

Известный
148
102
Я хотел сделать если игрок находится в авто то писалось как под цифрой 1. Если игрок не в т/с то под цифрой 2.
CLEO:
{$CLEO}
0000:

:1
wait 0
0ab0: 49
jf @1
00DF:   actor $PLAYER_ACTOR driving
jf @2
0AD1: show_formatted_text_highpriority "InCar" time 2000
jump @3

:2
wait 0
0AD1: show_formatted_text_highpriority "Onfoot" time 2000

:3
wait 0
8ab0: 49
jf @3
jump @1
Я делал бы как-то вот так.



как сделать чтоб проверка двигателя не работала когда игрок не на водительском месте.
CVehicle + 0x460 = [dword] Указатель на водителя (CPed).
Можно сравнивать это значение с указателем на свою структуру (0xB6F5F0).



Кстати, нашёл ещё вот это:

CVehicle + 0x4F8 = [dword] Статус дверей машины.
  • 1 = Открыты
  • 2 = Закрыты
Не знаю почему мне выводило 0. Люблю самп :)
 
  • Нравится
Реакции: F.SKY

F.SKY

Участник
36
9
CLEO:
{$CLEO}
0000:

:1
wait 0
0ab0: 49
jf @1
00DF:   actor $PLAYER_ACTOR driving
jf @2
0AD1: show_formatted_text_highpriority "InCar" time 2000
jump @3

:2
wait 0
0AD1: show_formatted_text_highpriority "Onfoot" time 2000

:3
wait 0
8ab0: 49
jf @3
jump @1

Привет, можешь проверить в скрипте с дверьми я вроде все нормально сделал но игра крашит при воде команды.

И как совместить эти функции в скрипте?
CVehicle + 0x4F8 = [dword] Статус дверей машины.
CVehicle + 0x460 = [dword] Указатель на водителя (CPed)

CLEO:
{$CLEO}
0000:

:0
wait 0
0afa:
jf @0
0b34: "lock" @1
0BDE: pause_thread 0


:1
wait 0
jf @1
00DF:   actor $PLAYER_ACTOR driving
jf @2
03C0: 0@ = actor $PLAYER_ACTOR car
09B3: get_car 0@ door_status 1@

if
0039:   1@ == 0
then
0AF9: samp say_msg "/c unlock"
else
0AF9: samp say_msg "/c lock"
end
jump @3

:2
wait 0
0AF9: samp say_msg "/c FOOT"

:3
jf @3
jump @1
cmdret

CLEO:
{$CLEO}
0000: NOP

:1
0001: wait 0 ms
00D6: if and
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BMX
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BIKE
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #MTBIKE
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
03C0: 0@ = actor $PLAYER_ACTOR car
0441: 1@ = car 0@ model
0AC8: 2@ = allocate_memory_size 128
0ADB: 2@ = car_model 1@ name
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @2

:3
0001: wait 0 ms
0AF9: samp say_msg "/c engin ON %s" 2@
0002: jump @5

:2
0001: wait 0 ms
0AF9: samp say_msg "/c engin OFF %s" 2@
0002: jump @4

:5
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
8ABE:   not vehicle 0@ engine_on
004D: jump_if_false @5
0002: jump @2

:4
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @4
0002: jump @3
0AB2: 0 ret
 
Последнее редактирование:

New_J3rs3y1337

Известный
148
102
я вроде все нормально сделал
CLEO:
{$CLEO}
0000:

:0
wait 0
0afa:                    //проверка на то что самп загружен
jf @0
0b34: "lock" @1
0BDE: pause_thread 0    //ставим на паузу

:1
00DF:   actor $PLAYER_ACTOR driving                    //если в машине то
jf @2
03C0: 0@ = actor $PLAYER_ACTOR car                  //просто получаем хендл машины и идём проверять двери
jump @3

:2                                                                                 //а если не в машине, смотрим ближайшие кары
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to $NO_USE    //этот опкод покажет ближайший кар в радиусе ~30-35 метров           
not 0@ == -1
jf @5
00AA: store_car 0@ position_to 2@ 3@ 4@
00A0: store_actor $PLAYER_ACTOR position_to 5@ 6@ 7@
050A: 8@ = distance_between_XYZ 2@ 3@ 4@ and_XYZ 5@ 6@ 7@                  //получаем дистанцию, чтоб проверяло только те машины,
8@ < 4.0                                                                    //которые в радиусе 4 метров от игрока
jf @5

:3
09B3: get_car 0@ door_status 1@
1@ == 2
jf @4
0AD1: show_formatted_text_highpriority "unlock~n~%d" time 2000 0@
jump @5

:4
0AD1: show_formatted_text_highpriority "lock~n~%d" time 2000 0@

:5
cmdret

У тебя крашило из-за того что cmdret в конце не вызывался вообще. Бесконечный цикл внутри тела команды делать запрещается.

И как совместить эти функции в скрипте?
CLEO:
{$CLEO}
0000: NOP

:1
0001: wait 0 ms
00D6: if and
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BMX
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BIKE
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #MTBIKE
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1

03C0: 0@ = actor $PLAYER_ACTOR car
0A8D: 3@ = read_memory 0xB6F5F0 size 4 virtual_protect 0
0A97: 4@ = car 0@ struct
4@ += 0x460
0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0
003B:   4@ == 3@
jf @1

03C0: 0@ = actor $PLAYER_ACTOR car
0441: 1@ = car 0@ model
0AC8: 2@ = allocate_memory_size 128
0ADB: 2@ = car_model 1@ name
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @2

:3
0001: wait 0 ms
0AF9: samp say_msg "/c engin ON %s" 2@
0002: jump @5

:2
0001: wait 0 ms
0AF9: samp say_msg "/c engin OFF %s" 2@
0002: jump @4

:5
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
8ABE:   not vehicle 0@ engine_on
004D: jump_if_false @5
0002: jump @2

:4
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @4
0002: jump @3
0AB2: 0 ret

Теперь скрипт ENGINE будет реагировать только если ты на водительском месте.
По крайней мере я на это надеюсь :)
 
Последнее редактирование:
  • Нравится
Реакции: F.SKY

F.SKY

Участник
36
9
CLEO:
{$CLEO}
0000:

:0
wait 0
0afa:                    //проверка на то что самп загружен
jf @0
0b34: "lock" @1
0BDE: pause_thread 0    //ставим на паузу

:1
00DF:   actor $PLAYER_ACTOR driving                    //если в машине то
jf @2
03C0: 0@ = actor $PLAYER_ACTOR car                  //просто получаем хендл машины и идём проверять двери
jump @3

:2                                                                                 //а если не в машине, смотрим ближайшие кары
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to $NO_USE    //этот опкод покажет ближайший кар в радиусе ~30-35 метров        
not 0@ == -1
jf @5
00AA: store_car 0@ position_to 2@ 3@ 4@
00A0: store_actor $PLAYER_ACTOR position_to 5@ 6@ 7@
050A: 8@ = distance_between_XYZ 2@ 3@ 4@ and_XYZ 5@ 6@ 7@                  //получаем дистанцию, чтоб проверяло только те машины,
8@ < 4.0                                                                    //которые в радиусе 4 метров от игрока
jf @5

:3
09B3: get_car 0@ door_status 1@
1@ == 2
jf @4
0AD1: show_formatted_text_highpriority "unlock~n~%d" time 2000 0@
jump @5

:4
0AD1: show_formatted_text_highpriority "lock~n~%d" time 2000 0@

:5
cmdret

У тебя крашило из-за того что cmdret в конце не вызывался вообще. Бесконечный цикл внутри тела команды делать запрещается.


CLEO:
{$CLEO}
0000: NOP

:1
0001: wait 0 ms
00D6: if and
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BMX
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #BIKE
80DD:   not actor $PLAYER_ACTOR driving_car_with_model #MTBIKE
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1

03C0: 0@ = actor $PLAYER_ACTOR car
0A8D: 3@ = read_memory 0xB6F5F0 size 4 virtual_protect 0
0A97: 4@ = car 0@ struct
4@ += 0x460
0A8D: 4@ = read_memory 4@ size 4 virtual_protect 0
003B:   4@ == 3@
jf @1

03C0: 0@ = actor $PLAYER_ACTOR car
0441: 1@ = car 0@ model
0AC8: 2@ = allocate_memory_size 128
0ADB: 2@ = car_model 1@ name
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @2

:3
0001: wait 0 ms
0AF9: samp say_msg "/c engin ON %s" 2@
0002: jump @5

:2
0001: wait 0 ms
0AF9: samp say_msg "/c engin OFF %s" 2@
0002: jump @4

:5
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
8ABE:   not vehicle 0@ engine_on
004D: jump_if_false @5
0002: jump @2

:4
0001: wait 0 ms
00D6: if and
8118:   not actor $PLAYER_ACTOR dead
00DF:   actor $PLAYER_ACTOR driving
004D: jump_if_false @1
0ABE:   vehicle 0@ engine_on
004D: jump_if_false @4
0002: jump @3
0AB2: 0 ret

Теперь скрипт ENGINE будет реагировать только если ты на водительском месте.
По крайней мере я на это надеюсь :)

ENGINE работает отлично, но я не как не могу вывести надпись на экран то что игрок находится рядом с т/с.
И как сделать чтоб команда запускала скрипт и отправлялась эту же команду с изменяющемся параметром на сервер.
Пример: пишешь команду в чат /lock 1-8 и скрипт реагировал на /lock, а серверу отправлял /lock и цифру указанную после. Думаю понятно объяснил.
 
Последнее редактирование:

New_J3rs3y1337

Известный
148
102
не как не могу вывести надпись на экран то что игрок находится рядом с т/с
CLEO:
:1
wait 0
80DF:   actor $PLAYER_ACTOR driving
jf @1
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to $NO_USE
not 0@ == -1
jf @1
00AA: store_car 0@ position_to 2@ 3@ 4@
00A0: store_actor $PLAYER_ACTOR position_to 5@ 6@ 7@
050A: 8@ = distance_between_XYZ 2@ 3@ 4@ and_XYZ 5@ 6@ 7@             
8@ < 4.0                                                               
jf @1
0AF8: samp add_message_to_chat "Игрок находится рядом с т/с" color 0xFFFFFFFF
jump @1

Типо вот этого?



как сделать чтоб команда запускала скрипт и отправлялась эту же команду с изменяющемся параметром на сервер
В приоритете команды, которые зарегистрированы у тебя локально, насколько знаю. Поэтому можно использовать:
0C8F: samp process_chat_input "/save";
0AF9: samp say_msg "lol";
Ну или на крайняк отправлять RPC SendChatMessage с нужной командой на сервер.
 

D3.Pheonix

🎹
Модератор
2,865
1,649
ENGINE работает отлично, но я не как не могу вывести надпись на экран то что игрок находится рядом с т/с.
И как сделать чтоб команда запускала скрипт и отправлялась эту же команду с изменяющемся параметром на сервер.
Пример: пишешь команду в чат /lock 1-8 и скрипт реагировал на /lock, а серверу отправлял /lock и цифру указанную после. Думаю понятно объяснил.
Закажи уже скрипт, тебе его сделают. Дом 2 какой то, построй свой скрипт...
Так тебе его ещё на метках делают, от этого ещё печальнее (не в обиду, ты молодец что помогаешь ему)
 
  • Ха-ха
Реакции: New_J3rs3y1337

D3.Pheonix

🎹
Модератор
2,865
1,649
Чего метки так хейтят вообще? Никак не пойму. Лично мне на них куда удобнее 🤔
Потому что ты не познал конструкции, и не писал больших скриптов. Да и в чужом коде намного проще разобраться, если есть есть исходник с нормальным кодом и табуляцией, и не придётся туда сюда рыскать, куда же происходит jump. В какой то степени даже будешь немного лучше соображать что происходит, например в js или lua скрипте. Можно еще в добавок писать на классах, но это уже вкусовщина, т.к. будет смесь из опкодов и классов.
 
  • Нравится
Реакции: New_J3rs3y1337

F.SKY

Участник
36
9
CLEO:
:1
wait 0
80DF:   actor $PLAYER_ACTOR driving
jf @1
0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 0@ closest_ped_to $NO_USE
not 0@ == -1
jf @1
00AA: store_car 0@ position_to 2@ 3@ 4@
00A0: store_actor $PLAYER_ACTOR position_to 5@ 6@ 7@
050A: 8@ = distance_between_XYZ 2@ 3@ 4@ and_XYZ 5@ 6@ 7@             
8@ < 4.0                                                               
jf @1
0AF8: samp add_message_to_chat "Игрок находится рядом с т/с" color 0xFFFFFFFF
jump @1

Типо вот этого?
Не работает. Из-за 6 строчки если убрать "not" поменять знак и число, то спамит при входе в игру, а если оставить то вообще ничего не происходит.
 

New_J3rs3y1337

Известный
148
102
Странно. В чат действительно должно было спамить, мой косяк, но не при входе в игру. Да и с шестой строкой проблем возникнуть не должно было. Я скомпилировал этот же скрипт у себя, всё работает. Возможно дело в твоём компиляторе и версии сани билдера 🤔
Попробуй мой билд закинуть, там открыт исходник. На всякий случай ещё сюда приложу:
1658393212955.png

Если будет работать, будем думать как правильно реализовать однократную отправку сообщений в чат, т.к там тоже есть нюансы которые по-хорошему нужно учитывать.
 

Вложения

  • test21.cs
    137 байт · Просмотры: 7
Последнее редактирование:

murakami

Известный
131
13
Код:
{$CLEO}
0000:
repeat
wait 0
until Samp.Available()
0B34: samp register_client_command "space" to_label @space
1@ = 0

while true
wait 0
    if
    1@ == 1
    then
    0B56: set_game_key 14 state 255
    1@ = 0
    end
end

:space
1@ = 1
Samp.CmdRet()

This is the code to press the shift key when typing /space chat. Strangely, if I manually type /space it works, but when I type /space using the keybinder, cleo doesn't recognize it. The key binder is normal. Does anyone know what causes this? Why doesn't register_client_command catch the command when used as keybind?
 
  • Эм
Реакции: Bili Djin