Русскоязычный форум поклонников игры «Они» от Bungie
geyser написал(а):
"Чтобы создать бота нужно прописать в BINA новые данные (модель, имя, анимация...)?" Смотря, что такое 'создать'. ai2_spawn - создание? Анимации прописаны в ONCC, а не в CHAR.
"А потом просто бота прописать в скрипты?" Смотря, что такое 'просто'... Вообще-то доводка уровня - это процесс итеративный: поскриптил, скривился, поправил BINA, поскриптил ещё...
"Есть ли инструкция по созданию ботов?" Т.е. по добавлению в BINACharacter? http://wiki.oni2.net/AE:Adding_spawnable_characters http://wiki.oni2.net/OBD_talk:BINA/OBJC/CHAR#XML
"мне нужна команда, которая бы любые процессы выполняла последовательно" Смотря что такое 'любые', но для начала посмотри сюда: Oni Scripts: FAQ-пособие
Спасибо гейсер посмотрел!) Начинаю понимать... С BINACharacter мне пока рано! А вот насчёт команды:
func void wait_to_help(void) - "wait_to_help" это просто название функции и не несёт смысловой нагрузки.
chr_wait_health Muro 200 - "chr_wait" команда ждать. А например, если нужно сделать покруче событие, что-бы ждать приходилось не наличие 200 хп , а окончание жуткого замеса между 10 TCTF и 10 Синдикатов )... Нужно создавать отдельную функцию и уже делать привязку к chr_wait ???
Или ждать пока откроется дверь, то команда выглядеть будет вот так: chr_wait_door_open 21 ???
&&
Оффлайн
Smith, не путай... "wait_to_help
"(void) - функция, прописанная уже в скриптах. "смысловой нагрузки" в имени этой функции ровно столько же, как у любой другой. "chr_wait_health
"(ai_name,hp) - функция, прописанная глубже. принципиальная разница только в размещении и вроде ещё паре нюансов. никакого "chr_wait" здесь нет вообще. есть только функции с таким префиксом: chr_wait_health
, chr_wait_animation
, chr_wait_animtype
, chr_wait_animstate
. их объединяет только схожесть названий (ну, и примерно аналогичная суть: остановить дальнейшее выполнение до события).
тем более, "chr_wait_door_open" - чушь ещё и потому, что chr_ относится в чарам, а у дверей свой собственный префикс door_. ) но к названию никогда не надо цепляться и тем более делить его на что-то. это лишь для удобства.
Smith написал(а):
А например, если нужно сделать покруче событие, что-бы ждать приходилось не наличие 200 хп , а окончание жуткого замеса между 10 TCTF и 10 Синдикатов )
20 организаций? или 20 человек? +)chr_wait_health Suwestvo 0
повторить для всех существ...
хотя традиционно разработчиками использовались функции, вызываемые смертями персонажей (т.е. на самом деле они всей группой ссылались на одну-единственную функцию), чтобы декрементить счётчик и при достижении нуля делать все дела.
для того, чтобы что-то произошло по событию, необходим какой-то триггер. или мы имеем скриптовую вилку с ожиданием события (то есть не так уж и много всего... пересечение некоторого значения здоровья, исполнение некой анимации... возможна периодическая проверка значения переменной через рекурсивную функцию), или прописанное в ресурсах событие, вызывающее определённую функцию в игре. можно спрятать от игры все скрипты и побегать по уровням со включенной девмодой - консоль будет периодически заявлять, что "нет такой-то функции, запрошенной движком". тут тебе и лазеры, и открытие определённых дверей, и прохождение/пролетание по определённой области, и указанные в BINA смерть и разговор с персонажем.
если триггера в нужном месте нет - создавай... насколько я понимаю, здесь опять следует обратиться к BINA - TRIG, DOOR. если оно того стоит.
Оффлайн
Smith написал(а):
всмысле?)) Как её запустить?
вилкой... из какого-нибудь исполняемого места. смотри пресловутое wait_to_help. fork MyFunction
кстати, функцию лучше не называть таким общим словом, имхо. и суть неясна, и пересечение с командой...
Оффлайн
Люди вы nick9 извинити онмойдруг просто когдая книму домойзаходил вмести с другом, мы с nick9 пошли пить а его и мой дружок оказывается написал это мы токо понилиэто по цитате чёон там наколякал извините что я за него отмазываюсь,ноэто правда!!!!!!!!!!!
Оффлайн
Мih@ написал(а):
Smith написал(а):
всмысле?)) Как её запустить?
вилкой... из какого-нибудь исполняемого места. смотри пресловутое wait_to_help.
fork MyFunction
кстати, функцию лучше не называть таким общим словом, имхо. и суть неясна, и пересечение с командой...
Я эту команду "TCTF" вставил в другую функцию, "fork TCTF" - не сработало(
Оффлайн
vitya написал(а):
Люди вы nick9 извинити онмойдруг просто когдая книму домойзаходил вмести с другом, мы с nick9 пошли пить а его и мой дружок оказывается написал это мы токо понилиэто по цитате чёон там наколякал извините что я за него отмазываюсь,ноэто правда!!!!!!!!!!!
А чё он отрицал что это написал?
Smith написал(а):
Я эту команду "TCTF" вставил в другую функцию, "fork TCTF" - не сработало(
Ты не понял Миху.
Функцию делай TCTF,а в скрипте на нужном месте пиши fork TCTF.
Оффлайн
Smith, слушай сюда. Есть определённая тонкость с chr_location и вообще с любыми функциями, которые обращаются к челам через индекс (char ID). Этот индекс уникален, в каждый данный момент он соответствует максимум одному челу. Выдаётся этот индекс в момент появления чела в памяти (он соответствует номеру первой пустой ячейки, куда игра "кладёт" нового чела). Поэтому - и это главное - этот индекс сильно зависит от состояния памяти на момент вызова ai2_spawn, т.е. от предыстории. Этот индекс важно не путать с так называемым "скриптовым индексом" (script ID), который бывает у безмозглых челов и игроков. У Коноки, например, скриптовый индекс есть, и как правило 0, но он не имеет ничего общего с индексом Коноки как чела, т.е. с индексом её ячейки в памяти, который как правило тоже 0 (ибо Коноко появляется в уровне в первую очередь).
Рассмотрим твой скрипт. Целиком ты нам его не показываешь, но допустим, что кроме Коноки в уровне был только Гриффин, соответственно у Коноки был индекс 0, а у Гриффина - 1. Гриффин не освободит индекс 1, пока не станет трупом, а трупом он не станет, пока ты от него не отвернёшься и не попрыгаешь, например. Дело в том, что игра не спешит удалять мёртвых челов из памяти и заменять их на трупы, и предпочитает это делать, когда игрок на труп не смотрит. Поэтому ты не можешь заранее знать, какой индекс окажется у ParkStriker, скорее всего - 2, но в других ситуациях может оказаться и 1, если ты дашь Гриффину время и возможность стать трупом, до того как вызывать ai2_spawn(ParkStriker). Решить неоднозначность можно несколькими способами. Во-первых, можно найти подходящий FLAG и использовать chr_telerport. Во-вторых, статус Гриффина можно заморозить, чтобы он ни в коем случае не становился трупом, вот так: chr_death_lock(Griffin,1). В последних, Гриффина можно, наоборот, явно удалить из игры, не дожидаясь его превращения в труп: например, делаешь ему chr_death_lock, а потом чуть-чуть лечишь и chr_delete(Griffin).
Полную информацию о челах, существующих в памяти на данный момент, даёт девмодовая команда chr_who (с консоли). Чтобы увидеть информацию, надо пользоваться английским движком, а не русским, так что советую поставить недавно опубликованный гуёвый Эдишн, в котором содержится английский движок вместе с новым Даоданом, который позволяет играть в русскую версию, имея при этом все преимущества английского движка.
Оффлайн
geyser написал(а):
Smith, слушай сюда. Есть определённая тонкость с chr_location и вообще с любыми функциями, которые обращаются к челам через индекс (char ID). Этот индекс уникален, в каждый данный момент он соответствует максимум одному челу. Выдаётся этот индекс в момент появления чела в памяти (он соответствует номеру первой пустой ячейки, куда игра "кладёт" нового чела). Поэтому - и это главное - этот индекс сильно зависит от состояния памяти на момент вызова ai2_spawn, т.е. от предыстории. Этот индекс важно не путать с так называемым "скриптовым индексом" (script ID), который бывает у безмозглых челов и игроков. У Коноки, например, скриптовый индекс есть, и как правило 0, но он не имеет ничего общего с индексом Коноки как чела, т.е. с индексом её ячейки в памяти, который как правило тоже 0 (ибо Коноко появляется в уровне в первую очередь).
Рассмотрим твой скрипт. Целиком ты нам его не показываешь, но допустим, что кроме Коноки в уровне был только Гриффин, соответственно у Коноки был индекс 0, а у Гриффина - 1. Гриффин не освободит индекс 1, пока не станет трупом, а трупом он не станет, пока ты от него не отвернёшься и не попрыгаешь, например. Дело в том, что игра не спешит удалять мёртвых челов из памяти и заменять их на трупы, и предпочитает это делать, когда игрок на труп не смотрит. Поэтому ты не можешь заранее знать, какой индекс окажется у ParkStriker, скорее всего - 2, но в других ситуациях может оказаться и 1, если ты дашь Гриффину время и возможность стать трупом, до того как вызывать ai2_spawn(ParkStriker). Решить неоднозначность можно несколькими способами. Во-первых, можно найти подходящий FLAG и использовать chr_telerport. Во-вторых, статус Гриффина можно заморозить, чтобы он ни в коем случае не становился трупом, вот так: chr_death_lock(Griffin,1). В последних, Гриффина можно, наоборот, явно удалить из игры, не дожидаясь его превращения в труп: например, делаешь ему chr_death_lock, а потом чуть-чуть лечишь и chr_delete(Griffin).
Полную информацию о челах, существующих в памяти на данный момент, даёт девмодовая команда chr_who (с консоли). Чтобы увидеть информацию, надо пользоваться английским движком, а не русским, так что советую поставить недавно опубликованный гуёвый Эдишн, в котором содержится английский движок вместе с новым Даоданом, который позволяет играть в русскую версию, имея при этом все преимущества английского движка.
Спасибо! Но дело в том что телепортировать челов я могу. Я прописываю по порядку ai2_spawn (имя)
И и телепортирую их соответственно в том порядке котором стоят, если первый в скрипте написал ai2_spawn Sr_9 то он и будет телепор. под номером 1. Это срабатывает. И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??
Оффлайн
Smith написал(а):
И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??
ну смотри последовательно. начинается исполнение всегда из одного места - функции main
. в последнем уровне, она ссылается на функцию start
. в которой, в свою очередь, есть ряд ифов, среди которых находим: if (my_save_point eq 4)
{
а ещё глубже - вариации в зависимости от того, жив ли Гриффин: if (did_kill_griffen() eq #)
{
в его присутствии - вилка для ожидания 200 хелсов у Муро, на которую и следовало бы ориентироваться (хотя это ни разу не принципиально): fork wait_to_help
собственно, если ориентироваться на оригинальное течение скрипта (а не написание его с нуля), где-то тут вилке самое место. то бишь, мыслим логически - функция "ожидает" событие, и её вилочный вызов нужно ставить там, где начинается это "ожидание".
Smith написал(а):
И и телепортирую их соответственно в том порядке котором стоят, если первый в скрипте написал ai2_spawn Sr_9 то он и будет телепор. под номером 1. Это срабатывает.
да неправда это... у тебя совершенно посторонняя функция, в которой ParkStriker и спавнится (а не заранее). когда она вызовется и вызовется ли вообще - неизвестно. особенно если скрипт будет не из последовательного "убил энного врага, заспавнился энплюспервый", а с динамичным месивом.
Оффлайн
Мih@ написал(а):
Smith написал(а):
И где это нужное место (тем более тстф была функцией)?? Получается нужно команду fork TCTF вписать в ту фукцию, которая отвечает именно за 4сохранение, за последнюю битву?? Но в какую??
ну смотри последовательно. начинается исполнение всегда из одного места - функции
main
. в последнем уровне, она ссылается на функциюstart
. в которой, в свою очередь, есть ряд ифов, среди которых находим:if (my_save_point eq 4)
{
а ещё глубже - вариации в зависимости от того, жив ли Гриффин:if (did_kill_griffen() eq #)
{
в его присутствии - вилка для ожидания 200 хелсов у Муро, на которую и следовало бы ориентироваться (хотя это ни разу не принципиально):fork wait_to_help
собственно, если ориентироваться на оригинальное течение скрипта (а не написание его с нуля), где-то тут вилке самое место. то бишь, мыслим логически - функция "ожидает" событие, и её вилочный вызов нужно ставить там, где начинается это "ожидание".
О получилось Спасибо что обяснил! Всё BlackSwat делает кроме того, что он не идёт к флагу, вот моя ф-ция:
func void arbalet(void)
{
chr_wait_health Griffin 0
chr_location 5 -395.204987 1445.000000 -2941.419941
chr_set_class 5 TCTF_swat_blackops_1
chr_changeteam C_Sr19 TCTF
chr_set_health C_Sr19 210
chr_giveweapon C_Sr19 w3_phr
ai2_attack C_Sr19 Muro
ai2_movetoflag 0516 C_Sr19
ai2_setmovementmode C_Sr19 run
}
ДА и ещё Муро не атакует
Отредактировал(а) Smith (15-07-2009 08:34:06)
Оффлайн
А чё он отрицал что это написал?
Говорё же написал не он, а стёр он!
У него такая реакция!
Оффлайн
Smith написал(а):
ai2_movetoflag 0516 C_Sr19
дословно "флаг 0516, иди к персонажу". +)) первый аргумент - персонаж, а второй - флаг.
Smith написал(а):
ai2_attack C_Sr19 Muro
да это вообще весьма условная штука... точно не уверен, но вроде это функция просто выставляет персонажу приоритет для атаки. например, в оригинале финальной битвы - Муро всегда атакует игрока, до достижения им 200 хелсов остальные синдикатовцы заняты лишь TCTF. когда же muro_in_danger eq 1, все начинают фокусить игрока. никакой мощной низкоуровневой привязки нет.
Оффлайн
Мih@ написал(а):
Smith написал(а):
ai2_movetoflag 0516 C_Sr19
дословно "флаг 0516, иди к персонажу". +)) первый аргумент - персонаж, а второй - флаг.
Smith написал(а):
ai2_attack C_Sr19 Muro
да это вообще весьма условная штука... точно не уверен, но вроде это функция просто выставляет персонажу приоритет для атаки. например, в оригинале финальной битвы - Муро всегда атакует игрока, до достижения им 200 хелсов остальные синдикатовцы заняты лишь TCTF. когда же muro_in_danger eq 1, все начинают фокусить игрока. никакой мощной низкоуровневой привязки нет.
А вот я хочу что бы при смерти гриффина опять появлялся вертолёт, ну и поновой 2 TCTF (можно без гриффина)! функцию сделал камеры удалил, невышло(( Как правильно оформить процедуру??
Оффлайн
Smith, не бывает "не вышло". бывает "вышло не то, что ожидалось, потому что написано не то, что нужно".
появление вертолёта - не очень удобная штука... катсцена с ним постоянно меняет обзор, что позволяет делать некоторые махинации "за кадром", поэтому, во-первых, спрыгивание с вертолёта и бег к центру не согласованы (как вариант, бег вообще убираем и назначаем движение к флагу или атаку на врага), а во-вторых, вертолёт не умеет красиво исчезать. или в некоторый момент он удаляется начисто (лично я в таких случаях использую быстрые fade_out
и fade_in
, но они бросаются в глаза ещё больше, чем ВНЕЗАПНОЕ исчезновение вертолёта), или, если эта операция выполняется единожды, висит до самого конца.
ну, например, я поглядел в таком виде:func void tround_z(void)
{
obj_create 901 906
env_anim 901 906
ai2_spawn Griffin force
ai2_spawn GrifOps02 force
ai2_spawn GrifOps03 force
chr_envanim Griffin GrifGrifBox01
chr_envanim GrifOps02 GrifOps01Box01
chr_envanim GrifOps03 GrifOps03Box01
chr_animate Griffin COMGUYlev7_helistand 500
chr_animate GrifOps01 STRIKEcrouch_idle 400
chr_animate GrifOps02 STRIKEcrouch_idle 400
chr_animate GrifOps03 STRIKEcrouch_idle 400
sleep f290
env_setanim 901 heli_doors_rt08
env_setanim 902 heli_doors_lt08
env_setanim 903 heli_rotorblades08
env_setanim 904 heli_body08
env_setanim 905 heli_canopy08
env_setanim 906 heli_interior08
chr_envanim Griffin GrifGrifBox02 norotation
chr_envanim GrifOps02 GrifOps01Box02 norotation
chr_envanim GrifOps03 GrifOps03Box02 norotation
chr_animate Griffin COMGUYlev7_Grif
chr_animate GrifOps02 STRIKElev7_Ops01
chr_animate GrifOps03 STRIKElev7_Ops03
sleep f240
playback Griffin GrifGrifRunAlt
playback GrifOps02 GrifOps01Run
sleep f10
playback GrifOps03 GrifOps03Run
}
всё работает безо всяких проблем... разве что дурацкое ai2_spawn GrifOps0# force
желательно поменять на полноценного персонажа и убрать force.
Оффлайн
Спасибо Mih@ сработало)) Ещё проблемка, я пару синдикатов телепортировал на крышу (в финальную битву)
Битва началась... всё замечатель, но радиус обзора челов мелковат( Ближе к середины битвы 2 TCTF в одном углу ,пару синдикатов по центру... И друг друга не видят... Короче как сделать радиус обзора больше? Скриптом можно обойтись?
Оффлайн