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

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #90 : Февраль 10, 2018, 04:55:47 pm »
есть вопрос. Как использовать такие адреса памяти?
0x703997
Выбранный индекс меню [байт]. Сообщение GTAForums
•   00 - Статистика
•   01 - Начало игры
•   03 - Настройка звука
•   04 - Дисплей
•   05 - Язык
•   06 - Карта

Читать его, чтобы узнать, в каком меню находится в данный момент игрок. Но это имеет смысл только в плагинах, поскольку CLEO не работает в меню. Или в MMS.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #91 : Февраль 14, 2018, 02:52:22 pm »
Спасибо уважаемый Shagg_E за Ваш ответ.
Да cleo изжил себя, надо учится писать плагины, чтобы работать с памятью.
На питоне можно писать плагины или только на с++?
Вот написал скрипт- Томми стоит на летящем самолете не падая. https://www.youtube.com/watch?v=BYLfgRrZCb0&feature=youtu.be
Есть проблема, она постоянно снижается, не удерживая высоту. Подскажите, пожалуйста, как решить  эту проблему?
   
Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :1
  4. wait 0  
  5. if 0AB0: key_pressed 0x42 // b                                                
  6. jf @1        
  7. 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 4.2 0.0
  8. 0AB1: call_scm_func @fun 4 #SKIMMER 1@ 2@ 3@ 0@ 4@    
  9. 00AA: store_car 0@ position_to 1@ 2@ 3@
  10. :4  
  11.  wait 0                        
  12. 00AA: store_car 0@ position_to 1@ 2@ 3@
  13. 000B: 1@ += 0.013357 // floating-point values
  14. 000B: 2@ += 0.627942 // floating-point values
  15. 000B: 3@ += 0.510589
  16. 0055: put_player $player_char at 1@ 2@ 3@
  17. 0171: set_player $player_char z_angle_to 4@
  18. if 0AB0: key_pressed 0x26 // up                              
  19. jf @3                      
  20. 000A: 3@ += 15 // integer values    
  21. car.PutAt(0@, 1@ 2@ 3@)                  
  22. :3
  23. if 0AB0: key_pressed 0x28 // down      
  24. jf @5        
  25. 0acd: show_text_high_priority "time" time 1000  
  26. 04C4: create_coordinate 1@ 2@ 3@ from_actor $PLAYER_ACTOR offset 0.0 90.0 100.0
  27. //|0012: 3@ *= 20
  28. :5
  29. 04D2: set_plane 0@ fly_autopilot_around_point 1@ 2@ 3@ 30  
  30. if 00F8: player $player_char stopped_in_sphere 0 near_point 1@ 2@ 3@  radius 3.0 3.0 1.5
  31. jf @4
  32. :2
  33. if 0AB0: key_pressed 0x4e // b                                                
  34. jf @4                          
  35. jump @1  
  36. :41
  37. wait 0
  38. return
  39. :fun
  40. repeat
  41. wait 0
  42. Model.Load(0@)                    
  43. 038B: load_requested_models        
  44. gosub @delay
  45. until Model.Available(0@)
  46. 00A5: 4@ = create_car 0@ at 1@ 2@ 3@
  47. Model.Destroy(0@)            
  48. 0174: 5@ = car 4@ z_angle
  49. 0AB2: ret 2 4@ 5@
  50. gosub @delay
  51. :delay
  52. 16@ = 0
  53. repeat
  54. wait 0                
  55. until 0029: 16@ >= 100 // задержка
  56. return
  57.  

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #92 : Февраль 15, 2018, 10:44:45 pm »
Цитировать
На питоне можно писать плагины или только на с++?
Не знаю - не пользуюсь им(питоном). Плагины лучше писать строго на c++ . Ведь когда ты забросишь Вайс - знания по c++ останутся, а этот язык будет актуален еще долгие годы.

Цитировать
Есть проблема, она постоянно снижается, не удерживая высоту. Подскажите, пожалуйста, как решить  эту проблему?
Скорее всего проблема в опкоде автопилота(04D2), но не уверен(не пользовался им). Я предпочитаю задавать скорость и направление движения "вручную"(задавая точные значения в адреса памяти).

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #93 : Февраль 18, 2018, 02:11:14 pm »
Уважаемый Shagg благодарю, что общайтесь со мной.
C++ очень интересный и мощный язык программирования. Жаль всегда не хватает времени. Дочь родилась.
Опкод 04D2 при скорости 56 снижается, а при 57 набирает высоту.
Вот бы научиться работать с ida базой и адресами памяти.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #94 : Февраль 21, 2018, 08:44:29 pm »
Здравствуйте, всем.
Подскажите, пожалуйста, адрес памяти, который устанавливает в машину определенный тип бомбы. Конечно, можно написать скрипт бомбы, но легче сделать это через память.
нашел только это
+ 0x25 - [1 байт] - тип бомбы (3 = дистанционный, 2 = зажигание двигателя, 1 = время, 0 = нет)
но как использовать? не знаю.

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #95 : Февраль 21, 2018, 09:44:20 pm »
нашел только это
+ 0x25 - [1 байт] - тип бомбы (3 = дистанционный, 2 = зажигание двигателя, 1 = время, 0 = нет)
но как использовать? не знаю.
+0x25 - это смещение от какого-то адреса памяти. От какого адреса - это зависит от того, откуда взята эта информация.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #96 : Февраль 22, 2018, 06:12:26 am »
Спасибо за Ваш ответ Уважаемый Shagg.
Данная информация взята с сайта http://www.gtamodding.com/wiki/Memory_Addresses_(VC)
Вот этот кусочек https://prnt.sc/ii3nbj
Может есть еще другой адрес??

Cделал так, зависает. Также не нашел адрес памяти гаража кэма.
Подскажите, пожалуйста.
Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :1
  4. wait 0
  5. if 0AB0: key_pressed 0x46 // f
  6. jf @1  
  7. 05E0: 0@ = read_memory 0x7D74B8 size 4 virtual_protect 0
  8. 0@ + = 0x25  
  9. 05DF: write_memory 0@  size 1 value 1 virtual_protect 0
  10. jump @1                    
  11.  
  12.  

Даже чтение адреса, приводит к вылету.

Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :1
  4. wait 0
  5. if 0AB0: key_pressed 0x46 // f
  6. jf @1  
  7. 05E0: 0@ = read_memory 0x7D74B8 size 1 virtual_protect 0
  8. 0@ + = 0x25   // сброс бомбы автомобиля
  9. 05E0: 1@ = read_memory 0@ size 1 virtual_protect 0  
  10. jump @1                    
  11.  
  12.  


Попытался сделать гараж, но он не работает в качестве перекраске.
Где я ошибся? 
Код: Javascript
  1. {$CLEO}              
  2. 0000:
  3. :1
  4. wait 0
  5. if 0AB0: key_pressed 0x41 // a
  6. jf @1  
  7. 0219: 0@ = create_garage_type 5 door -837.738 -902.016 11.103 to -852.820 -902.8630 11.103 depth -837.738 -914.941711    
  8. gosub @open
  9. jump @1                    
  10. :open
  11. 0AE3: 3@ = random_object_near_point -836.77 -901.84 12.05 in_radius 5.0 find_next 0 //IF and SET    
  12. for 4@ = 1 to 100
  13. 034E: move_object 3@ to -837.13 -901.67 15.95 speed 0.0 0.0 0.05 collision_check 0
  14. wait 4
  15. end  
  16. return      
  17.  
  18.  



« Последнее редактирование: Февраль 22, 2018, 10:26:41 pm от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #97 : Февраль 24, 2018, 01:29:25 pm »
Цитировать
Вот этот кусочек

Это не то. Глянь выше в этом списке - это относится к гаражам. Вернее - к машинам, находящимся в гаражах. В гараже, который ты пытался править, видимо, не было машины, поэтому ты получил вылет.

Правильный оффсет - это:
Цитировать
0x1FE    byte    (& 7) car bomb state


Вообще, в Трехе был опкод, проверяющий тип бомбы в транспорте, а также опкод, устанавливающий нужный тип бомбы на авто, но из Вайса их вырезали.
Однако в этих же статьях по этим опкодам приводятся варианты scm-функций, которые можно использовать вместо этих опкодов.
Я накатал тестовый код, который приведен в конце сообщения.


Цитировать
Также не нашел адрес памяти гаража кэма.

Он "ненастоящий". Т.е. в оригинальной игре в миссии ограбления дверь гаража открывается "вручную" путем "ручного" передвижения гаражной двери. Чтобы гараж был "рабочим" и автоматическим - нужно его обозначить("создать") и ничего двигать не придется.


Касаемо создания гаражей. Там всё просто.
Опкод 0219 создает гараж опроделенного типа(5 - покраска) в определенном месте. Если в указанной зоне есть гаражная дверь - она автоматически будет открываться/закрываться.

Самое важное - это правильно обозначить координаты.

Возьмем один из стандартных гаражей:
Цитировать
0219: $681 = create_garage_type 5 door -914.129 -1263.54 10.706 to -906.3 -1266.9 14.421 depth -907.137 -1246.626


$681 - хэндл гаража. В принципе он нужен лишь для принудительного открытия/закрытия или удаления гаража.

5 - тип гаража.

Первые xyz координаты - это передний левый нижний угол гаража:


Вторые xyz координаты - это передний правый верхний угол гаража:


Последние xy координаты - это "глубина", т.е. задний левый угол гаража:


Пример, "активирующий" гараж Кэма, я также привел ниже.

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

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


Вот код, который при вводе чита "CBNPNS" ставит бомбу 1 типа на машину игрока, если тот сидит в транспорте и никакой бомбы в авто не установлено. Также активируется гараж Кэма. В конце идут необходимые scm-функции.
Этот же код представлен в аттаче.

Код: Text
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. thread 'CBNPNS'
  5.  
  6. :CBNPNS_01
  7. wait 0
  8. if and
  9.    Player.Defined($PLAYER_CHAR)
  10. 0ADC: test_cheat "CBNPNS"
  11. jf @CBNPNS_01
  12. if
  13. 00E0:   player $PLAYER_CHAR driving
  14. jf @CBNPNS_02
  15. 03C1: 0@ = player $PLAYER_CHAR car_no_save
  16. // car struct + 0x1FE (byte & 7) - car bomb state
  17. //
  18. //0 -   CARBOMB_NONE               No bomb
  19. //1 -   CARBOMB_TIMED              Inactive timed bomb, can be obtained from garage type 2
  20. //2 -   CARBOMB_ONIGNITION         Inactive ignition bomb, can be obtained from garage type 3
  21. //3 -   CARBOMB_REMOTE             Remote detonation bomb, can be obtained from garage type 4
  22. //4 -   CARBOMB_TIMEDACTIVE        Active timed bomb, activated from bomb type 1
  23. //5 -   CARBOMB_ONIGNITIONACTIVE   Active ignition bomb, activated from bomb type 2
  24. //
  25. if
  26. 0AB1: call_scm_func @opcode_0228 2 car_handle 0@ bomb_stage 0 // check if car bomb state == 0
  27. jf @CBNPNS_02
  28. 0AB1: call_scm_func @opcode_0242 2 car_handle 0@ bomb_type 1 // sets car bomb type 1
  29.  
  30. :CBNPNS_02
  31. 0219: 15@ = create_garage_type 5 door -836.738 -915.016 9.8 to -836.738 -898.316 13.4 depth -853.238 -905.016
  32. 0ACE: show_formatted_text_box "~h~The ~t~bomb ~h~has been ~x~installed ~h~and ~t~Kam's garage ~h~has been ~x~activated."
  33. jump @CBNPNS_01
  34.  
  35.  
  36. //-------------------------------------------------------------------------------------
  37. // SCM FUNCTIONS:
  38. //-------------------------------------------------------------------------------------
  39.  
  40. :opcode_0228
  41. // 0@ - input param (car handle)
  42. // 1@ - input param (bomb stage)
  43. 05E7: 0@ = car 0@ struct
  44. 0@ += 0x1FE  // car bomb offset
  45. 05E0: 0@ = read_memory 0@ size 1 virtual_protect 0
  46. 05F9: 0@ = 0@ AND 7
  47. 003B:   0@ == 1@  // check bomb stage in car against input
  48. 05F6: ret 0
  49.  
  50. :opcode_0242
  51. // 0@ - input param (car handle)
  52. // 1@ - input param (bomb stage)
  53. 05E7: 0@ = car 0@ struct
  54. 0@ += 0x1FE  // car bomb offset
  55. 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0  // store previous value
  56. 05F9: 1@ = 1@ AND 7  // keep only the first three bits from input param
  57. 05F9: 2@ = 2@ AND 0xF8  // exclude the first three bits in stored value
  58. 05FA: 2@ = 2@ OR 1@  // replace the first three bits of stored value with input param
  59. 05DF: write_memory 0@ size 1 value 2@ virtual_protect 0  // set to new value
  60. 05F6: ret 0
« Последнее редактирование: Февраль 24, 2018, 01:37:03 pm от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #98 : Февраль 26, 2018, 12:41:13 pm »
Спасибо огромное Уважаемый Shagg за такой полный и подробный ответ. Благодаря ему, стал лучше понять принцип работы с памятью.

Отвечу Вам порядку.
Этот адрес и смещение ставит бомбу на машину находящуюся в гараже. Надо с ним поработать.
Жаль, что из gta vice вырезали опкоды, только благодаря scm может их вернуть. Благодарю Вас за написанный код
Да, двери в гараж кэма, открывал, путем перемещение объекта.
У меня именно поэтому и вылетало, неправильно обозначал координаты гаража.
Огромное Вам спасибо, что наглядно объяснили как правило обозначать координаты гаража.
Да если создавать гараж, только при условие, что игрок находится в машине, иначе удалить гараж опкодом, чтобы не засорять память.
Писал эти дни скрипт, много раз тестировал, чтобы отладить его. Конечно неидеален, не спорю.
Записал видеодемострацию. https://www.youtube.com/watch?v=9GV9s4nRsMI&feature=youtu.be
Очень много проблем было с тем, чтобы поставить камеру, а точнее развернуть. Переходилось часами перебирать значения для опкодов
       
015F: set_camera_position -817.4 -905.55 13.86 0.0 rotation 0.0 0.0
0160: point_camera -3982.5 -238.75 63.44 switchstyle 2     

Может есть другой способ поставить камеру в нужным ракурсе?

Вроде все хорошо, но почему бомба с детонатором на машину не ставится. Голова ломаю почему.
Также, хоть и скрипт сам по себе небольшой, но работает он крайне медленно, думаю над его оптимизацией. По идей, все должен летать.
Вы очень помогайте. Очень делать, что-то посложнее. То, что делал еще полгода назад. Кажется смешным, простым. Сейчас бы это все написал не так коряво, а красивый и быстро работающим кодом.
Вот скрипт.
Код: Javascript
  1. {$CLEO}      
  2. const
  3. x = -847.231812 // Координаты внутри гаража  
  4. y = -901.642578 // Координаты внутри гаража  
  5. z = 11.103406  // Координаты внутри гаража  
  6. a = -834.576294 // Координаты гаража
  7. b = -902.218567 // Координаты гаража
  8. c = 11.103406 // Координаты  гаража
  9. end
  10. 0000:
  11. :1
  12. wait 0      
  13. 0164: disable_marker 13@ // удалить маркер
  14. if 00E0: player $PLAYER_CHAR driving
  15. jf @4
  16. 0570: 13@ = create_asset_radar_marker_with_icon 8 at x y z  // Внутри гаража        
  17. 03C1: 0@ = player $PLAYER_CHAR car_no_save // получить хендл авто
  18. if 00F7: player $player_char sphere 0 near_point_in_car a b c radius 20.0 20.0 3.0 sphere 0
  19. jf @4                                            
  20. gosub @open // открыть двери гаража              
  21. if 00FA: player $player_char stopped_in_sphere 0 near_point_in_car x y z radius 9.0 9.0 3.0
  22. jf @3    
  23. gosub @camera // установить камеру
  24. :Check // Проверки
  25. if and
  26. 8495: not vehicle 0@ burning
  27. 83CE: not car 0@ stuck
  28. 8119: not car 0@ wrecked
  29. 00DC: player $player_char driving 0@
  30. 0256: player $PLAYER_CHAR defined      
  31. 01C1: car 0@ stopped
  32. jf @3
  33. wait 0      
  34. if 0AB0: key_pressed 0x61// 1      
  35. then 0AB1: call_scm_func @opcode_0242 2 0@ 1                
  36. else
  37. if 0AB0: key_pressed 0x62// 2                        
  38. then 0AB1: call_scm_func @opcode_0242 2 0@ 2  
  39. else
  40. if 0AB0: key_pressed 0x63// 3                        
  41. then 0AB1: call_scm_func @opcode_0242 2 0@ 3  
  42. else
  43. if 0AB0: key_pressed 0x64// 4          
  44. then gosub @super_properties            
  45. else
  46. if 0AB0: key_pressed 0x65// 5                        
  47. then 0AB1: call_scm_func @opcode_0228 2 0@ 1  
  48. end  
  49. end  
  50. end  
  51. end
  52. end
  53. jump @Check
  54. :3                                        
  55. gosub @open  
  56. 015A: restore_camera
  57. 02EB: restore_camera_with_jumpcut            
  58. if or
  59. 80F5: not player $player_char in_sphere 0 near_point x y z radius 20.0 20.0 3.0
  60. 00F7: player $player_char sphere 0 near_point_in_car a b c radius 30.0 20.0 3.0 sphere 0
  61. jf @3                                    
  62. 0ACE: show_formatted_text_box "~w~garage doors are closed."    
  63. gosub @cloose                                          
  64. :4                                    
  65. 01C3: remove_references_to_car 0@      
  66. jump @1            
  67. //-------------------------------------------------------------------------------------
  68. // SCM FUNCTIONS:
  69. //-------------------------------------------------------------------------------------
  70.                    
  71. :cloose
  72. 0AE3: 3@ = random_object_near_point -836.77 -901.84 15.95 in_radius 5.0 find_next 0 //IF and SET    
  73. for 4@ = 1 to 100
  74. 034E: move_object 3@ to -836.77 -901.84 12.05 speed 0.0 0.0 0.05 collision_check 0
  75. wait 4
  76. end    
  77. return
  78. :open
  79. 0AE3: 3@ = random_object_near_point -836.77 -901.84 12.05 in_radius 5.0 find_next 0 //IF and SET    
  80. for 4@ = 1 to 100
  81. 034E: move_object 3@ to -837.13 -901.67 15.95 speed 0.0 0.0 0.05 collision_check 0
  82. wait 4
  83. end                    
  84. return    
  85. :camera                                          
  86. 015F: set_camera_position -817.4 -905.55 13.86 0.0 rotation 0.0 0.0
  87. 0160: point_camera -3982.5 -238.75 63.44 switchstyle 2    
  88. 0164: disable_marker 13@                          
  89. gosub @cloose                                                                                      
  90. 0ACE: show_formatted_text_box "~h~~t~The press 1 for install timed bomb~t~ ~h~press 2 for install ignition bomb, ~t~ ~y~ press 3 for install detonation bomb~x~ ~t~~h~press 4 to set super properties car~h~~b~~t~ press 5 to remove mine with the car.~b~ "
  91. return    
  92. :opcode_0228// сборс типа бомбы 0@ (хендл автомобиля) 1@ (тип бомбы)
  93. 05E7: 0@ = car 0@ struct
  94. 0@ += 0x1FE  // car bomb offset
  95. 05E0: 0@ = read_memory 0@ size 1 virtual_protect 0
  96. 05F9: 0@ = 0@ AND 7
  97. 003B:   0@ == 1@  // проверить стадию бомбы в автомобиле
  98. 0acd: show_text_high_priority "to remove mine with the car" time 1000      
  99. 05F6: ret 0
  100.  
  101. :opcode_0242 // Установить тип бомбы 0@ (car handle) 1@ (bomb stage)  
  102. gosub @text
  103. 05E7: 0@ = car 0@ struct
  104. 0@ += 0x1FE  // car bomb offset
  105. 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0  // store previous value
  106. 05F9: 1@ = 1@ AND 7  // keep only the first three bits from input param
  107. 05F9: 2@ = 2@ AND 0xF8  // exclude the first three bits in stored value
  108. 05FA: 2@ = 2@ OR 1@  // replace the first three bits of stored value with input param
  109. 05DF: write_memory 0@ size 1 value 2@ virtual_protect 0  // set to new value
  110. 05F6: ret 0            
  111. :text
  112. if 0039: 1@ == 1 // integer values
  113. then 0acd: show_text_high_priority "Timed detonation" time 1000    
  114. else
  115. if 0039: 1@ == 2                        
  116. then 0acd: show_text_high_priority "Engine ignition detonation" time 1000      
  117. else
  118. if 0039: 1@ == 3                        
  119. then 0acd: show_text_high_priority "Remote detonation" time 1000    
  120. end  
  121. end  
  122. end  
  123. return
  124. :super_properties      
  125. 053F: set_car 0@ tires_vulnerable 0
  126. 02AC: set_car 0@ immunities 1 1 1 1 1
  127. 01EC: make_car 0@ very_heavy 1
  128. 0acd: show_text_high_priority "super properties are set" time 1000    
  129. return
  130.  
  131. /*
  132.  
  133. :opcode_02B9// удалить гараж
  134. // 0 @ - входной параметр (дескриптор гаража)
  135. 0@ * = 0xA8   // размер каждой структуры гаража
  136. 0@ + = 0x812668   // базовый адрес для гаражей
  137. 0@ + = 0x5   // смещение активации
  138. 05DF: write_memory 0@ size 1 value 1 virtual_protect 0   // деактивировать гараж
  139. 05F6: ret 0                                        
  140. // car struct + 0x1FE (byte & 7) - car bomb state
  141. //  press 1 for install timed bomb,  press 2 for install ignition bomb, press 2 for install detonation bomb.
  142. //0 -0  CARBOMB_NONE    Без бомбы
  143. 1       CARBOMB_TIMED   Неактивная бомба, рассчитанная по времени, может быть получена из гаражного типа 2
  144. 2       CARBOMB_ONIGNITION      Неактивная зажигательная бомба может быть получена из гаражного типа 3
  145. 3       CARBOMB_REMOTE  Удаленная детонационная бомба может быть получена из гаражного типа 4
  146. 4       CARBOMB_TIMEDACTIVE     Активная импульсная бомба, активированная из бомбы типа 1
  147. 5       CARBOMB_ONIGNITIONACTIVE        Активная зажигательная бомба, активированная из бомбы типа 2  
  148. //0219: 15@ = create_garage_type 5 door -836.738 -915.016 9.8 to -836.738 -898.316 13.4 depth -853.238 -905.016    
  149. //03DA: set_garage 15@ camera_follows_player      
  150. //03CB: set_camera 83.0 -849.8 9.3  
  151.  // "~h~The ~t~press 1 for install timed bomb,."
  152. // 0AB1: call_scm_func @opcode_0228 2 car_handle 0@ bomb_stage 0 // check if car bomb state == 0
  153. // jf @2 press 2 for install ignition bomb, press 2 for install detonation bomb~x~activated
  154. //0AB1: call_scm_func @opcode_0242 2 car_handle 0@ bomb_type 1 // sets car bomb type 1
  155. //0ACE: show_formatted_text_box          
  156.  

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #99 : Февраль 26, 2018, 03:08:50 pm »
Классный скрипт!

Чтобы работала бомба с детонатором, нужно выдать игроку детонатор, как оружие вроде(очень давно этим не занимался, так что могу ошибаться):
Код: Text
  1. 01B1: give_player $PLAYER_CHAR weapon 34 ammo 1

Опкод 015F - установка камеры в нужную точку.
Опкод 0160 - это точка, в которую "смотрит" камера. Вместо этого опкода можно использовать другой опкод - чтобы камера смотрела прямо на авто:
Код: Text
  1. 0158: camera_on_vehicle 0@ mode 15 switchstyle 2

Аналогичные опкоды есть для слежения за актерами и объектами.

Параметр "2" в конце означает, что камера "телепортируется" мгновенно. Чтобы она переместилась плавно, нужно поставить 1 и добавить опкод перед установкой камеры:
Код: Text
  1. 0460: set_camera_pointing_time 0.0 1500
, где 1500 - время передвижения камеры.

Например:
Код: Text
  1. 0460: set_camera_pointing_time 0.0 1500
  2. 015F: set_camera_position -817.4 -905.55 13.86 0.0 rotation 0.0 0.0
  3. 0157: camera_on_player $PLAYER_CHAR mode 15 switchstyle 1
Этот код плавно переместит камеру в нужную точку за 1.5 секунды. Камера будет указывать на игрока.

Цитировать
скрипт сам по себе небольшой, но работает он крайне медленно, думаю над его оптимизацией
К сожалению - тут я не помощник. У меня уйдут часы на разбор, столько времени у меня, увы - нет...
Но ты просто держи в голове главный принцип - нужно стараться сокращать кол-во wait-ов до одного, стремясь превратить весь скрипт в один большой цикл. Это сложно, но итоговый код будет крайне органичен, плюс этот навык поможет тебе потом в любых других языках скриптинга и программирования.

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #100 : Февраль 27, 2018, 08:08:08 am »
Спасибо уважаемый Shagg, что оценили мой скромный труд.
Ваш совет о детонаторе помог мне. Пришлось реализовать это через проверку.
if and             
02D8: actor $PLAYER_ACTOR current_weapon == 34
00E1: player 0 pressed_button 17
jf @1
020B: explode_car 0@   
jump @1                 

C установкой ракурса камеры, нужно поработать, тут есть свои нюансы. Спасибо за опкод
Решил обойтись без scm функции :opcode_0228 он работает не корректно.
Оптимизация сложный процесс, движок игры очень старый, изначально не рассчитал на такое.
Спасибо за совет.
Скажите, пожалуйста, адрес памяти дающий возможность стрелять ракетам из любой машины. Ракеты это объект, значит должны иметь свой id.
Хочу сделать самонаводящиеся ракеты на машины. 
Стал пользоваться {$I Garage.func}, чтобы загружать константы, gosub, SCM функций из другого файла, очень удобно, как импорт в языках программирования.
Очень интересна директива $OPCODE понял только, что добавление новых опкодов.
Видео демонстрация https://www.youtube.com/watch?v=xHvTUgfCK4U&feature=youtu.be
     

Код: Javascript
  1. {$CLEO}      
  2. const
  3. x = -847.231812 // Координаты внутри гаража  
  4. y = -901.642578 // Координаты внутри гаража  
  5. z = 11.103406  // Координаты внутри гаража  
  6. a = -834.576294 // Координаты гаража
  7. b = -902.218567 // Координаты гаража
  8. c = 11.103406 // Координаты  гаража
  9. end
  10. 0000:      
  11. :1
  12. wait 0      
  13. 0164: disable_marker 13@ // удалить маркер
  14. if 00E0: player $PLAYER_CHAR driving
  15. jf @4
  16. 0570: 13@ = create_asset_radar_marker_with_icon 8 at x y z  // Внутри гаража        
  17. 03C1: 0@ = player $PLAYER_CHAR car_no_save // получить хендл авто
  18. if 00F7: player $player_char sphere 0 near_point_in_car a b c radius 20.0 20.0 3.0 sphere 0
  19. jf @4                                            
  20. gosub @open // открыть двери гаража              
  21. if 00FA: player $player_char stopped_in_sphere 0 near_point_in_car x y z radius 9.0 9.0 3.0
  22. jf @3    
  23. gosub @camera // установить камеру
  24. :Check // Проверки
  25. if and
  26. 8495: not vehicle 0@ burning
  27. 83CE: not car 0@ stuck
  28. 8119: not car 0@ wrecked
  29. 00DC: player $player_char driving 0@
  30. 0256: player $PLAYER_CHAR defined      
  31. 01C1: car 0@ stopped
  32. jf @3      
  33. wait 0      
  34. if 0AB0: key_pressed 0x61// 1      
  35. then 0AB1: call_scm_func @opcode_0242 2 0@ 1 // бомба с таймером            
  36. else
  37. if 0AB0: key_pressed 0x62// 2                        
  38. then 0AB1: call_scm_func @opcode_0242 2 0@ 2 // бомба взрывается при входе в авто    
  39. else
  40. if 0AB0: key_pressed 0x63// 3                        
  41. then 0AB1: call_scm_func @opcode_0242 2 0@ 3 // бомба с детонатором
  42. else
  43. if 0AB0: key_pressed 0x64// 4          
  44. then gosub @super_properties // пуленепробиваемость, супер масса            
  45. else
  46. if 0AB0: key_pressed 0x65// 5                        
  47. then 0AB1: call_scm_func @opcode_0242 2 0@ 0 // разминировать авто
  48. end  
  49. end  
  50. end  
  51. end
  52. end
  53. jump @Check
  54. :3                                        
  55. gosub @open  
  56. 015A: restore_camera
  57. 02EB: restore_camera_with_jumpcut            
  58. if or
  59. 80F5: not player $player_char in_sphere 0 near_point x y z radius 20.0 20.0 3.0
  60. 00F7: player $player_char sphere 0 near_point_in_car a b c radius 30.0 20.0 3.0 sphere 0
  61. jf @3                                    
  62. 0ACE: show_formatted_text_box "~w~garage doors are closed."    
  63. gosub @cloose  
  64. :4                                          
  65. 01C3: remove_references_to_car 0@  
  66. if and            
  67. 02D8: actor $PLAYER_ACTOR current_weapon == 34
  68. 00E1: player 0 pressed_button 17
  69. jf @1
  70. 020B: explode_car 0@    
  71. jump @1                
  72. :cloose
  73. 0AE3: 3@ = random_object_near_point -836.77 -901.84 15.95 in_radius 5.0 find_next 0 //IF and SET    
  74. for 4@ = 1 to 100
  75. 034E: move_object 3@ to -836.77 -901.84 12.05 speed 0.0 0.0 0.05 collision_check 0
  76. gosub @delay1
  77. end    
  78. return
  79. :open
  80. 0AE3: 3@ = random_object_near_point -836.77 -901.84 12.05 in_radius 5.0 find_next 0 //IF and SET    
  81. for 4@ = 1 to 100
  82. 034E: move_object 3@ to -837.13 -901.67 15.95 speed 0.0 0.0 0.05 collision_check 0
  83. gosub @delay1
  84. end                    
  85. return  
  86. :delay1
  87. 16@ = 0
  88. repeat
  89. wait 0                
  90. until 0029: 16@ >= 4 // задержка
  91. return              
  92. :camera                                          
  93. 015F: set_camera_position -817.4 -905.55 13.86 0.0 rotation 0.0 0.0
  94. 0160: point_camera -3982.5 -238.75 63.44 switchstyle 2    
  95. 0164: disable_marker 13@                          
  96. gosub @cloose                                                                                      
  97. 0ACE: show_formatted_text_box "~h~~t~The press 1 for install timed bomb~t~ ~h~press 2 for install ignition bomb, ~t~ ~y~ press 3 for install detonation bomb~x~ ~t~~h~press 4 to set super properties car~h~~b~~t~ press 5 to remove mine with the car.~b~ "
  98. return    
  99. :opcode_0242 // Установить тип бомбы 0@ (car handle) 1@ (bomb stage)    
  100. gosub @text
  101. 05E7: 0@ = car 0@ struct
  102. 0@ += 0x1FE  // car bomb offset
  103. 05E0: 2@ = read_memory 0@ size 1 virtual_protect 0  // store previous value
  104. 05F9: 1@ = 1@ AND 7  // keep only the first three bits from input param
  105. 05F9: 2@ = 2@ AND 0xF8  // exclude the first three bits in stored value
  106. 05FA: 2@ = 2@ OR 1@  // replace the first three bits of stored value with input param
  107. 05DF: write_memory 0@ size 1 value 2@ virtual_protect 0  // set to new value
  108. 05F6: ret 0        
  109. :text                                          
  110. if 0039: 1@ == 1 // integer values
  111. then 0acd: show_text_high_priority "Timed detonation" time 1000    
  112. else
  113. if 0039: 1@ == 2                        
  114. then 0acd: show_text_high_priority "Engine ignition detonation" time 1000      
  115. else
  116. if 0039: 1@ == 3                        
  117. then gosub @fun
  118. 0acd: show_text_high_priority "Remote detonation" time 1000    
  119. else
  120. if 0039: 1@ == 0                        
  121. then 0acd: show_text_high_priority "to remove mine with the car" time 1000      
  122. end
  123. end  
  124. end  
  125. end  
  126. return
  127. :super_properties      
  128. 053F: set_car 0@ tires_vulnerable 0
  129. 02AC: set_car 0@ immunities 1 1 1 1 1
  130. 01EC: make_car 0@ very_heavy 1
  131. 0acd: show_text_high_priority "super properties are set" time 1000    
  132. return
  133. :fun
  134. repeat
  135. wait 0
  136. Model.Load(#bomb)                            
  137. 038B: load_requested_models
  138. gosub @delay
  139. until Model.Available(#bomb)
  140. 01B1: give_player $PLAYER_CHAR weapon 34 ammo 1
  141. Model.Destroy(#bomb)
  142. return
  143. gosub @delay
  144. :delay
  145. 16@ = 0
  146. repeat
  147. wait 0                
  148. until 0029: 16@ >= 10 // задержка
  149. return
  150.  

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #101 : Март 02, 2018, 08:00:27 pm »
Скажите, пожалуйста, адрес памяти дающий возможность стрелять ракетам из любой машины...
...
Очень интересна директива $OPCODE понял только, что добавление новых опкодов...
Боюсь, я тут не в силах чем-то помочь  :(
Первое наверное проще "эмулировать" путем создания и передвижения ракеты "вручную"(полный скриптовый контроль), а со вторым я не сталкивался...
« Последнее редактирование: Март 02, 2018, 08:02:51 pm от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #102 : Март 04, 2018, 01:39:09 pm »
Благодарю Вас уважаемый Shagg, за Ваш искренний ответ.
Попробовать эмулировать передвижения ракеты "вручную".
Все получилось, но ракета летит как-то "криво", а не прямо.
Как добавить звук выстрела? Есть таблица звуков?
Видео демонстрация https://www.youtube.com/watch?v=H_FmtrYXBLU&feature=youtu.be
Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :1                                                                                              
  4. 01C4: remove_references_to_object 3@ // This object will now disappear when the player looks away    
  5. wait 0        
  6. if 00E0: player $player_char driving
  7. jf @1            
  8. if 00E1:  player 0 pressed_button 17
  9. jf @1    
  10. 03C1: 4@ = player $player_char car_no_save    
  11. 0174: 15@ = car 4@ z_angle
  12. 0407: create_coordinate 0@ 1@ 2@ from_car 4@ offset 0.0 0.0 0.50
  13. 0AB1: call_scm_func @fun 4 273 0@ 1@ 2@ 3@        
  14. 0177: set_object 3@ z_angle_to 15@
  15. 0382: set_object 3@ collision_detection 1
  16. 04D9: object 3@ set_scripted_collision_check 0                          
  17. 0400: create_coordinate 5@ 6@ 7@ from_object 3@ offset 0.0 80.0 0.0  // коор цели    
  18. :2
  19. wait 0                                                            
  20. 034E: move_object 3@ to 5@ 6@ 7@ speed 0.31 0.31 0.0 collision_check 0    
  21. 0392: object 3@ toggle_in_moving_list 0 // отключить физику объекта              
  22. if 04E6: object 3@ near_point 5@ 6@ 7@ radius 7.5 7.5 7.5 flag 1                
  23. jf @3                                              
  24. 0acd: show_text_high_priority "god" time 1000      
  25. jump @boom                                    
  26. :3
  27. if 05EF: 14@ = random_actor_near_point 5@ 6@ 7@ in_radius 0.10 find_next 0 pass_deads 0 //IF and SET      
  28. jf @4    
  29. jump @boom      
  30. :4
  31. if 05F0: 14@ = random_vehicle_near_point 5@ 6@ 7@ in_radius 0.10 find_next 0 pass_wrecked 0 //IF and SET            
  32. jf @5    
  33. if 8039: NOT 3@ == 0@    
  34. jf @5  
  35. jump @boom      
  36. :5
  37. if 05F1: 14@ = random_object_near_point 5@ 6@ 7@ in_radius 0.10 find_next 0 //IF and SET
  38. jf @2
  39. :boom  
  40. 020C: create_explosion_with_radius 6 at 5@ 6@ 7@      
  41. 01BC: put_object 3@ at 0.0 0.0 0.0
  42. jump @1
  43. :fun
  44. repeat
  45. wait 0
  46. Model.Load(0@)                            
  47. 038B: load_requested_models
  48. gosub @delay
  49. until Model.Available(0@)
  50. 0107: 4@ = create_object 0@ at 1@ 2@ 3@    
  51. Model.Destroy(0@)  
  52. 0453: object 4@ set_rotation 180.0 0.0 0.0
  53. 0AB2: ret 1 4@
  54. :delay
  55. 16@ = 0
  56. repeat
  57. wait 0                
  58. until 0029: 16@ >= 10 // задержка      
  59. return                      
  60.  

Хочу научить управлять авто дистанционно через память.

как вывести значение переменной на экран?
Код: Javascript
  1. {$CLEO}
  2. 0000:
  3. :1
  4. wait 0
  5. if 00E0: player $player_char driving
  6. jf @1
  7. if 00E1: player 0 pressed_button 17
  8. jf @1
  9. 03C0: 0@ = actor $PLAYER_ACTOR car //
  10. 05E7: 0@ = car 0@ struct //
  11. 0@ += 0x1F0 //
  12. 05E0: 11@ = read_memory 0@ size 1 virtual_protect 0
  13. 0acd: show_text_high_priority "11@ %d" time 1000
  14. jump @1
  15.  


Помогите, пожалуйста.

конечно, очень писать плагины для vc, уроков для нубов нет. Прям горю желанием, сделать, что крутое.
 
   
« Последнее редактирование: Март 04, 2018, 01:41:43 pm от egor230 »

Оффлайн Shagg_E

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 705
  • Репутация: +24/-4
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #103 : Март 14, 2018, 02:49:06 pm »
Как добавить звук выстрела? Есть таблица звуков?

Стандартными средствами никак... Может только путем замены одного из стандартных .wav в папке Audio и проигрывания его с помощью опкодов 03CF, 03D0, 03D7, 03D1, 03D2 и 040D. Но для звука выстрела этот способ крайне медлителен и неудобен.
Касаемо звуков sfx - есть опкоды 018C(проиграть одиночный SFX звук), 018D(бесконечно зацикленный SFX звук) и 018E(остановить зацикленный звук). Как видно из списков звуков в статьях по этим опкодам - звука выстрела там нет. Но есть другие, не менее интересные звуки.
Я пытался расковырять проигрывание любых sfx звуков, но пока прогресс не очень большой. Конечно, удалось найти возможность проиграть некоторые другие звуки, но звуков выстрела там по-прежнему нет.
Там же, но сообщением ниже я описал способ проигрывания некоторых реплик педами.

как вывести значение переменной на экран?

Запись
Код: Text
  1. 1@ = 5
  2. 2@ = 0.4
  3. 0ACF: show_formatted_styled_text "First: %d. Second: %.1f." time 2000 style 1 1@ 2@
выведет такой текст на экран:
Цитировать
"First: 5. Second: 0.4."

и этот текст будет на экране 2000мс(2 секунды). Т.е. %d - для integer, %.1f - для float значений.


конечно, очень писать плагины для vc, уроков для нубов нет. Прям горю желанием, сделать, что крутое.

Я и сам нуб в программировании, но мне помогли уроки с этого сайта.
« Последнее редактирование: Март 14, 2018, 02:52:06 pm от Shagg_E »

Оффлайн egor230

  • Новичок
  • **
  • Сообщений: 183
  • Репутация: +7/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #104 : Март 15, 2018, 11:36:15 am »
Здравствуйте уважаемый Shagg. Очень-очень рад вашему ответу, так его ждали и меня от Вас.
Благодарю Вас за такие подробные объяснения, всё становится более понятным, ясным благодаря им.
Да, со звуком надо учиться работать. Думаю, тут  можно много сделать чего интересного. Жаль на всё это не хватает времени. Спасибо вам большое, что объяснили мне как вывести значения переменной на экран, то очень поможет в изучении работы с памятью. Жалко их очень мало, хотелось бы больше уроков по работе ida  базой. Там много чего можно отыскать интересного для будущих модов. Сколько я не бы бился получается выпустить ракету по прямой  по прямой траектории. Может как-то можно задать движения через память? Вы написали очень хороший мод по работе с объектами игры.