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

Dark_Knight

Me, me and me.
Друг
4,081
2,099
он понимает когда игрок в каре, а когда нет. Проблема если игрок в каре, то скорость автомобиля не выводит, а сразу краш.
actor.Driving принимает только хендл актера, а не его ид. Т.е. тебе нужно получить хендл по иду и проверять, что хендл не равен нулю.
 

VADE

Новичок
36
1
Здравствуйте, скриптеры! У меня возникло парочку вопросов, надеюсь на вашу помощь.
1. Почему не стоит использовать глобальные переменные?
2. Можно ли сделать переменных больше чем 31@.
3. Как остановить цикл REPEAT, если функция выключена (Например: У меня есть функция, которую я включил, а потом выключил, но при этом цикл, который у меня присутствует в коде все еще идет, и если проверка выполнится, скрипт все равно сработает. Как это исправить?)
 
Последнее редактирование:

Wood_Goblin

Новичок
22
0
actor.Driving принимает только хендл актера, а не его ид. Т.е. тебе нужно получить хендл по иду и проверять, что хендл не равен нулю.
Я думаю, в конструкции ещё wait не помешал бы. Многовато операций за раз выходит.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
Я думаю, в конструкции ещё wait не помешал бы. Многовато операций за раз выходит.
Тело функции, которое обрабатывается с помощью SF, не благотворят wait внутри.

Здравствуйте, скриптеры! У меня возникло парочку вопросов, надеюсь на вашу помощь.
1. Почему не стоит использовать глобальные переменные?
2. Можно ли сделать переменных больше чем 31@.
3. Как остановить цикл REPEAT, если функция выключена (Например: У меня есть функция, которую я включил, а потом выключил, но при этом цикл, который у меня присутствует в коде все еще идет, и если проверка выполнится, скрипт все равно сработает. Как это исправить?)
  1. Можешь использовать те, которые зарезервированы и не используются. "Создание" своих приведет к перезаписи переменных, которые могут использоваться игрой;
  2. Выдели память (4 байта - 1 переменная) с помощью, к примеру 0AC8, и потом записывай туда что-хочешь размером в 4 байта;
    CLEO:
    0AC8: 0@ = allocate_memory_size 8 // "2 переменные", каждая может содержать по 4 байта информации => 2 * 4 = 8
    0AB1: call @writeToMemory 2 p 0@ n 0 value 1234
    0AB1: call @writeToMemory 2 p 0@ n 1 value 200.5
    
    0AB1: call @readFromMemory 2 p 0@ n 0 ret_to 1@
    0AB1: call @readFromMemory 2 p 0@ n 1 ret_to 2@
    0AD1: show_formatted_text_highpriority "%d %f" time 3000 1@ 2@
    
    :writeToMemory
    // call @writeToMemoryOffset 2 p 0@ n 1@ value 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0
    0AB2: ret 0
    
    :readFromMemory
    // call @readFromMemory 2 p 0@ n 1@ ret_to 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 2@
  3. Какая проверка?.
 
Последнее редактирование:
  • Нравится
Реакции: VADE

VADE

Новичок
36
1
Тело функции, которое обрабатывается с помощью SF, не благотворят wait внутри.


  1. Можешь использовать те, которые зарезервированы и не используются. "Создание" своих приведет к перезаписи переменных, которые могут использоваться игрой;
  2. Выдели память (4 байта - 1 переменная) с помощью, к примеру 0AC8, и потом записывай туда что-хочешь размером в 4 байта;
    CLEO:
    0AC8: 0@ = allocate_memory_size 8 // "2 переменные", каждая может содержать по 4 байта информации => 2 * 4 = 8
    0AB1: call @writeToMemory 2 p 0@ n 0 value 1234
    0AB1: call @writeToMemory 2 p 0@ n 1 value 200.5
    
    0AB1: call @readFromMemory 2 p 0@ n 0 ret_to 1@
    0AB1: call @readFromMemory 2 p 0@ n 1 ret_to 2@
    0AD1: show_formatted_text_highpriority "%d %f" time 3000 1@ 2@
    
    :writeToMemory
    // call @writeToMemoryOffset 2 p 0@ n 1@ value 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0
    0AB2: ret 0
    
    :readFromMemory
    // call @readFromMemory 2 p 0@ n 1@ ret_to 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 2@
  3. Какая проверка?.
3. Когда я ввожу команду /cmd, у меня переменной 0@ присваивается true (0@ = 1). После этого прыгает на gosub (смотри ниже), а в gosub у меня стоит цикл RETURN. Так вот если я передумал использовать скрипт и снова ввел /cmd, то переменной 0" присваивается false, т.е. скрипт не должен работать, но так как у меня в gosub стоит цикл, пока он не выполнится, скрипт не выключится. Как это исправить?
CLEO:
:DRIVING
REPEAT
0001: 100
UNTIL 00DF: $PLAYER_ACTOR   {REPEAT}
04C4: store_coords_to 10@ 11@ 12@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 0.0
03C0: 0@ = actor $PLAYER_ACTOR car  
0051:
 

Wood_Goblin

Новичок
22
0
Помешает он только
Тело функции, которое обрабатывается с помощью SF, не благотворят wait внутри.


  1. Можешь использовать те, которые зарезервированы и не используются. "Создание" своих приведет к перезаписи переменных, которые могут использоваться игрой;
  2. Выдели память (4 байта - 1 переменная) с помощью, к примеру 0AC8, и потом записывай туда что-хочешь размером в 4 байта;
    CLEO:
    0AC8: 0@ = allocate_memory_size 8 // "2 переменные", каждая может содержать по 4 байта информации => 2 * 4 = 8
    0AB1: call @writeToMemory 2 p 0@ n 0 value 1234
    0AB1: call @writeToMemory 2 p 0@ n 1 value 200.5
    
    0AB1: call @readFromMemory 2 p 0@ n 0 ret_to 1@
    0AB1: call @readFromMemory 2 p 0@ n 1 ret_to 2@
    0AD1: show_formatted_text_highpriority "%d %f" time 3000 1@ 2@
    
    :writeToMemory
    // call @writeToMemoryOffset 2 p 0@ n 1@ value 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8C: write_memory 0@ size 4 value 2@ virtual_protect 0
    0AB2: ret 0
    
    :readFromMemory
    // call @readFromMemory 2 p 0@ n 1@ ret_to 2@
    1@ *= 4
    005A: 0@ += 1@
    0A8D: 2@ = read_memory 0@ size 4 virtual_protect 0
    0AB2: ret 1 2@
  3. Какая проверка?.

Т.е. в сампфунксе на этот счёт всё предусмотрено? Просто в сингле без wait вылет обеспечен...
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,468
3. Когда я ввожу команду /cmd, у меня переменной 0@ присваивается true (0@ = 1). После этого прыгает на gosub (смотри ниже), а в gosub у меня стоит цикл RETURN. Так вот если я передумал использовать скрипт и снова ввел /cmd, то переменной 0" присваивается false, т.е. скрипт не должен работать, но так как у меня в gosub стоит цикл, пока он не выполнится, скрипт не выключится. Как это исправить?
В цикле
CLEO:
if 0@ == 0 then
    break
end

Т.е. в сампфунксе на этот счёт всё предусмотрено?
Насчет чего?
При регистрации команды указывается колбэк, в колбэках некорректно использовать wait и подобные операторы.
 

VADE

Новичок
36
1
В цикле
CLEO:
if 0@ == 0 then
    break
end


Насчет чего?
При регистрации команды указывается колбэк, в колбэках некорректно использовать wait и подобные операторы.
Ой, спасибо тебе большое! Выручил)
Упс... У меня кейворда "break" нет. Не подскажешь опкод?
 

Wood_Goblin

Новичок
22
0
В цикле
CLEO:
if 0@ == 0 then
    break
end


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

Там дальше идёт работа с if actor.Driving(3@), далее получение хендла авто, затем след. операции. Тут тоже задержка не нужна?