Показать сообщение отдельно
Старый 09.08.2005, 15:35   #682
marazmus
A.G.F.C.
 
Регистрация: 02.09.2005
Сообщений: 6
marazmus вне форума

По умолчанию Re: Скриптинг в Готике

Клево.
И тебе спасибо, за постановку задачи и за то, что не поленился проверить. Теперь буду знать.

Вообще, мне кажется, нужно сделать факи по скриптингу некоторых игровых ситуаций.
Конечно, поднимать всю тему тоже прикольно, иногда.
Но все-таки часто требуется именно конкретное описание конкретного случая.
Голову никто не отменял :), но время такой фак может сэкономить очень сильно.

Добавление от 08/09/05, в 15:54:46
Например:

Перемещение NPC по миру.

Вейпойнт.

Основа для перемещения - вейпойнт.
Он устанавливается в спейсере, в том месте, которое нужно создателю мода.
Причем для того, чтобы просто вставить NPC в мир, хватит и одного вейпойнта.

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

Итоговый маршрут NPC - это путь по таким связкам, от одного вейпойнта к другому.
Естественно, чтобы NPC дошел до пункта назначения, в связке не должно быть разрывов.

Вставка NPC в мир.

Чтобы вставить NPC в мир, нужно воспользоваться функцией Wld_InsertNPC().

У нее два параметра.
Первый - имя intance NPC, который вставляется.
Например - NONE_666_Ramirez

Второй - имя вейпойнта, на который будет вставляться наш NPC
Например, "NW_XARDAS_TOWER_VALLEY_09"

Итого: Wld_InsertNPC(NONE_666_Ramirez,"NW_XARDAS_TOWER_VA LLEY_09");

Здесь есть некоторые тонкости.

1) У NPC, который вставляется, в описании обязательно должна присутствовать функция типа RTN_***.
Например,
[pre]
      func void Rtn_PreStart_666()
      {
      TA_Guard_Passage (8,0,22,0,"NW_FARM1_OUT_01");
      TA_Guard_Passage (22,0,8,0,"NW_FARM1_OUT_01");
      };
[/pre]
2) Параметр daily_routine обязательно должен присутствовать и ему должно быть назначено имя существующей функции
[pre]
daily_routine = Rtn_PreStart_666;
[/pre]
Иначе NPC просто не вставится в мир.

Отсюда следует еще одно: у NPC в описании обязательно должен присутствовать ID.
[pre]
ID = 666;
[/pre]

Без ID или при его дублировании в описании другого NPC возможны ошибки при работе.

Перемещение NPC по миру.

Скриптовая основа - функция B_StartOtherRoutine() и функции типа RTN_*** конкретного NPC.

Как это использовать?

Простой пример:
пишем, например, в теле диалога
[pre]
B_StartOtherRoutine(NONE_666_Ramirez,"q");
[/pre]
Это означает, что для NPC с именем instance NONE_666_Ramirez была "включена" его RTN функция rtn_q_666(),
в которой написано, что он должен делать, т.е. информация о вейпойнтах
Туда он и пойдет, в зависимости от "внутренностей" RTN-функции.

Еще один способ - телепортация.
Функция - AI_Teleport().
Работает ТОЛЬКО в связке с B_StartOtherRoutine(), то есть:
сперва применяем AI_Teleport(),
затем B_StartOtherRoutine(),
причем имена вейпойнтов, использованных в этих функциях должны совпадать.
То есть - если в AI_Teleport() указали вейпойнт "NW_X_01",
то он должен быть в функции rtn_q_666, которая используется в B_StartOtherRoutine().

Уф, вроде все.
Пишите исправления. :)
Отправить личное сообщение для Ответить с цитированием