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

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #75 : Октябрь 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 поэтому их закомментировал. 
 
Код: 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.  

Оффлайн Shagg_E

  • Опытный
  • **
  • Сообщений: 480
  • Репутация: +14/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Помощь с CLEO
« Ответ #76 : Ноябрь 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
, который "подчищает" некоторые действия, созданные другими опкодами(так же, как в миссиях). Подробнее тут.

Код: 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.
Могу только посредством беглого анализа сказать, что в записи
Код: Text
  1. 004E: end_thread // Завершение потока  
  2. jump @MISSION_1 // Чтобы можно пройти заново    
  3. return
последние 2 строчки не выполняются, поскольку первая строчка завершает весь скрипт. Также в CLEO-скриптах вместо опкода 004E юзается 0A93(о котором я написал в начале этого сообщения).
Даже если ты удалишь первую строчку, то опять же - последняя никогда не выполнится, поскольку jump - это безоговорочный "прыжок", без выполнения кода, написанного ниже.
Т.е., чтобы выполнился return - тебе нужно удалить 2 верхние строчки.
« Последнее редактирование: Ноябрь 11, 2017, 01:55:27 am от Shagg_E »

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #77 : Ноябрь 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                                          
  83. 0A93: end_custom_thread // Завершение потока  
  84. :begin          
  85. 0317: increment_mission_attempts // команда, для того чтобы в статистике к попытке миссий прибавилось 1  
  86. 0004: $onmission = 1 // мисия запущена                                                        
  87. wait 0        
  88. return                  
  89. :pickup
  90. wait 0
  91. 0247: request_model 335  
  92. 038B: load_requested_models          
  93. if 0248: model 335 available
  94. jf @pickup
  95. return                    
  96. :delay
  97. 16@ = 0
  98. repeat
  99. wait 0                
  100. until 0029: 16@ >= 900 // задержка  
  101. return
  102. :fun
  103. repeat
  104. wait 0
  105. 0247: request_model 0@ // Запрос модели таксиста
  106. 0247: request_model 2@ // Запрос модели минигана
  107. 038B: load_requested_models
  108. gosub @delay
  109. until gosub @load
  110. 5@ = actor.Create(1@, 0@, d, e, f)
  111. 000E: 2@ -= 257 // Установить номер оружие
  112. 01B2: give_actor 5@ weapon 2@ ammo 9999
  113. 02E2: set_actor 5@ weapon_accuracy_to 100 // Установка точности стрельбы для актера
  114. 000A: 2@ += 257 // Установить модель оружие
  115. actor.Angle(5@) = g // Задать угол актеру
  116. actor.Health(5@) = h // Установить кол-во здоровье педа
  117. 03FE: set actor 5@ money m // Кол-во денег педа
  118. 01CA: actor 5@ kill_player $player_char // Актер хочет убить игрока
  119. Model.Destroy(2@)
  120. Model.Destroy(0@)
  121. 0AB2: ret 1 5@
  122. :load
  123. if and
  124. Model.Available(0@)
  125. Model.Available(2@)
  126. jf @load
  127. return
  128.  

Скрипт врагов

Код: Javascript
  1. {$CLEO .s}                
  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. thread 'BOMB'      
  18. :1
  19. wait 0                                        
  20. 0AB1: call_scm_func @fun 3 #VICE4 4 #flame 1@ 2@ 3@ 4@    
  21. :2                            
  22. wait 0
  23. if and                              
  24. 0118: actor 1@ dead            
  25. 0118: actor 2@ dead            
  26. jf @3                                          
  27. 0AAB: file_exists "CLEO\Set.ini"    
  28. 0A9A: 13@ = openfile "CLEO\Set.ini" mode 0x77  // IF and SET        
  29. 0006: 11@ = 1 // integer values            
  30. 0AD9: write_formatted_text "%d" in_file 13@ 11@
  31. 0A9B: closefile 13@  
  32. jump @4
  33. :3      
  34. if 8256: not player $player_char defined
  35. jf @2
  36. :4
  37. 0164: disable_marker 3@    
  38. 0164: disable_marker 4@    
  39. 01C2: remove_references_to_actor 1@        
  40. 01C2: remove_references_to_actor 2@        
  41. 0249: release_model #VICE4
  42. 004E: end_thread // Завершение потока                            
  43. :fun
  44. repeat
  45. wait 0
  46. 0247: request_model 0@ // Запрос модели таксиста
  47. 0247: request_model 2@ // Запрос модели минигана    
  48. 038B: load_requested_models          
  49. gosub @delay              
  50. until gosub @load      
  51. 3@ = actor.Create(1@, 0@, d, e, f)    
  52. 000E: 2@ -= 257 // Установить номер оружие
  53. 01B2: give_actor 3@ weapon 2@ ammo 9999    
  54. 02E2: set_actor 3@ weapon_accuracy_to 100 // Установка точности стрельбы для актера
  55. 000A: 2@ += 257 // Установить модель оружие
  56. actor.Angle(3@) = g // Задать угол актеру  
  57. actor.Health(3@) = h // Установить кол-во здоровье педа                
  58. 03FE: set actor 3@ money m // Кол-во денег педа  
  59. 01CA: actor 3@ kill_player $player_char // Актер хочет убить игрока      
  60. 0187: 5@ = create_marker_above_actor 3@        
  61. 4@ = actor.Create(1@, 0@, d, e, f)    
  62. 000E: 2@ -= 257 // Установить номер оружие
  63. 01B2: give_actor 4@ weapon 2@ ammo 9999    
  64. 02E2: set_actor 4@ weapon_accuracy_to 100 // Установка точности стрельбы для актера
  65. 000A: 2@ += 257 // Установить модель оружие
  66. actor.Angle(4@) = g // Задать угол актеру  
  67. actor.Health(4@) = h // Установить кол-во здоровье педа                
  68. 03FE: set actor 4@ money m // Кол-во денег педа  
  69. 01CA: actor 4@ kill_player $player_char // Актер хочет убить игрока      
  70. 0187: 6@ = create_marker_above_actor 4@    
  71. 0249: release_model 0@
  72. 0249: release_model 2@
  73. 0AB2: ret 4 3@ 4@ 5@ 6@  
  74. :delay
  75. 16@ = 0
  76. repeat
  77. wait 0                
  78. until 0029: 16@ >= 900 // задержка  
  79. return
  80. :load
  81. if and
  82. Model.Available(0@)
  83. Model.Available(2@)
  84. jf @load
  85. return
  86.  

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #78 : Декабрь 01, 2017, 10:36:57 am »
Здравствуйте, всем.
Нашел интересный cleo скрипт для sa. Он открывает дверь фабрике.
Код: Javascript
  1. {$CLEO .cs}
  2.  
  3. //-------------MAIN---------------
  4. 0662: printstring "SCRIPT_BY_[_KRASH_]"
  5. 03A4: name_thread "OTRKOYMNEETYXYNTY"
  6.  
  7. :OTRKOYMNEETYXYNTY_44
  8. 0001: wait 0 ms
  9. 00D6: if and
  10. 056D:   actor $PLAYER_ACTOR defined
  11. 0038:   $ONMISSION == 0
  12. 03CA:   object 0@ exists
  13. 00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 1055.53 2087.596 10.8203 radius 10.0 10.0 10.0
  14. 004D: jump_if_false @OTRKOYMNEETYXYNTY_44
  15. 034E: move_object 0@ to 1055.629 2087.67 15.469 speed 0.0 0.0 0.05 collision_check 0
  16.  
  17. :OTRKOYMNEETYXYNTY_150
  18. 0001: wait 0 ms
  19. 00D6: if
  20. 00FE:   actor $PLAYER_ACTOR sphere 0 in_sphere 1055.53 2087.596 10.8203 radius 10.0 10.0 10.0
  21. 004D: jump_if_false @OTRKOYMNEETYXYNTY_209
  22. 0002: jump @OTRKOYMNEETYXYNTY_44
  23.  
  24. :OTRKOYMNEETYXYNTY_209
  25. 0001: wait 0 ms
  26. 034E: move_object 0@ to 1055.629 2087.67 12.469 speed 0.0 0.0 0.05 collision_check 0
  27. 0002: jump @OTRKOYMNEETYXYNTY_150
  28.  

Решил сделать, что-то подобное в vc с гаражом Кема Джонса.
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:  
  3. const
  4. t = 25 // Скорость дверей
  5. end
  6. 0006: 0@ = 0 // integer values      
  7. :Noname_2
  8. wait 0    
  9. if 056D: actor $PLAYER_ACTOR defined  
  10. jf @Noname_2  
  11. if 00F6: player $player_char in_sphere 0 near_point_on_foot -836.77 -901.84 12.05 radius 9.8 4.8 8.5
  12. jf @Noname_2          
  13. :Noname_1  
  14. wait 0      
  15. if and    
  16. 0AB0: key_pressed 69
  17. 0039: 0@ == 0 // integer values      
  18. jf @Noname_3  
  19. 0AE3: 3@ = random_object_near_point -836.77 -901.84 12.05 in_radius 5.0 find_next 0 //IF and SET    
  20. for 4@ = 1 to 100
  21. 034E: move_object 3@ to -837.13 -901.67 15.95 speed 0.0 0.0 0.05 collision_check 0
  22. wait t
  23. end
  24. 000A: 0@ += 1  // integer values  
  25. :Noname_3        
  26. wait 0  
  27. if and    
  28. 0AB0: key_pressed 69  
  29. 0039: 0@ == 1 // integer values      
  30. jf @Noname_4
  31. 0AE3: 3@ = random_object_near_point -836.77 -901.84 15.95 in_radius 5.0 find_next 0 //IF and SET    
  32. for 4@ = 1 to 100
  33. 034E: move_object 3@ to -836.77 -901.84 12.05 speed 0.0 0.0 0.05 collision_check 0
  34. wait t
  35. end
  36. 000E: 0@ -= 1  // integer values  
  37. :Noname_4        
  38. wait 0  
  39. if and    
  40. 80F6: not player $player_char in_sphere 0 near_point_on_foot -836.77 -901.84 12.05 radius 9.8 4.8 8.5
  41. 0039: 0@ == 1 // integer values      
  42. jf @Noname_1  
  43. 0AE3: 3@ = random_object_near_point -836.77 -901.84 15.95 in_radius 5.0 find_next 0 //IF and SET    
  44. for 4@ = 1 to 100
  45. 034E: move_object 3@ to -836.77 -901.84 12.05 speed 0.0 0.0 0.05 collision_check 0
  46. wait t
  47. end
  48. 000E: 0@ -= 1  // integer values  
  49. jump @Noname_2
  50.  
  51.  

Возник вопрос. Есть опкод 05F1: 3@ = random_object_near_point 0@ 1@ 2@ in_radius 10.0 find_next 1 //IF and SET
Он ищет случайные объекты в радиусе. Как проверить соответствует модель номеру,  например 3@ == 826?.
Как лучше двигать объект, через цикл for? Нужно высчитывать много.

Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Помощь с CLEO
« Ответ #79 : Декабрь 02, 2017, 09:38:34 pm »
Ну во-первых цикл for не нужен. Опкод 034E - это еще и проверка. Ты можешь сделать вот так:

if
   034E: move_object 3@ to -836.77 -901.84 12.05 speed 0.0 0.0 0.05 collision_check 0
then
   ...
end

Чтоб проверить модель надо сделать вот так:

0AE3: 3@ = random_object_near_point -836.77 -901.84 15.95 in_radius 5.0 find_next 0 //IF and SET  // получаем хендл объекта в заданных координатах
0A98: 15@ = object 3@ struct   // получаем структуру по хендлу
15@ += 0x5C    //    переходим к смещению в структуре, где находится модель объекта
0A8D: 15@ = read_memory 15@ size 2 virtual_protect 0    //   вычисляем модель, которая в Вайсе занимает 2 байта (кстати и не только в этой гта)
if
   15@ == 826   //   проверяем равняется ли модель - 826
then
   ...
end
I know everything and nothing...

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #80 : Декабрь 06, 2017, 02:14:26 pm »
Mfisto благодарю Вас за очень объяснение.
Ваш способ намного проще и лучше.
Вот как работать с памятью, чтобы сравнивать с id объекта, не знал.
Работа с памятью открывает новые возможности.
Изучаю ее, пока на SA.
Подскажите, пожалуйста, почему не получается отключить радар и интерфейс?
Не понимаю, должно работать.
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:
  3. :NONAME_10
  4. 0001: wait 0 ms
  5. 00D6: if
  6. 0ADC: test_cheat "CV"
  7. 004D: jump_if_false @NONAME_10
  8. 0A8D: 1@ = read_memory 0xBA676C size 1 virtual_protect 1
  9. 0acd: show_text_high_priority "~p~ Kill the enemy, take the case!!!" time 7000 // Надпись на экрана
  10. 05DF: write_memory 1@ size 1 value 2 virtual_protect 0
  11. //05DF: write_memory 0xBA6769 size 1 value 0 virtual_protect 1
  12. 0002: jump @NONAME_10
  13. //0A93: end_custom_thread // Завершение потока
  14. 0xBA676C - [байт] Радарный режим
  15. 0 = карты и блики
  16. 1 = блики
  17. 2 = выкл.
  18. 0xBA6769 - [байт] Режим Hud
  19. 0 = выкл.
  20. 1 = on
  21.  


Оффлайн mfisto

  • Скриптер
  • Главный Модератор
  • Новичек
  • *****
  • Сообщений: 173
  • Репутация: +19/-0
  • Не пью, не курю, за компьютером сижу...
    • mfistof
    • Просмотр профиля
    • Empire of CJ
Re: Помощь с CLEO
« Ответ #81 : Декабрь 07, 2017, 04:00:00 am »
Если верить твоим адресам (в плане того, что ты сам написал), то надо всего лишь добавить к твоему коду две строчки:

0A8C: write_memory 0xBA676C size 1 value 2 virtual_protect 0 // эту строчку добавляешь туда, где надо отключить "Радарный режим"
0A8C: write_memory 0xBA6769 size 1 value 0 virtual_protect 0 // а эту - где надо отключить "Hud"
I know everything and nothing...

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #82 : Декабрь 09, 2017, 10:39:25 am »
Благодарю Вас уважаемый mfisto за Ваш ответ. Теперь адреса памяти работаю.
Хочу научится с ними работать. Не совсем до конца это понимаю.
Например, искал уроки по вызову функций, их к сожалению нет.
Для каких адресов памяти, можно вызывать функцию и как?
Вот переделал один скрипт, теперь правая дверь авто сама открывается при входе.
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:
  3. :1
  4. wait 0
  5. if and
  6. 80E0: not player $player_char driving
  7. 00E1: player 0 pressed_button 15
  8. jf @1                                    
  9. actor.storepos($PLAYER_ACTOR, 1@ 2@ 3@)
  10. :2
  11. 0AE2: 10@ = random_vehicle_near_point 1@ 2@ 3@ in_radius 20.0 find_next 0 pass_wrecked 1 //IF and SET
  12. 0AB1: call_scm_func @left_front_door 1 10@ ret 0  
  13. jump @1
  14. :left_front_door        
  15. 05E7: 10@ = car 0@ struct
  16. 05E4: call_function_method 0x59D1D0 struct 10@ num_params 1 pop 0 15 {1..19} 2@ // IsComponentPresent
  17. if 2@ == 1
  18. then
  19. 0085: 3@ = 10@
  20. 3@ += 0x2A0 // CDamageManager
  21. 05E4: call_function_method 0x5A9810 struct 3@ num_params 1 pop 0 2 {0..5} 4@ // GetComponnetStatus
  22. if 4@ <> 3
  23. then
  24. for 12@ = 0.0 TO 1.0 step 0.1
  25. 05E3: call_function_method 0x59CF50 struct 10@ num_params 3 pop 0 12@ 2 15 {1..19} // CAutomobile__OpenDoor ???
  26. wait 0
  27. end
  28. 05E3: call_function_method 0x59CF50 struct 10@ num_params 3 pop 0 1.0 2 15 {1..19} // CAutomobile__OpenDoor ???
  29. end
  30. end
  31. 0AB2: ret 0
  32.  

Оффлайн egor230

  • Прохожий
  • *
  • Сообщений: 64
  • Репутация: +0/-0
    • Просмотр профиля
    • Mr
Re: Помощь с CLEO
« Ответ #83 : Декабрь 29, 2017, 07:25:41 pm »
Здравствуйте, всем.
Поздравлю всех с наступающим Новым годом.
Благодарю Вашим ответами изучил основы cleo.
Хочется дальше расти и развиваться.
Хотел у Вас спросить, есть опкод 0AD9: write_formatted_text "XYZ: %f %f %f" in_file 0@ 1@ 2@ 3@ а как использовать опкод  0A9E
Скрипт с этим опкодом вылетает.
Код: Javascript
  1. {$CLEO .cs}
  2. 0000:
  3. :1
  4. wait 0                      
  5. if 00E0:   player $player_char driving
  6. jf @1                    
  7. if 0AB0: key_pressed 0x4e // n
  8. jf @1                          
  9. 03C0: 0@ = actor $player_char car
  10. 00AA: store_car 0@ position_to 1@ 2@ 3@  
  11. 0AAB: file_exists "CLEO\he.ini"  
  12. 0A9A: 4@ = openfile "CLEO\he.ini" mode 0x77    // Открыть ini файл в режиме записи        
  13. 0A9E: writefile 4@ size 64 from 1@        
  14. 0A9B: closefile 4@
  15. jump @1
  16.  
Скажите, пожалуйста, как правильно использовать  опкод  0A9E