GTA Builder Форум

GTA Vice City => Общие вопросы => Тема начата: Tommi4kaVar4etti от Февраль 21, 2016, 05:45:14 pm

Название: Помощь с CLEO
Отправлено: Tommi4kaVar4etti от Февраль 21, 2016, 05:45:14 pm
Я делаю мод стрельбы с пассажирского сидения для gta3 и vice city и мне нужно изменить Assembler code через CLEO.
Адрес и Assembler code выглядят так:
gta-vc.exe+1005CE mov [ebx+00000244],00000032
gta-vce.exe+10C6D6 mov [ebx+00000244],00000032

и нужно это заменить на:
gta-vc.exe+1005CE mov [ebx+00000244],00000001
gta-vce.exe+10C6D6 mov [ebx+00000244],00000001
Название: Re: Помощь с CLEO
Отправлено: Sektor от Февраль 21, 2016, 06:40:25 pm
Скиньте точные адреса памяти, в которые вы хотели бы сделать запись. Лучше все скопировать даже с IDA и сюда запостить.
Название: Re: Помощь с CLEO
Отправлено: mfisto от Февраль 21, 2016, 10:04:26 pm
Тебе просто надо записать следующее:

0A8C: write_memory 0x005005D4 size 1 value 1 virtual_protect 1
0A8C: write_memory 0x0050C6DC size 1 value 1 virtual_protect 1
Название: Re: Помощь с CLEO
Отправлено: Tommi4kaVar4etti от Февраль 22, 2016, 09:58:40 am
Тебе просто надо записать следующее:

0A8C: write_memory 0x005005D4 size 1 value 1 virtual_protect 1
0A8C: write_memory 0x0050C6DC size 1 value 1 virtual_protect 1

Спасибо! Очень помогли!
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 02, 2017, 08:34:43 pm
Здравствуйте, уважаемые господа.
Читая Ваш форум, сильно поражен глубиной Ваших знаний!
Подскажите, пожалуйста, где ошибиться в этом скрипте?
Первый скрипт лифт в небоскрёбе.

{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
:elevator_1
wait 0
if and
0102:   actor $PLAYER_ACTOR stopped_near_point_on_foot -559.85 782.59 22.88 radius 1.0 1.0 1.0 sphere
005EE:   key_pressed 70
jf @elevator_2
wait 100
fade 1 1000
wait 1000
0055: put_player $PLAYER_CHAR at  -555.26 787.57 97.51     
jump @elevator_2
               
:elevator_2
wait 0
if and
0102:   actor $PLAYER_ACTOR stopped_near_point_on_foot -555.26 787.57 97.51  radius 1.0 1.0 1.0 sphere
005EE:   key_pressed 70
jf @elevator_1
wait 100
fade 1 1000
wait 1000
0055: put_player $PLAYER_CHAR at -559.85 782.59 22.88         
jump @elevator_1
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Июль 03, 2017, 07:18:30 am
Вы неправильно затемняете экран и не ставите задержки, чтобы игрока не телепортировало бесконечно:

...
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at  -555.26 787.57 97.51   
fade 1 1000
wait 1000
...
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at -559.85 782.59 22.88       
fade 1 1000
wait 1000
...
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 03, 2017, 09:57:33 am
 
Спасибо большое за Вашу ценную подсказку, признаю свою неопытность, первый раз пишу скрипт. Нужно еще долго учиться и набираться опыта.
В миссии "Прожектор" от киностудия, открывались двери лифта, мы попадали на другой этаж небоскреба… потом туда "обычный" путём весьма сложно попасть. 
К сожалению не знаю каким опкодом открыть двери лифта и как это сделать через скрипт.
В данный момент только начинаю изучать CLEO, чтобы делать скрипты для vice city, мне она очень нравится своей атмосферой.
Сейчас попробую, потом обязательно опишусь об результатах.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 09, 2017, 09:27:56 am
Здравствуйте, всем.
Очень надеюсь на Ваш совет.
Пытаюсь сделать первый скрипт.
Чтобы игрок находясь в лифте банка и при нажатие F, перемещайся в хранилище.
Вылетает при нажатии F.
Помогайте пожалуйста.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
wait 0
:elevator_1
wait 0
if
05EE:   key_pressed 70 //VK_...
else_jump @elevator_1
jump @elevator_2

:elevator_2
if
0102:  actor $PLAYER_CHAR stopped_near_point_on_foot -938.11 -351.20 17.80 radius 1.0 1.0 1.0 sphere 0
else_jump @elevator_1
jump @elevator_3

:elevator_3
fade 0 1000
wait 100
0055: put_player $PLAYER_CHAR at -938.91 -351.93 7.23
fade 1 1000
wait 100
jump @elevator_1

Решил сделать так.
При нажатии на f ничего не проходит
 

{$CLEO}
wait 0
while true
    wait 0
    if
      0256:   player $PLAYER_CHAR defined
      then
        continue
     end
    if
     0102:  actor $PLAYER_CHAR stopped_near_point_on_foot -938.11 -351.20 17.80 radius 1.0 1.0 1.0 sphere 0
    then
        continue
    end
    if
        05EE:   key_pressed 70 //VK_...
    then
         0055: put_player $PLAYER_CHAR at -938.91 -351.93 7.23
     end
     end
   
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Июль 09, 2017, 11:06:37 am
Вылетает при нажатии F.
Помогайте пожалуйста.
Дело в том, что команда
Код: Text
  1. fade 0 1000
затемняет экран в течении 1000ms(т.е. 1 секунда)
а команда
Код: Text
  1. fade 1 1000
- убирает затемнение в течении 1000ms. Игра так сделана, что вы не можете убирать затемнение, пока экран полностью не затемнится.
Что происходит в вашем коде:
Код: Text
  1. fade 0 1000 // затемняется экран в течении 1000ms(1 секунда)
  2. wait 100 // проходит 100 ms(т.е. 0.1 секунды)
  3. 0055: put_player $PLAYER_CHAR at -938.91 -351.93 7.23 // телепорт игрока(т.е. экран еще не успеет затемниться, а вы уже телепортируете игрока)
  4. fade 1 1000 // прошло всего 0.1 секунды, а вы уже убираете затемнение, что приводит к вылету
  5. wait 100 // этот код уже не выполняется, т.к. игра вылетела

Я бы переделал этот код в такой:

Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0000: NOP
  5.  
  6. :elevator_1
  7. wait 0
  8. if and
  9. 05EE:   key_pressed 70 //VK_...
  10. 0102:  actor $PLAYER_CHAR stopped_near_point_on_foot -938.11 -351.20 17.80 radius 1.0 1.0 1.0 sphere 0
  11. else_jump @elevator_1
  12. fade 0 1000
  13. wait 1000
  14. 0055: put_player $PLAYER_CHAR at -938.91 -351.93 7.23
  15. fade 1 1000
  16. wait 1000
  17. jump @elevator_1

А вот этот вариант кода включает в себя предыдущий и, помимо этого, позволит также перемещаться из хранилища обратно: также - при нажатии F(в игре не проверял, полагаюсь на то, что вы правильно указали координаты):
Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0000: NOP
  5.  
  6. :elevator_1
  7. wait 0
  8. if and
  9. 05EE:   key_pressed 70 //VK_...
  10. 0102:  actor $PLAYER_CHAR stopped_near_point_on_foot -938.11 -351.20 17.80 radius 1.0 1.0 1.0 sphere 0
  11. else_jump @elevator_2
  12. fade 0 1000
  13. wait 1000
  14. 0055: put_player $PLAYER_CHAR at -938.91 -351.93 7.23
  15. fade 1 1000
  16. wait 1000
  17.  
  18. :elevator_2
  19. if and
  20. 05EE:   key_pressed 70 //VK_...
  21. 0102:  actor $PLAYER_CHAR stopped_near_point_on_foot -938.91 -351.93 7.23 radius 1.0 1.0 1.0 sphere 0
  22. else_jump @elevator_1
  23. fade 0 1000
  24. wait 1000
  25. 0055: put_player $PLAYER_CHAR at -938.11 -351.20 17.80
  26. fade 1 1000
  27. wait 1000
  28. jump @elevator_1
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 09, 2017, 03:58:49 pm
Огромное Вам спасибо за столь полный ответ на банальный вопрос.
Примите искреннюю благодарность за Ваше подробное и доходчивое объяснение.
Исключительная редкость получить ответ от человека имеющего такие глубокие познания в cleo.

Имею огромное желание писать пока скрипты для vice city, очень рад что встретился Ваш форум, где можно развиваться в этом  направлении.
К большому сожалению, игра вылетает на этапе загрузки…. 
Конечно, можно сделать легко телепорт без нажатие клавиши F, но хочется понять, где моя ошибка.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 10, 2017, 07:27:16 am
Здравствуйте.
Наконец-то скрипт работает.
Лифты в банке и небоскрёбе спускают и поднимают при нажатии клавиши F.
Скриншоты
http://pixs.ru/showimage/1jpg_8992674_26821624.jpg (http://pixs.ru/showimage/1jpg_8992674_26821624.jpg)
http://pixs.ru/showimage/2jpg_5330334_26821626.jpg (http://pixs.ru/showimage/2jpg_5330334_26821626.jpg)
http://pixs.ru/showimage/3jpg_1961155_26821627.jpg (http://pixs.ru/showimage/3jpg_1961155_26821627.jpg)
http://pixs.ru/showimage/4jpg_8258854_26821628.jpg (http://pixs.ru/showimage/4jpg_8258854_26821628.jpg)

Очень хочется узнать как через cleo отрывать и закрывать двери лифта.
Подскажите, пожалуйста, как сделать чтобы не как-то будто спрыгивает после телепортации?   
Вот он
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
0001: wait 0

:Elevator_1
0001: wait 2 ms
00D6: if
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot -938.11 -351.20 17.80 radius 2.0 2.0 2.0 sphere 0
004D: jump_if_false @Elevator_5
jump @Elevator_3

:Elevator_3
00D6: if
05EE: key_pressed 70 //VK_...
004D: jump_if_false @Elevator_1
jump @Elevator_4

:Elevator_4
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at -939.95 -351.86 7.23  offset 0.0 0.0 2.0
fade 1 1000
wait 1000
jump @Elevator_5

:Elevator_5
0001: wait 2 ms
00D6: if
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot -939.95 -351.86 7.23 radius 2.0 2.0 2.0 sphere 0
004D: jump_if_false @Elevator_8       
jump @Elevator_6

:Elevator_6
00D6: if
05EE: key_pressed 70 //VK_...
004D: jump_if_false @Elevator_5
jump @Elevator_7

:Elevator_7
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at -938.11 -351.20 17.80  offset 0.0 0.0 2.0
fade 1 1000
wait 1000
jump @Elevator_8

:Elevator_8
jump @Elevator_9

:Elevator_9
0001: wait 2 ms
00D6: if
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot -559.85 782.59 22.88 radius 2.0 2.0 2.0 sphere 0
004D: jump_if_false @Elevator_12
jump @Elevator_10

:Elevator_10
00D6: if
05EE: key_pressed 70 //VK_...
004D: jump_if_false @Elevator_9
jump @Elevator_11

:Elevator_11
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at -554.26 788.57 97.51  offset 0.0 0.0 2.0
fade 1 1000
wait 1000
jump @Elevator_12

:Elevator_12
0001: wait 2 ms
00D6: if
0102: actor $PLAYER_ACTOR stopped_near_point_on_foot -554.26 788.57 97.51 radius 2.0 2.0 2.0 sphere 0
004D: jump_if_false @Elevator_15
jump @Elevator_13

:Elevator_13
00D6: if
05EE: key_pressed 70 //VK_...
004D: jump_if_false @Elevator_12
jump @Elevator_14

:Elevator_14
fade 0 1000
wait 1000
0055: put_player $PLAYER_CHAR at  -559.85 782.59 22.88  offset 0.0 0.0 2.0
fade 1 1000
wait 1000
jump @Elevator_15

:Elevator_15
0002: jump @Elevator_1


Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 14, 2017, 07:17:11 am
Здравствуйте, всем.
Снова возникала проблема со скрипитом сплавна авто в заданных координатах.
Пожалуйста, скажите, модели редких авто. Как это сделать?
Вот скрипт, с обычными моделями работает.
{$CLEO}     
004F: create_thread @MyCar
:MyCar
Wait 0
Model.Load(#Bloodring Racer)
If Model.Available(#Bloodring Racer)
JF @MyCar
Car.Create(1@, #Bloodring Racer, 108.39, -807.28, 10.46)
End_thread @MyCar
Помогите, пожалуйста.

вот как решил
{$CLEO}
//-------------MAIN---------------\\
0000: NOP
thread 'CAMFSTF'
wait 1000
:MyCar
Wait 0
014B: $Car = init_parked_car_generator #BLOODRB 8 8 0 alarm 50 door_lock 0 0 40000 at 106.39 -807.28 10.46 angle 180.0
014C: set_parked_car_generator $Car cars_to_generate_to 101
004E: end_thread
         
Но с некоторыми не работает, например, PANLANT
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 15, 2017, 01:39:36 pm
Здравствуйте.
Подскажите, пожалуйста, хочу создать пачку денег на точке, а игра вылетает.
Помогите, пожалуйста, разобраться, где ошибка.
{$CLEO .cs}

//-------------MAIN---------------
004F: create_thread @Noname_12

:Noname_12
wait 0
00D6: if
0256: player $PLAYER_CHAR defined
04A6: 3@ = create_asset_money_pickup_at 109.39 -808.28 10.46  money 1 1
:2
wait 0
if
0214: pickup 3@ picked_up
004D: jump_if_false @2
0215: destroy_pickup 3@
0109: player $PLAYER_CHAR money 1+= 4@
       
jump @Noname_12
004E: end_thread
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Июль 15, 2017, 04:29:26 pm
Здравствуйте, всем.
Снова возникала проблема со скрипитом сплавна авто в заданных координатах.

1)В CLEO-скриптах НЕ используй глобальные переменные(те, что со знаком "$"), кроме $PLAYER_CHAR, $PLAYER_ACTOR.
Если вкратце, то есть единый массив глобальных переменных для всех скриптов, включая main.scm, поэтому, когда ты используешь любую глобальную переменную - где-то в main.scm перестает нормально работать какой-то скрипт, потому что ты записал в глобальную переменную значение, которое конфликтует с этим скриптом. Самое печальное, что значения, сохраненные в глобальных переменных, сохраняются в сохранениях. То есть из-за твоего скрипта у людей могут в дальнейшем возникнуть вылеты игры на пустом месте. Даже если они удалят твой скрипт - у них уже "запорятся" сохранения, которые они делали с твоим скриптом.

Выход есть - используй только локальные переменные(те, что со знаком "@"). Их всего 16(от 0@ до 15@), плюс 2 таймера(16@ и 17@).
Но если с умом подходить к скриптингу, то их хватает за глаза. Разумеется, если у тебя чересчур масштабные разработки - лучше делать их в main.scm.

2) "jump" можно не писать, если необходимая метка идет сразу после места, где ты хотел написать "jump".

3)Не стоит через CLEO-скрипт создавать парковки, пикапы, значки на карте и прочее. Всё это дело сохраняется в файлах сохранения! Это значит, что если человек хотя бы раз сохранится с твоим скриптом - у него твоя парковка не исчезнет никогда - даже если он удалит твой скрипт. Самое страшное, что при каждом заходе в игру будет создаваться новая парковка, т.е. если человек сделал операцию "загрузил сохранение/сохранился/вышел из игры" 10 раз - у него на одиннадцатый заход в игру будет 11 парковок в одном месте! Не факт, что игра будет спавнить все эти авто, но всё равно это лишняя нагрузка и вообще неправильный подход к скриптингу.

Лучше напиши скрипт, который будет спавнить машину при определенных условиях, например - если игрок подошел к нужному месту на расстоянии 30 метров:
Код: Text
  1. {$CLEO}    
  2. thread 'CAMFSTF'
  3.  
  4. :MyCar
  5. wait 0
  6. if
  7. 00F5:   player $player_char in_sphere 0 near_point 106.39 -807.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  8. jf @MyCar
  9. model.Load(#BLOODRB) // загружаем модель, точнее ставим её в очередь на загрузку
  10. 038B: load_requested_models // принудительная загрузка всех моделей, стоящих в очереди на загрузку
  11.  
  12. :MyCar2
  13. wait 0
  14. if
  15.  Model.Available(#BLOODRB) // на всякий пожарный проверяем, загрузилась ли модель
  16. jf @MyCar2
  17. Car.Create(0@, #BLOODRB, 106.39, -807.28, 10.46)  // спавним авто
  18. 0249: release_model #BLOODRB // обязательно выгружаем модель из памяти игры, ведь авто мы уже заспавнили, и модель нам не нужна
  19. 0175: set_car 0@ z_angle_to 180.0 // поворот авто
  20. 01C3: remove_references_to_car 0@ // выгружаем авто из памяти игры, чтобы оно автоматически исчезло "за спиной", если игрок куда-нибудь уйдет
  21.  
  22. :MyCar3
  23. wait 0
  24. if
  25. 00F5:   player $player_char in_sphere 0 near_point 106.39 -807.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  26. jf @MyCar // Как только игрок отошел от этого места снова на 30 метров - скрипт перезапускается(а авто само удалится благодаря опкоду 01C3)
  27. jump @MyCar3

Конечно, сразу будет бросаться в глаза, что авто появляется "перед носом"(больший радиус не советую делать, пока ты не получил достаточно опыта в скриптинге), поэтому лучше "спрятать" это авто куда-нибудь в "укромный уголок", где его появление не будет столь заметно.
         
Но с некоторыми не работает, например, PANLANT

Это что вообще за машина такая? Её не существует в оригинальной игре.

Здравствуйте.
Подскажите, пожалуйста, хочу создать пачку денег на точке, а игра вылетает.

Во-первых:
004F: create_thread @Noname_12

Так нельзя делать! Каждый CLEO-скрипт - это уже отдельный тред, а ты создаешь еще один тред(система CLEO устроена так, что всё это дело конфликтует с main.scm!)!

Во-вторых:
Код: Text
  1. 00D6: if  // ЕСЛИ
  2. 0256: player $PLAYER_CHAR defined  // ИГРОК СУЩЕСТВУЕТ
  3. 04A6: 3@ = create_asset_money_pickup_at 109.39 -808.28 10.46  money 1 1  // ТО СОЗДАЕМ ПИКАП
А если игрок не существует(во время загрузки, например)? В каждом условии должен быть переход куда-нибудь на случай, если проверка не сработает!
Иначе говоря, эта часть кода должна быть такой:
Код: Text
  1. 00D6: if  // ЕСЛИ
  2. 0256: player $PLAYER_CHAR defined  // ИГРОК СУЩЕСТВУЕТ
  3. 004D: jump_if_false @OLOLO // ЕСЛИ НЕТ - ПРЫГАЕМ НА МЕТКУ OLOLO
  4. 04A6: 3@ = create_asset_money_pickup_at 109.39 -808.28 10.46  money 1 1  // А ЕСЛИ ВСЁ ЖЕ СУЩЕСТВУЕТ - ТО СОЗДАЕМ ПИКАП
Но вообще - проверять, существует ли игрок - необязательно, если ты в скрипте не проводишь никаких операций непосредственно с ним.

В-третьих, пикап пачки денег создается по-другому

В-четвертых - ты пишешь:
Код: Text
  1. 0109: player $PLAYER_CHAR money 1+= 4@
Т.е. даешь игроку кол-во денег, которое записано в переменную 4@. Но ты ничего не записал в переменную 4@! Конечно, это не вызовет вылета игры(не буду описывать здесь, почему), но это явная ошибка!

В-пятых - читай, что я писал выше в пункте 3 про создание парковок, пикапов, значки на карте и т.д.
Опять же - лучше написать скрипт, который будет создавать пикап, когда игрок в определенном радиусе от нужной точки:
Код: Text
  1. {$CLEO}
  2. 0000:
  3. thread 'PICKU01'
  4.  
  5. :PICKU01_01
  6. wait 0
  7. if
  8. 00F5:   player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  9. jf @PICKU01_01
  10. model.Load(337) // ставим в очередь на загрузку модель денег под номером 337(см. в Vice City\data\maps\generic.ide)
  11. 038B: load_requested_models // принудительная загрузка всех моделей, стоящих в очереди на загрузку
  12.  
  13. :PICKU01_02
  14. wait 0
  15. if
  16.  Model.Available(337) // на всякий пожарный проверяем, загрузилась ли модель
  17. jf @PICKU01_02
  18. 0@ = Pickup.Create(337,8,109.39, -808.28, 10.46) // создаем пикап денег, автоматически исчезающий через 30 секунд
  19. 0249: release_model 337 // обязательно выгружаем модель из памяти игры, ведь пикап мы уже создали, и модель нам не нужна
  20.  
  21. :PICKU01_03
  22. wait 0
  23. if
  24. 00F5:   player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  25. jf @PICKU01_04 // если игрок покинул этот радиус - переход на метку "3", где удаляется пикап
  26. if
  27. pickup.Picked_up(0@) // если пикап был подобран
  28. jf @PICKU01_03
  29. 0109: player $player_char money += 10000 // даем игроку 10000 долларов
  30. jump @PICKU01_03
  31.  
  32. :PICKU01_04
  33. 0215: destroy_pickup 0@
  34. jump @PICKU01_01

ВНИМАНИЕ! Нельзя, чтобы при этом в этом радиусе была точка сохранения/спавна. Иначе будет опять проблема с файлами сохранений(сохранение пикапа в файле сохранения).
Опять же, чтобы не было заметно, что пикап появляется "перед носом" - лучше "спрятать" этот пикап куда-нибудь в "укромный уголок"(см. пример с машиной выше).

Ну и последнее:
У тебя очень много косяков в скриптах. Это не проблема, если приложить усилия. Пожалуйста, прочитай в справке SannyBuilder основы скриптинга(Статьи/введение в скриптинг). Конечно, там инфа в основном для SA, но тебе нужно изучать хотя бы самое-самое важное: узнать всё про переменные, метки(label), циклы и т.д.
Однако там инфа про скриптинг в main.scm, а в CLEO-скриптинге иногда действуют другие правила.
Поэтому скачай последнюю библиотеку CLEO для Vice City (http://cleo.li/), затем скачай актуальные VCSCM.INI и opcodes.txt (http://newrockstar.do.am/Other_Files/VCOPCODES2017.rar) для SannyBuilder(кинь эти файлы в Sanny Builder 3\data\vc\) и смотри эти уроки по скриптингу на youtube (https://www.youtube.com/watch?v=uHcq3n1c0og). Конечно, они опять для SA, но первые несколько уроков подходят и для Vice City. Они хотя бы дадут общее понимание скриптинга.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 16, 2017, 03:50:07 pm
Спасибо огромное за Ваш подробный ответ, с доскональный объяснением. Безгранично Вам за него благодарен.
Теперь стало абсолютно понятно, к каким ужасным приводит использования глобальных переменных в скрипте.
Буду учиться работать с локальными переменными. Пока только начал, практика повысит уровень навыка. У меня очень скромные планы.
Спасибо за совет об jump, будем стараться.
 Мудрый совет о спавне машин, действительная лишняя нагрузка не к чему. Согласен, лучше спавить на определительных условиях, чтобы лишний раз не засорят память игры, иначе рано или поздно может быть вылет.
Спав авто на определенном расстоянии- идеальный выход, все гениальное просто. Обязательно так сделаю, как Вы сказали.
Модель PANLANT перепутал в файле handling.cfg с SEAPLANE, Прошу прощение, что сбил Вас  с толка.
Еще одна моя ошибка с тредом.
С проверками мне нужно учится работать.
Значит, если операции над игроком не проводятся, проверку существует игрок, можно не писать.
Опять еще одна моя ошибка.
Пикапы  лучше делать при радиусе, так правильнее.
Точка пикапа должна быть в радиусе.
На ошибках учатся, главное, что на свете есть такие люди высокого ума, которые просвещают темный народ.
Хорошо еще раз перечитаю, справку по основам скриптинг.
Почти все уроки почти для SA мало для VC.
Но желание есть.
Важно понять основу.
Спасибо за полезные ссылки, они помогут в изучении скриптинга.
Ваш ответ, много научил меня еще спасибо.

Вопрос чем разница между ими?.
0214: pickup 3@ picked_up
И
pickup.Picked_up

также думаю, может быть этот опкод на коробку передач.
0428: set_car $4226 avoid_level_transitions 1
Написал скрипт добавление новой недвижимости  со сохранением. Конечно, много ошибок.
{$CLEO .cs}

0000:
//-------------MAIN---------------
5@= 10
0518: 4@ = create_available_asset_pickup 'PROP_3' at 292.91 759.83 12.76 price 5@ // $X $Y $Z координаты, 1@ цена
:Noname_1
wait 0
if
0214: pickup 4@ picked_up
jf @Noname_1
02A3: toggle_widescreen 1
016A: fade 0 time 2000
wait 2000
0215: destroy_pickup 4@
wait 2000
0394: play_music 1
02A3: toggle_widescreen 0
016A: fade 1 time 2000

:savegame
0001: wait 0 ms
1@=301.13 // с запада на восток
2@=753.58 // с севера на юг
3@=12.76 // высота
model.load(1277) 
Model.Available(1277)
0213: 10@ = create_pickup #PICKUPSAVE type 3 at 1@ 2@ 3@
038B: load_requested_models
0002: jump @savegame_70

:savegame_70
0001: wait 0 ms
00D6: if
0256: player $PLAYER_CHAR defined
004D: jump_if_false @savegame_288
00D6: if
0038: $ONMISSION == 0
004D: jump_if_false @savegame_288
00D6: if
0214: pickup 10@ picked_up
004D: jump_if_false @savegame_70
0001: wait 200 ms 
0215: destroy_pickup 10@
03D8: show_save_screen
00A1: put_actor $PLAYER_ACTOR at 292.91 759.83 12.76
0173: set_actor $PLAYER_ACTOR Z_angle_to 87.2991 // юг=180 запад=90 св=0 в=270 градусов
0001: wait 200 ms

:savegame_209
0002: jump @savegame

:savegame_288
0001: wait 0 ms
0215: destroy_pickup 10@
00D6: if
0038: $ONMISSION == 0
004D: jump_if_false @savegame_288
0002: jump @savegame
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Июль 17, 2017, 06:59:31 am
Вопрос чем разница между ими?.
0214: pickup 3@ picked_up
И
pickup.Picked_up
В санни билдере есть такие полезные штуки как кейворды и классы. Они дают возможность не запоминать номера опкодов, а использовать ключевые слова. Например, вместо 0001: wait 0 ms можно написать wait 0, pickup.Picked_up вместо 0214: pickup 3@ picked_up. Классы содержат кейворды объединенные одним объектом (Actor, Car, Object, Model, Camera, Pickup).     
Название: Re: Помощь с CLEO
Отправлено: DK от Июль 17, 2017, 08:43:02 am
Сразу читай справку SannyBuilder, раздел Кодинг.
Особенно статьи Условия и Циклы.
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Июль 20, 2017, 03:30:13 pm
также думаю, может быть этот опкод на коробку передач.
0428: set_car $4226 avoid_level_transitions 1
Нет, этот опкод запрещает тачке кататься по всей карте, заставляя её колесить по одному району(не точно, но как-то так)

Написал скрипт добавление новой недвижимости  со сохранением. Конечно, много ошибок.
Опять создание пикапа без проверок нахождения игрока в определенном радиусе. Этот пикап сохранится в файле сохранения и его потом оттуда не выковыришь.

Далее есть проверка
Код: Text
  1. Model.Available(1277)
Но опять нет jump_if_false на случай, если модель не доступна. Тем более - выше не написано
Код: Text
  1. 038B: load_requested_models
, чтобы загрузить модели(читай мой предыдущий пост с примерами и комментами к опкодам).


В остальном согласен с GeniusZ и DK
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 20, 2017, 05:24:26 pm
Спасибо всем за Ваши ответы, очень приятно.
Прошу прощение, что не сразу Вам ответил, дела- работа, кредиты, семья.
GeniusZ, кейворды очень удобная и полезная вещь при написания скрипта.
DK, читаю, изучаю. Так интересно, жаль всегда есть свободного время. Более широкие возможности дает работа с памятью.
Shagg_E спасибо за Ваш ответ, к сожалению не все опкоды имеют понятно описания.
Прошу прощения за мою оплошность, его создал до прочтения Вашего мудрого совет.
Скажите, пожалуйста, как создать пикап, только на один раз? Взял и больше не появляется.
Сегодня написал скрипт блокировка дверей авто. Если зайти двери блокируются, выйдешь они разблокируется сами,
в машине также это можно сделать нажатием клавишей F. Конечно, есть ошибки. Вам виднее сделать его лучше.
Код: Javascript
  1. {$CLEO .cs}
  2. //-------------MAIN---------------
  3. 0000: NOP
  4. :BLOCK_1                          
  5. 0001: wait 0 ms
  6. 00D6: if
  7. 0256: player $PLAYER_CHAR defined
  8. 004D: jump_if_false @BLOCK_1
  9. 00D6: if
  10. 00E0: player $PLAYER_CHAR driving
  11. 004D: jump_if_false @BLOCK_1
  12. :1
  13. 03C1: 10@ = player $PLAYER_CHAR car
  14. 020A: set_car 10@ door_status_to 2
  15. :3
  16. wait 1
  17. 00D6: if  
  18. 05EE: key_pressed 66 //VK_...
  19. 004D: jump_if_false @2
  20. :4
  21. wait 1
  22. 00D6: if  
  23. 85EE: not key_pressed 66 //VK_...
  24. 004D: jump_if_false @3
  25. :5
  26. 020A: set_car 10@ door_status_to 1
  27. 01E5: text_1number_highpriority 'NUMBER' 1 flag 1000 time 1  // ~1~
  28. wait 500
  29. 00BE: text_clear_all
  30. :6
  31. wait 1
  32. 00D6: if  
  33. 05EE: key_pressed 66 //VK_...
  34. 004D: jump_if_false @6
  35. :7
  36. wait 1
  37. 00D6: if  
  38. 85EE: not key_pressed 66 //VK_...
  39. 004D: jump_if_false @6
  40. :8
  41. 020A: set_car 10@ door_status_to 2
  42. 01E5: text_1number_highpriority 'NUMBER' 2 flag 1000 time 1  // ~1~
  43. wait 500
  44. 00BE: text_clear_all
  45. :2
  46. 00D6: if
  47. 8443: NOT player $PLAYER_CHAR in_a_car
  48. 004D: jump_if_false @BLOCK_1
  49. 020A: set_car 10@ door_status_to 1
  50. 01E5: text_1number_highpriority 'NUMBER' 1 flag 1000 time 1  // ~1~
  51. jump @BLOCK_1
  52.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Июль 20, 2017, 07:40:22 pm
Скажите, пожалуйста, как создать пикап, только на один раз? Взял и больше не появляется.

Абсолютно точно также, как в примере из этого поста (http://forum.gtabuilder.ru/index.php?topic=325.msg2893#msg2893), только заменить
Код: Text
  1. jump @PICKU01_03
на
Код: Text
  1. 0215: destroy_pickup 0@
  2. 0A93: end_custom_thread

Т.е. финальный вариант будет выглядеть так:
Код: Text
  1. {$CLEO}
  2. 0000:
  3. thread 'PICKU01'
  4.  
  5. :PICKU01_01
  6. wait 0
  7. if
  8. 00F5:   player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  9. jf @PICKU01_01
  10. model.Load(337) // ставим в очередь на загрузку модель денег под номером 337(см. в Vice City\data\maps\generic.ide)
  11. 038B: load_requested_models // принудительная загрузка всех моделей, стоящих в очереди на загрузку
  12.  
  13. :PICKU01_02
  14. wait 0
  15. if
  16. Model.Available(337) // на всякий пожарный проверяем, загрузилась ли модель
  17. jf @PICKU01_02
  18. 0@ = Pickup.Create(337,8,109.39, -808.28, 10.46) // создаем пикап денег, автоматически исчезающий через 30 секунд
  19. 0249: release_model 337 // обязательно выгружаем модель из памяти игры, ведь пикап мы уже создали, и модель нам не нужна
  20.  
  21. :PICKU01_03
  22. wait 0
  23. if
  24. 00F5:   player $player_char in_sphere 0 near_point 109.39 -808.28 10.46 radius 30.0 30.0 30.0   // проверяется нахождение игрока в радиусе 30 метров
  25. jf @PICKU01_04 // если игрок покинул этот радиус - переход на метку "3", где удаляется пикап
  26. if
  27. pickup.Picked_up(0@) // если пикап был подобран
  28. jf @PICKU01_03
  29. 0109: player $player_char money += 10000 // даем игроку 10000 долларов
  30. 0215: destroy_pickup 0@
  31. 0A93: end_custom_thread
  32. //jump @PICKU01_03
  33.  
  34. :PICKU01_04
  35. 0215: destroy_pickup 0@
  36. jump @PICKU01_01



Сегодня написал скрипт блокировка дверей авто. Если зайти двери блокируются, выйдешь они разблокируется сами,
в машине также это можно сделать нажатием клавишей F. Конечно, есть ошибки. Вам виднее сделать его лучше.


Код: Text
  1. {$CLEO .cs}
  2. //-------------MAIN---------------
  3. 0000: NOP
  4.  
  5. :BLOCK_1 // первый цикл                          
  6. wait 0
  7. if
  8. 0256: player $PLAYER_CHAR defined  // если игрок существует
  9. jf @BLOCK_1
  10. if
  11. 00E0: player $PLAYER_CHAR driving  // если игрок водит авто
  12. jf @BLOCK_1
  13. 03C1: 0@ = player $PLAYER_CHAR car  // записываем хэндл авто в переменную 0@
  14. 020A: set_car 0@ door_status_to 2   // блокируем двери
  15.  
  16. :BLOCK_2  // далее начинает работать второй цикл
  17. wait 0
  18. if
  19. 8443: NOT player $PLAYER_CHAR in_a_car  // если игрок покинул авто
  20. jf @BLOCK_2
  21. if
  22. 8039:   NOT 0@ == -1 // если авто существует(хэндл этого авто не равен -1)
  23. jf @BLOCK_1
  24. 020A: set_car 0@ door_status_to 1  // разблокируем двери
  25. jump @BLOCK_1
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 22, 2017, 09:04:31 pm
 Shagg_E
Благодарю за Ваш ответ. По Вашим советам, учусь скриптингу, конечно, не все всегда получается. Опираясь на ответы в теме, написал скрипт.
Огромное Вам спасибо за ответ по блокировке дверей, теперь скрипт благодаря совету эксперту стал лучше!!!!!!!!!
Заезжайте на маркер, сигналите, за деньги получайте непробиваемые шины.
Единственная проблема, значок маркер с радара не пропадает, когда покидаешь радиус. Подскажите, пожалуйста, где ошибка?
Ищу также опкод или адрес памяти, который отвечает за включения\отк фар авто. Ну люблю vice city?, хоть и 28 лет, скоро отцом стану.
Код: Javascript
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0000: NOP
  5.  
  6. :car_tuning_1
  7. 00D6: if
  8. 0256:   player $PLAYER_CHAR defined
  9. 004D: jump_if_false @car_tuning_1
  10.  
  11. :car_tuning_2
  12. 0001: wait 0 ms
  13. 00D6: if
  14. 00E0:   player $PLAYER_CHAR driving
  15. 004D: jump_if_false @car_tuning_2
  16. 00D6: if
  17. 00F5:   player $player_char in_sphere 0 near_point -1107.25 -517.35 11.20 radius 30.0 30.0 30.0
  18. 004D: jump_if_false @car_tuning_2
  19. 02A7: 13@ = create_icon_marker_and_sphere 31 at -1107.25 -517.35 11.20
  20. 0103:   actor $PLAYER_ACTOR stopped_near_point_in_car -1107.25 -517.35 11.20 radius 3.0 3.0 3.0 sphere 0 // never used in VC
  21. 004D: jump_if_false @car_tuning_2
  22. if
  23. 0122:   player $PLAYER_CHAR pressing_horn
  24. 004D: jump_if_false @car_tuning_2
  25. if
  26. 010A:   player $PLAYER_CHAR money > 10000
  27. 004D: jump_if_false @car_tuning_2
  28. 0109: player $PLAYER_CHAR money += -10000
  29. 016A: fade 0 1000 ms
  30. 0001: wait 1500 ms  
  31. 03C0: $PLAYER_CAR = actor $PLAYER_ACTOR car
  32. 053F: set_car $PLAYER_CAR tires_vulnerable 0
  33. 016A: fade 1 1000 ms
  34. 0001: wait 1500 ms
  35. 0394: play_music 1
  36. 00D6: if
  37. 00F5:  player $player_char in_sphere 0 near_point -1107.25 -517.35 11.20 radius 30.0 30.0 30.0
  38. jf @car_tuning_3
  39. :car_tuning_3
  40. 0164: disable_marker 13@
  41. 0002: jump @car_tuning_1
  42.  
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Июль 23, 2017, 08:24:20 am
Судя по коду, Вы декомпилируете свой же скрипт. Это делать не стоит, когда у вас есть исходники. Просто открываете .txt файл с кодом и продолжаете работать, иначе при декомпиляции вы теряете часть информации и получаете плохочитабельный код.

Что касается маркера на карте, то используйте вместо опкода:
02A7: 13@ = create_icon_marker_and_sphere 31 at -1107.25 -517.35 11.20вот эти:
0570: 13@ = create_asset_radar_marker_with_icon 31 at -1107.25 -517.35 11.20
03BC: 14@ = create_sphere -1107.25 -517.35 11.20

Только потом не забудьте выключить сферу:
...
:car_tuning_3
0164: disable_marker 13@
03BD: destroy_sphere 14@

Что касается условий: зачем проверять каждое условие отдельно, если можно проверить все разом?
{$CLEO}

0570: 13@ = create_asset_radar_marker_with_icon 31 at -1107.25 -517.35 11.20
03BC: 14@ = create_sphere -1107.25 -517.35 11.20 2.0

:car_tuning_1
wait 0
if and
  0256:   player $PLAYER_CHAR defined
  00E0:   player $PLAYER_CHAR driving
  00F5:   player $player_char in_sphere 0 near_point -1107.25 -517.35 11.20 radius 30.0 30.0 30.0
  0103:   actor $PLAYER_ACTOR stopped_near_point_in_car -1107.25 -517.35 11.20 radius 3.0 3.0 3.0 sphere 0 // never used in VC
  0122:   player $PLAYER_CHAR pressing_horn
  010A:   player $PLAYER_CHAR money > 10000
jf @car_tuning_1
0109: player $PLAYER_CHAR money += -10000
016A: fade 0 1000 ms
0001: wait 1500 ms 
03C0: 0@ = actor $PLAYER_ACTOR car
053F: set_car 0@ tires_vulnerable 0
016A: fade 1 1000 ms
0001: wait 1500 ms
0394: play_music 1
0164: disable_marker 13@
03BD: destroy_sphere 14@
05DC: end_custom_thread

Вообще я мог бы рекомендовать вам сайт ru-script.3dn.ru. Правда там уроки скриптинга по SA, но он мало чем отличается от скриптинга в VC.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 24, 2017, 01:58:32 pm
Очень Рад вашему ответу, большое спасибо за уделенное мне время.
Да часто что-то меняю в скриптах, учту на будущее.
Благодарю Вас за ясный и понятный ответ по маркера, очень помог мне.
Вы абсолютно Вы, лучше проверить все условия сразу. Теперь благодаря Вам, скрипт работает идеально.
Спасибо за ссылку на сайт, будет полезный. Буду изучать.
Естественно sa очень хорошо изученная, по ней много уроков. Я ее прошел в 2005, но стиль 80 ближе, чем негров из 90.
Жаль по vice нету списка адресов памяти с подробным объяснением каждого значения.
Вот нашел ломанный скрипт, который должен по нажатию клавиши, взрывать все авто, кроме того, в которым находится игрок.
Пока моих знаний не хватает понять его, буду рад любым подсказкам.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
0002: jump @BIGBANG№ _33
03A4: name_thread 'BIGBANG№ '
0004: '¤ BLOWALL' = 'L' // integer values
hex
 85 68
end
0400: create_coordinate 280580 $64 'Їяяя№ Я  Ї…h' from_object 282372 offset 'Я  ­…h' 282884 'Я  ®…h'
hex
 01 AF 85 68
end
0400: create_coordinate 'Њяяя№ Я  ±…h' 6849969 1 from_object 284676 offset 'Я  °…h' 285700 $64
hex
 04 67
end
0004: 'Я  І…h' = 279812 // integer values
0002: jump @BIGBANG№ _151
04B9: unknown_stuff -704642048
0004: 'а' = 'iяяяБ   ' // integer values
0300: text_3numbers_highpriority // never used in VC or GTA 3
0200:   player // never used in VC
hex
 01 44 FF FF FF B9 04 D6
end
0400: create_coordinate 'Њяяя№ Я  ±…h' 6849969 1 from_object
00E0:   player $PLAYER_CHAR driving
004D: jump_if_false @BIGBANG№ _269
0001: wait 0 ms
00D6: if
05EE:   key_pressed 76 //VK_...
004D: jump_if_false @BIGBANG№ _188
0002: jump @BIGBANG№ _232
04B9: unknown_stuff 'х  '
0801:
hex
 FF FF FF B9
end
0104:   actor
8805:   not
hex
 13 F5
end
0303: text_4numbers_highpriority // never used in VC or GTA 3
0400: create_coordinate 'Њяяя№ Я  ±…h' 6849969 1 from_object 1140916226 offset 'яяя№ Г  '
0200:   player // never used in VC
hex
 01 69 FF FF
end
02FF: show_text_3numbers GXT
hex
 01   
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Июль 26, 2017, 03:55:23 am
Вот нашел ломанный скрипт, который должен по нажатию клавиши, взрывать все авто, кроме того, в которым находится игрок.
Пока моих знаний не хватает понять его, буду рад любым подсказкам.
Просто автор этого скрипта поставил на него защиту, из-за которой скрипт неправильно декомпилируется.
К счастью, защита была не сложной, поэтому вот код этого скрипта:
Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 05DF: write_memory 6849964 size 1 value 79 virtual_protect 0
  5. 05DF: write_memory 6849965 size 1 value 81 virtual_protect 0
  6. 05DF: write_memory 6849966 size 1 value 72 virtual_protect 0
  7. 05DF: write_memory 6849967 size 1 value 88 virtual_protect 0
  8. 05DF: write_memory 6849968 size 1 value 92 virtual_protect 0
  9. 05DF: write_memory 6849969 size 1 value 103 virtual_protect 0
  10. 05DF: write_memory 6849970 size 1 value 69 virtual_protect 0
  11.  
  12. :Noname_151
  13. wait 0
  14. if
  15. 00E0:   player $player_char driving
  16. jf @Noname_151
  17. 03C1: 0@ = player $player_char car_no_save
  18.  
  19. :Noname_188
  20. if
  21. 00E0:   player $player_char driving
  22. jf @Noname_269
  23. wait 0
  24. if
  25. 05EE:   key_pressed 76 //VK_...
  26. jf @Noname_188
  27. 03F5: set_vehicle 0@ apply_damage_rules 0
  28. wait 5000
  29. 03F5: set_vehicle 0@ apply_damage_rules 1
  30. jump @Noname_188
  31.  
  32. :Noname_269
  33. Car.RemoveReferences(0@)
  34. jump @Noname_151

В первых 6 строках(где идет работа с памятью) происходит замена чит-кода "BIGBANG" на "BLOWALL", а далее - думаю, всё очевидно.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 29, 2017, 06:39:35 pm
Спасибо Shagg_E за Ваш ответ. О Вас много хорошего пишут, что Вы сильно помогайте людям с модами.
Не знал, что защита бывает на скрипте. Жаль, он не работает.
Нашел адреса памяти, отвечающие за свет фар.

0x2B0   byte   light status
•   bit 0/1 = front left lights
•   bit 2/3 = front right lights
•   bit 4/5 = rear left lights
•   bit 6/7 = rear right lights
Решил, написать скрипт, который выкл\вкл фар.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
0001: wait 0 ms

:NONAME_6
0001: wait 0 ms
00D6: if and
00E0:   player $PLAYER_CHAR driving
05EE:   key_pressed 70 //VK_...
004D: jump_if_false @NONAME_6
03C1: 1@ = player $player_char car_no_save
05E7: 2@ = car 1@ struct
0A8D: 3@ = read_memory 0x2B0 size 1 virtual_protect 1
0A8C: write_memory 3@ size 1 value 0 virtual_protect 1
0002: jump @NONAME_6 
В итоге вылет. Да я нуб, признаю это. Знаний маловато. Помогите, пожалуйста, буду благодарен за совет.
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Июль 30, 2017, 05:50:17 am
В данном случае 0x2B0 означает смещение от структуры машины. То есть, чтобы получить адрес состояния фар определенной машины, нужно получить ее структуру и прибавить к ней это смещение.
Цитировать
0x2B0   byte   light status
•   bit 0/1 = front left lights
•   bit 2/3 = front right lights
•   bit 4/5 = rear left lights
•   bit 6/7 = rear right lights
Судя по этому описанию, это поле структуры в 1 байт, и оно является флагом фар. Я имею в виду, что каждый бит этого байта отвечает за свет каждой фары транспортного средства.
Код: Text
  1. {$CLEO}
  2. 0000:
  3.  
  4. while true //начало бесконечного цикла
  5.     wait 0 //задержка, чтобы игра обработала кадр
  6.    
  7.     if and //если игрок за рулем и нажал клавишу "H"
  8.         Actor.Driving($PLAYER_ACTOR)
  9.         05EE: key_pressed 0x48 // key "H"
  10.     then //тогда
  11.         03C0: 0@ = actor $PLAYER_ACTOR car //находим машину, в которой сидит игрок
  12.         05E7: 0@ = car 0@ struct //получаем структуру этой машины
  13.         0@ += 0x2B0 //прибавляем смещение
  14.         05E0: 1@ = read_memory 0@ size 1 virtual_protect 0 //считыванием состоянием флагов
  15.        
  16.         if //если фары выключены
  17.             1@ == 0
  18.         then //тогда устанавливаем все флаги
  19.             1@ = 0xFF //в двоичном представление это число выглядит так: 11111111
  20.         else //иначе сбрасываем все флаги
  21.             1@ = 0 //в двоичном представление это число выглядит так: 00000000
  22.         end //конец проверки
  23.        
  24.         05DF: write_memory 0@ size 1 value 1@ virtual_protect 0 //записываем получившиеся значение обратно
  25.         wait 250 //маленькая задержка, чтобы фары не переключались мгновенно
  26.     end  //конец первой проверки
  27.    
  28. end //конец бесконечного цикла
Название: Re: Помощь с CLEO
Отправлено: egor230 от Июль 31, 2017, 07:17:32 pm
GeniusZ, спасибо Вам огромное, Вам скрипт работает идеально, чувствует  большой опыт в работе с памятью. Здесь полный ноль.
Благодарю Вам за понятного объяснение.
Можно, с Вашего позволения вопрос, почему мы пишем virtual_protect 0, не virtual_protect 1, чтобы снять защиту с памяти.
Скажите, пожалуйста, есть такой опкод, который записывает  ближайшую машину в переменную.
Хочу провести такой эксперимент, в миссии "водитель" остановить машину хилари, и выкинуть его, что будет?
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Июль 31, 2017, 08:39:31 pm
Вся память программы состоит из кода и данных, и, чтобы программа случайно не натворила что-нибудь с кодом, на него устанавливается защита. Чтобы ее снять, надо писать virtual_protect 1(когда мы, конечно, модифицируем код и знаем что делаем).

Скажите, пожалуйста, есть такой опкод, который записывает  ближайшую машину в переменную.
053E: $Car = get_random_car_with_actors -1 in_area $2556 $2658 $445 $446
Название: Re: Помощь с CLEO
Отправлено: egor230 от Август 02, 2017, 08:56:47 am
 GeniusZ, спасибо Вам огромное, что просвещает своей мудрости меня в этой области. Если бы не было Вашего замечательного форум, люди вроде меня не развивались.
Значит мы пишем 1 только когда модифицируем код памяти.
Благодарю Вас за нужный опкод.
Пытаюсь написать скрипт, чтобы машина рядом заглохла, но получаю лишь вылет. Если у Вас есть время, подскажите, пожалуйста, где мои ошибки?
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
:1   
wait 0   
if   
 05EE: key_pressed 71
jf @1     
:2           
 wait 30   
if   
 85EE: not key_pressed 71
jf @2
04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 60.0 60.0 0.0
04C4: store_coords_to 4@ 5@ 6@ from_actor $PLAYER_ACTOR with_offset -60.0 -60.0 0.0
053E: 10@ = get_random_car_with_actors -1 in_area 1@ 2@ 4@ 5@
jf @1//
02D4: car 10@ turn_off_engine 0     
jump @1 
Название: Re: Помощь с CLEO
Отправлено: GeniusZ от Август 02, 2017, 01:48:45 pm
Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0000: NOP
  5. :1    
  6. wait 0    
  7. if    
  8.  05EE: key_pressed 71
  9. jf @1      
  10. :2          
  11.  wait 30    
  12. if    
  13.  85EE: not key_pressed 71
  14. jf @2
  15. 04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 60.0 60.0 0.0
  16. 04C4: store_coords_to 4@ 5@ 6@ from_actor $PLAYER_ACTOR with_offset -60.0 -60.0 0.0
  17. 053E: 10@ = get_random_car_with_actors -1 in_area 1@ 2@ 4@ 5@
  18. //jf @1 - не правильно закомментировали
  19. 02D4: car 10@ turn_off_engine 0    
  20. jump @1  
Название: Re: Помощь с CLEO
Отправлено: egor230 от Август 02, 2017, 08:49:57 pm
 GeniusZ, спасибо Вам большое исправления.
Сегодня, написал скрипт, что машина по нажатию клавиши G, ехала к Вам, работает очень криво. Думаю, как сделать чтобы машина подъезжала быстро и аккуратно. Помогите, пожалуйста, в этом.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
:1   
wait 0
01EB: set_traffic_density_multiplier_to 0.0
if   
 05EE: key_pressed 70
jf @1   
actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
if
0AE2: 0@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET
jf @1     
0186: 4@ = create_marker_above_car 0@
020A: set_car 0@ door_status_to 1
:3
wait 10
if   
 05EE: key_pressed 71
jf @3     
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0

:4
00A8: set_car 0@ to_psycho_driver
04BA: set_car 0@ speed_instantly 70.0
:5
02C2: car 0@ drive_to_point 5@ 6@ 7@
wait 100
01AF: car 0@ 0 5@ 6@ 7@  radius 1.0 1.0 1.0
01C1: car 0@ stopped
0164: disable_marker 4@
jump @1

сделать чуть лучше, но машина едет слишком медленно.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
:1   
wait 0
01EB: set_traffic_density_multiplier_to 0.0
if   
 05EE: key_pressed 70
jf @1   
actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
if
0AE2: 0@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET
jf @1     
0186: 4@ = create_marker_above_car 0@
020A: set_car 0@ door_status_to 1
:3
wait 10
if   
 05EE: key_pressed 71
jf @3     
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0
:4
wait 100
00AE: set_vehicle 0@ traffic_behavior_to 3

:5
02C2: car 0@ drive_to_point 5@ 6@ 7@
wait 100
if
01AF: car 0@ 0 5@ 6@ 7@  radius 1.0 1.0 1.0
jf @5     
01C1: car 0@ stopped
0164: disable_marker 4@
wait 100
02D4: car 0@ turn_off_engine 1
jump @1

наконец-то, доработал скрипт, машина подъезжает к томми быстро, только застраивает часто.
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
:1   
wait 0
if   
 05EE: key_pressed 70
jf @1   
actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
0AE2: 0@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET
jf @1     
0186: 4@ = create_marker_above_car 0@
020A: set_car 0@ door_status_to 1
:3
wait 10
if   
 05EE: key_pressed 71
jf @3     
04C4: create_coordinate 5@ 6@ 7@ from_actor $PLAYER_ACTOR offset 0.0 0.0 0.0
02C1: set 8@ 9@ 10@ to_car_path_coords_closest_to 5@ 6@ 7@
wait 100
00AE: set_vehicle 0@ traffic_behavior_to 5.0
Car.SetMaxSpeed(0@, 60.0)
:5
02C2: car 0@ drive_to_point 8@ 9@ 10@
00AE: unknown_set_car 0@ to_ignore_traffic_lights 2 
wait 100
if or
0495: car 0@ burning
02BF: car 0@ sunk
0119: car 0@ wrecked
01F4: car 0@ flipped
0203: actor $PLAYER_ACTOR near_car 0@ radius 5.0 5.0 5.0
jf @5
0164: disable_marker 4@
:2
if
 0203: actor $PLAYER_ACTOR near_car 0@ radius 5.0 5.0 5.0
jf @5     
02D4: car 0@ turn_off_engine 0
wait 100
jump @1


 Здравствуйте, всем.
Прошу прощения, что Вас отвлекают от дел.
Всю игру прошел с автоприцелом, но на mp4, прицел от первого лица.
С помощью этого скрипта, можно стрелять с автоприцелом.
{$CLEO .CS}
thread 'AUTOAIM'

:START
wait 0
Player.Defined($PLAYER_CHAR)
jf @START
jump @DATHING

:DATHING
wait 0
05DF: write_memory 0x5349DB size 2 value 0x9090 virtual_protect 1 //M4
05DF: write_memory 0x5349E0 size 2 value 0x9090 virtual_protect 1 //Ruger
05DF: write_memory 0x5349E5 size 2 value 0x9090 virtual_protect 1 //M60
05DF: write_memory 0x5349D1 size 2 value 0x9090 virtual_protect 1 //sniper rifle (29)
05DF: write_memory 0x5349D6 size 2 value 0x9090 virtual_protect 1 //sniper rifle (28)
05DF: write_memory 0x5349C8 size 2 value 0x9090 virtual_protect 1 //rocket launcher
jf @DATHING
jump @START
но с ним снайперки и базуки не стрелять вообще. Скажите, пожалуйста, какие адреса разблокируют стрельбу без прицела от первого лица?.
Теперь машина подъезжает быстро к томми.
{$CLEO .cs}     

//-------------MAIN---------------
0000: NOP
:1   
wait 0
if   
 05EE: key_pressed 70
jf @1   
actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
0AE2: 12@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET
jf @1     
0186: 0@ = create_marker_above_car 12@
:GUL_102
0001: wait 200 ms
if   
 05EE: key_pressed 71
jf @GUL_102   
0208: 1@ = random_float 70.0 120.0
0208: 2@ = random_float 70.0 120.0
04C4: create_coordinate 3@ 4@ 5@ from_actor $PLAYER_ACTOR offset 1@ 2@ 100.0
02C1: set 9@ 10@ 11@ to_car_path_coords_closest_to 3@ 4@ 5@
:2
0001: wait 10 ms
00AB: put_car 12@ at 9@ 10@ 11@
if
01B0: car 12@ stopped 1 9@ 10@ 11@ radius 5.0 5.0 5.0
jf @2
00AE: set_vehicle 12@ traffic_behavior_to 5.5
0423: set_car 12@ improved_handling_to 1.5
00AE: unknown_set_car 12@ to_ignore_traffic_lights 2 
04C4: create_coordinate 6@ 7@ 8@ from_actor $PLAYER_ACTOR offset 5.0 5.0 0.0
02AC: set_car 12@ immunities 1 1 1 1 1
01EC: make_car 12@ very_heavy 1
03AB: set_car 12@ strong 1
00A7: car 12@ drive_to 6@ 7@ 8@
00AD: set_car 12@ max_speed_to 120.0
04BA: set_car 12@ speed_instantly 70.0
:GUL_516 
0001: wait 10 ms
00D6: if or
03CE: car 12@ stuck
01F4: car 12@ flipped
020D: car 12@ flipped
02BF: car 12@ sunk
jf @2
0001: wait 10 ms
00D6: if
0202: actor $PLAYER_ACTOR near_car 12@ radius 5.0 5.0 sphere 0
004D: jump_if_false @GUL_516
0164: disable_marker 0@
0001: wait 200 ms
02D4: car 12@ turn_off_engine 1
02AC: set_car 12@ immunities  0 0 0 0 0
01EC: make_car 12@ very_heavy 0
03AB: set_car 12@ strong 0
0001: wait 40 ms   
0002: jump @1
Название: Re: Помощь с CLEO
Отправлено: egor230 от Август 25, 2017, 06:47:58 pm

Подскажите, пожалуйста, почему машина и маркер, никак не удаляются после открытия передней двери авто, которая подъехала к нам? Куда их поставить, чтобы удалились?
{$CLEO .cs}
{$NOSOURCE}
0000:
:1
wait 0
if
05EE: key_pressed 69
jf @1
actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
wait 500
0AE2: 10@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 30.0 find_next 0 pass_wrecked 1 //IF and SET
if
gosub @4
004D: jf @1
wait 200
0186: 0@ = create_marker_above_car 10@
046C: 4@ = car 10@ driver
if
not 4@ == -1
jf @3
03E2: actor 4@ exit_car
:3
0001: wait 200 ms
01C2: remove_references_to_actor 4@
0001: wait 10 ms
00D6: if
0202: actor $PLAYER_ACTOR near_car 10@ radius 5.0 5.0 sphere 0
004D: jump_if_false @3
0001: wait 40 ms
if
gosub @5
then
0@ = 15
1@ = 2
gosub @left_front_door
end
:4
if and
8137: not car 10@ id = 166
8137: not car 10@ id = 178
8137: not car 10@ id = 191
8137: not car 10@ id = 192
8137: not car 10@ id = 193
8137: not car 10@ id = 198
004D: jf @1
return
:5
if and
6@ = 0x59D1D0
7@ = 0x5A9810
8@ = 0x59C890
9@ = 0x59CF50
return
:left_front_door
05E7: 10@ = car 10@ struct
0085: 11@ = 10@
05E4: call_function_method 6@ struct 11@ num_params 1 pop 0 0@ {1..19} 2@ // IsComponentPresent
if
2@ == 1
then
0085: 3@ = 10@
3@ += 0x2A0 // CDamageManager
05E4: call_function_method 7@ struct 3@ num_params 1 pop 0 1@ {0..5} 4@ // GetComponnetStatus
if
4@ <> 3
then
for 12@ = 0.0 TO 1.0 step 0.1
05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
wait 0
end
05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
end
end
return
01C3: remove_references_to_car 10@
0164: disable_marker 0@
jump @1

Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Август 27, 2017, 12:32:19 am
1) Зачем директива "{$NOSOURCE}"?
Ты же сам на предыдущей странице сталкивался с тем, какие проблемы возникают, когда автор какого-нибудь скрипта блокирует доступ к исходникам своего скрипта. Всё это стопорит моддинг, без взаимопомощи и открытых исходников мы бы до сих пор умели только скины в игре менять(и то - лишь те, что в папке skins)... И это касается не только моддинга.

2) Мне кажется, ты до сих пор не понимаешь даже свой собственный код(возможно - потому что копируешь его откуда-то не глядя). То у тебя в коде "jf @1", то "004D: jf @1", то вообще "004D: jump_if_false @3"(то же самое с "wait" и "if"); то у тебя низкоуровневый, то высокоуровневый код - что за непостоянство?

3) Почему у тебя какой-то код после "return"?
Ты понимаешь, что командой "return" ты делаешь возврат на точку, из которой был вызван gosub, и код после "return" уже не читается? Именно поэтому маркер не исчезает.

4) Зачем всюду невпопад распиханы ненужные задержки wait то по 200, то по 40, или даже 10 миллисекунд?

5) Код представляет собой непонятный венегрет, плюс я не использовал никогда условный gosub, поэтому понятия не имею, сработают ли мои правки, но вот:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3.  
  4. :1
  5. wait 0
  6. if
  7. 05EE: key_pressed 69
  8. jf @1
  9. actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)//
  10. if
  11. 0AE2: 10@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 30.0 find_next 0 pass_wrecked 1 //IF and SET
  12. jf @1
  13. if
  14. gosub @4
  15. jf @1
  16. 0186: 0@ = create_marker_above_car 10@
  17. 046C: 4@ = car 10@ driver
  18. if
  19. not 4@ == -1
  20. jf @3
  21. 03E2: actor 4@ exit_car
  22.  
  23. :3
  24. 01C2: remove_references_to_actor 4@
  25. if
  26. 0202: actor $PLAYER_ACTOR near_car 10@ radius 5.0 5.0 sphere 0
  27. jf @3
  28. if
  29. gosub @5
  30. then
  31. 0@ = 15
  32. 1@ = 2
  33. gosub @left_front_door
  34. end
  35. 01C3: remove_references_to_car 10@
  36. 0164: disable_marker 0@
  37. jump @1
  38.  
  39. :4
  40. if and
  41. 8137: not car 10@ id = 166
  42. 8137: not car 10@ id = 178
  43. 8137: not car 10@ id = 191
  44. 8137: not car 10@ id = 192
  45. 8137: not car 10@ id = 193
  46. 8137: not car 10@ id = 198
  47. 004D: jf @1
  48. return
  49.  
  50. :5
  51. if and
  52. 6@ = 0x59D1D0
  53. 7@ = 0x5A9810
  54. 8@ = 0x59C890
  55. 9@ = 0x59CF50
  56. return
  57.  
  58. :left_front_door
  59. 05E7: 10@ = car 10@ struct
  60. 0085: 11@ = 10@
  61. 05E4: call_function_method 6@ struct 11@ num_params 1 pop 0 0@ {1..19} 2@ // IsComponentPresent
  62. if
  63. 2@ == 1
  64. then
  65. 0085: 3@ = 10@
  66. 3@ += 0x2A0 // CDamageManager
  67. 05E4: call_function_method 7@ struct 3@ num_params 1 pop 0 1@ {0..5} 4@ // GetComponnetStatus
  68. if
  69. 4@ <> 3
  70. then
  71. for 12@ = 0.0 TO 1.0 step 0.1
  72. 05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
  73. wait 0
  74. end
  75. 05E3: call_function_method 9@ struct 10@ num_params 3 pop 0 12@ 1@ 0@ {1..19} // CAutomobile__OpenDoor ???
  76. end
  77. end
  78. return


P.S. И пожалуйста. ПОЖАЛУЙСТА. Прочитай справку Sanny Builder полностью, чтобы понимать, что ты кодишь. Или хотя бы интересуйся значением каждой команды, которую используешь в своих скриптах, а не бездумно копируй. Лично с моей стороны пропадает всякое желание и силы помогать, когда с твоей стороны не видно желание учиться.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 05, 2017, 05:15:13 pm
Здравствуйте, уважаемый  Shagg_E
Огромное спасибо за Ваш ответ.
Директиву  "{$NOSOURCE}" использует Vital https://www.youtube.com/watch?v=t626LNNH2qY&list=PLFAE331B20083DBCC (https://www.youtube.com/watch?v=t626LNNH2qY&list=PLFAE331B20083DBCC)
Чтобы легко вносить изменения, не было проблем с декомпиляции с скрипта.
Вы совершенно правы, еще нахожусь между низкоуровневый и высокоуровневый скриптнигом,  высокоуровневый более продвинутый, привыкаю к нему, хотя низкоуровневый более легкий.

Благодарю за Ваш совет о "return" теперь где ошибка.
Да задержек много лишних, но если не поставить после 3 лейба задержку то будет вылет.
А почему Вы используйте условный gosub?
Читаю, изучаю, набиваю шишки, но больше понимаю.
Очень ценю Ваше терпение, что так подробно объясняйте. Здорово, что есть форум с умными людьми, от которых много чему научиться.
Вот написал пару скриптов, они работают, но Вам лучше знать, как можно красивее и короче их писать.
взорвать 2 машины около томми
{$CLEO .cs}
0000:
:0
wait 0
if
0256: player $PLAYER_CHAR defined
then
01C3: remove_references_to_car 4@
01C3: remove_references_to_car 5@
if
0ADC: test_cheat "g"
then
wait 10
actor.StorePos($player_actor 0@ 1@ 2@)
if
0AE2: 4@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0 pass_wrecked 1 //IF and SET
then
020B: explode_car 4@
if
0AE2: 5@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 30.0 find_next 4@ pass_wrecked 1 //IF and SET
then
020B: explode_car 5@
end
end
end
end
jump @0

и

Теперь катана, топор и мачете, отрубает голову с первого удара.
{$CLEO .cs}
wait 0
while true
if
0256: player $PLAYER_CHAR defined
then
01C2: remove_references_to_actor 0@
end
wait 0
if
00E1: player 0 pressed_button 17
then
if or
02D8: actor $PLAYER_ACTOR current_weapon == 8
02D8: actor $PLAYER_ACTOR current_weapon == 9
02D8: actor $PLAYER_ACTOR current_weapon == 10
then
wait 10
04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0
0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
if
not 0@ == -1
then
wait 500
0321: kill_actor 0@
end
end
end
end
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 09, 2017, 12:35:45 am
Директива "{$NOSOURCE}" наоборот мешает тому, чтобы было "легко вносить изменения". При декомпиляции скрипта последняя версия Sanny Builder (https://sannybuilder.com/index.html) дает выбор - открыть исходный код, включенный в скрипт, или же декомпилировать скрипт. Именно при первом варианте как раз-таки "легко вносить изменения"(очевидно же), однако если в скрипт была внесена директива "{$NOSOURCE}" - исходного кода в скрипте не окажется, и редактор сможет лишь декомпилировать скрипт, т.е. потеряется его есходный вид и всякие комментарии.

Цитировать
А почему Вы используйте условный gosub?

Я же написал, что просто отредактировал тот скрипт "на глазок", убрав самые явные ошибки, но я понятия не имею, получился ли в итоге рабочий код, т.к. нет времени на тесты этого винегрета.

Цитировать
взорвать 2 машины около томми

Опкод 01C3 применяется, чтобы удалить автомобиль из списка неудаляемых объектов(т.е. чтобы машина снова могла исчезнуть за спиной и не портила сохранения). Однако он не требуется при использовании опкода 0AE2, т.к. последний не вносит найденную машину в этот список.
Кроме того, даже если бы опкод 01C3 требовался - он стоит не на своем месте.

Так же не стоит использовать опкод 0ADC с одной буквой - он для чит-кодов. Если хочешь сделать "клавишу активации" - используй
Код: Text
  1. 0AB0: key_pressed 0x47

Вот итоговый код(взрывает 2 машины около игрока при наборе чит-кода "blow2"):
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3.  
  4. :0  // начало цикла
  5. wait 0  // если не ставить хоть какую-нибудь задержку - цикл будет бесконечно "быстро" выполняться, не давая игре работать(т.е. она повиснет)
  6. if and  //(1 ветка) если И(and обозначает, что дальнейшие условия должны выполнться только вместе)...
  7.     0256: player $PLAYER_CHAR defined  // ...игрок существует...
  8.     0ADC: test_cheat "blow2"  // ...И введен чит "blow2"
  9. then  // тогда
  10.     actor.StorePos($player_actor, 0@, 1@, 2@)  // записываем координаты позиции игрока в переменные  0@ 1@ 2@
  11.     if  //(2 ветка) если...
  12.         0AE2: 3@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 30.0 find_next 0 pass_wrecked 1  // ...найдена НЕ ВЗОРВАННАЯ(pass_wrecked 1 - пропуск взорванных) машина в радиусе 30.0 юнитов(игровых метров) от точки со координатами 0@ 1@ 2@ (find_next 0 обозначает, что мы НАЧИНАЕМ "сканировать" местность на наличие машин)
  13.     then  // тогда
  14.         020B: explode_car 3@  // взрываем найденную машину
  15.         if  //(3 ветка) если...
  16.             0AE2: 3@ = random_vehicle_near_point 0@ 1@ 2@ in_radius 30.0 find_next 1 pass_wrecked 1  // ...найдена НЕ ВЗОРВАННАЯ(pass_wrecked 1 - пропуск взорванных) машина в радиусе 30.0 юнитов(игровых метров) от точки со координатами 0@ 1@ 2@ (find_next 1 обозначает, что мы ПРОДОЛЖАЕМ "сканировать" местность на наличие машин)
  17.         then  // тогда
  18.             020B: explode_car 3@  // взрываем найденную машину
  19.         end  // закрытие 3 ветки
  20.     end  // закрытие 2 ветки
  21. end  // закрытие 1 ветки
  22. jump @0  // цикл начинается заного с метки "0"

Цитировать
Теперь катана, топор и мачете, отрубает голову с первого удара.

Опять то же замечание по поводу опкода 01C2. Он не нужен при использовании 0AE1. И опять-таки - даже если бы опкод 01C2 требовался - он стоит не на своем месте.

Итоговый код такой:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3.  
  4. while true  // начало главного бесконечного цикла(1) (можно использовать вместо способа из первого скрипта)
  5.     wait 0  // если не ставить хоть какую-нибудь задержку - цикл будет бесконечно "быстро" выполняться, не давая игре работать(т.е. она повиснет)
  6.     if  //(1 ветка) если...
  7.         0256: player $PLAYER_CHAR defined  // ...игрок существует...
  8.     then  // тогда
  9.         if  //(2 ветка) если...
  10.         00E1: player 0 pressed_button 17  // ...И нажата клавиша "огонь"(ЛКМ по-умолчанию)
  11.         then  // тогда
  12.             if or  //(3 ветка) если ИЛИ...
  13.                 02D8: actor $PLAYER_ACTOR current_weapon == 8  // ...оружие в руках игрока - мясницкий нож...
  14.                 02D8: actor $PLAYER_ACTOR current_weapon == 9  // ...ИЛИ оружие в руках игрока - мачете...
  15.                 02D8: actor $PLAYER_ACTOR current_weapon == 10  // ...ИЛИ оружие в руках игрока - катана...
  16.             then  // тогда
  17.                 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0  // записываем координаты позиции игрока с оффсетом 0.0 1.2 0.0 (вперед на 1.2 юнита, т.е. метра) в переменные  1@ 2@ 3@
  18.                 if  //(4 ветка) если...
  19.                     0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1  // ...найден НЕ МЕРТВЫЙ(pass_deads 1 - пропуск мертвых) актер в радиусе 1.2 юнита(игровых метра) от точки со координатами 1@ 2@ 3@ (find_next 0 обозначает, что мы НАЧИНАЕМ "сканировать" местность на наличие актеров)
  20.                 then  // тогда
  21.                     0321: kill_actor 0@  // убить актера
  22.                     while 0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 1 pass_deads 1  // следующий бесконечный цикл(2) выполняется, пока выполняется условие: ЕСЛИ ...найден НЕ МЕРТВЫЙ(pass_deads 1 - пропуск мертвых) актер в радиусе 1.2 юнита(игровых метра) от точки со координатами 1@ 2@ 3@ (find_next 1 обозначает, что мы ПРОДОЛЖАЕМ "сканировать" местность на наличие актеров)
  23.                         0321: kill_actor 0@  // убить актера
  24.                     end  // закрытие бесконечного цикла(2)
  25.                 end  // закрытие 4 ветки
  26.             end  // закрытие 3 ветки
  27.         end  // закрытие 2 ветки
  28.     end  // закрытие 1 ветки
  29. end  // закрытие главного бесконечного цикла(1)

Но, как ты сможешь заметить при тестах - такая реализация работает не так, как задумывалось: головы "отрубаются" не после удара, а сразу как только игрок нажмет кнопку "огонь".
Можно было бы конечно запилить кучу проверок с таймерами и прочим, но зачем, если отрубание голов с первого раза уже сделали:
http://www.gtagarage.com/mods/show.php?id=28361 (http://www.gtagarage.com/mods/show.php?id=28361)
тема на форумсах с исходным кодом:
http://gtaforums.com/topic/881281-lethal-slices/ (http://gtaforums.com/topic/881281-lethal-slices/)
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 10, 2017, 09:46:35 pm
Уважаемый Shagg_E
Теперь понятно, директива "{$ NOSOURCE}", мешает вносит изменения, теряются комментарии. Благодарю за подробное разъяснение, Вы очень много время на меня потратили. Думаю, наша переписка поможет другим людям.
Gosub многие используют, чтоб выглядел скрипт более компактным.
Опкод 01C3 не нужен, являться лишним. Это очень ценный совет. Действительно зачем лишний опкод в скрипте.
Насчет опкода  0ADC очень дельный совет, теперь использовать его.
Опять моя ошибка в "отрубание" с опкодом 01с3.
Нужно дорабатывать, добавить таймер, проверку уменьшилось здоровье актера.
Cleo, чем он нравится один и тот же скрипт, написать разными способами.
Вот написал так.
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:
  3. while true
  4. wait 0
  5. if // (1 ветка)
  6. 0256:  player $PLAYER_CHAR defined
  7. then
  8. if // (2 ветка)
  9. 00E1: player 0 press_button 17
  10. then
  11. if or // (3 ветка)
  12. 02D8: actor $PLAYER_ACTOR current_weapon == 8
  13. 02D8: actor $PLAYER_ACTOR current_weapon == 9
  14. 02D8: actor $PLAYER_ACTOR current_weapon == 10
  15. then  
  16. 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0  
  17. if   // (4 ветка)
  18. 0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
  19. then
  20. 5@ = 0
  21. 6@ = 16                                                                                                      
  22. repeat
  23. wait 0
  24. 5@ += 1
  25. until 003B: 5@ == 6@
  26. if  // (5 ветка)
  27. 8039: not 0@ == -1
  28. then  
  29. 0321: kill_actor 0@
  30. end
  31. end
  32. end  
  33. end
  34. end
  35. end
  36.  

в бесконечных циклах нельзя использовать wait 0, так это приводит к вылету. Использовал цикл repeat until. Пока не умею пользоваться таймерами в циклах, но буду учиться.   
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 10, 2017, 11:35:00 pm
Цитировать
Gosub многие используют, чтоб выглядел скрипт более компактным.
Да, я и сам его использую по этой же причине(как и scm-функции). Но вот условный gosub не использовал(не было нужды), поэтому и не могу помочь с ним.

Цитировать
Опкод 01C3 не нужен, являться лишним
Он был лишним конкретно в том случае. Иногда он необходим(когда сам создаешь актера, например, и необходимо, чтобы он исчезал за спиной или вдалеке).

Цитировать
Насчет опкода  0ADC очень дельный совет, теперь использовать его.
Да, он удобен для создания чит-кодов. А для опкода 0AB0 номера клавиш можно найти в справке SannyBuilder в разделе CLEO 3 Code Library/Список значений кнопок для 0AB0

Цитировать
Вот написал так.
Проверка
Код: Text
  1. 8039: not 0@ == -1
в данном случае не нужна, поскольку опкод 0AE1 здесь уже используется, как условие. Т.е. актер уже точно найден.

Цитировать
Пока не умею пользоваться таймерами в циклах, но буду учиться.
Таймерами являются переменные 16@ и 17@. Они начинают свой отсчет сразу при старте скрипта, даже если ты их не используешь.
Пользоваться легко - достаточно сбросить их значение на ноль, а потом в нужное время проверять их значение.
Отсчет идет в миллисекундах. 1000 миллисекунд=1 секунде.

Вот вариант кода с таймером:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3. while true
  4.     wait 0
  5.     if // (1 ветка)
  6.         0256:  player $PLAYER_CHAR defined
  7.     then
  8.         if // (2 ветка)
  9.             00E1: player 0 press_button 17
  10.         then
  11.             if or // (3 ветка)
  12.                 02D8: actor $PLAYER_ACTOR current_weapon == 8
  13.                 02D8: actor $PLAYER_ACTOR current_weapon == 9
  14.                 02D8: actor $PLAYER_ACTOR current_weapon == 10
  15.             then
  16.                 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0
  17.                 if   // (4 ветка)
  18.                     0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
  19.                 then
  20.                     16@ = 0 // таймер сброшен
  21.                     repeat
  22.                         wait 0
  23.                     until 0019:   16@ > 1000  // проверка, прошло ли 500 миллисекунд(0.5 секунды)
  24.                     0321: kill_actor 0@
  25.                 end
  26.             end
  27.         end
  28.     end
  29. end

В данном случае можно также просто обойтись простым wait:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3. while true
  4.     wait 0
  5.     if // (1 ветка)
  6.         0256:  player $PLAYER_CHAR defined
  7.     then
  8.         if // (2 ветка)
  9.             00E1: player 0 press_button 17
  10.         then
  11.             if or // (3 ветка)
  12.                 02D8: actor $PLAYER_ACTOR current_weapon == 8
  13.                 02D8: actor $PLAYER_ACTOR current_weapon == 9
  14.                 02D8: actor $PLAYER_ACTOR current_weapon == 10
  15.             then
  16.                 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0
  17.                 if   // (4 ветка)
  18.                     0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
  19.                 then
  20.                     wait 500
  21.                     0321: kill_actor 0@
  22.                 end
  23.             end
  24.         end
  25.     end
  26. end

...и с проверкой здоровья:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3. while true
  4.     wait 0
  5.     if // (1 ветка)
  6.         0256:  player $PLAYER_CHAR defined
  7.     then
  8.         if // (2 ветка)
  9.             00E1: player 0 press_button 17
  10.         then
  11.             if or // (3 ветка)
  12.                 02D8: actor $PLAYER_ACTOR current_weapon == 8
  13.                 02D8: actor $PLAYER_ACTOR current_weapon == 9
  14.                 02D8: actor $PLAYER_ACTOR current_weapon == 10
  15.             then
  16.                 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0
  17.                 if   // (4 ветка)
  18.                     0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
  19.                 then
  20.                     0226: 1@ = actor 0@ health // записываем первоначальное здоровье актера
  21.                     wait 500
  22.                     0226: 2@ = actor 0@ health // записываем здоровье актера спустя 500 миллисекунд
  23.                     if
  24.                         001D:   1@ > 2@  // если здоровье уменьшилось
  25.                     then
  26.                         0321: kill_actor 0@
  27.                     end
  28.                 end
  29.             end
  30.         end
  31.     end
  32. end


И наконец - самый корректный вариант: проверяем здоровье актера во время работы таймера(пока не прошло 1000 миллисекунд).
Если здоровье потратилось - актер, а затем и весь цикл проверки таймера - "убиваются":
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3. while true
  4.     wait 0
  5.     if // (1 ветка)
  6.         0256:  player $PLAYER_CHAR defined
  7.     then
  8.         if // (2 ветка)
  9.             00E1: player 0 press_button 17
  10.         then
  11.             if or // (3 ветка)
  12.                 02D8: actor $PLAYER_ACTOR current_weapon == 8
  13.                 02D8: actor $PLAYER_ACTOR current_weapon == 9
  14.                 02D8: actor $PLAYER_ACTOR current_weapon == 10
  15.             then
  16.                 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 1.2 0.0
  17.                 if   // (4 ветка)
  18.                     0AE1: 0@ = random_actor_near_point 1@ 2@ 3@ in_radius 1.2 find_next 0 pass_deads 1
  19.                 then
  20.                     0226: 1@ = actor 0@ health // записываем первоначальное здоровье актера
  21.                     16@ = 0 // таймер сброшен
  22.                     repeat
  23.                         wait 0
  24.                         0226: 2@ = actor 0@ health
  25.                         if
  26.                             001D:   1@ > 2@  // если здоровье уменьшилось
  27.                         then
  28.                             0321: kill_actor 0@
  29.                             break // "убиваем" цикл repeat, поскольку мы сделали, что хотели с актером
  30.                         end
  31.                     until 0019:   16@ > 1000 // проверка, прошло ли 1000 миллисекунд(1.0 секунды)
  32.                 end
  33.             end
  34.         end
  35.     end
  36. end


В игре не проверял, так что мог что-нибудь упустить...
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 11, 2017, 11:06:40 pm
Уважаемый  Shagg_E спасибо Вам огромное за Ваш ответ, Ваши скрипты работают идеально, так многому научился общаясь с умным человеком.
Сначала пишу низкоуровневый код, потом Gosub делают не таким громоздким.
Опкод 01C3 нужен при создании актеров, чтобы не засорят память.
Опкод 0ADC очень полезно использовать во высокоуровневым коде, он там удобнее
8039: not 0 @ == -1 опять моя ошибка- лишняя проверка.
Теперь можно вместо wait использовать таймеры.
Думал, в бесконечных циклах нежелательно использовать wait.
Вы очень гениально использует оператор break, он в моих скриптах приводит к вылетам.
Все работает как часы.
В vc выбор оружия неудобный, нельзя нажать 6 и взять снайперку, как в других играх.
Решил исправить,  для удобства использую SCM функцию, но она не работает.
Не пойму в чем причина? Подскажите, пожалуйста.
Вот сделать часть для холодного оружия.
{$CLEO .cs}
0000:
:1
 wait 0
 if   
05EE:   key_pressed 49  // VK_...
jf @1
0006: 0@ = #cleaver // integer values
0006: 1@ = 8 // integer values
0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
wait 900                       
:2
if and
05EE:   key_pressed 49  // VK_...           
02D8: actor $PLAYER_ACTOR current_weapon == 8     
jf @2
0006: 0@ = #machete // integer values
0006: 1@ = 9 // integer values
0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
wait 900                       
:3
if and
05EE:   key_pressed 49  // VK_...           
02D8: actor $PLAYER_ACTOR current_weapon == 9   
jf @3
0006: 0@ = #katana // integer values
0006: 1@ = 10 // integer values
0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
wait 900                         
:4
if and
05EE:   key_pressed 49  // VK_...           
02D8: actor $PLAYER_ACTOR current_weapon == 10   
jf @4
0006: 0@ = #bat // integer values
0006: 1@ = 6 // integer values
0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
jump @1 
:5
 repeat
 wait 0
 Model.Load(0@)
 until Model.Available(0@)
 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 0
 Model.Destroy(0@)
0AB2: ret 0   
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 11, 2017, 11:43:46 pm
Я не понял - тебе нужно выдавать новое оружие или выбирать то, что находится в слоте холодного оружия?
Если второе - то вот код:
Код: Text
  1. {$CLEO .cs}
  2. 0000:
  3.  
  4. :1
  5. wait 0
  6. if and
  7.    Player.Defined($PLAYER_CHAR)  
  8. 05EE:   key_pressed 49  // 1
  9. jf @1
  10. 04B8: get_weapon_data_from_player $player_actor slot 2 weapon 0@ ammo 1@ model 2@ // записываем оружие игрока в слоте 2(ручное оружие): номер оружия - в 0@, патроны - в 1@, модель - в 2@
  11. 01B8: set_player $player_char armed_weapon_to 0@ // задаем игроку текущее оружие, которое у него есть в слоте 2
  12. jump @1
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 11, 2017, 11:55:51 pm
Shagg_E, спасибо большое за столь быстрый ответ. оружие выдается новое scm функция передает через переменные номер оружия, которое выдается игроку, нажал 1 получил топор, нажал 1 - мечете.
Конечно, можно и так.
wait 0
if   
05EE:   key_pressed 49  // VK_...
jf @1
 repeat
 wait 0
 Model.Load(#cleaver)
 until Model.Available(#cleaver)
 01B2: give_actor $PLAYER_ACTOR weapon 8 ammo 0
 Model.Destroy(#cleaver)
тогда слишком громоздкий код получится
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 12, 2017, 02:10:49 am
Тогда нужно так:
Код: Text
  1. {$CLEO .cs}
  2. 0006: 1@ = 6
  3.  
  4. :1
  5. wait 0
  6. if and
  7.    Player.Defined($PLAYER_CHAR)  
  8. 05EE:   key_pressed 49  // проверка, что нажата клавиша 1
  9. jf @1
  10.  
  11. :1a
  12. wait 0
  13. if
  14.    Player.Defined($PLAYER_CHAR)
  15. jf @1
  16. if      
  17. 85EE:   NOT key_pressed 49  // проверка, что отпущена клавиша 1
  18. jf @1a
  19. if
  20. 0039:   1@ == 6
  21. jf @2
  22. 0006: 0@ = #cleaver // integer values
  23. 0006: 1@ = 8 // integer values
  24. 0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
  25. jump @1                      
  26.  
  27. :2
  28. if
  29. 0039:   1@ == 8
  30. jf @3
  31. 0006: 0@ = #machete // integer values
  32. 0006: 1@ = 9 // integer values
  33. 0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
  34. jump @1                      
  35.  
  36. :3
  37. if
  38. 0039:   1@ == 9
  39. jf @4
  40. 0006: 0@ = #katana // integer values
  41. 0006: 1@ = 10 // integer values
  42. 0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
  43. jump @1                        
  44.  
  45. :4
  46. if
  47. 0039:   1@ == 10
  48. jf @1
  49. 0006: 0@ = #bat // integer values
  50. 0006: 1@ = 6 // integer values
  51. 0AB1: call_scm_func @5 2 0@ 1@ var_ret 0
  52. jump @1
  53.  
  54. :5
  55. repeat
  56. wait 0
  57. Model.Load(0@)
  58. until Model.Available(0@)
  59. 01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 0
  60. Model.Destroy(0@)
  61. 0AB2: ret 0

P.S. Кстати.
Если при копировании моего кода в SB весь код сдвигается вправо(предполагаю, что это неудобно) - выдели его(ctrl+a например) и нажми Shift+Tab.
Этим действием ты сдвинешь все выделенные строки на 1 табуляцию влево.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 12, 2017, 07:30:53 am
Спасибо огромное уважаемый Shagg_E
Все работает идеальное!
Я в неописуемым восторге от Вашего мастерства! Как здорово, что Вы мне нашли время ответить. Полдня ломал голову почему SCM функция не работает. Вы в 2 счета сумею заставить ее работать!!!! Восхищаюсь Вами.   
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 12, 2017, 09:55:07 am
Подскажите, пожалуйста, уважаемый Shagg_E
Как правильно пользоваться scm функции с возвратом параметров? Ее использую, что сделать более компактным.
{$CLEO .cs}
0006: 1@ = 7
:1
wait 0
if     
0AB0: key_pressed 0x31
jf @1
if
0039:   1@ == 7
jf @2
0AB1: call_scm_func @fun1 3 #cleaver 8 0 var_ret 3 0@ 1@ 2@ 
gosub @sab
jump @1

:fun1
0006: 0@ = 0@ // integer values
0006: 1@ = 1@ // integer values
0006: 2@ = 2@ // integer values
0AB2: ret 3 0@ 1@ 2@       

весь скрипт
{$CLEO .cs}
0006: 1@ = 7
:1
wait 0
if     
0AB0: key_pressed 0x31
jf @1
if
0039:   1@ == 7
jf @2
0AB1: call_scm_func @fun1 3 #cleaver 8 0 var_ret 3 0@ 1@ 2@ 
gosub @sab
jump @1
                 
:2
if
0039:   1@ == 8
jf @3
0006: 0@ = #machete // integer values
0006: 1@ = 9 // integer values 
0006: 2@ = 0 // integer values
gosub @sab
jump @1                       
:3
if
0039:   1@ == 9
jf @4
0006: 0@ = #katana // integer values
0006: 1@ = 10 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                         
:4
if
0039:   1@ == 10
jf @5
0006: 0@ = #bat // integer values
0006: 1@ = 6 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                 
:5
if
0039:   1@ == 6
jf @6
0006: 0@ = #chnsaw // integer values
0006: 1@ = 11 // integer values
0006: 2@ = 0 // integer values
gosub @sab       
jump @1                 
:6
if
0039:   1@ == 11
jf @7
0006: 0@ = #brassknuckle // integer values
0006: 1@ = 1 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                 
:7
if
0039:   1@ == 1
jf @8
0006: 0@ = #screwdriver // integer values
0006: 1@ = 2 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                 
:8
if
0039:   1@ == 2
jf @9
0006: 0@ = #golfclub // integer values
0006: 1@ = 3 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                     
:9
if
0039:   1@ == 3
jf @10
0006: 0@ = #nitestick // integer values
0006: 1@ = 4 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                 
:10
if
0039:   1@ == 4
jf @11
0006: 0@ = #knifecur// integer values
0006: 1@ = 5 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1                 
:11
if
0039:   1@ == 5
jf @1
0006: 0@ = #hammer// integer values
0006: 1@ = 7 // integer values
0006: 2@ = 0 // integer values
gosub @sab
jump @1
:sab
0AB1: call_scm_func @fun 3 0@ 1@ 2@ var_ret 0   
wait 900
return
:fun
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 0

:fun1
0006: 0@ = 0@ // integer values
0006: 1@ = 1@ // integer values
0006: 2@ = 2@ // integer values
0AB2: ret 3 0@ 1@ 2@       



попробовал так вылет

{$CLEO .cs}
0006: 1@ = 7
:1
wait 0
if     
0AB0: key_pressed 0x31
jf @1
if
0039:   1@ == 7
jf @2
0AB1: call_scm_func @fun 3 #cleaver 8 0 var_ret 1 1@ 
wait 900
jump @1
:2
if
0039:   1@ == 8
jf @3
0AB1: call_scm_func @fun 3 #machete 9 0 var_ret 1 1@ 
wait 900
jump @1                   
:fun
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 1 1@             


так тоже вылет голову уже сломал
{$CLEO .cs}
0006: 1@ = 7
:1
wait 0
if     
0AB0: key_pressed 0x31
jf @1
if
0039:   1@ == 7
jf @2
0AB1: call_scm_func @fun 3 #cleaver 8 0 var_ret 3 0@ 1@ 3@
wait 900
jump @1
:2
if
0039:   1@ == 8
jf @3
0AB1: call_scm_func @fun 3 #machete 9 0 var_ret 3 0@ 1@ 3@
wait 900
jump @1                   
:fun
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 3 0@ 1@ 3@                   
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 12, 2017, 04:51:22 pm
Про scm-функции я подробно писал тут (http://forum.gtabuilder.ru/index.php?topic=271.msg1689#msg1689).

К сожалению, времени на примеры у меня больше не осталось, так что я надеюсь, что ты разберешься с написанным в том посте.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 12, 2017, 09:49:38 pm
Спасибо уважаемый Shagg_E больше!
Очень полезная информация, немного не понял вот, что.
Мы передаем в call_scm_func @fun params_count 3 параметра модель оружия, тип, кол-во патронов,
Чтобы они записались в переменные 0@ 1@ 2@ и в дальнейшим их использовать в другой функции, где создается и выдается оружия игроку. Но я получаю вылет.
Помогите мне, пожалуйста. 
{$CLEO .cs}
0006: 1@ = 7
:1
wait 0
if     
0AB0: key_pressed 0x31
jf @1
if
0039:   1@ == 7
jf @2
05F6: call_scm_func @fun params_count 3 #cleaver 8 0 0@ 1@ 2@
gosub @sab
jump @1
:fun
0006: 0@ = 0@ // integer values
0006: 1@ = 1@ // integer values
0006: 2@ = 2@ // integer values
0AB2: ret 3 0@ 1@ 2@       
:sab
0AB1: call_scm_func @fun1 3 0@ 1@ 2@ var_ret 0 
wait 900
return
:fun1
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 0             
:2
if
0039:   1@ == 8
jf @1
05F6: call_scm_func @fun params_count 3 #machete 9 0 0@ 1@ 2@
gosub @sab
jump @1 
                     
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 12, 2017, 10:21:35 pm
0AB1: call_scm_func @fun1 3 0@ 1@ 2@ var_ret 0не нужно писать "var_ret 0". Просто сразу пишешь получаемые параметры. А поскольку тут их нет - ничего вообще писать не нужно:
0AB1: call_scm_func @fun1 3 0@ 1@ 2@и всё.
Посмотри внимательно в том посте, ссылку на который я скинул. Там про всё это написано
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 15, 2017, 07:37:41 am
Спасибо за Ваш ответ уважаемый  Shagg_E
Вы мне очень помогли Вашим советом.
Решил проблему, сделав скрипт путем увеличения порядкового номера модели ход. оружия (они расположены последовательно начиная 258 и закачивая 269). Старался сделать скрипт компактным высокоуровневым кодом. Все работает! По нажатию клавиши 1 идет переключения оружия ближнего боя. Хотел, чтобы по нажатию клавиши 2 переключались пистолеты (colt45 и python), но почему-то не работает. Никак не могу понять причину! Если у Вас будет свободное время, подскажите, пожалуйста, очень Вашего ответа.
{$CLEO .cs}
0000:           
0006: 0@ = 258 // начало диапазона ход. оружия
0006: 1@ = 0 //  начало диапазона типа ход. оружия
0006: 3@ = 273 // начало диапазона пистолета
0006: 4@ = 16 //  начало диапазона типа пистолета
:1
while true
wait 0
if // (1 ветка)
0256:   player $PLAYER_CHAR defined // игрок жив
then
if // (2 ветка)     
0AB0: key_pressed 0x31 // клавиши 1 нажата
then
gosub @sab // сдвиг модели ход. оружия на 1 перед
if // (3 ветка) 
8039: not 0@ == 270 //проверка это конец диапазона ход. оружия
then
gosub @sab1 // функция загр. модели ход. оружия
else
gosub @sab2 // возврат начала диапазона ход. оружия 
if // (4 ветка)     
0AB0: key_pressed 0x32 // клавиши 1 нажата
then
gosub @sab11 // сдвиг модели пистолетов на 1 перед
if // (4 ветка) 
8039: not 3@ == 276  // проверка это конец диапазона ход. оружия
then                                                                           
gosub @sab22 // функция загр. пистолетов
else
gosub @sab33 // возврат начала диапазона пистолетов
end
end
end
end
end
end
jump @1   
:sab11
000A: 3@ += 1 
000A: 4@ += 1 
0006: 5@ = 200
return   
:sab22 // функция загр. пистолетов
0AB1: call_scm_func @fun 3 3@ 4@ 5@ var_ret 0 
wait 900 // задержка между переключениями оружия 
return
:sab33
0006: 3@ = 273
0006: 4@ = 16       
return               
:sab                                   
000A: 0@ += 1 
000A: 1@ += 1 
0006: 2@ = 0
return
:sab1 // функция загр. модели ход. оружия
0AB1: call_scm_func @fun 3 0@ 1@ 2@ var_ret 0 
wait 900 // задержка между переключениями оружия 
return
:fun
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 0
:sab2
0006: 0@ = 258
0006: 1@ = 0
return       
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 16, 2017, 12:43:06 pm
Здравствуйте все. Нашёл очень интересный скрипт на просторах интернета, который позволяет перезагружать другие скрипты не выходя из игры для нее перезапуска. Это позволяет редактировать скрипт что называется на "ходу". Очень экономя своё время. Конечно, этот скрипт можно улучшать, но он имеет один недостаток. Нужно написать имя каждого потока и скрипта который мы хотим перезапустить. Что не очень удобно. Можно сделать так, чтобы он автоматически находил их сам? Например, из файла cleo. Может asi плагин? Прикрепляю исходник.

{$CLEO}
0000: NOP     
thread "REBOOT"     
 
:REBOOTC     
wait 0
if and     
0ab0: key_pressed 15 //заменяем на свою
0ab0: key_pressed 16 //заменяем на свою
Player.Defined(0)     
jf @REBOOTC     
0ABA: end_custom_thread_named 'rbt'
while true
wait 50
if and
0ab0: key_pressed 15 //заменяем на свою
0ab0: key_pressed 16 //заменяем на свою
then break
end
end     
0A92: create_custom_thread "rebootc.cs"  //тут указываем название скрипта перезагрузки .” у меня это rebootc
wait 1000
thread 'rbt'     
0ABA: end_custom_thread_named 'ffaa' //название перезагружаемого потока
wait 50     
0A92: create_custom_thread "asdf.cs" //название перезагружаемого скрипта, с вышеуказанным потоком
0acd: show_text_high_priority "Script was reloaded" time 1000     
wait 1000     
jump @REBOOTC
[code=php]
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 17, 2017, 01:46:30 am
Цитировать
Хотел, чтобы по нажатию клавиши 2 переключались пистолеты (colt45 и python), но почему-то не работает.
Достаточно использовать табуляцию(сдвиг строк на 4 пробела при нажатии клавижи TAB), чтобы увидеть, что проверка второй клавиши находится где-то не там:
:1
while true
    wait 0
    if // (1 ветка)
        0256:   player $PLAYER_CHAR defined // игрок жив
    then
        if // (2 ветка)     
            0AB0: key_pressed 0x31 // клавиши 1 нажата
        then
            gosub @sab // сдвиг модели ход. оружия на 1 перед
            if // (3 ветка)
                8039: not 0@ == 270 //проверка это конец диапазона ход. оружия
            then
                gosub @sab1 // функция загр. модели ход. оружия
            else
                gosub @sab2 // возврат начала диапазона ход. оружия
                if // (4 ветка)     
                    0AB0: key_pressed 0x32 // клавиши 1 нажата
                then
                    gosub @sab11 // сдвиг модели пистолетов на 1 перед
                    if // (4 ветка)
                        8039: not 3@ == 276  // проверка это конец диапазона ход. оружия
                    then                                                                           
                        gosub @sab22 // функция загр. пистолетов
                    else
                        gosub @sab33 // возврат начала диапазона пистолетов
                    end
                end
            end
        end
    end
end
jump @1


Цитировать
Нужно написать имя каждого потока и скрипта который мы хотим перезапустить. Что не очень удобно. Можно сделать так, чтобы он автоматически находил их сам? Например, из файла cleo.
А как игра узнает, какой именно скрипт нужно перезагрузить? Тогда уж перезагружать сразу все. Но ведь многие скрипты по-просто не расчитаны на перезагрузку. Да и к тому же: представленный код перезагрузки вполне удобно юзать, когда работаешь над каким-нибудь одним скриптом. Ты же не работаешь над несколькими одновременно, поэтому не вижу проблемы 1 раз изменить код перезагрузки, заменив название перезагружаемого скрипта, чтобы потом спокойно тестировать и работать над своим скриптом...
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 17, 2017, 05:50:53 pm
Спасибо большое ответ, уважаемый Shagg_E. Вы очень мудрый человек, учусь от Вас))))))))
Благодарю Вас за совет по табуляции, люблю когда код скрипта идет ровно.
Исправил, переключается все оружия, 1 ход оружия 2 пистолеты 3 дробовики.
Вместо wait использовать таймер, иначе оружия не загружалось, Томми стрелять пустыми руками)))
Нагрузка большая для движка 2002 года.
Скрипт перезагрузки скрипта можно улучшить, создав ini файл.
Cleo имеет сильные ограничения, писать на нем мисси ад!
Можно ли как- улучшить Sanny Builder 3? Например, сразу выдался определенный шаблон, как {$CLEO .cs}, 0000, 1:, jump @.
Там есть интересный пункт добавить. Только сменил тему, сделав похожим на редактор atom.
Очень хочу освоить lua vice, жаль нету уроков, хотя бы один скрипт написать.
Этот скрипт, только гранаты не меняет, буду проверять на отдельном скрипте.

{$CLEO .cs}
0000:           
0006: 0@ = 258 // начало диапазона ход. оружия
0006: 1@ = 0 //  начало диапазона типа ход. оружия
0006: 3@ = 273 // начало диапазона пистолета
0006: 4@ = 16 //  начало диапазона типа пистолетов
0006: 5@ = 275 // начало диапазона дробовиков
0006: 6@ = 18 //  начало диапазона типа дробовика
0006: 7@ = 280 // начало диапазона автоматов
0006: 8@ = 21 //  начало диапазона типа автоматов
0006: 9@ = 286 // начало диапазона тяжелого оружия
0006: 10@ = 29 //  начало диапазона типа тяжелого оружия 
0006: 11@ = 269 // начало диапазона гранат
0006: 12@ = 11 //  начало диапазона типа гранат
:1                                   
while true
wait 0
if // (1 ветка)
0256:   player $PLAYER_CHAR defined // игрок жив             
then     
if // (2 ветка)     
0AB0: key_pressed 0x31 // клавиши 1 нажата
jf @2
gosub @sab // сдвиг модели ход. оружия на 1 перед
if // (3 ветка) 
0039:  0@ == 270 //проверка это конец диапазона ход. оружия
then
gosub @sab1 // возврат начала диапазона ход. оружия   
else
gosub @sab2 // функция загр. модели ход. оружия
jump @1     
:2
if // (5 ветка)     
0AB0: key_pressed 0x32 // клавиши 2 нажата
jf @3                                           
gosub @sab11 // сдвиг модели пистолетов на 1 перед
if // (6 ветка) 
0039:  3@ == 276  // проверка это конец диапазона пистолетов
then                                                                           
gosub @sab22 // возврат начала диапазона пистолетов
else
gosub @sab33 // функция загр. пистолетов
jump @1     
:3
if // (7 ветка)     
0AB0: key_pressed 0x33 // клавиши 3 нажата
jf @4                                           
gosub @sab1d // сдвиг модели дробовиков на 1 перед
if // (8 ветка) 
0039: 5@ == 279  // проверка это конец диапазона дробовиков
then                                                                           
gosub @sab2d // возврат начала диапазона дробовиков
else
gosub @sab3d // функция загр. дробовиков
jump @1 
:4
if // (9 ветка)     
0AB0: key_pressed 0x34 // клавиши 4 нажата
jf @5                                           
gosub @sab1a // сдвиг модели автоматов на 1 перед
if // (10 ветка) 
0039: 7@ == 285  // проверка это конец диапазона автоматов
then                                                                           
gosub @sab2a // возврат начала диапазона автоматов
else
gosub @sab3a // функция загр. автоматов
jump @1
:5
if // (11 ветка)     
0AB0: key_pressed 0x35 // клавиши 5 нажата
jf @6       
if
0039: 1@ == 27
then                                                         
gosub @sabm4 // функция загр. m4   
else
gosub @sabkr  // функция загр. крюгер m4
jump @1   
:6
if // (12 ветка)     
0AB0: key_pressed 0x36 // клавиши 6 нажата
jf @7
if
0039: 1@ == 29
then                                                         
gosub @sabls // лазерная загр. винтовки 
else
gosub @sabsp // обычной загр. винтовки
jump @1
:7
if // (13 ветка)     
0AB0: key_pressed 0x37 // клавиши 7 нажата
jf @8                                               
gosub @sabhard // сдвиг модели тяжелого оружия на 1 вперед
if // (4 ветка) 
0039: 9@ == 291  // проверка это конец диапазона тяжелого оружия
then                                                                           
gosub @sabhard1 // возврат начала диапазона тяжелого оружия 
else
gosub @sabhard2 // функция загр. тяжелого оружия
jump @1
:8
if // (4 ветка)     
0AB0: key_pressed 0x38 // клавиши 8 нажата
jf @1                                     
gosub @grena // сдвиг модели гранат на 1 вперед
if // (4 ветка) 
0039: 11@ == 273  // проверка это конец диапазона гранат
then                                                                           
gosub @grena1 // возврат начала диапазона гранат 
else
gosub @grena2 // функция загр. гранат
end
end
end
end
end
end
end
end
end
end
jump @1
:sabsp // функция загр. пистолетов
0006: 0@ = 285
0006: 1@ = 28 
0006: 2@ = 200
0AB1: call_scm_func @fun 3 0@ 1@ 2@
gosub @delay // задержка между переключениями оружия 
return
:sabls // функция загр. пистолетов
0006: 0@ = 286
0006: 1@ = 29 
0006: 2@ = 200
0AB1: call_scm_func @fun 3 0@ 1@ 2@
gosub @delay // задержка между переключениями оружия
return
:sabm4 // функция загр. mp4
0006: 0@ = 280
0006: 1@ = 26 
0006: 2@ = 200
0AB1: call_scm_func @fun 3 0@ 1@ 2@
gosub @delay // задержка между переключениями оружия
0006: 1@ = 26
return
:grena
000A: 11@ += 1 
000A: 12@ += 1 
0006: 2@ = 200
return   
:grena1
0006: 11@ = 269
0006: 12@ = 11       
return       
:grena2 // функция загр. пистолетов 
0AB1: call_scm_func @fun 3 11@ 12@ 2@
gosub @delay // задержка между переключениями оружия 
return 
:sab1
0006: 0@ = 258
0006: 1@ = 0
return             
:sab                                   
000A: 0@ += 1 
000A: 1@ += 1 
0006: 2@ = 0
return     
:sab2 // функция загр. модели ход. оружия
0AB1: call_scm_func @fun 3 0@ 1@ 2@
gosub @delay // задержка между переключениями оружия
return
:sab11 // сдвиг модели пистолетов на 1 перед
000A: 3@ += 1 
000A: 4@ += 1 
0006: 2@ = 200
return   
:sab22  // возврат начала диапазона пистолетов
0006: 3@ = 273
0006: 4@ = 16       
return       
:sab33 // функция загр. пистолетов 
0AB1: call_scm_func @fun 3 3@ 4@ 2@
gosub @delay // задержка между переключениями оружия
return   
:sab1d // возврат начала диапазона дробовиков
000A: 5@ += 1 
000A: 6@ += 1 
0006: 2@ = 200
return   
:sab2d // возврат начала диапазона дробовиков
0006: 5@ = 275
0006: 6@ = 18       
return       
:sab3d // функция загр. дробовиков 
0AB1: call_scm_func @fun 3 5@ 6@ 2@
gosub @delay // задержка между переключениями оружия
return   
:sabm // функция загр. пистолетов 
0AB1: call_scm_func @fun 3 7@ 8@ 2@
gosub @delay // задержка между переключениями оружия
return                       
:sab1a
000A: 7@ += 1 
000A: 8@ += 1 
0006: 2@ = 200
return
:sab2a
0006: 7@ = 280
0006: 8@ = 21       
return       
:sab3a // функция загр. автоматов 
0AB1: call_scm_func @fun 3 7@ 8@ 2@
gosub @delay // задержка между переключениями оружия
return       
:sabhard
000A: 9@ += 1 
000A: 10@ += 1 
0006: 2@ = 200
return   
:sabhard1
0006: 9@ = 286
0006: 10@ = 29       
return       
:sabhard2 // функция загр. пистолетов 
0AB1: call_scm_func @fun 3 9@ 10@ 2@
gosub @delay // задержка между переключениями оружия
return   
:sabkr // функция загр. крюгер
0006: 0@ = 276
0006: 1@ = 27 
0006: 2@ = 200
0AB1: call_scm_func @fun 3 0@ 1@ 2@
gosub @delay // задержка между переключениями оружия 
0006: 1@ = 27
return
:fun
repeat
wait 0
Model.Load(0@)
until Model.Available(0@)
038B: load_requested_models
gosub @delay
01B2: give_actor $PLAYER_ACTOR weapon 1@ ammo 2@
Model.Destroy(0@)
0AB2: ret 0
:delay
16@ = 0
repeat
wait 0                 
until 0029: 16@ >= 300 // задержка между переключениями оружия
return
[code=html5]
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 26, 2017, 11:58:58 am
Здравствуйте, всем.
Подскажите, пожалуйста, умные люди. Я написал скрипт, чтобы по нажатию клавиши 1, приезжала полиция. По нажатию клавиши 2 приезжала скорая помощь. Конечно в будущем переделаю на 01,02,03. Но, понимаете полиция приезжает без проблем, а вот при вызове скорой идёт зависание, игра вылетает. Считаю что причина в типе педа. Хотя действовал по справке. Написал код скрипта как можно в более удобном виде для внесения изменений. Подскажите мне пожалуйста где я ошибся?. 
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:
  3. 03A4: name_thread 'U'  
  4. :call
  5. wait 0
  6. if
  7. not Actor.Driving($PLAYER_ACTOR)
  8. jf @call
  9. 0AC8: 14@ = allocate_memory_size 260
  10. if
  11. 0AB0: key_pressed 0x61 // вызов полиции
  12. jf @call_2
  13. gosub @cop1  
  14. jump @call  
  15. :call_2
  16. if
  17. 0AB0: key_pressed 0x62 // вызов скорой помощи
  18. jf @call_3
  19. gosub @med1  
  20. jump @call  
  21. :call_3
  22. if
  23. 0AB0: key_pressed 0x63// вызов пожарных
  24. jf @call  
  25. gosub @fire1
  26. jump @call                    
  27. 0AC9: free_allocated_memory 14@                    
  28. 0ABA: end_custom_thread_named 'U'      
  29. :cop                            
  30. wait 100
  31. 0006: 0@ = #cop // Модель педа
  32. 0006: 1@ = #CELLPHONE
  33. 0006: 2@ = #nitestick
  34. 0006: 3@ = #colt45 // Модель оружие
  35. 0006: 4@ = #POLICE // Модель машины
  36. 0006: 15@ = 6 // Тип модели      
  37. return        
  38. :med
  39. wait 100
  40. 0006: 0@ = #MEDIC // Модель педа
  41. 0006: 1@ = #CELLPHONE
  42. 0006: 2@ = #nitestick
  43. 0006: 3@ = #colt45 // Модель оружие
  44. 0006: 4@ = #AMBULAN // Модель машины
  45. 0006: 15@ = 16 // Тип модели
  46. return            
  47. :fire
  48. wait 100
  49. 0006: 0@ = #FIREMAN // Модель педа
  50. 0006: 1@ = #CELLPHONE
  51. 0006: 2@ = #nitestick
  52. 0006: 3@ = #colt45 // Модель оружие
  53. 0006: 4@ = #FIRETRUK // Модель машины
  54. 0006: 15@ = 17 // Тип модели
  55. return                  
  56.                          
  57. :cop1  
  58. gosub @2 // Очистить переменные
  59. 0AD3: 14@ = format "~r~The police left for you, wait"
  60. gosub @cop
  61. gosub @5
  62. return                                                                                  
  63. :med1  
  64. gosub @2 // Очистить переменные        
  65. 0AD3: 14@ = format "~r~The ambulance goes to you"
  66. gosub @med
  67. gosub @5
  68. return  
  69. :fire1  
  70. gosub @2                                            
  71. 0AD3: 14@ = format "~r~The fire truck went to You"
  72. gosub @fire
  73. gosub @5
  74. return          
  75. :2
  76. wait 50  
  77. Model.Destroy(0@)
  78. Model.Destroy(2@)
  79. Model.Destroy(3@)
  80. Model.Destroy(4@)
  81. Actor.RemoveReferences(13@)
  82. Actor.RemoveReferences(14@)
  83. Car.RemoveReferences(12@)
  84. return
  85. :3
  86. wait 50
  87. Model.Load(0@)
  88. Model.Load(1@)
  89. Model.Load(2@)
  90. Model.Load(3@)
  91. Model.Load(4@)
  92. 038B: load_requested_models
  93. return
  94. :4
  95. wait 10
  96. if and
  97. 0248: model 0@ available
  98. 0248: model 1@ available
  99. 0248: model 2@ available
  100. 0248: model 3@ available
  101. 0248: model 4@ available
  102. jf @4
  103. 0AB2: ret 0
  104. :5
  105. 009A: 13@ = create_actor_pedtype 15@ model 0@ at 0.0 0.0 0.0
  106. gosub @3
  107. 0AB1: call_scm_func @4 4 0@ 1@ 2@ 4@ var_ret 0
  108. wait 10
  109. 052B: actor $PLAYER_ACTOR hold_cellphone 1
  110. wait 3500
  111. 052B: actor $PLAYER_ACTOR hold_cellphone 0
  112. wait 300
  113. Model.Destroy(1@) // выгрузить модель телефона из памяти
  114. wait 100
  115. 0208: 5@ = random_float 70.0 120.0
  116. 0208: 6@ = random_float 70.0 120.0
  117. 04C4: create_coordinate 7@ 8@ 9@ from_actor $PLAYER_ACTOR offset 5@ 6@ 100.0
  118. 02C1: set 9@ 10@ 11@ to_car_path_coords_closest_to 7@ 8@ 9@
  119. 12@ = Car.Create(4@, 9@, 10@, 11@)
  120. 00AE: set_vehicle 12@ traffic_behavior_to 2
  121. 0129: 13@ = create_actor 15@ 0@ in_car 12@ driverseat
  122. 04C4: create_coordinate 6@ 7@ 8@ from_actor $PLAYER_ACTOR offset 5.0 5.0 0.0
  123. 01EC: make_car 12@ very_heavy 1
  124. 03AB: set_car 12@ strong 1
  125. 0423: set_car 12@ improved_handling_to 1.5
  126. 00AE: unknown_set_car 12@ to_ignore_traffic_lights 2
  127. Car.DriveTo(12@, 6@, 7@, 8@)
  128. Car.SetMaxSpeed(12@, 30.0)
  129. 04BA: set_car 12@ speed_instantly 20.0
  130. 01B2: give_actor 13@ weapon 4 ammo 0
  131. 01B2: give_actor 13@ weapon 17 ammo 9999                                          
  132. 0AD1: show_formatted_text_highpriority 14@ time 3000
  133. :6
  134. wait 100              
  135. if
  136. 0202: actor $PLAYER_ACTOR near_car 12@ radius 10.0 10.0 sphere 0
  137. jf @6
  138. 01EC: make_car 12@ very_heavy 0
  139. 03E2: actor 13@ exit_car
  140. wait 3000
  141. gosub @2
  142. wait 600
  143. return      
  144.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Сентябрь 26, 2017, 02:24:41 pm
Глянул мельком... зачем ты создаешь актера 2 раза?
Тут:
Код: Text
  1. 009A: 13@ = create_actor_pedtype 15@ model 0@ at 0.0 0.0 0.0
и тут:
Код: Text
  1. 0129: 13@ = create_actor 15@ 0@ in_car 12@ driverseat
Затем еще удаляешь несуществующего актера:
Код: Text
  1. Actor.RemoveReferences(14@)

Насчет типа педа: попробуй поменять на civmale(номер 4).
Если после всех этих манипуляций вылеты не прекратятся - будем думать дальше...
Название: Re: Помощь с CLEO
Отправлено: mfisto от Сентябрь 26, 2017, 06:34:05 pm
Зачем в цикле использовать постояное выделение памяти?
0AC8: 14@ = allocate_memory_size 260
Название: Re: Помощь с CLEO
Отправлено: egor230 от Сентябрь 27, 2017, 11:56:39 am
Огромное спасибо уважаемый  Shagg_E, что заметили мою грубую ошибку. Благодаря Вашей наблюдательности, скрипт заработать. Да, действительно создал лишних.
Сейчас улучил скрипт, как мог, конечно, мне нереально далеко до Вас. Пытаюсь расти.
Уважаемый  mfisto выделил память для вывода на экран текста, потом освобождаю ее.
 Конечно, у меня не "прямые руки", но учусь. Моя мечта освоить vice lua, чтобы самому писать миссии.
Код: HTML5
  1. {$CLEO .cs}
  2. 0000:
  3. 03A4: name_thread 'service'  
  4. :call                              
  5. while true
  6. wait 0
  7. if // (1 ветка)
  8. 0256:   player $PLAYER_CHAR defined // игрок жив            
  9. then    
  10. if // (2 ветка)    
  11. not Actor.Driving($PLAYER_ACTOR)
  12. jf @call                                        
  13. 0AC8: 14@ = allocate_memory_size 260
  14. if // (3 ветка)  
  15. 0ADC: test_cheat "02" // вызов полиции        
  16. jf @call_2
  17. gosub @cop1          
  18. jump @call  
  19. :call_2
  20. if // (4 ветка)
  21. 0ADC: test_cheat "03" // вызов скорой помощи
  22. jf @call_3
  23. gosub @med1        
  24. jump @call  
  25. :call_3
  26. if // (5 ветка)  
  27. 0ADC: test_cheat "01" // вызов пожарных
  28. jf @call  
  29. gosub @fire1          
  30. 0AC9: free_allocated_memory 14@    
  31. jump @call            
  32. end
  33. end                                
  34. :cop                            
  35. wait 100
  36. 0006: 0@ = #cop // Модель педа
  37. 0006: 1@ = #CELLPHONE
  38. 0006: 2@ = #nitestick
  39. 0006: 3@ = #colt45 // Модель оружие
  40. 0006: 4@ = #POLICE // Модель машины
  41. 0006: 13@ = 6 // Тип модели      
  42. return        
  43. :med
  44. wait 100
  45. 0006: 0@ = #MEDIC // Модель педа
  46. 0006: 1@ = #CELLPHONE
  47. 0006: 2@ = #nitestick
  48. 0006: 3@ = #colt45 // Модель оружие
  49. 0006: 4@ = #AMBULAN // Модель машины
  50. 0006: 13@ = 16 // Тип модели
  51. return            
  52. :fire
  53. wait 100
  54. 0006: 0@ = #FIREMAN // Модель педа
  55. 0006: 1@ = #CELLPHONE
  56. 0006: 2@ = #nitestick
  57. 0006: 3@ = #colt45 // Модель оружие
  58. 0006: 4@ = #FIRETRUK // Модель машины
  59. 0006: 13@ = 17 // Тип модели
  60. return                                                      
  61. :cop1  
  62. gosub @2 // Очистить переменные
  63. 0AD3: 14@ = format "~r~The police left for you, wait"
  64. gosub @cop
  65. gosub @5
  66. return                                                                                  
  67. :med1  
  68. gosub @2 // Очистить переменные        
  69. 0AD3: 14@ = format "~r~The ambulance goes to you"
  70. gosub @med
  71. gosub @5
  72. return  
  73. :fire1  
  74. gosub @2                                            
  75. 0AD3: 14@ = format "~r~The fire truck went to You"
  76. gosub @fire
  77. gosub @5
  78. return          
  79. :2
  80. wait 50  
  81. Model.Destroy(0@) // удалить модель педа
  82. Model.Destroy(2@) // удалить модель первого оружие
  83. Model.Destroy(3@)  // удалить модель второго оружие
  84. Model.Destroy(4@)  // удалить модель машины            
  85. Actor.RemoveReferences(11@)        
  86. Actor.RemoveReferences(12@)
  87. Car.RemoveReferences(10@)
  88. return
  89. :3
  90. wait 50
  91. Model.Load(0@)
  92. Model.Load(1@)
  93. Model.Load(2@)
  94. Model.Load(3@)
  95. Model.Load(4@)
  96. 038B: load_requested_models
  97. return
  98. :4
  99. wait 10
  100. if and
  101. 0248: model 0@ available
  102. 0248: model 1@ available
  103. 0248: model 2@ available
  104. 0248: model 3@ available
  105. 0248: model 4@ available
  106. jf @4
  107. 0AB2: ret 0
  108. :5
  109. gosub @3
  110. 0AB1: call_scm_func @4 4 0@ 1@ 2@ 4@ var_ret 0
  111. wait 10
  112. 052B: actor $PLAYER_ACTOR hold_cellphone 1
  113. wait 3500
  114. 052B: actor $PLAYER_ACTOR hold_cellphone 0
  115. wait 300
  116. Model.Destroy(1@) // выгрузить модель телефона из памяти
  117. wait 100
  118. 0208: 5@ = random_float 70.0 120.0
  119. 0208: 6@ = random_float 70.0 120.0
  120. 04C4: create_coordinate 7@ 8@ 9@ from_actor $PLAYER_ACTOR offset 5@ 6@ 100.0
  121. 02C1: set 7@ 8@ 9@ to_car_path_coords_closest_to 7@ 8@ 9@
  122. 10@ = Car.Create(4@, 7@, 8@, 9@)
  123. 00AE: set_vehicle 10@ traffic_behavior_to 2
  124. 0129: 11@ = create_actor 13@ 0@ in_car 10@ driverseat
  125. 01C8: 12@ = create_actor_pedtype 13@ model 0@ in_car 10@ passenger_seat 0
  126. 04C4: create_coordinate 6@ 7@ 8@ from_actor $PLAYER_ACTOR offset 5.0 5.0 0.0
  127. 0397: enable_car 10@ siren 1
  128. 01EC: make_car 10@ very_heavy 1
  129. 03AB: set_car 10@ strong 1
  130. 0423: set_car 10@ improved_handling_to 1.5
  131. 00AE: unknown_set_car 10@ to_ignore_traffic_lights 2
  132. Car.DriveTo(10@, 6@, 7@, 8@)
  133. Car.SetMaxSpeed(10@, 30.0)
  134. 04BA: set_car 10@ speed_instantly 20.0
  135. 01B2: give_actor 11@ weapon 4 ammo 0
  136. 01B2: give_actor 11@ weapon 17 ammo 9999      
  137. 01B2: give_actor 12@ weapon 4 ammo 0
  138. 01B2: give_actor 12@ weapon 17 ammo 9999                                            
  139. 0AD1: show_formatted_text_highpriority 14@ time 3000
  140. :6
  141. wait 100              
  142. if
  143. 0202: actor $PLAYER_ACTOR near_car 10@ radius 10.0 10.0 sphere 0
  144. jf @6
  145. 0397: enable_car 1@ siren 0
  146. 01EC: make_car 10@ very_heavy 0            
  147. 03E2: actor 11@ exit_car
  148. 03E2: actor 12@ exit_car
  149. wait 3000
  150. gosub @2
  151. wait 600
  152. return      
  153.  
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 02, 2017, 02:10:35 pm
Здравствуйте, всем.
Уважаемые очень умные люди, ценители классики.
Подскажите мне, пожалуйста.
Пытаюсь написать cleo миссии  для vc, она никак не запускается.
Голову можно сломать.
Помогите, пожалуйста. Буду очень Вам признателен.
Код: HTML5
  1. {$CLEO}
  2. 0000:  
  3. :STARTER
  4. thread 'STARTER'
  5. wait 0      
  6. if
  7. 0256: player $PLAYER_CHAR defined
  8. jf @STARTER
  9. if
  10. $ONMISSION == 0
  11. jf @STARTER
  12. 02A7: 0@ = create_icon_marker_and_sphere 34 at  77.3075 -879.1083 10.4481
  13. :STARTER_1
  14. wait 0
  15. if
  16. $ONMISSION == 1
  17. then
  18. marker.Disable(0@)
  19. jump @STARTER
  20. end
  21. if
  22. not actor.Driving($PLAYER_ACTOR)
  23. then
  24.  if
  25.  0102: actor $PLAYER_ACTOR in_sphere  77.3075 -879.1083 10.4481 radius 2.0 2.0 2.0 sphere 0 stopped_on_foot
  26.  then
  27.  jump @STARTER_2
  28.  end
  29. end
  30. jump @STARTER_1  
  31. :STARTER_2
  32. Marker.Disable(0@)  
  33. 00BE: text_clear_all
  34. 03E6: remove_text_box
  35. 00BA: show_text_styled GXT 'MISS_01' time 1000 style 2
  36. 0A94: start_custom_mission "MISSION"
  37. jump @STARTER

Код: Javascript
  1. {$CLEO .cm}
  2. :MISSION
  3. thread 'MISSION'
  4. gosub @MISSION_START // Старт миссии
  5. if
  6. wasted_or_busted // Игрок арестован или мертв
  7. jf @MISSION_COMPLETED // Миссия выполнена
  8. gosub @MISSION_FAILED // Провал миссии
  9. :MISSION_COMPLETED // Миссия выполнена
  10. $ONMISSION = 0 // Чтобы работали другие миссии
  11. mission_cleanup // Очистка после миссии
  12. end_thread
  13. :MISSION_START // Старт миссии
  14. increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  15. $ONMISSION = 1
  16. gosub @load // Загрузить актера
  17. 0@ = actor.Create(16, #MEDIC, 77.3075, -879.1083, 10.4481)
  18. actor.Angle(0@) = 199.2093 // Задать угол актеру
  19. fade 0 600 // Затемение экрана
  20. wait 600 // Задержка  
  21. fade 1 600 // Убрать затемение экрана
  22. 01CA: actor 0@ kill_player $player_char // Актер хочет убить игрока
  23. 1@ = marker.CreateAboveActor(0@) // Создать маркер над актером
  24. :MISSION_1      
  25. wait 0
  26. if actor.Dead(0@)
  27. then
  28. marker.Disable(1@)
  29. jump gosub @MISSION_2
  30. end
  31. jump @MISSION_1
  32. :load
  33. repeat
  34. wait 0
  35. model.Load(#MEDIC)
  36. 038B: load_requested_models
  37. until model.Available(#MEDIC)
  38. return
  39. :MISSION_2
  40. gosub @MISSION_END
  41. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1    
  42. 0394: play_music 1 // мелодия выполнение миссии
  43. Player.Money($PLAYER_CHAR) += 1000
  44. return
  45. :MISSION_FAILED // Провал миссии
  46. gosub @MISSION_END // Завершение миссии
  47. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  48. 0394: play_music 2 // мелодия провала миссии
  49. return
  50. :MISSION_END // Завершение миссии
  51. actor.RemoveReferences(0@)
  52. marker.Disable(1@)
  53.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 02, 2017, 03:34:14 pm
Так нельзя делать. Поскольку CLEO для Вайса не поддерживает CLEO-миссии - нужно писать миссию и её стартер в виде одного скрипта.
Также повторю то, что писал когда-то в начале темы: нельзя создавать маркеры в cleo-скриптах таким путем, поскольку это портит сохранения.

Добавил в аттаче пример миссии(SimpleMission.txt), которая запускается с помощью чит-кода "SMISSION".
Код миссии прокомментирован практически построчно.
Помимо самой миссии, в скрипте продемонстрировано выделение памяти под новые переменные(поскольку для большой миссии в дальнейшем могут понадобиться больше переменных, чем 16 стандартных локальных).
К сожалению, у меня нет времени на более подробные объяснения, так что надеюсь, что принцип будет понятен.

Также добавил еще один пример миссии(Mission.txt), который активируется с чит-кода "MISSIONSTART". Этот пример уже не мой, но написан по тому же принципу.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 03, 2017, 11:20:57 am
Спасибо огромное уважаемый Shagg_E.
Вы очень много сделал для доброго и хорошего.
Благодаря Вам, научился основам скриптинга!!!!!!!!
Очень жаль, что CLEO для vice city не поддерживает CLEO-миссии, может это можно исправить, путем изменение самой библиотеки.
Прекрасно понимаю, что создать маркеры в потоках. Они портят сохранения.
Вы прислали великолепный аттач, с очень подробными, пояснительными комментариями, к сожалению, он не компилируется.
Конечно, буду изучать, вникать, позволю выразить свое мнение- писать миссии на Cleo для vice сложно, поэтому их очень мало
На vice lua писать миссии легко, жаль недоработан.
Вот пример миссии, убить солдата.
Код: Javascript
  1. local pickup = -1;
  2. local actor_handle = -1;
  3. local handle_blip   = -1;
  4. local function mission_end()
  5.  ON_MISSION = 0
  6.  ClearBlip(handle_blip)
  7.  DestroyPickup(pickup)
  8.  CleanUpThisPed(actor_handle)
  9.  ReleaseModel(4) -- RELEASE ARMY
  10. end
  11. local function mission_failed()
  12.  GXT_AddBigMessageWithNumber("M_FAIL", 5000, 0)  
  13.  ICON_MISSION_1 = CreateBlip(4, 77.3075, -879.1083, 10.4481, 2, 3)
  14.  SetBlipSprite(ICON_MISSION_1, 5)
  15.  mission_end()
  16. end
  17. local function mission_complete()
  18.  GXT_AddBigMessageWithNumber("M_PASS", 5000, 0, 100)  
  19.  PlayMusic(1)
  20.  SetPlayerMoney(PLAYER_CHAR, GetPlayerMoney(PLAYER_CHAR) + 100)
  21.  MISSION_COMPLETE = 1
  22.  ICON_MISSION_1 = nil
  23.  ICON_MISSION_2 = CreateBlip(4, 77.3075, -879.1083, 10.4481, 2, 3)
  24.  SetBlipSprite(ICON_MISSION_2, 6)
  25.  mission_end()
  26. end
  27. function MISSION_1()
  28.   ON_MISSION = 1
  29.   MakePlayerSafe(PLAYER_CHAR, true)
  30.   CameraFade(3000, true)
  31.   Wait(3000)
  32.   CameraFade(3000, false)
  33.   CameraSetPositionAndRotation(61.6968, -853.02, 14.4633, 0, 0, 0)
  34.   CameraSetTargetPoint(77.3075, -879.1083, 10.4481, 2)           
  35.   Wait(3000)             
  36.   CameraRestore()      
  37.   MakePlayerSafe(PLAYER_CHAR, false)  
  38.   pickup = CreatePickup(5, 3, 25.3015, -873.775, 10.4633)
  39.   handle_blip = SetBlipTieToPickup(pickup, 6, 3);
  40.   ChangeBlipScale(handle_blip, 3)
  41.   ChangeBlipColour(handle_blip, 0xFFFFFF55)
  42.  while true do
  43.  if IsPickupPickedUp(pickup) then
  44.       ClearBlip(handle_blip)
  45.        break;
  46.      end
  47.           -- Если плеер был убит, то миссия провалена!  
  48.   if IsDeadActor(PLAYER_ACTOR) then
  49.        mission_failed()
  50.           return
  51.     end
  52.    Wait(0)
  53.  end
  54.  RequestModel(4); -- Army
  55.  LoadRequestedModels();
  56. -- Создание актера
  57.   actor_handle = CreateActor(20, 4, 15.1169, -884.6266, 10.7958);
  58.   SetActorObjectiveTarget(actor_handle, PLAYER_CHAR, 9, 0)
  59. -- Цикл миссии
  60. while true do
  61.   if IsDeadActor(actor_handle) then
  62.       Wait(2000)
  63.       mission_complete()
  64.           return
  65.     end
  66.   if IsDeadActor(PLAYER_ACTOR) then
  67.       mission_failed()
  68.           return
  69.     end
  70.   Wait(0)
  71. end
  72. end
  73.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 03, 2017, 02:21:44 pm
Цитировать
к сожалению, он не компилируется.


Странно: у меня и другого чела(автора второй миссии) всё компилируется отлично.
Поставь последний Sanny Builder v3.2.2 (https://sannybuilder.com/index.html), а затем поставь актуальные VCSCM.INI и opcodes.txt (http://newrockstar.do.am/Other_Files/VCOPCODES2017.rar) для SannyBuilder(кинь эти файлы в Sanny Builder 3\data\vc\)
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 03, 2017, 04:18:51 pm
Уважаемый  Shagg_E, рад Вашему ответ.
Несмотря на Вашу занятность, Вы помогайте, отвечая на банальные вопросы.
Все сделал как Вы сказали, все же выдает ошибку при компиляция
Привожу скрин ошибки, может быть у меня что-то не так.
http://pixs.ru/showimage/netJPG_9279626_27746496.jpg (http://pixs.ru/showimage/netJPG_9279626_27746496.jpg)

Работают над скриптом по изменению цвета авто, думал за 5 мин напишу, а она вылетает.
Не знаю почему
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:  
  3. 03A4: name_thread 'U'      
  4. :1
  5. wait 0
  6. if
  7. actor.Driving($player_char)
  8. jf @1
  9. 00DA: 0@ = player $player_char car // хенлд машины игрока
  10. 03F3: get_car 0@ color 1@ 2@  // записать цвета авто
  11. if  
  12. 0AB0: key_pressed 0x45 // клавиша e  
  13. jf @2
  14. 000A: 1@ += 1  // сдвиг цвета на 1 вперед
  15. if
  16. 0019: 1@ > 9 // integer values    
  17. jf @3
  18. 0006: 1@ = 0 // integer values
  19. jump @3
  20. :2
  21. if  
  22. 0AB0: key_pressed 0x51 // клавиша q  
  23. jf @1
  24. 000A: 2@ += 1  // integer values
  25. if
  26. 0019: 2@ > 9 // integer values    
  27. jf @3
  28. 0006: 2@ = 0 // integer values
  29. :3
  30. wait 1000
  31. 0229: set_car 0@ color_to 1@ 2@ // установить цвета авто
  32. jump @1
  33. 0ABA: end_custom_thread_named 'U'
  34.  
 
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 03, 2017, 08:37:21 pm
Цитировать
Все сделал как Вы сказали, все же выдает ошибку при компиляция
Очень странно - кейворды(а именно их отсутствие и вызвало эту ошибку, судя по скрину) должны устанавливаться вместе с Sanny Builder.
Попробуй поставить мои(в аттаче) - кидать также в Sanny Builder 3\data\vc\.

Цитировать
Работают над скриптом по изменению цвета авто, думал за 5 мин напишу, а она вылетает.
Не знаю почему
Опкод 00DA используется только в миссиях, так что замени его на 03C1:
Код: Text
  1. 03C1: 0@ = player $player_char car_no_save

И последняя строчка
Код: Text
  1. 0ABA: end_custom_thread_named 'U'
- лишняя(во-первых, выше уже есть jump, а во-вторых - поток не может закрыть сам себя таким способом!)
Название: Re: Помощь с CLEO
Отправлено: mfisto от Октябрь 04, 2017, 11:47:18 am
Здесь не верно:
actor.Driving($player_char)Должно быть:
actor.Driving($player_actor)
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 05, 2017, 12:00:41 pm
Спасибо Вам огромное уважаемый Shagg_E с Вашими кейвордами все заработало.
Благодаря Вашему мудрому совету машины меняют свой цвет без проблем.
Ценное замечание насчет поток. Признаюсь искреннее, не совсем понимают, зачем нужен поток в скрипте?
mfisto, спасибо большое за ценное замечание.
В cleo для vc, сейчас мне интересно поработать с памятью, она расширяет возможности.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 07, 2017, 08:27:46 am
Здравствуйте, всем.
Вот написал шаблонную миссию, работает стабильно.   
Создавал маркер перед потоком, чтобы избежать вреда сохранениям.
Старался привести код в удобный, читаемым вид.
Возникли вопросы.
При провале, миссия не запускается вновь.
Скажите, пожалуйста, как записать в константы имя модели- медик или $player_char как ch.
У меня не выходит, это нужно для краткости.
Если 1@ = actor.Create(16, #MEDIC, 77.3075, -879.1083, 10.4481) поместить в цикле for, допустим 3, тогда создается 3 актер,
Как цикл For использовать в качестве условие, что актер 1@ убить 3 раза?
Надеюсь, на Ваши мудрые советы.
 
Код: Javascript
  1. {$CLEO .cs}                                      
  2. const
  3. ONM = $ONMISSION
  4. x =  79.8094 // Координаты
  5. y = -880.79  // Координаты
  6. z =  10.445  // Координаты
  7. end          
  8. 0000:
  9. :MISSION_1
  10. while true        
  11. wait 0
  12. if 0256: player $player_char defined
  13. then gosub @MISSION_END      
  14. if ONM == 0
  15. then 02A7: 0@ = create_icon_marker_and_sphere 34 at x y z
  16. if 00F8: player $player_char stopped 0 x y z radius 1.0 1.0 1.5
  17. then      
  18. gosub @MISSION_START // Старт миссии
  19. jump @MISSION_1 // Чтобы можно пройти заново      
  20. end
  21. end
  22. end
  23. end
  24. :MISSION_BEGIN // Тело миссии                    
  25. fade 0 300 // Затемение экрана
  26. gosub @load // Загрузить актера
  27. 1@ = actor.Create(16, #MEDIC, 77.3075, -879.1083, 10.4481)
  28. actor.Angle(1@) = 199.2093 // Задать угол актеру    
  29. gosub @delay // Задержка                                                
  30. 2@ = marker.CreateAboveActor(1@) // Создать маркер над актером  
  31. fade 1 300 // Убрать затемение экрана      
  32. 01CA: actor 1@ kill_player $player_char // Актер хочет убить игрока
  33. gosub @actor
  34. return
  35. :MISSION_START // Старт миссии
  36. gosub @MISSION_END // Завершение миссии
  37. 03A4: name_thread 'MISS'      
  38. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  39. ONM == 1 // миссия запущена  
  40. gosub @MISSION_BEGIN // Сама миссия                    
  41. :MISSION_COMPLETED // Миссия выполнена
  42. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1    
  43. 0394: play_music 1 // мелодия выполнение миссии
  44. Player.Money($PLAYER_CHAR) += 1000  
  45. gosub @MISSION_END
  46. :MISSION_FAILED // Провал миссии              
  47. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  48. gosub @MISSION_END          
  49. :MISSION_END          
  50. ONM == 0      
  51. 0249: release_model #MEDIC // Выгрузить из памяти    
  52. actor.RemoveReferences(1@)  
  53. 0164: disable_marker 0@  // Удалить маркер    
  54. 0164: disable_marker 2@                
  55. 0ABA: end_custom_thread_named 'MISS'  
  56. return                                    
  57. :load
  58. repeat
  59. wait 0
  60. model.Load(#MEDIC)
  61. 038B: load_requested_models
  62. gosub @delay
  63. until model.Available(#MEDIC)
  64. return
  65. :delay
  66. 16@ = 0
  67. repeat
  68. wait 0                
  69. until 0029: 16@ >= 1100 // задержка
  70. return    
  71. :actor // Условие выполнение миссии    
  72. wait 0
  73. if actor.Dead(1@)
  74. then jump @MISSION_COMPLETED // Миссия выполнена
  75. else jump @player
  76. end
  77. return                  
  78. :player // Условие провала миссии
  79. wait 0
  80. if 8256: not player $player_char defined
  81. then jump @MISSION_FAILED // Провал миссии    
  82. else jump @actor
  83. end                    
  84.  
Все сделал, работает как надо, почти весь день потратил.
Ее можно использовать как шаблон для создания миссии.

Код: Javascript
  1. {$CLEO}
  2. const
  3. ONM = $ONMISSION
  4. x = 79.8094 // Координаты
  5. y = -880.79 // Координаты
  6. z = 10.445 // Координаты
  7. end
  8. 0000:
  9. :MISSION_1
  10. while true
  11. wait 0
  12. if 0256: player $player_char defined
  13. then gosub @MISSION_END
  14. if ONM == 0
  15. then 02A7: 0@ = create_icon_marker_and_sphere 34 at x y z
  16. if 00F8: player $player_char stopped 0 x y z radius 1.0 1.0 1.5
  17. then
  18. gosub @MISSION_START // Старт миссии
  19. jump @MISSION_1 // Чтобы можно пройти заново
  20. end
  21. end
  22. end
  23. end
  24. :MISSION_BEGIN // Тело миссии
  25. fade 0 300 // Затемнение экрана    
  26. gosub @load // Загрузить актера                    
  27. 1@ = actor.Create(16, #MEDIC, 77.3075, -879.1083, 10.4481)    
  28. 0164: disable_marker 0@ // Удалить маркер    
  29. actor.Angle(1@) = 199.2093 // Задать угол актеру
  30. gosub @delay // Задержка
  31. 2@ = marker.CreateAboveActor(1@) // Создать маркер над актером
  32. fade 1 300 // Убрать затемнение экрана
  33. 01CA: actor 1@ kill_player $player_char // Актер хочет убить игрока
  34. gosub @actor
  35. return    
  36. :actor // Условие выполнение миссии
  37. wait 0
  38. if actor.Dead(1@)
  39. then jump @MISSION_COMPLETED // Миссия выполнена
  40. else jump @player
  41. end
  42. return
  43. :MISSION_START // Старт миссии          
  44. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  45. ONM == 1 // миссия запущена
  46. gosub @MISSION_BEGIN // Сама миссия
  47. return
  48. :MISSION_COMPLETED // Миссия выполнена
  49. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
  50. 0394: play_music 1 // мелодия выполнение миссии
  51. Player.Money($PLAYER_CHAR) += 1000                          
  52. mission_cleanup // Очистка после миссии
  53. gosub @MISSION_END                          
  54. return        
  55. :MISSION_FAILED // Провал миссии
  56. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  57. gosub @MISSION_END
  58. :MISSION_END          
  59. ONM == 0
  60. 0249: release_model #MEDIC // Выгрузить из памяти
  61. actor.RemoveReferences(1@)
  62. 0164: disable_marker 0@ // Удалить маркер
  63. 0164: disable_marker 2@
  64. return
  65. :load
  66. repeat
  67. wait 0
  68. model.Load(#MEDIC)
  69. 038B: load_requested_models
  70. gosub @delay
  71. until model.Available(#MEDIC)
  72. return
  73. :delay
  74. 16@ = 0
  75. repeat
  76. wait 0
  77. until 0029: 16@ >= 1100 // задержка
  78. return
  79. :player // Условие провала миссии
  80. wait 0
  81. if 8256: not player $player_char defined
  82. then jump @MISSION_FAILED // Провал миссии
  83. else jump @actor
  84. end
  85.  
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 09, 2017, 07:41:15 am
Здравствуйте, всем.
Написал вторую тестовую миссию, столкнулся с интересными нюансами.
Если создать в качестве медика и дать оружие, он стрелять по нам из него не будет.
Заменил на таксиста.
Циклом for создаем нужно их количество, так как в vc нет массива.
При установки здоровье 150, вылетать
При подъеме денег с убитых врагов идет вылет, что странно.

Как правильно загружать несколько моделей? Через request_model или model.Load()?
Буду благодарен за Ваши ответы.
Код: Javascript
  1. {$CLEO .cs}
  2. const
  3. ONM = $ONMISSION
  4. x = 567.389 // Координаты
  5. y = 531.035 // Координаты
  6. z = 12.0494 // Координаты  
  7. a = 598.08 // Координаты пикапа
  8. b = 860.784 // Координаты пикапа
  9. c = 22.029  // Координаты  пикапа  
  10. d = 569.892 // Координаты педа
  11. e = 801.703 // Координаты педа
  12. f = 11.6737  // Координаты  педа    
  13. end
  14. 0000:
  15. :MISSION_1        
  16. while player.Defined($PLAYER_ACTOR)
  17. wait 0      
  18. gosub @MISSION_END
  19. if ONM == 0
  20. then 02A7: 0@ = create_icon_marker_and_sphere 35 at x y z
  21. if 00F8: player $player_char stopped 0 x y z radius 1.0 1.0 1.5
  22. then                            
  23. gosub @MISSION_START // Старт миссии
  24. jump @MISSION_1 // Чтобы можно пройти заново
  25. end
  26. end
  27. end
  28. :MISSION_BEGIN // Тело миссии
  29. for 4@ = 1 to 5                
  30. 3@ = actor.Create(4, #HMOCA, d, e, f)  
  31. 03FE: set actor 3@ money 1000                      
  32. 01B2: give_actor 3@ weapon 33 ammo 9999    
  33. 02E2: set_actor 3@ weapon_accuracy_to 100 // Установка точности стрельбы для актера
  34. 01CA: actor 3@ kill_player $player_char // Актер хочет убить игрока    
  35. end                                    
  36. 0213: 1@ = create_pickup 335 type 1 at a b c  
  37. 0164: disable_marker 0@ // Удалить маркер    
  38. actor.Angle(3@) = 169.2093 // Задать угол актеру
  39. 03DC: 2@ = create_marker_above_pickup 1@ // Создать маркер над актером
  40. gosub @actor
  41. return        
  42. :actor // Условие выполнение миссии
  43. wait 0
  44. if pickup.Picked_up(1@)
  45. then jump @MISSION_COMPLETED // Миссия выполнена
  46. else jump @player
  47. end
  48. return
  49. :MISSION_START // Старт миссии    
  50. gosub @load // Загрузить актера      
  51. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  52. ONM == 1 // мисия запущена
  53. gosub @MISSION_BEGIN // Сама миссия
  54. return
  55. :MISSION_COMPLETED // Миссия выполнена
  56. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
  57. 0394: play_music 1 // мелодия выполнение миссии
  58. Player.Money($PLAYER_CHAR) += 1000              
  59. gosub @MISSION_END                          
  60. return        
  61. :MISSION_FAILED // Провал миссии
  62. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  63. gosub @MISSION_END
  64. :MISSION_END          
  65. ONM == 0                                
  66. actor.RemoveReferences(3@)
  67. 0AC9: free_allocated_memory 3@  
  68. 0249: release_model 335 // Выгрузить из памяти  
  69. 0249: release_model #HMOCA // Выгрузить из памяти  
  70. 0249: release_model #MINIGUN // Выгрузить из памяти
  71. 0164: disable_marker 0@ // Удалить маркер
  72. 0164: disable_marker 2@                  
  73. mission_cleanup // Очистка после миссии
  74. return
  75. :load    
  76. fade 0 300 // Затемение экрана      
  77. 0247: request_model #HMOCA  
  78. 0247: request_model #MINIGUN
  79. 038B: load_requested_models
  80. 0AC8: 3@ = allocate_memory_size 128
  81. gosub @delay // Задержка      
  82. fade 1 300 // Убрать затемение экрана
  83. return  
  84. repeat
  85. wait 0
  86. model.Load(335)
  87. 038B: load_requested_models
  88. gosub @delay
  89. until model.Available(335)
  90. return
  91. :delay
  92. 16@ = 0
  93. repeat
  94. wait 0
  95. until 0029: 16@ >= 1100 // задержка
  96. return
  97. :player // Условие провала миссии
  98. wait 0
  99. if 8256: not player $player_char defined
  100. then jump @MISSION_FAILED // Провал миссии
  101. else jump @actor
  102. end
  103.  
Написал так, только при провале актеры не удаляются, при взятие денег и повторном прохождении зависание. Не знаю, что делать?
Код: Javascript
  1. {$CLEO .cs}
  2. const
  3. ONM = $ONMISSION
  4. x = 567.389 // Координаты значка миссии
  5. y = 531.035 // Координаты значка миссии
  6. z = 12.0494 // Координаты значка миссии
  7. a = 598.08 // Координаты пикапа
  8. b = 860.784 // Координаты пикапа
  9. c = 22.029  // Координаты пикапа  
  10. d = 569.892 // Координаты педа
  11. e = 801.703 // Координаты педа
  12. f = 11.6737 // Координаты педа
  13. end
  14. 0000:
  15. :MISSION_1        
  16. while player.Defined($PLAYER_ACTOR)
  17. wait 0      
  18. gosub @MISSION_END
  19. if ONM == 0
  20. then 02A7: 0@ = create_icon_marker_and_sphere 35 at x y z
  21. if 00F8: player $player_char stopped 0 x y z radius 1.0 1.0 1.5
  22. then                            
  23. gosub @MISSION_START // Старт миссии
  24. jump @MISSION_1 // Чтобы можно пройти заново
  25. end
  26. end
  27. end
  28. :MISSION_BEGIN // Тело миссии
  29. gosub @foe1 // Враги
  30. 0164: disable_marker 0@ // Удалить маркер    
  31. 03DC: 2@ = create_marker_above_pickup 1@ // Создать маркер над актером
  32. gosub @actor
  33. return        
  34. :actor // Условие выполнение миссии
  35. wait 0
  36. if pickup.Picked_up(1@)
  37. then jump @MISSION_COMPLETED // Миссия выполнена
  38. else jump @player
  39. end
  40. return
  41. :MISSION_START // Старт миссии
  42. 0AC8: 3@ = allocate_memory_size 8000    
  43. gosub @load // Загрузить актера      
  44. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  45. ONM == 1 // мисия запущена
  46. gosub @MISSION_BEGIN // Сама миссия
  47. return
  48. :MISSION_COMPLETED // Миссия выполнена
  49. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
  50. 0394: play_music 1 // мелодия выполнение миссии
  51. Player.Money($PLAYER_CHAR) += 1000              
  52. gosub @MISSION_END                          
  53. return        
  54. :MISSION_FAILED // Провал миссии
  55. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  56. gosub @MISSION_END
  57. :MISSION_END          
  58. ONM == 0
  59. gosub @del1 // Удалить врагов
  60. 0249: release_model 335 // Выгрузить из памяти  
  61. 0249: release_model #HMOCA // Выгрузить из памяти  
  62. 0249: release_model #MINIGUN // Выгрузить из памяти
  63. 0164: disable_marker 0@ // Удалить маркер
  64. 0164: disable_marker 2@
  65. 0AC9: free_allocated_memory 3@                
  66. return
  67. :foe    
  68. 3@ = actor.Create(4, #HMOCA, d, e, f)      
  69. 01B2: give_actor 3@ weapon 33 ammo 9999    
  70. 02E2: set_actor 3@ weapon_accuracy_to 100 // Установка точности стрельбы для актера      
  71. //03FE: set actor 3@ money 1000 // Кол-во денег педа  
  72. actor.Health(3@) = 200            
  73. actor.Angle(3@) = 169.2093 // Задать угол актеру
  74. 01CA: actor 3@ kill_player $player_char // Актер хочет убить игрока                
  75. 0213: 1@ = create_pickup 335 type 1 at a b c  
  76. return
  77. :load    
  78. fade 0 300 // Затемение экрана      
  79. 0247: request_model #HMOCA  
  80. 0247: request_model #MINIGUN
  81. 038B: load_requested_models
  82. gosub @delay // Задержка      
  83. fade 1 300 // Убрать затемение экрана
  84. return  
  85. repeat
  86. wait 0
  87. model.Load(335)
  88. 038B: load_requested_models
  89. gosub @delay
  90. until model.Available(335)
  91. return
  92. :delay
  93. 16@ = 0
  94. repeat
  95. wait 0
  96. until 0029: 16@ >= 1100 // задержка
  97. return
  98. :player // Условие провала миссии
  99. wait 0
  100. if 8256: not player $player_char defined
  101. then jump @MISSION_FAILED // Провал миссии
  102. else jump @actor
  103. end          
  104. :del                                                
  105. actor.DestroyInstantly(3@)    
  106. actor.RemoveReferences(3@)
  107. return        
  108. :foe1
  109. gosub @foe // 1 враг
  110. gosub @foe // 2 враг
  111. gosub @foe // 3 враг
  112. gosub @foe // 4 враг
  113. gosub @foe // 5 враг
  114. gosub @foe // 6 враг
  115. return      
  116. :del1    
  117. gosub @del // удалить враг 1      
  118. gosub @del // удалить враг 2      
  119. gosub @del // удалить враг 3      
  120. gosub @del // удалить враг 4      
  121. gosub @del // удалить враг 5      
  122. gosub @del // удалить враг 6    
  123. return      
  124.  

Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 09, 2017, 02:25:33 pm
Цитировать
зачем нужен поток в скрипте?
Каждый скрипт это и есть поток. А вот задание имени потока действительно необязательно. Оно действительно нужно лишь в том случае, если ты потом захочешь где-нибудь удаленно закрыть этот поток, и это можно сделать лишь по его имени(если оно у него есть).


Цитировать
Создавал маркер перед потоком, чтобы избежать вреда сохранениям.
Так какая разница, если игрок может пойти и сохраниться в тот период, когда маркер уже создан, а миссия еще не начата и этот маркер в итоге сохранится в файле сохранения(навредит ему)? Не советую вообще создавать какие-либо маркеры вне миссии, лучше сделай так, чтобы миссия активировалась чит-кодом или еще каким действием. Ведь CLEO-миссии - это лишь баловство(тут и чит-код сойдет). Если хочешь написать полноценную красивую сюжетную линию с кучей миссий и маркерами, как в оригинале, то и делать это стоит как в оригинале - в main.scm. Там уже можно и маркеры, и пикапы, и парковки и прочее создавать и юзать глобальные переменные.


Цитировать
Скажите, пожалуйста, как записать в константы $player_char как ch.
Странный вопрос, ведь ты уже записал $ONMISSION в ONM


Цитировать
Скажите, пожалуйста, как записать в константы имя модели- медик
"имена моделей" - это лишь упрощение SannyBuilder, на самом деле при компиляции они заменяются на соответствующие ID из IDE файлов.
То есть #MEDIC - это номер 5 в default.ide, т.е. вместо
Цитировать
1@ = actor.Create(16, #MEDIC, 77.3075, -879.1083, 10.4481
можно писать
Цитировать
1@ = actor.Create(16, 5, 77.3075, -879.1083, 10.4481
Соответственно, в константы тоже следует записывать номер, а можно и также имя модели:
Цитировать
MEDICMODEL = #MEDIC


Цитировать
Как цикл For использовать в качестве условие, что актер 1@ убить 3 раза?
Я не практикую высокоуровневый скриптинг для подобных запутанных вещей, и тебе того же советую. Высокоуровневый код хорош только для несложных скриптов и то - чисто для эстетики. И чем сложнее миссии ты будешь писать, тем запутаннее будут эти твои циклы for, while и until. Конечно, Рокстары вроде как писали подобным типом кода, но это их дело. Я скинул примеры моего способа написания миссий, а ты уже смотри, как тебе будет удобно.


Цитировать
Циклом for создаем нужно их количество, так как в vc нет массива.
При установки здоровье 150, вылетать
При подъеме денег с убитых врагов идет вылет, что странно.
Я показал на примере тех двух миссий, как работать с массивами - всё там работает отлично. У тебя же все 5 актеров записываются в одну и ту же переменную 3@, соответственно работать в дальнейшем ты сможешь только с последним созданным, а других даже удалить не сможешь.
Попробуй взять за основы те миссии и хорошенько их "распотрошить", чтобы было удобнее понять, как работать с массивами в Вайсе "на практике".


Цитировать
Как правильно загружать несколько моделей? Через request_model или model.Load()?

Это одно и то же.
Есть опкод:
Цитировать
0247: request_model #ARMY
Для него есть кейворд:
Цитировать
request_model #ARMY
А также - команда класса:
Цитировать
model.Load(#ARMY)
- все три способа абсолютно легитимны. Просто юзай тот, который тебе кажется наиболее удобным. При компиляции будет один результат.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 10, 2017, 12:04:49 pm
Спасибо громадное уважаемый Shagg_E за Ваш подробный ответ, он много меня научил.
Скрипт и поток равнозначны, благодарю за доходчивое объяснение.
Благодаря Вашему умному совету, поступил следующим образом- введен чит код, ставим $ONMISSION == 1,  миссия активировалась- создаем маркер, делаем проверки стоим на маркере, удаляем его и так далее.
Странно флаг  $ONMISSION == 1 в скрипте не отключает возможность прохождения других миссии, хотя по идеи должен.
Уже понять, что писать миссии в cleo очень сложно, движок на это не рассчитан, в sa можно легко через стартер. Даже у меня криворукого получилось с горем пополам))))))))))
Можно ли для создания миссии написать, что вроде dyom под vc?
В main.scm создавать свои миссии не дорос до ее, там работать сложно.
Почему-то константа ch, что является $player_char  не работает.
Спасибо за разъяснение в const номера моделей, затем закомментировать их, чтобы не запутаться.   
 как ch.

Цитировать
MEDICMODEL = #MEDIC
Теперь стало понятно, как можно записывать имя модели.

Благодарю за совет, много говорят, что писать скрипты нужно высокоуровневый кодом, хотя низкоуровневый удобнее, его легче понять.
Буду изучать Ваш уникальный способ написание более внимательный образом.
Что ж буду учится это полезно для мозга, копаться и разбирать с Ваших гениальных примерах.

Спасибо, за разъяснение как модели  request_model или model.Load() идентичны.
 Изменил свою миссию все работает, только при 6 прохождении вылетает.
Код: Javascript
  1. {$CLEO}
  2. const
  3. x = 567.389 // Координаты значка миссии
  4. y = 531.035 // Координаты значка миссии
  5. z = 12.0494 // Координаты значка миссии
  6. a = 598.08 // Координаты пикапа
  7. b = 860.784 // Координаты пикапа
  8. c = 22.029  // Координаты пикапа  
  9. d = 569.892 // Координаты педа
  10. e = 801.703 // Координаты педа
  11. f = 11.6737 // Координаты педа
  12. end
  13. 0000:
  14. :MISSION_1        
  15. wait 0            
  16. if            
  17. $ONMISSION == 0  // Друга миcсия не запущена
  18. jf @MISSION_1  
  19. if
  20. 0ADC: test_cheat "BL" // включить миссию  
  21. jf @MISSION_1    
  22. $ONMISSION == 1 // мисия запущена
  23. 02A7: 0@ = create_icon_marker_and_sphere 35 at x y z
  24. :2        
  25. wait 0  
  26. if or
  27. 8256: not player $player_char defined // Игрок умер
  28. 0ADC: test_cheat "BL" // выключить миссию    
  29. jf @1      
  30. gosub @MISSION_END
  31. jump @MISSION_1 // Чтобы можно пройти заново
  32. :1  
  33. wait 0  
  34. if
  35. 00F8: player $player_char stopped 0 x y z radius 1.0 1.0 1.5
  36. jf @2            
  37. wait 200
  38. gosub @MISSION_START // Старт миссии    
  39. jump @MISSION_1 // Чтобы можно пройти заново  
  40. :MISSION_START // Старт миссии        
  41. gosub @load // Загрузить актера    
  42. 0164: disable_marker 0@ // Удалить маркер      
  43. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  44. gosub @MISSION_BEGIN // Сама миссия
  45. return            
  46. :MISSION_END          
  47. $ONMISSION == 0            
  48. gosub @del // Удалить врагов  
  49. return
  50. :MISSION_BEGIN // Тело миссии
  51. gosub @foe // Враги
  52. 03DC: 2@ = create_marker_above_pickup 1@ // Создать маркер над кейсом
  53. gosub @actor
  54. return        
  55. :actor // Условие выполнение миссии
  56. wait 0
  57. if pickup.Picked_up(1@)
  58. then jump @MISSION_COMPLETED // Миссия выполнена
  59. else jump @player
  60. end
  61. return        
  62. :player // Условие провала миссии
  63. wait 0
  64. if 8256: not player $player_char defined
  65. then jump @MISSION_FAILED // Провал миссии
  66. else jump @actor
  67. end          
  68. :MISSION_COMPLETED // Миссия выполнена
  69. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
  70. 0394: play_music 1 // мелодия выполнение миссии
  71. Player.Money($PLAYER_CHAR) += 1000              
  72. gosub @MISSION_END      
  73. gosub @reb // Перезагрузка скрипта                    
  74. return        
  75. :MISSION_FAILED // Провал миссии
  76. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  77. gosub @MISSION_END  
  78. gosub @reb // Перезагрузка скрипта  
  79. :foe // Создать врагов    
  80. 3@ = actor.Create(4, #HMOCA, d, e, f)      
  81. 01B2: give_actor 3@ weapon 33 ammo 9999    
  82. 02E2: set_actor 3@ weapon_accuracy_to 100 // Установка точности стрельбы для актера      
  83. actor.Angle(3@) = 169.2093 // Задать угол актеру
  84. 01CA: actor 3@ kill_player $player_char // Актер хочет убить игрока    
  85. 4@ = actor.Create(4, #HMOCA, d, e, f)      
  86. 01B2: give_actor 4@ weapon 33 ammo 9999    
  87. 02E2: set_actor 4@ weapon_accuracy_to 100 // Установка точности стрельбы для актера    
  88. actor.Angle(4@) = 169.2093 // Задать угол актеру
  89. 01CA: actor 4@ kill_player $player_char // Актер хочет убить игрока                
  90. 0213: 1@ = create_pickup 335 type 1 at a b c // Создать пикап кейса  
  91. 03DC: 2@ = create_marker_above_pickup 1@ // Создать маркер над пикапом кейса  
  92. return      
  93. :del                                          
  94. 0164: disable_marker 2@  // Удалить маркер
  95. 0215: destroy_pickup 1@ // Удалить пикап кейса          
  96. 0249: release_model 335 // Выгрузить из памяти  
  97. 0249: release_model #MINIGUN // Выгрузить из памяти
  98. 0249: release_model #HMOCA // Выгрузить из памяти                
  99. actor.RemoveReferences(3@) // Удалить врага          
  100. actor.RemoveReferences(4@) // Удалить врага
  101. return      
  102. :load // загрузка моделей для миссии    
  103. fade 0 300 // Затемение экрана      
  104. 0247: request_model #HMOCA  
  105. 0247: request_model #MINIGUN
  106. 038B: load_requested_models
  107. gosub @delay // Задержка      
  108. fade 1 300 // Убрать затемение экрана
  109. return  
  110. repeat
  111. wait 0
  112. model.Load(335)
  113. 038B: load_requested_models
  114. gosub @delay
  115. until model.Available(335)
  116. return
  117. :delay
  118. 16@ = 0
  119. repeat
  120. wait 0
  121. until 0029: 16@ >= 1100 // задержка
  122. return
  123. :reb              
  124. wait 50      
  125. 0ABA: end_custom_thread_named 'Test'
  126. wait 1000
  127. 0A92: create_custom_thread "Test.cs"  //название перезагружаемого потока
  128. wait 50    
  129. return
  130.  
Решил при провале и прохождении миссии сделать перегрузку потока скритпа, по моему сделал неправильно, перестала деактивация миссии.
Помоги, пожалуйста, нубу.
Код: Javascript
  1.  
  2. :reb              
  3. wait 50      
  4. 0ABA: end_custom_thread_named 'Test'
  5. wait 1000
  6. 0A92: create_custom_thread "Test.cs"  //название перезагружаемого потока
  7. wait 50    
  8. return
  9.  
Название: Re: Помощь с CLEO
Отправлено: kenking от Октябрь 10, 2017, 04:42:41 pm
... ставим $ONMISSION == 1,  миссия активировалась- создаем маркер, делаем проверки стоим на маркере, удаляем его и так далее.
Странно флаг  $ONMISSION == 1 в скрипте не отключает возможность прохождения других миссии, хотя по идеи должен.
...
Ты же не установил флаг, а опять его проверяешь. Двойное равенство - это проверка равна ли левая часть выражения правому? Надо
$ONMISSION = 1
После прохождения миссии опять вернуть в прежнее состояние
$ONMISSION = 0
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 15, 2017, 12:48:23 pm
Спасибо большое уважаемый kenking за Ваш точный совет! Теперь флаг миссии работает.
Теперь бьюсь с новой проблемой, уже несколько дней провале миссия зависает или маркеры не удаляются.
Помоги, пожалуйста, прошу.
Код: Javascript
  1. {$CLEO}
  2. const
  3. x = 567.389 // Координаты значка миссии
  4. y = 531.035 // Координаты значка миссии
  5. z = 12.0494 // Координаты значка миссии
  6. a = 598.08 // Координаты пикапа
  7. b = 860.784 // Координаты пикапа
  8. c = 22.029  // Координаты пикапа  
  9. d = 569.892 // Координаты педа
  10. e = 801.703 // Координаты педа
  11. f = 11.6737 // Координаты педа
  12. m = 1000 // Кол-во денег педа  
  13. end
  14. 0000:
  15. :MISSION_1    
  16. while 0256: player $PLAYER_CHAR defined
  17. wait 0            
  18. if            
  19. $ONMISSION == 0  // Друга миcсия не запущена
  20. then
  21. if
  22. 0ADC: test_cheat "BL" // включить миссию  
  23. then                          
  24. gosub @MISSION_START // Старт миссии    
  25. jump @MISSION_1 // Чтобы можно пройти заново
  26. end
  27. end
  28. end  
  29. :MISSION_START // Старт миссии        
  30. gosub @load // Загрузить актера                                  
  31. $ONMISSION = 1 // мисия запущена    
  32. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1
  33. gosub @MISSION_BEGIN // Сама миссия
  34. return                                  
  35. :MISSION_END                                        
  36. $ONMISSION = 0        
  37. gosub @del // Удалить врагов                                
  38. return
  39. :MISSION_BEGIN // Тело миссии  
  40. gosub @foe // Враги
  41. 0055: put_player $player_char at x y z  
  42. 0171: set_player $player_char z_angle_to 89.2093 // Задать угол актеру
  43. fade 1 300 // Убрать затемение экрана
  44. gosub @actor
  45. return        
  46. :actor // Условие выполнение миссии
  47. wait 0
  48. if pickup.Picked_up(1@)
  49. then jump @MISSION_COMPLETED // Миссия выполнена
  50. else jump @player
  51. end
  52. return        
  53. :player // Условие провала миссии
  54. wait 0
  55. if 8256: not player $player_char defined
  56. then jump gosub @MISSION_FAILED // Провал миссии
  57. else jump @actor
  58. end          
  59. :MISSION_COMPLETED // Миссия выполнена
  60. 01E3: show_text_1number_styled GXT 'M_PASS' number 1000 time 5000 style 1
  61. 0394: play_music 1 // мелодия выполнение миссии
  62. Player.Money($PLAYER_CHAR) += 1000              
  63. gosub @MISSION_END                
  64. return        
  65. :MISSION_FAILED // Провал миссии
  66. 00BA: show_text_styled GXT 'M_FAIL' time 5000 style 1 // MISSION FAILED
  67. gosub @MISSION_END
  68. return  
  69. :foe // Создать врагов    
  70. 3@ = actor.Create(4, #HMOCA, d, e, f)      
  71. 01B2: give_actor 3@ weapon 33 ammo 9999    
  72. 02E2: set_actor 3@ weapon_accuracy_to 100 // Установка точности стрельбы для актера      
  73. actor.Angle(3@) = 169.2093 // Задать угол актеру          
  74. 03FE: set actor 3@ money m // Кол-во денег педа  
  75. 01CA: actor 3@ kill_player $player_char // Актер хочет убить игрока    
  76. 4@ = actor.Create(4, #HMOCA, d, e, f)      
  77. 01B2: give_actor 4@ weapon 33 ammo 9999    
  78. 02E2: set_actor 4@ weapon_accuracy_to 100 // Установка точности стрельбы для актера    
  79. actor.Angle(4@) = 169.2093 // Задать угол актеру
  80. 01CA: actor 4@ kill_player $player_char // Актер хочет убить игрока                
  81. 0213: 1@ = create_pickup 335 type 1 at a b c // Создать пикап кейса  
  82. 03DC: 2@ = create_marker_above_pickup 1@ // Создать маркер над пикапом кейса  
  83. return      
  84. :del                                          
  85. 0164: disable_marker 2@  // Удалить маркер
  86. 0215: destroy_pickup 1@ // Удалить пикап кейса          
  87. 0249: release_model 335 // Выгрузить из памяти  
  88. 0249: release_model #MINIGUN // Выгрузить из памяти
  89. 0249: release_model #HMOCA // Выгрузить из памяти                
  90. actor.RemoveReferences(3@) // Удалить врага          
  91. actor.RemoveReferences(4@) // Удалить врага
  92. return      
  93. :load // загрузка моделей для миссии    
  94. fade 0 300 // Затемение экрана      
  95. 0247: request_model #HMOCA  
  96. 0247: request_model #MINIGUN
  97. 038B: load_requested_models
  98. gosub @delay // Задержка      
  99. return  
  100. repeat
  101. wait 0
  102. model.Load(335)
  103. 038B: load_requested_models
  104. gosub @delay
  105. until model.Available(335)
  106. return
  107. :delay
  108. 16@ = 0
  109. repeat
  110. wait 0
  111. until 0029: 16@ >= 1100 // задержка
  112. return
  113.  

Все исправил, все работает как надо, за основу взял найденную cleo миссию для vc.
Вот, что получилось.
Код: Javascript
  1. {$CLEO}
  2. 0000:        
  3. const
  4. x = 567.389 // Координаты значка миссии
  5. y = 531.035 // Координаты значка миссии
  6. z = 12.0494 // Координаты значка миссии
  7. a = 598.08 // Координаты пикапа
  8. b = 860.784 // Координаты пикапа
  9. c = 22.029  // Координаты пикапа  
  10. d = 569.892 // Координаты педа
  11. e = 801.703 // Координаты педа
  12. f = 11.6737 // Координаты педа
  13. m = 1000 // Кол-во денег педа  
  14. end
  15. :MISSION_1    
  16. wait 0                                    
  17. if
  18. 0256: player $player_char defined
  19. jf @MISSION_1        
  20. if
  21. 0038: $onmission == 0 // integer values
  22. jf @MISSION_1  
  23. if 0ADC: test_cheat "BL" // включить миссию  
  24. jf @MISSION_1  
  25. jump @MISSION_START // Старт миссии    
  26. jump @MISSION_1  // Чтобы можно пройти заново    
  27. return
  28. :MISSION_START // Старт миссии                        
  29. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1  
  30. 03A4: name_thread 'TEST'
  31. 0004: $onmission = 1 // мисия запущена        
  32. wait 0            
  33. 0247: request_model #HMOCA // Запрос модели таксиста  
  34. 038B: load_requested_models        
  35. 011C: actor $player_actor clear_objective
  36. fade 0 1500 ms  
  37. 01BD: $current_time_in_ms = current_time_in_ms
  38. //0055: put_player $player_char at x y z
  39. 1@ = actor.Create(4, #HMOCA, d, e, f)      
  40. 016A: fade 1 1000 ms                    
  41. :player    
  42. wait 0
  43. if 8256: not player $player_char defined
  44. jf @actor
  45. gosub @MISSION_FAILED // Провал миссии    
  46. gosub @MISSION_END // Завершение миссии
  47. jump @MISSION_1  // Чтобы можно пройти заново    
  48. :actor
  49. if 0118: actor 1@ dead
  50. jf @player
  51. gosub @MISSION_COMPLETED // Миссия выполнена
  52. gosub @MISSION_END // Завершение миссии
  53. jump @MISSION_1  // Чтобы можно пройти заново    
  54. :MISSION_COMPLETED // Миссия выполнена
  55. 01E3: text_1number_styled 'M_PASS' number 15000 time 3000 style 1  // ˜© ?po¦?? ?ty m?cc?«! $~1~    
  56. 0394: play_music 1                        
  57. Player.Money($PLAYER_CHAR) += 1500        
  58. 0318: set_latest_mission_passed 'VSHELI'  
  59. return  
  60. :MISSION_FAILED // Провал миссии
  61. 00BA: text_styled 'M_FAIL' 3000 ms 1  // m?cc?¬ ?po˜a?eha!  
  62. return  
  63. :MISSION_END // Завершение миссии      
  64. 0249: release_model #HMOCA
  65. 01C2: remove_references_to_actor 1@
  66. 0004: $onmission = 0 // integer values
  67. 01BD: $current_time_in_ms = current_time_in_ms
  68. 00D8: mission_cleanup
  69. return  
  70.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 18, 2017, 02:25:34 pm
Пробуй ставить задержки в несколько секунд по очереди с начала скрипта до его конца и тестируй. Т.е. сначала после первого опкода и тестируй, потом после второго и т.д. Я так часто ищу участки скриптов, вызывающие ошибку.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 19, 2017, 03:33:15 pm
Спасибо уважаемый Shagg_E за Ваш совет.
Расстановка может помочь найти ошибку в скрипте, сам еще использую 0acd: show_text_high_priority "ok" time 1000, чтобы где застрял скрипт.
Вы очень много меня научили, дорогой Shagg_E.
В принципе cleo миссия работает, ее можно использовать как шаблон для написание миссии, путем внесения изменений.
Написания даже самым простых миссии очень мутное дело, при этом в cleo нет возможности все сделать компактнее, вместо 10 опкодов писать одну функцию. Это все упростить.
Вы как один из лучших модеров по гта, прекрасно знакомы с языком lua.
Пытаюсь его освоить путем изменение скриптов moonloader, настроил с горем пополам редактор atom, чтобы выводил подсказки при наборе команды, но как это сделать в notepad++ чтобы подсвечивались новые команды, а только стандартные.

Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 19, 2017, 10:08:34 pm
Цитировать
В принципе cleo миссия работает, ее можно использовать как шаблон для написание миссии, путем внесения изменений.
Если просто "работает" - это еще не значит, что всё сделано правильно, будь пожалуйста внимательнее к коду, чтобы не было таких моментов:
Код: Text
  1. jump @MISSION_START // Старт миссии    
  2. jump @MISSION_1  // Чтобы можно пройти заново
  3. return
После первого jump второй jump и return не выполнятся!
Jump - это не gosub. Jump - это безоговорочный прыжок, и код после него не выполняется!

Цитировать
Вы как один из лучших модеров по гта, прекрасно знакомы с языком lua.
Я "середнячок" в моддинге(просто относительно эрудирован), а Lua я не знаю совершенно...
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 21, 2017, 02:59:50 pm
Огромное спасибо уважаемый Shagg_E за возможность общаться с умным человеком.
Да, совершено правы, невнимательность, ведет к совершению ошибок.
Раньше придерживался девиз "Главное, чтоб работало", сейчас с опытом, хочется переписать все скрипты, начиная с первого, теперь вижу все свои недочеты и серьезные огрехи, которые тогда не замечал.
 Вы "середнячок"  ультра класса!
Уверен Ваш светлый ум разобрался с ним в "два счета"
Там нет лимит переменных, есть другие классные фишки, они облегчаю программирование.
Например, написал lua скрипт, При нажатии на клавиши 1 cj дать миниган и 100 патронов.
Представлю, что Вы могли на писать на нем, если с лимитом в 16 переменных, творите настоящую фантастику.
Код: Javascript
  1. script_author("egor")
  2. script_name("weapon")
  3. require "lib.moonloader"
  4.  
  5. function main() -- объявление функции
  6.  while true do -- бесконечный цикл
  7.  local a = 362 -- модель оружие
  8.  local b = 38 -- id оружие или его номер
  9.  local c = 100 -- количество патронов у оружия
  10. wait(0) -- задержка в 0 мс
  11. if isPlayerPlaying (PLAYER_HANDLE) then  -- если игрок найден
  12. if isKeyDown(VK_1)  then -- если клавиша 1 нажата
  13.     requestModel(a) -- запрос модели минигана
  14. if hasModelLoaded(a) then  -- ждём, пока модель не загрузится  
  15.  while isKeyDown(VK_1) do wait(100) end -- и ждём, пока клавиша не будет отпущена
  16.   printString ("GiveWeapon", 1000) -- надпись дано оружие, второй параметр время надписи
  17.  giveWeaponToChar(PLAYER_PED, b, c) -- дать миниган, первый параметр id, количество патронов
  18.  markModelAsNoLongerNeeded (a, b) -- удалить модель и id из памяти
  19.  end
  20.  end
  21.  end
  22.  end
  23.  end
  24.  
  25.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 23, 2017, 01:05:04 pm
Цитировать
Раньше придерживался девиз "Главное, чтоб работало", сейчас с опытом, хочется переписать все скрипты, начиная с первого, теперь вижу все свои недочеты и серьезные огрехи, которые тогда не замечал.
Твой прогресс меня радует - немногие так быстро углубляются в скриптинг, да еще и прислушиваются к советам. Если продолжишь в том же темпе - скоро я тебе уже буду бесполезен ;)
Повторюсь - я практически во всех аспектах моддинга Вайса нахожусь примерно на среднем уровне, моё отличие от многих других лишь в том, что я в своё время наделал миллиарды ошибок и порой годами доходил до решения той или иной проблемы, зачастую не додумываясь(или просто упираясь) банально спросить совета более опытного человека. А бывало, что и спросить было не у кого...
Именно по этой причине я сейчас стараюсь помогать людям, у которых вижу желание изучать что-то новое: просто не хочу, чтобы они тратили на решения отдельных проблем столько же времени, сколько когда-то угробил на это я. А не потому что я супер-мега эксперт.
Уже сталкивался несколько раз, когда некоторые модмейкеры, которым я когда-то помогал осваивать новые трюки в какой-либо области моддинга, публикуют что-то в этой самой области, до чего я бы и не додумался. Что-то, что вдохновляет других, включая и меня самого.
Поэтому я надеюсь, что когда-нибудь и ты будешь также помогать другим.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 24, 2017, 09:02:30 am
Здравствуйте, уважаемый Shagg.
Спасибо Вам за добрые слова, Вы всегда меня поддерживали мудрым советом.
Свой прогрессом недоволен, хочется все и сразу, думал, что на следующий день достигну это уровня, а не через 3 с половиной месяца.
Gta vc, любимая игра, все хотел ее улучшить. Но в жизни много проблем, которые нужно решить. Нельзя бросить работу, все остальное, уйти в программирования с головой.
Годами находить решения, редкий человек, обладает таким терпением.
Вы мне очень помогли, Вам очень благодарен. Без Вас не достиг этого уровня. Как хорошо, что Вы помогайте и вдохновляйте других.
Помогаю в личке в вконтакте одному школьнику, иногда в шоке от его банальных косяков.
Хотел у Вас спросит можно открыт тему по lua скриптам. Это неплохая альтернатива cleo, может привлечь новых людей.
Моя cleo миссия для vc (убить таксиста, взять кейс) работает. Сделал координаты поближе, при 6 прохождении начала вылетать с этой ошибкой странно
http://pixs.ru/uploaded/netJPG_1964327_28025231.jpg/28025231_7909674/ (http://pixs.ru/uploaded/netJPG_1964327_28025231.jpg/28025231_7909674/)
Есть вопрос в чем отличия между этими опкодами 0AB1: call_scm_func @GetSQR 1 10 $result и 05F5: call_scm_func @func params_count 0?  они по своему действию очень схожи.
У Вас форуме есть тема Vice City Plugin SDK. Это круто! Но что это такое? Как пользоваться? Что может? не понятно. Боюсь писать туда, бан получу за тупость еще.
Написал скрипт, который по нажатию клавиши f записывает координаты игрока в ini файл. Может быть полезен. А как записать координаты в одну строчку? Чтобы удобнее копировать их.
Код: Javascript
  1. {$CLEO}
  2. 0000:                    
  3. while player.Defined($PLAYER_ACTOR)
  4. wait 0      
  5. if 80E0: not player $player_char driving
  6. then      
  7. if 0AB0: key_pressed 0x46 // f
  8. then                  
  9. 0AAB: file_exists "cleo\coordinate.ini"
  10. 0054: store_player $PLAYER_CHAR position_to 0@ 1@ 2@
  11. 0AF3: write_float 0@ to_ini_file "cleo\coordinate.ini" section "SectionName" key " x "
  12. 0AF3: write_float 1@ to_ini_file "cleo\coordinate.ini" section "SectionName" key " y "
  13. 0AF3: write_float 2@ to_ini_file "cleo\coordinate.ini" section "SectionName" key " z "
  14. 0acd: show_text_high_priority "~r~coordinates recorded" time 1000    
  15. end
  16. end
  17. end
  18.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Октябрь 27, 2017, 03:43:10 pm
По lua скриптам - есть спец. раздел (http://forum.gtabuilder.ru/index.php?board=28.0).

Цитировать
при 6 прохождении начала вылетать с этой ошибкой странно
Ну тут точно проблема в коде, судя по скрину. Но не факт, что в коде миссии - пробуй перепроходить, удалив все сторонние скрипты. Вообще, тестирование - это очень времязатратный процесс, поэтому тут уж вряд ли тебе кто-то поможет. Тратить большую часть времени на тесты -  это бремя скриптера/программиста.

Цитировать
Есть вопрос в чем отличия между этими опкодами
Ни в чем, это одинаковые опкоды. Просто изначально сделали второй, а первый добавили для упрощения переноса скриптов из SA.

Цитировать
Plugin SDK. Это круто! Но что это такое? Как пользоваться? Что может? не понятно. Боюсь писать туда, бан получу за тупость еще.
Если вкратце, то с помощью этого упрощается написание плагинов для III/VC/SA на языке C++. Всё остальное написано тут (http://forum.gtabuilder.ru/index.php?topic=337.0).

Цитировать
Написал скрипт
А теперь скомпилируй и декомпилируй его. И увидишь, что в конце скрипт "обрублен", что вызовет краш игры, если игрок не существует.
Всегда проверяй декомпиляцией, чтобы отсечь такие элементарные ошибки.
1) Если хочешь командой while создать бесконечный цикл в начале - делай это с помощью while true.
Далее.
2) player.Defined работает ТОЛЬКО с $PLAYER_CHAR, а не $PLAYER_ACTOR!
3) Проверяй, что клавиша не только нажата, но и отпущена! Иначе, если игрок не отпустит клавишу - скрипт будет выполняться множество раз подряд зря.
4) Опкод 0AAB - это проверка существования файла. А ты написал её как обычную команду.


Цитировать
А как записать координаты в одну строчку? Чтобы удобнее копировать их.


Короче, с учетом вышесказанного, вот готовый код:
Код: Text
  1. {$CLEO}
  2. 0000:                    
  3. while true
  4.     wait 0
  5.     if  player.Defined($PLAYER_CHAR)
  6.     then
  7.         if  80E0: not player $PLAYER_CHAR driving
  8.         then      
  9.             if  0AB0: key_pressed 0x46 // f
  10.             then
  11.                 while 0AB0: key_pressed 0x46 // f
  12.                     wait 0
  13.                 end                  
  14.                 if  0A9A: 0@ = openfile "CLEO/coordinate.ini" mode 0x77  // IF and SET
  15.                 then
  16.                     0054: store_player $PLAYER_CHAR position_to 1@ 2@ 3@
  17.                     0AD9: write_formatted_text "XYZ: %f %f %f" in_file 0@ 1@ 2@ 3@
  18.                     0A9B: closefile 0@
  19.                     0ACD: show_text_high_priority "~r~coordinates recorded" time 1000  
  20.                 end  
  21.             end
  22.         end
  23.     end
  24. end
Название: Re: Помощь с CLEO
Отправлено: egor230 от Октябрь 30, 2017, 09:23:04 pm
Уважаемый Shagg благодарю за Вашу отзывчивость и терпение. Всегда хотел стать программистом. Вы столько много мне помогайте.
Есть Вы не против, буду выкладывать свои поделки по lua.
С опытом приходит перфекционизм в деле написании скриптов, стремление сделать код кратким, понятным и легко изменяемым.
На помощь приходят scm-функций, например, 0AB1: call_scm_func @fun 3 #HMOCA 4 #MINIGUN 1@ . передаем модель, а ее id функция находит сама- очень удобно.
Вы правы, большую часть времени уходит на тестирования, скрипт перезагрузки скрипта сильно. Всегда убираю построение скрипты, чтобы не мешались.         
благодарю Вас за объяснение об этих двух опкодах.
Очень интересна разница между опкодами создающими и завершающими поток.
Нюансы их применение.
Код: Javascript
  1. 0A92: create_custom_thread "ShowTextBox.s"
  2. 00D7: create_thread @HJ without_parameters
  3. 05DE: create_custom_thread 'ct.s'
  4. 03A4: name_thread 'MAIN'
  5.  
  6. 004E: end_thread
  7. 0A93: end_custom_thread
  8. 0459: end_thread_named 'mythread'
  9. 0ABA: end_custom_thread_named 'BENZIN'
  10.  

Хотел бы научиться писать плагины на C++, жаль пока нет инструкции в видео формате…..
Декомпиляцией поможет отсечь элементарные ошибки в коде.

С бесконечными циклами, пока работаю хуже, чем с метками.
Увидел у Vital на канале, что он использовал.
Код: Javascript
  1. 0000:                    
  2. while player.Defined($PLAYER_CHAR)
  3. вместо
  4.  
  5. 0000:                    
  6. while true
  7.     wait 0
  8.     if  player.Defined($PLAYER_CHAR)
  9.  
так короче на один end.
Думал, опкод 0AB0 позволяет избавить от проверки отпущена клавиша.
Опкод 0AAB нужно записывать как условия.
Спасибо Вам огромное за скрипт.
Есть вопросы.
Вот опкод 0A9A нашел описание к нему, может новичкам поможет.
Код: Javascript
  1.  0A9A: 0@ = openfile "CLEO/coordinate.ini" mode 0x77  // IF and SET
  2.  
  3. Открывает файл для чтения и записи. Этот код операции может использоваться как условие: если файл не был открыт, он возвращает False, иначе True.
  4.  
  5. Параметры:
  6. 1 = переменная для хранения дескриптора файла
  7. 2 = имя файла. Если путь относительный, файл открыт в соответствии с текущим каталогом (код операции 0A99).
  8. 3 = режим открытия файла:
  9. 0x6272 - открывает двоичный файл для чтения
  10. 0x72 - открывает текстовый файл для чтения
  11. 0x6277 - открывает двоичный файл для записи
  12. 0x77 - открывает текстовый файл для записи
  13.  
Насчет опкода 0AD9: write_formatted_text "XYZ: %f %f %f" in_file 0@ 1@ 2@ 3@
Почему пишется %f %f %f? Что это дает и почему именно так?
Вот переписал миссию, она работает, проверил десятки раз.
Помогло избавиться от вылетов при подбирание денег 004E: end_thread // Завершение потока, но при провале или выполнении миссии, приходится перезагружать сэйв. Думаю решить эту проблему перезагрузкой из другого файла, методом  0A9A.
Также интересное наблюдение, если создать более двух врагов, игра вылетает с ошибкой http://pixs.ru/showimage/net1JPG_8268775_28118726.jpg (http://pixs.ru/showimage/net1JPG_8268775_28118726.jpg) поэтому их закомментировал. 
 
Код: Javascript
  1. {$CLEO}
  2. 0000:        
  3. const
  4. x = -1150.94 // Координаты значка миссии
  5. y = -1418.94 // Координаты значка миссии
  6. z = 11.5395 // Координаты значка миссии
  7. a = -1101.47 // Координаты пикапа
  8. b = -1330.97 // Координаты пикапа
  9. c = 11.3695 // Координаты пикапа  
  10. d = -1064.83 // Координаты педа
  11. e = -1445.94 // Координаты педа
  12. f = 11.7444 // Координаты педа
  13. m = 1000 // Кол-во денег педа  
  14. h = 200 // Количество жизни актера  
  15. g = 169.2093 // Задать угол актеру  
  16. end
  17. :MISSION_1    
  18. wait 0                                    
  19. if 0256: player $player_char defined
  20. jf @MISSION_1                                                    
  21. Thread 'TEST'  
  22. if and
  23. 0038: $onmission == 0 // integer values
  24. 0ADC: test_cheat "BLK" // включить миссию  
  25. jf @MISSION_1    
  26. :MISSION_START // Старт миссии          
  27. 03CB: load_scene d e f // быстрая прогрузка местности, чтобы не видеть мерзкие LODы
  28. fade 0 300 // Затемнение экрана      
  29. gosub @begin // Начало      
  30. gosub @pickup // Запрос модели кейса                  
  31. 0AB1: call_scm_func @fun 3 #HMOCA 4 #MINIGUN 1@      
  32. 0AB1: call_scm_func @fun 3 #VICE4 4 #M60 2@          
  33. //0AB1: call_scm_func @fun 3 #VICE3 4 #M60 3@
  34. //0AB1: call_scm_func @fun 3 #VICE2 4 #M60 4@        
  35. 0213: 14@ = create_pickup 335 type 1 at a b c // Создать пикап кейса  
  36. 03DC: 15@ = create_marker_above_pickup 14@ // Создать маркер над пикапом кейса  
  37. 0055: put_player $player_char at x y z // Поставить игрока на точку    
  38. gosub @delay // Задержка        
  39. fade 1 300 // Убрать затемение экрана          
  40. :player  // Условия провал миссии  
  41. wait 0
  42. if 8256: not player $player_char defined
  43. jf @actor
  44. gosub @MISSION_FAILED // Провал миссии    
  45. :actor // Условия прохождение миссии
  46. if and        
  47. 0118: actor 1@ dead      
  48. 0118: actor 2@ dead
  49. //0118: actor 3@ dead
  50. //0118: actor 4@ dead
  51. pickup.Picked_up(14@)    
  52. jf @player  
  53. gosub @MISSION_COMPLETED // Миссия выполнена  
  54. :MISSION_COMPLETED // Миссия выполнена
  55. 01E3: text_1number_styled 'M_PASS' number 1000 time 3000 style 1  // ˜© ?po¦?? ?ty m?cc?«! $~1~    
  56. 0394: play_music 1                        
  57. Player.Money($PLAYER_CHAR) += 1000            
  58. gosub @MISSION_END // Завершение миссии  
  59. return  
  60. :MISSION_FAILED // Провал миссии
  61. 00BA: text_styled 'M_FAIL' 3000 ms 1 // Надпись провал миссии    
  62. gosub @MISSION_END // Завершение миссии
  63. return  
  64. :MISSION_END // Завершение миссии                
  65. 0164: disable_marker 15@                
  66. 0215: destroy_pickup 14@        
  67. 0249: release_model 355      
  68. 0249: release_model #HMOCA          
  69. 0249: release_model #VICE4        
  70. //0249: release_model #VICE3          
  71. //0249: release_model #VICE2            
  72. 01C2: remove_references_to_actor 1@    
  73. 01C2: remove_references_to_actor 2@  
  74. //01C2: remove_references_to_actor 3@    
  75. //01C2: remove_references_to_actor 4@                
  76. 0004: $onmission = 0 // integer values
  77. 00D8: mission_cleanup    
  78. 004E: end_thread // Завершение потока  
  79. jump @MISSION_1 // Чтобы можно пройти заново    
  80. return            
  81. :begin              
  82. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1  
  83. 0004: $onmission = 1 // мисия запущена                                                        
  84. wait 0
  85. return                                        
  86. :fun
  87. repeat
  88. wait 0
  89. 0247: request_model 0@ // Запрос модели таксиста
  90. 0247: request_model 2@ // Запрос модели минигана    
  91. 038B: load_requested_models          
  92. gosub @delay              
  93. until gosub @load
  94. 5@ = actor.Create(1@, 0@, 0, 0, 0)    
  95. 000E: 2@ -= 257 // Установить номер оружие
  96. 01B2: give_actor 5@ weapon 2@ ammo 9999    
  97. 02E2: set_actor 5@ weapon_accuracy_to 100 // Установка точности стрельбы для актера
  98. 000A: 2@ += 257 // Установить модель оружие
  99. actor.Angle(5@) = g // Задать угол актеру  
  100. actor.Health(5@) = h // Установить кол-во здоровье педа                
  101. 03FE: set actor 5@ money m // Кол-во денег педа  
  102. 01CA: actor 5@ kill_player $player_char // Актер хочет убить игрока    
  103. Model.Destroy(0@)      
  104. Model.Destroy(2@)      
  105. actor.PutAt(5@, d, e, f) // Поставить врага на точку      
  106. 0AB2: ret  1 5@
  107. :delay
  108. 16@ = 0
  109. repeat
  110. wait 0                
  111. until 0029: 16@ >= 900 // задержка  
  112. return
  113. :load
  114. if and
  115. Model.Available(0@)
  116. Model.Available(2@)
  117. jf @load
  118. return
  119. :pickup
  120. wait 0
  121. 0247: request_model 335  
  122. 038B: load_requested_models          
  123. if 0248: model 335 available
  124. jf @pickup
  125. return
  126.  
Название: Re: Помощь с CLEO
Отправлено: Shagg_E от Ноябрь 11, 2017, 01:48:10 am
Цитировать
Есть Вы не против, буду выкладывать свои поделки по lua.
Да я не против) Главное - чтобы в соответствующем разделе ;)

Цитировать
Очень интересна разница между опкодами создающими и завершающими поток.
Код: Text
  1. 0A92: create_custom_thread "ShowTextBox.s"
этот опкод запускает .s скрипт. Это обычный CLEO-скрипт, но с расширением ".s". Разница в том, что .s скрипты не запускаются автоматически при старте игры(в отличии от .cs скриптов). Т.е. данный способ используется, чтобы запустить какой-то скрипт ровно тогда, когда тебе нужно. Просто смени расширение нужного скрипта на ".s" и используй данный опкод запуска в другом скрипте.

Код: Text
  1. 00D7: create_thread @HJ without_parameters
Обычный create_thread(опкод 004F) в main.scm может вызываться с параметрами, точно так же, как как scm функция, а этот опкод - нет. Зато в потоках, которые создаются этим опкодом, в отличии от 004F, может вызываться опкод
Код: Text
  1. 00D8: mission_cleanup
, который "подчищает" некоторые действия, созданные другими опкодами(так же, как в миссиях). Подробнее тут (https://www.gtamodding.com/wiki/00D8).

Код: Text
  1. 05DE: create_custom_thread 'ct.s'
То же самое, что и опкод 0A92.

Код: Text
  1. 03A4: name_thread 'MAIN'
Задает имя потоку/CLEO-скрипту.
 
Код: Text
  1. 004E: end_thread
Завершает текущий поток в main.scm.

Код: Text
  1. 0A93: end_custom_thread
Завершает текущий CLEO-скрипт.

Код: Text
  1. 0459: end_thread_named 'mythread'
Завершает в main.scm поток с именем "mythread"(именно для этого и нужно объявлять имена потокам опкодом 03A4).

Код: Text
  1. 0ABA: end_custom_thread_named 'BENZIN'
Завершает CLEO-скрипт с именем "BENZIN"(если у того есть имя, заданное опкодом 03A4).

Цитировать
Хотел бы научиться писать плагины на C++, жаль пока нет инструкции в видео формате…..
Это не ко мне(я сам пока с этим профан). Но по C++ есть достаточно материала в интернете(да и на этом сайте, кстати).

Цитировать
Увидел у Vital на канале, что он использовал.
Я знаю одно - при декомпиляции это превращается в белиберду, значит тут что-то не так. Проверь сам и увидишь. Я уже писал, что с высокоуровневым кодингом в scm-скриптинге могут быть большие проблемы, поэтому сам им не пользуюсь, и помочь с этим не могу.

Цитировать
Насчет опкода 0AD9: write_formatted_text "XYZ: %f %f %f" in_file 0@ 1@ 2@ 3@
Почему пишется %f %f %f? Что это дает и почему именно так?
%f означает, что вместо этого символа будет вставлено float число(дробное), которое записано далее(переменная 1@).
Т.е. если это написано 3 раза - это означает, что будут вставлены 3 float числа, и они там передаются в переменные 1@ 2@ 3@.
Т.е. запись
Код: Text
  1. 1@ = 1.2
  2. 2@ = 4.5
  3. 3@ = 3.7
  4. 0AD9: write_formatted_text "XYZ: %f %f %f" in_file 0@ 1@ 2@ 3@
означает, что в файл 0@ запишется текст:
XYZ: 1.2 4.5 3.7Также можно вставлять не только float, но и integer. Для этого вместо %f нужно писать %d
В некоторых случаях также можно добавлять целые слова или строки: %s

Цитировать
Помогло избавиться от вылетов при подбирание денег 004E: end_thread // Завершение потока, но при провале или выполнении миссии, приходится перезагружать сэйв. Думаю решить эту проблему перезагрузкой из другого файла, методом  0A9A.
Зачем, если можно вместо завершения(end_thread) скрипта сделать "прыжок"(jump) на его начало?

По поводу миссии - сожалею, но тут я не могу помочь. Я уже писал об этом когда-то: что придет время, когда этот час настанет(тавтология). Твой код слишком объемный, так что я буду слишком долго в него вникать. Ты сам видел - я заходил на форум несколько раз с момента написания тобой этого сообщения, но отвечаю лишь сейчас.
У меня патологическая нехватка времени.
Помимо объёмности, твой код написан совершенно не так, как писал бы его я. Не в смысле "хуже" или "лучше", а в смысле в другом стиле. У каждого скриптера свой стиль, каждый пишет так, как удобно ему, а не другим. Нет единого стандарта и это мешает взаимопониманию.
Мне кажется, я рассказал тебе практически всё, что знал сам, а дальше дело уже за тобой. Ну и ребятами с sannybuilder (https://sannybuilder.com/forums/index.php).
Могу только посредством беглого анализа сказать, что в записи
Код: Text
  1. 004E: end_thread // Завершение потока  
  2. jump @MISSION_1 // Чтобы можно пройти заново    
  3. return
последние 2 строчки не выполняются, поскольку первая строчка завершает весь скрипт. Также в CLEO-скриптах вместо опкода 004E юзается 0A93(о котором я написал в начале этого сообщения).
Даже если ты удалишь первую строчку, то опять же - последняя никогда не выполнится, поскольку jump - это безоговорочный "прыжок", без выполнения кода, написанного ниже.
Т.е., чтобы выполнился return - тебе нужно удалить 2 верхние строчки.
Название: Re: Помощь с CLEO
Отправлено: egor230 от Ноябрь 21, 2017, 07:50:32 am
Спасибо огромное уважаемый Shagg_E за Ваш информативный ответ, очень рад нашему общению на форуме в таком формате.
Прошу прощение за долгий ответ, дел куча, а времени мало.
Хорошо, буду выкладывать, жаль по lua не так много уроков как по c++.
Скрипты  с расширением ".s", толкнули к интересной мысли. Их можно использовать как вспомогательные инструменты для обхода ограничений в 16.
Врагов создаю в BOMB.s, если враги убиты в ini файл пишет 1. А в основном поток идет проверка записан в ini файл 1. 
Не совсем понятно про 00D7 это поток можно вызвать опкодом.
Спасибо огромное за подробное объяснение про потоки.
C++ пока это для меня темным лес. Пока по cleo еще много вопросов.
Высокоуровневый скриптинг, можно использовать, если работает идеально на низкоуровневом.
Благодарю Вас за понятного объяснение про запись в ini файл, теперь лимит в перемен можно обойти.
cleo миссии имеют ряд особенности, мы не можем писать cm миссии как для sa.
Почему опкод 004E: end_thread помогает избежать вылетов, тут надо еще разбираться. Благодарю за верное замечание, переместил его.
Да, нехватка времени эта главная проблема нашего времени.
Прекрасно понимаю, что мой код миссии кривой, его можно улучшать, по мере накопление опыта.
Из-за свободы в написание скриптов, трудно разобраться в чужом скрипте, хорошо в этом помогают комментарии.
Спасибо за подсказку насчет опкода 0A93.
Есть еще один вопрос.
Существуют опкоды.
0297: clear_rampage_kills очистить все убийства
0298: 0@ = rampage_kills 83 получить сколько игрок убил педов.
Пытался сделать счетчик убийств.
Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :k_1
  4. wait 0
  5. if 05EE: key_pressed 72
  6. jf @k_1
  7. 0297: clear_rampage_kills
  8. 0298: 0@ = rampage_kills 83          
  9. :k_2          
  10. wait 0
  11. if 0039: 0@ == 1 // integer values
  12. jf @k_2
  13. 0acd: show_text_high_priority "da" time 1000 // убил одного вывел сообщение "da"
  14. jump @k_1
  15.  
думал использовать в миссиях.
Вот миссия.
 
Код: Javascript
  1. {$CLEO}
  2. 0000:        
  3. const
  4. x = -1150.94 // Координаты значка миссии
  5. y = -1418.94 // Координаты значка миссии
  6. z = 11.5395 // Координаты значка миссии
  7. a = -1101.47 // Координаты пикапа
  8. b = -1330.97 // Координаты пикапа
  9. c = 11.3695 // Координаты пикапа  
  10. d = -1064.83 // Координаты педа
  11. e = -1445.94 // Координаты педа
  12. f = 11.7444 // Координаты педа    
  13. m = 1000 // Кол-во денег педа  
  14. h = 200 // Количество жизни актера  
  15. g = 169.2093 // Задать угол актеру  
  16. end
  17. :MISSION_1    
  18. wait 0                                    
  19. if 0256: player $player_char defined
  20. jf @MISSION_1                                                    
  21. Thread 'TEST'  
  22. if and
  23. 0038: $onmission == 0 // integer values
  24. 0ADC: test_cheat "BLK" // включить миссию  
  25. jf @MISSION_1    
  26. :MISSION_START // Старт миссии          
  27. 03CB: load_scene d e f // быстрая прогрузка местности, чтобы не видеть мерзкие LODы
  28. fade 0 300 // Затемнение экрана      
  29. gosub @begin // Начало      
  30. gosub @pickup // Запрос модели кейса    
  31. 0AB1: call_scm_func @fun 3 #VICE4 4 #flame 1@                
  32. 0213: 14@ = create_pickup 335 type 1 at a b c // Создать пикап кейса  
  33. 03DC: 15@ = create_marker_above_pickup 14@ // Создать маркер над пикапом кейса  
  34. 0055: put_player $player_char at x y z // Поставить игрока на точку    
  35. gosub @delay // Задержка        
  36. fade 1 300 // Убрать затемение экрана  
  37. 0acd: show_text_high_priority "~p~ Kill the enemy, take the case!!!" time 7000 // Надпись на экрана          
  38. 0A92: create_custom_thread "BOMB.s" // Запустить скрипт с врагами  
  39. :player  // Условия провал миссии  
  40. wait 0
  41. if 8256: not player $player_char defined
  42. jf @actor
  43. gosub @MISSION_FAILED // Провал миссии    
  44. :actor // Условия прохождение миссии
  45. if and
  46. 0118: actor 1@ dead
  47. pickup.Picked_up(14@)    
  48. jf @player            
  49. 0A9A: 13@ = openfile "CLEO\Set.ini" mode "rt" // Открыть ini файл в режиме чтение      
  50. 0ADA: 12@ = scan_file 13@ format "%d" 11@ //IF and SET
  51. if
  52. 0039: 11@ == 1 // integer values
  53. jf @player                          
  54. 0A9B: closefile 13@  
  55. 0A9A: 13@ = openfile "CLEO\Set.ini" mode 0x77  // Открыть ini файл в режиме записи    
  56. 0006: 11@ = 0 // integer values            
  57. 0AD9: write_formatted_text "%d" in_file 13@ 11@
  58. 0A9B: closefile 13@  
  59. gosub @MISSION_COMPLETED // Миссия выполнена  
  60. :MISSION_COMPLETED // Миссия выполнена
  61. 01E3: text_1number_styled 'M_PASS' number 1000 time 3000 style 1  // ˜© ?po¦?? ?ty m?cc?«! $~1~    
  62. 0394: play_music 1                        
  63. Player.Money($PLAYER_CHAR) += 1000            
  64. gosub @MISSION_END // Завершение миссии  
  65. return  
  66. :MISSION_FAILED // Провал миссии
  67. 00BA: text_styled 'M_FAIL' 3000 ms 1 // Надпись провал миссии    
  68. gosub @MISSION_END // Завершение миссии
  69. return  
  70. :MISSION_END // Завершение миссии  
  71. 0249: release_model #VICE4
  72. 01C2: remove_references_to_actor 1@              
  73. 0164: disable_marker 15@                
  74. 0215: destroy_pickup 14@        
  75. 0249: release_model 355            
  76. 0395: clear_area 1 at x y range z 100.0 // Очистка местностти  
  77. 0395: clear_area 0 at x y range z 100.0  
  78. 0004: $onmission = 0 // integer values
  79. 00D8: mission_cleanup    
  80. 0ABA: end_custom_thread_named "BOMB.s"      
  81. jump @MISSION_1 // Чтобы можно пройти заново
  82. return