You are not logged in.
В вайсе помогал бесконечный цикл
:PLAYER_STOP wait 0 0372: set_actor $PLAYER_ACTOR anim 0 wait_state_time 100 ms jump @PLAYER_STOP
Встречный вопрос, лол:
как вернуть игроку управление в катсценах?
тот же
01B4: set_player $PLAYER_CHAR can_move 1
и подобные "очевидные" вещи не помогают...
Интересует рабочий способ для VC!
Last edited by Shag (03-08-2015 00:13)
Offline
Встречный вопрос, лол:
как вернуть игроку управление в катсценах?
В катсценах управление игроку вернуть нельзя, потому что там нет игрока.
Катсцена - это просто записанная анимация, которая рендерится в реалтайме и использует текущие модели игрока и персонажей.
Offline
как выставить машине такой же угол наклона, как и у определенного участка земли (например под ней)
например , что бы транспорт выставить паралельно склону горы
если можно с примером
спасибо
Last edited by Goldfish (06-08-2015 22:56)
Offline
В катсценах управление игроку вернуть нельзя, потому что там нет игрока.
Катсцена - это просто записанная анимация, которая рендерится в реалтайме и использует текущие модели игрока и персонажей.
Забыл пояснить - спрашиваю для VC, и там игрок появится, если вернуть камеру на место(restore to jumpcut) и/или управлять ею через SCM. Можно сделать что угодно(вот тут я сделал скриптовую "симуляцию" управления игроком, во время катсцены: во второй половине видео половина зомбов и часть объектов - катсценовые), но вот непосредственно прямое управление игроком я вернуть не смог:(
как выставить машине такой же угол наклона, как и у определенного участка земли (например под ней)
например , что бы транспорт выставить паралельно склону горы
если можно с примером
спасибо
Возможно, есть вариант по-проще, но в вайсе я бы сделал так(при условии, что угол поворота Za не меняется - т.е. уже установлен):
1)Получил бы координаты 2х точек прямо под авто и в 0.1 метре перед ним.
2)С помощью ground_z получил бы высоту земли в этих координатах
3)Высчитал бы "вектор" наклона у этих 2х точек с высотой, полученной с помощью ground_z
4)Высчитал бы угол между предыдущим вектором, и вектором, полученным из первоначальных координат с одной Z(например, Z авто)
5)В стракте авто нашел бы
+0x14 - [float] - X direction
+0x18 - [float] - Y direction
+0x1C - [float] - Z direction
6)Насколько помню, там углы от 0 до 6.28(2пи), значит, косинус угла, полученного в пункте 4 умножаем на -6.28 и это будет X direction, а синус - на 6.28, и это будет Y direction.
7)Записываем значения в
+0x14 - [float] - X direction
+0x18 - [float] - Y direction
8)Profit
P.S. Код будет огромнейший(вектора и углы между ними придется просчитывать простыми операциями +-*/ , т.к. спец. функций нет), плюс возможно я где-то накосячил, но примерно подобным методом я высчитывал перевороты автомобиля в направлении движения авто при падениях в грядущем скриптовом моде на VC(скоро выйдет), за SA не отвечаю.
Last edited by Shag (08-08-2015 01:36)
Offline
Здесь ещё кто-нибудь есть? У меня такие вопросы.
1. Можно ли проверить, игрок находится в уединённом месте?
2. Как сделать так, чтобы если выкинуть актёра из машины, он не садился обратно, не атаковал игрока, не убегал, а просто шёл как ни в чём не бывало?
3. Можно ли как-то пометить актёра? Чтобы в одном скрипте я его пометил, а в другом проверил, как именно я его пометил.
Offline
Здесь ещё кто-нибудь есть? У меня такие вопросы.
1. Можно ли проверить, игрок находится в уединённом месте?
2. Как сделать так, чтобы если выкинуть актёра из машины, он не садился обратно, не атаковал игрока, не убегал, а просто шёл как ни в чём не бывало?
3. Можно ли как-то пометить актёра? Чтобы в одном скрипте я его пометил, а в другом проверил, как именно я его пометил.
1. IMHO, ток смотреть в исходники (ты ж об уединении со шлюхами?)
2. Изменение decision maker'а уже пробовал?
Offline
Можно ли как-то пометить актёра? Чтобы в одном скрипте я его пометил, а в другом проверил, как именно я его пометил.
а зачем для этого делать 2 скрипта? не будет ли лучше помечать и проверять актеров в одном скрипте?
Offline
1. IMHO, ток смотреть в исходники (ты ж об уединении со шлюхами?)
Нет, идея такая. Игрок снимает и надевает маскировочный костюм, но делает это в укромном месте, чтобы его никто не видел. Там же он оставляет костюм. Не оставлять же его посреди дороги.
2. Изменение decision maker'а уже пробовал?
Я не знаю адреса нужной задачи.
а зачем для этого делать 2 скрипта? не будет ли лучше помечать и проверять актеров в одном скрипте?
Мне для мэйна надо. Хочу прицепить внешний скрипт к нескольким актёрам, и эта проверка нужна для того, чтобы определить, какие именно из всех прописанных в этом скрипте действий должен выполнять конкретный актёр. Можно было бы для каждого актёра прописать свой внешний скрипт, но тогда их будет довольно много. С одним было бы удобнее, тем более некоторые действия являются общими для некоторых актёров.
Offline
1. IMHO, ток смотреть в исходники (ты ж об уединении со шлюхами?)
Нет, идея такая. Игрок снимает и надевает маскировочный костюм, но делает это в укромном месте, чтобы его никто не видел. Там же он оставляет костюм. Не оставлять же его посреди дороги.
Прочеши список опкодов по слову "node" и проверяй расстояние до ближайших узлов путей людей и ТС.
Offline
да просто проходись по пулу тачек и педов и выясняй расстояние до них, если близко значит место не уединенное, к тому же случайный пед и тачка могут попасть куда угодно, поэтому я думаю проверять пул.
I know everything and nothing...
Offline
Нет, идея такая. Игрок снимает и надевает маскировочный костюм, но делает это в укромном месте, чтобы его никто не видел. Там же он оставляет костюм. Не оставлять же его посреди дороги.
Я лучше использовал ближайших педов и проверял дистацию. Так точно будем знать есть ли кто рядом или нет. К примеру вот такой скрипт:
{$CLEO} 0000: NOP // --------- НАЧАЛО ФУНКЦИИ goto @IS_NOT_ANY_PED_NEAR_PLAYER_END :IS_NOT_ANY_PED_NEAR_PLAYER 0AB5: store_actor $PLAYER_ACTOR closest_vehicle_to 1@ closest_ped_to 2@ if 056D: actor 2@ defined // если ближайший пед найден then 00A0: store_actor $PLAYER_ACTOR position_to 10@ 11@ 12@ 00A0: store_actor 2@ position_to 13@ 14@ 15@ 050A: 9@ = distance_between_XYZ 10@ 11@ 12@ and_XYZ 13@ 14@ 15@ if 0035: 0@ >= 9@ // если радиус между педом и игроком больше переданной дистанции then jump @IS_NOT_ANY_PED_NEAR_PLAYER_LABEL else 0AB2: ret 1 0 // в указанном радиусе есть кто-то end end if 056E: car 1@ defined // если ближайшая машина найдена then 01E9: 3@ = car 1@ num_passengers // получаем количество пассажиров if 3@ == 0 // Если ближайшая машина пустая then jump @IS_NOT_ANY_PED_NEAR_PLAYER_LABEL else 00A0: store_actor $PLAYER_ACTOR position_to 10@ 11@ 12@ 00AA: store_car 1@ position_to 3@ 4@ 5@ 050A: 9@ = distance_between_XYZ 10@ 11@ 12@ and_XYZ 13@ 14@ 15@ if 0035: 0@ >= 9@ // если радиус между машиной и игроком больше переданной дистанции then jump @IS_NOT_ANY_PED_NEAR_PLAYER_LABEL else 0AB2: ret 1 0 // в указанном радиусе есть кто-то в машине end end else jump @IS_NOT_ANY_PED_NEAR_PLAYER_LABEL end :IS_NOT_ANY_PED_NEAR_PLAYER_LABEL 0AB2: ret 1 1 // нет актёров на указанном радиусе :IS_NOT_ANY_PED_NEAR_PLAYER_END // --------- КОНЕЦ ФУНКЦИИ :SCRIPT thread 'SCRIPT' wait 0 if and 0AB0: key_pressed 9 // tab 0AB1: call_scm_func @IS_NOT_ANY_PED_NEAR_PLAYER 1 raius 10.0 store_to 2@ then 0ACE: show_formatted_text_box "RESULT: %d" 2@ // ------------------ или например пишем код, где игрок одевает/снимает маскировочный костюм -------------- end jump @SCRIPT
Сюда же можно было скинуть проверку на то, есть ли преграды между актёром и транспортом, но это уже сами допишите.
Если использовать в мейне, то копируйте функцию в файл, что бы был в не потоков, миссий и внешних скриптов, после чего в нужный момент проверяйте:
if 0AB1: call_scm_func @IS_NOT_ANY_PED_NEAR_PLAYER 1 raius 10.0 store_to 2@ then // бла-бла-бла end
Где:
10.0 - максимальный радиус проверки
2@ - в переменную запишется состояние: 0 - есть кто-то в этом радиусе, 1 - никого нет
Last edited by wmysterio (08-11-2015 20:16)
Offline
Кстати, я нашёл вот такой опкод
06FF: any_ped_near_actor 0@ in_range 20.0
Не пробовал, но, возможно, его можно использовать вместо того, чтобы перебирать пул.
Теперь такой вопрос. Делаю миссию, в которой игрок должен убить несколько врагов, причём желательно по-тихому. Т.е. он должен убивать их незаметно, без шума - ножом или пистолетом с глушителем. Если же кто-то из врагов его увидит или услышит звуки выстрелов, он поднимет тревогу.
Так вот, как сделать проверку на то, что актёр заметил игрока или услышал звуки выстрелов? Знаю, есть опкод 0364:, но он работает вообще не так как надо. Он срабатывает просто если между актёром и игроком нет препятствий, даже если актёр стоит спиной к игроку и никак не может его увидеть. Слышимость звуков пробовал проверять через событие актёра (номер 61 - актёр слышит громкий звук), но это почему-то не работает.
Также хотелось бы сделать так, чтобы враги поднимали тревогу, если обнаружат труп. Пробовал проверку 0480:, но тоже не работает. Можно как-то проверить, что актёр обнаружил труп?
Offline
Слышимость звуков пробовал проверять через событие актёра
Попробуйте это использовать:
Actor.StorePos($PLAYER_ACTOR, 160@, 161@, 162@) 0855: get_actor -1 noise_level_at 160@ 161@ 162@ store_to 166@
В переменную 166@ будет записан уровень шума
Если же кто-то из врагов его увидит или услышит звуки выстрелов, он поднимет тревогу.
Можно и так:
if 00E1: key_pressed 0 17 // нажато клавишу огонь then if or 02D8: actor $PLAYER_ACTOR current_weapon == 0 // Если стреляет с оружия 0 02D8: actor $PLAYER_ACTOR current_weapon == 1 // ИЛИ стреляет с оружия 1 02D8: actor $PLAYER_ACTOR current_weapon == 2 // ИЛИ стреляет с оружия 2 then jump @FAILED // прыгаем на метку провала end end
На счёт проверки на то, находится ли актёр возле трупа, то есть несколько вариантов:
0889: store_actor 0@ center_of_body_position_to 1@ 2@ 3@ // GET_DEAD_CHAR_COORDINATES if 00EC: actor $PLAYER_ACTOR sphere 0 near_point 1@ 2@ radius 2.0 2.0 then // бьём тревогу end //---------------------------------------------------------------- if AND 0104: actor $PLAYER_ACTOR near_actor 0@ radius 3.0 3.0 3.0 sphere 0 0118: actor 0@ dead then // бьём тревогу end
Ну и в таком духе. Главное включить фантазию а там сгенерируется практически любая проверка
Last edited by wmysterio (16-11-2015 19:09)
Offline
Попробуйте это использовать:
Actor.StorePos($PLAYER_ACTOR, 160@, 161@, 162@) 0855: get_actor -1 noise_level_at 160@ 161@ 162@ store_to 166@В переменную 166@ будет записан уровень шума
А какое должно быть значение переменной при шуме?
И это всё проверки на шум от самого игрока. А если он, скажем, бросит гранату или выстрелит из ракетницы, как проверить, что враги услышали взрыв?
Ну и в таком духе. Главное включить фантазию а там сгенерируется практически любая проверка
Если бы всё было так просто. Эти способы ведь не позволяют проверить, видит ли актёр труп.
Я вот попробовал такой способ, но он не действует. Даже не знаю, что здесь может быть не так.
04C4: store_coords_to 802@ 803@ 804@ from_actor 201@ with_offset 0.0 23.0 0.0 0AE1: 801@ = random_actor_near_point 802@ 803@ 804@ in_radius 24.0 find_next 1 pass_deads 0 //IF and SET if Actor.Defined(801@) else_jump @MISSION20_4779 if Actor.Dead(801@) else_jump @MISSION20_4779 actor.StorePos(201@, 805@, 806@, 807@) actor.StorePos(801@, 808@, 809@, 810@) if 06BD: no_obstacles_between 805@ 806@ 807@ and 808@ 809@ 810@ solid 1 car 1 actor 0 object 1 particle 0 else_jump @MISSION20_4779
По поводу проверки, заметил ли игрока кто-то из врагов. Можно ли проверить, что актёр стреляет или хотя бы целится в игрока? Это вполне бы сошло за проверку, что игрок обнаружен.
Offline
в принципе есть опкод, кторый проверяет повернут ли актер к чему-то, но он срабатывает даже если будет повернут находясь в другом конце штата, совместно можно использовать его с проверкой препятсчтвия между координатами
Offline
А какое должно быть значение переменной при шуме?
Должно быть значение типа float, если я правильно понял вопрос.
Если бы всё было так просто.
Ну это пока ещё не ад, чтобы делать такой вывод
Эти способы ведь не позволяют проверить, видит ли актёр труп.
Ну так не обязательно в буквальном смысле искать опкод, который проверял бы нужное действие. Графическое меню ведь тоже одним опкодом не нарисуешь. Нужно искать альтернативы, если других вариантов нет/не нашел
Можно ли проверить, что актёр стреляет
Можно. Вот опкоды:
02D6: actor $PLAYER_ACTOR fires_weapon 0 in_rectangle_cornerA -2774.03 -1572.78 cornerB -2837.13 -1468.24 // Если стреляет с оружия с ID 0 в 2D кубе 02E0: actor $PLAYER_ACTOR firing_weapon // Если просто стреляет где-угодно и с чего угодно ( вроде действует только на оружие, где есть патроны )
Last edited by wmysterio (18-11-2015 19:06)
Offline
Должно быть значение типа float, если я правильно понял вопрос.
Нет, я про конкретное число. Чему оно должно быть равно? Находил этот опкод в мэйне, но там почему-то значение ещё и умножается на какое число.
Можно. Вот опкоды:
Второй опкод срабатывает сразу, хотя актёр не стреляет. Видимо, это просто проверка, что актёр держит в руках огнестрельное оружие.
Ещё хотел спросить. Если машина, созданная в миссии, взрывается, можно сделать так, чтобы она не исчезала до конца миссии?
Offline
Нет, я про конкретное число. Чему оно должно быть равно? Находил этот опкод в мэйне, но там почему-то значение ещё и умножается на какое число.
Не проверяйте на равенство, проверяйте диапазон. Например, если больше какого-то диапазона. Умножается на число там для того, чтобы правильно отобразить полоску "Шум". Проверить уровень текущий шума можно через скрипт:
{$CLEO} 0000: 0@ = 0.0 while true wait 0 Actor.StorePos($PLAYER_ACTOR, 1@, 2@, 3@) 0855: get_actor -1 noise_level_at 1@ 2@ 3@ store_to 2@ if 02E0: actor $PLAYER_ACTOR firing_weapon then 0ACE: show_formatted_text_box "Actor use wepon" end if 02D6: actor $PLAYER_ACTOR fires_weapon 0 in_rectangle_cornerA -50.0 -50.0 cornerB 50.0 50.0 then 0ACE: show_formatted_text_box "Actor shooting in corner with weapon" end if 0025: 2@ > 0@ // (float) then 00BE: text_clear_all 0AD0: show_formatted_text_lowpriority "noise %f" time 4000 2@ // показываем сколько шума создал актёр end end
Мои исследования показали, что если игрок будет идти, то уровень примерно 44.0, если прыгает или бежит - 55.0, если стреляет - то обычно значение больше 100.0, ближнебойное оружие - 39.0. Некоторое оружие показывает 0.0( например огнетушитель ). Остальные сможете уже сами проверить, скрипт уже есть А там и проверить нужное значение в своём скрипте. Так же сюда учитывается и другой шум, например если открыть машину, то двери также будут генерировать шум, при этом шум от того как закрывает дверь в трое больше чем от шума открытия. Как не странно, если игрок сигналит в машине, то шум не генерируется
Второй опкод срабатывает сразу, хотя актёр не стреляет.
Опкоды рабочие. Правда я ошибся в одкоде 02D6. Параметр 0 указывает нужно ли рисовать сферу. Оружие может быть любое, которое имеет патроны.
Ещё хотел спросить. Если машина, созданная в миссии, взрывается, можно сделать так, чтобы она не исчезала до конца миссии?
С этим пока я не знаю - ни разу не приходилось отслеживать взорванную машину. Попробуйте создать над ней маркер и задать его режим отображения:
5@ = Car.Create(#ADMIRAL,14.9045, -4.6174, 4.7812) 6@ = Marker.CreateAboveCar(5@) 018B: set_marker 6@ radar_mode 4 // 4 - ничего не отображать: ни на радаре, ни стрелки над машиной
Код нужно проверить, но насколько я знаю сущность, что помечена маркером, с игры не удаляется во время миссии. Опять же это нужно проверить.
Last edited by wmysterio (19-11-2015 17:50)
Offline
Вопросы от зелёного новичка (понимающего суть программирования, но не писавшего скрипты к САньке):
1) Должен ли Sunny Builder быть установлен прямо в папку с игрой?
2) Не создаст ли проблем разница в версиях библиотеки CLEO - 4 и версии SB - 3?
3) Пробовал написать (смотри - скопипастить) простой скрипт по этой инструкции - во-первых, выдаёт ошибку от {$VERSION}, пишет, что директива не опознана, а если её удалить и скрипт скомпилится, при разворачивании игры обратно, пед не появляется на моих координатах.
Вообще, с чего стоит начать? А то я рванул с места в карьер.
Заранее благодарен вам, уважаемые корифеи форума!
Offline
1) Нет.
2) Нет.
3) Какой скрипт? Какая инструкция? Какая конкретно ошибка? Привыкай описывать проблемы максимально подробно. Не все знающие решение люди захотят переспрашивать или гадать, многие просто закроют вкладку.
Начать стоит с изучения справки Sanny Builder’а. На мой взгляд, она больше подходит на роль справки, чем учебника (что логично).
Если знаешь английский, есть три мастрида. Очень рекомендую, они исчерпывающи и очень качественно написаны (особенно первый и третий).
Если с английским плохо, то всё плохо. Тогда бери этот учебник (сайт скоро встанет). Я уж не помню, что там к чему. Он мне не очень нравился, во многом повторял справку, но именно по нему я научился скриптить.
Это ещё оч хороший курс. Прям идёшь с 12-ой страницы по убыванию, отгоняя мысли "Зачем мне именно это? Когда уже скрипты писать начну?". Там просто первые ~10 статей предваряют вопросы, которые могут возникнуть после написания хеллоуворлда.
Offline
как из одного скрипта получить значение переменной другого скрипта?
Пробовал :
старт пула потоков > первый активныф поинтер + 60 + 40 (переменная 10) и врите мемори, но получил вылет
Offline
как из одного скрипта получить значение переменной другого скрипта?
Пробовал :
старт пула потоков > первый активныф поинтер + 60 + 40 (переменная 10) и врите мемори, но получил вылет
Ну для начала нужно получить поинтер нужного потока:
if 0AAA: 0@ = thread 'MYTHREAD' pointer then // смещения end
А уже затем делать смещения. Имеется ввиду локальные переменные.
Offline
Goldfish wrote:как из одного скрипта получить значение переменной другого скрипта?
Пробовал :
старт пула потоков > первый активныф поинтер + 60 + 40 (переменная 10) и врите мемори, но получил вылетНу для начала нужно получить поинтер нужного потока:
if 0AAA: 0@ = thread 'MYTHREAD' pointer then // смещения endА уже затем делать смещения. Имеется ввиду локальные переменные.
Василь СПС!
Я даже и не знал про этот опкод
Last edited by Goldfish (06-12-2015 00:53)
Offline
Как вызвать функцию начала новой игры и функцию открытия меню "Загрузка игры"?
Offline