Согласно моим данным эта функция не принимает переменные (по крайней мере, в версии 1.6.1820), но были сообщения, что принимает – возможно, это зависит от версии. Эта функция заставляет NPC посмотреть на указанные координаты. Это прерывает текущую анимацию. На перемещающихся NPC это вызывает прекращение движения, поворот в нужном направлении, затем продолжение движения после того, как поворот закончен. (Информация с форумов / JOG, Dan_Wheeler)
Это алгоритм случайных перемещений, который используют практически все NPC в игре. NPC перемещается вдоль сетки пути, случайно меняет направление и совершает действия простоя (idle).
Range: определяет дистанцию, на которую Актер и существо может отходить от первоначального положения.
Duration: возможно время (в часах) выполнения Актером данного пакета (до его сброса, что, похоже, происходит, когда игрок или уходит, или спит, не уверен[28]?)
time: возможно определяет время начала исполнения пакета, если у него есть продолжительность.
[idle1], …[idle9]: шансы для движений простоя
Простои бывают (тестировалось в игре):
Человек мужчина: Idle1: Стоять смирно Idle2: Перенос веса с одной ноги на другую Idle3: Посмотреть назад Idle4: Почесать голову, потрясти головой Idle5: Поправить одежду или броню на плече Idle6: Зевать и потягиваться Idle7: Посмотреть на пальцы и оглянуться вокруг Idle8: Положить руку на грудь, как при боли в сердце Idle9: Потянуться за оружием, затем дотронуться до головы.
Человек женщина – как и выше, кроме: Idle5: Рука на бедро
Хаджит женщина – как Человек мужчина, кроме: Idle9: Почесать голову, потрясти головой
Чтобы актер стоял на одном место, используйте: AIWander, 0, 0, 0
Примечание: Количество простоев и некоторые описания в предыдущих версиях были обозначены неверно (исправлено с 8-ой версии – спасибо Whoopa).
Вот пример,который показывает все простои сериями (это может быть полезно, чтобы узнать, какую анимацию вы хотите использовать для NPC)
Begin Animtest
float timer
short count
set timer to ( timer + GetSecondsPassed )
if ( timer > 10 )
set timer to 0
set count to ( count + 1 )
if ( count >= 18 )
set count to 0
endif
endif
if ( count == 1 )
AIWander 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0
MessageBox "Idle 1 , 100"
set count to ( count + 1)
elseif ( count == 3 )
AIWander 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0
MessageBox "Idle 2 , 100"
set count to ( count + 1)
elseif ( count == 5 )
AIWander 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0
MessageBox "Idle 3 , 100"
set count to ( count + 1)
elseif ( count == 7 )
AIWander 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0
MessageBox "Idle 4 , 100"
set count to ( count + 1)
elseif ( count == 9 )
AIWander 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0
MessageBox "Idle 5 , 100"
set count to ( count + 1)
elseif ( count == 11 )
AIWander 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0
MessageBox "Idle 6 , 100"
set count to ( count + 1)
elseif ( count == 13 )
AIWander 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0
MessageBox "Idle 7 , 100"
set count to ( count + 1)
elseif ( count == 15 )
AIWander 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0
MessageBox "Idle 8 , 100"
set count to ( count + 1)
elseif ( count == 17 )
AIWander 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100
MessageBox "Idle 9 , 100"
set timer to 0
set count to ( count + 1)
endif
End
Актеры активируют объекты
AiActivate"Object ID"
AiActivate , ObjectID, [reset]
Actor -> AIActivate "Object"
Процитирую Bethesda: «Этот пакет указывает Актеру активировать ObjectID. Мощный и непротестированный, неиспользующийся пакет».
В обычном Морре эта функция практически сломана, кроме того, что ею можно заставить NPC выпить зелье. С Трибуналомона, похоже, исправлена, до определенной степени. Я мог заставить NPC поднять оружие, открыть обычную дверь и пройти через загружающую дверь. Загружающие двери работают, только если телепортирующий маркер находится в том же интерьере, или загруженных (текущий и вокруг) экстерьерах – иначе игра вылетает. Я также успешно тестил ее с активатором (переключателем у Призрачных Врат)
Нужны обычные предосторожности с функциями ИИ (убедитесь, что Актер не слишком далеко, что сетка ИИ на месте – нормальная, что ничего не загораживает путь, и т.д.) Хотя я не достаточно тестил, я не заметил, что появлялся сигнал от AIPackageDone, но есть и другие способы установить для NPC новый пакет (см примеры ниже).
Пример: Это тестовые скрипты, которые я сделал. Они показывают, как задавать условия, чтобы определить, закончил ли NPC выполнять действие.
Begin TT_opendoor
short doonce
short AIState
if ( doonce == 0 )
if ( GetDistance, Player < 400 )
AIActivate TT_door
set doonce to 1
endif
elseif ( doonce == 1 )
set AIState to GetCurrentAIPackage
MessageBox "Package = %g", AIState
if ( TT_door->GetAngle, z != 180 ); Как только дверь начала вращаться
MessageBox "Done"
AIWander 30, 5, 0, 0,20,0,0,10,30,0,0
set doonce to 2
endif
endif
end
Begin TT_pickmace
short doonce
short AIState
if ( doonce == 0 )
if ( GetDistance, Player < 400 )
AIActivate TT_daedric_mace
set doonce to 1
endif
elseif ( doonce == 1 )
set AIState to GetCurrentAIPackage
MessageBox "Package = %g", AIState
if ( GetItemCount, TT_daedric_mace >= 1 ); когда в инвентаре NPC появидась булава
MessageBox "Done"
AIWander 512, 5, 0, 0,20,0,0,10,30,0,0
set doonce to 2
endif
endif
end
Begin TT_openloaddoor
short doonce
short AIState
if ( doonce == 0 )
if ( GetDistance, Player < 400 )
AIActivate TT_door
set doonce to 1
endif
elseif ( doonce == 1 )
set AIState to GetCurrentAIPackage
MessageBox "Package = %g", AIState
if ( GetPos, y > 2000 ); позиция изменилась. Телепортация в ту же ячейку
Пакет ИИ «Следовать» (Follow) приказывает одному актеру идти за другим. Это можно использовать, чтобы NPC или существо пошло за игроком, а можно составить из NPC и существ караван. Следующий отрывок из моего собственного скрипта показывает использование функции с нулевыми параметрами:
elseif ( state == 20 )
HB_guar_pack_adros_ -> AIFollow, HB_adros_darani, 0, 0, 0, 0
AITravel -8144, -19409, 728 ;new coords point 1
set state to 30
Поскольку точка назначения и длительность не заданы, гуар будут следовать за NPC до тех пор, пока не будет дана другая команда. Также как и с другими командами ИИ, убедитесь, что каждая команда вызывается только раз, а не каждый фрейм.
Длительность, CellID и координаты x, y, z точки назначения ставят условия, при которых AIFollow завершится (что можно отследить функцией GetAIPackageDone). AiFollowCell позволяет указать интерьер в качестве точки назначения.
Значение необязательного флага reset неизвестно.
AIEscort, "Actor ID", duration, x, y, z, [reset]
AIEscortCell, "Actor ID", "Cell ID", duration, x, y, z, [reset]
Эта функции позволяет Актеру привести игрока в определенную точку. Актер будет ждать игрока, если расстояние окажется слишком большим, и продолжит путь, когда игрок приблизится (Спасибо Kir за эту инфу). Смотрите примерв создании персонажа – страж эскортирует вас из трюма судна на второй уровень к выходу. (Спасибо MisterSmileyFaceDude). Значение необязательного флага reset неизвестно.