Автор Тема: Помощь с CLEO  (Прочитано 47440 раз)

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #30 : Август 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
« Последнее редактирование: Август 06, 2017, 09:15:33 pm от egor230 »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #31 : Август 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


Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #32 : Август 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 полностью, чтобы понимать, что ты кодишь. Или хотя бы интересуйся значением каждой команды, которую используешь в своих скриптах, а не бездумно копируй. Лично с моей стороны пропадает всякое желание и силы помогать, когда с твоей стороны не видно желание учиться.
« Последнее редактирование: Август 27, 2017, 01:01:29 am от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #33 : Сентябрь 05, 2017, 05:15:13 pm »
Здравствуйте, уважаемый  Shagg_E
Огромное спасибо за Ваш ответ.
Директиву  "{$NOSOURCE}" использует Vital 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

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #34 : Сентябрь 09, 2017, 12:35:45 am »
Директива "{$NOSOURCE}" наоборот мешает тому, чтобы было "легко вносить изменения". При декомпиляции скрипта последняя версия Sanny Builder дает выбор - открыть исходный код, включенный в скрипт, или же декомпилировать скрипт. Именно при первом варианте как раз-таки "легко вносить изменения"(очевидно же), однако если в скрипт была внесена директива "{$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://gtaforums.com/topic/881281-lethal-slices/
« Последнее редактирование: Сентябрь 09, 2017, 12:47:34 am от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #35 : Сентябрь 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. Пока не умею пользоваться таймерами в циклах, но буду учиться.   
« Последнее редактирование: Декабрь 08, 2017, 01:55:07 pm от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #36 : Сентябрь 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


В игре не проверял, так что мог что-нибудь упустить...
« Последнее редактирование: Сентябрь 10, 2017, 11:47:00 pm от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #37 : Сентябрь 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   
« Последнее редактирование: Сентябрь 11, 2017, 11:18:30 pm от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #38 : Сентябрь 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

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #39 : Сентябрь 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)
тогда слишком громоздкий код получится

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #40 : Сентябрь 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 табуляцию влево.
« Последнее редактирование: Сентябрь 12, 2017, 02:19:40 am от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #41 : Сентябрь 12, 2017, 07:30:53 am »
Спасибо огромное уважаемый Shagg_E
Все работает идеальное!
Я в неописуемым восторге от Вашего мастерства! Как здорово, что Вы мне нашли время ответить. Полдня ломал голову почему SCM функция не работает. Вы в 2 счета сумею заставить ее работать!!!! Восхищаюсь Вами.   

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #42 : Сентябрь 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@                   
« Последнее редактирование: Сентябрь 12, 2017, 02:36:14 pm от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #43 : Сентябрь 12, 2017, 04:51:22 pm »
Про scm-функции я подробно писал тут.

К сожалению, времени на примеры у меня больше не осталось, так что я надеюсь, что ты разберешься с написанным в том посте.
« Последнее редактирование: Сентябрь 12, 2017, 04:53:56 pm от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #44 : Сентябрь 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