• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Tes 3 Morrowind. Скрипты - Анимация И Al  (Прочитано 8224 раз)

Описание:

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
0
Скрипты - Анимация и Al в TES 3 Morrowind

В данной теме будут рассматриваться вопросы управления анимацией и Al с помощью скриптовых команд в игре TES 3 Morrowind.

И как тут не вспомнить о "Morrowind Scripting for Dummies 8.0"  ( MSFD v8.0 ) от GhanBuriGhan  - великолепном руководстве по скриптовому языку TES 3 CS Morrowind? Помимо автора, нельзя не вспомнить с благодарностью еще одного человека, проделавшего громадную работу и усилиями которого на свет появился русский перевод - Gwathlobal.

Я не стану изобретать "велосипед", поэтому, следуя принципу "все об анимации в одном месте", привожу главы из MSFD v8.0, посвященные функциям по управлению анимацией и искусственным интеллектом (Al). Итак...


====================
"Morrowind Scripting for Dummies 8.0"  ( MSFD v8.0 )

Анимирование объектов

Есть группа функций, позволяющих проигрывать определенную анимацию, заданную в модели (файл .nif). Вы можете выяснить имена анимационных групп, загрузив модель в окно просмотра и затем, просматривая различные анимационные группы, или посмотреть в окне "base animation" в меню "Character". Великолепное собрание информации об анимационных группах можно найти здесь:
http://www.preik.net/morrowind/animationgroups.html

* Прим. Garin:  адрес, указанный в MSFD 8.0, уже не работает. Я изменил его на реальный. Кроме того, я представлял описание анимационных групп от автора Quentin Preik в теме "Туториалы по анимации"

Но только то, что перечислено в окне base animation  можно вызвать этой функцией. Дополнительную анимацию можно загрузить, использую кнопку анимации в меню объекта (Add Animation File ). Смотрите танцующих девушек в Доме Наслаждений Дезель в Суране.
Не у всех моделей есть анимационные группы, но различные флаги (под активаторами) — хорошие примеры, чтобы выяснить, что они означают.
Пример для GroupName: idle, idle2, idle3, walk, и т.д.
Эти функции не работают на игроке:

PlayGroup, GroupName, [Flags]

   PlayGroup, walk, 1

Проигрывает анимацию, определенную через GroupName. Опциональные флаги могут использоваться для того, чтобы начать проигрывание группы различными способами (см. ниже).
=============
LoopGroup, GroupName, Number_enum, [Flags]

Проигрывает анимацию, определенную через GroupName. Анимация будет проигрываться определенное количество раз, а затем вернется к анимации бездействия (Idle). Опциональные флаги могут использоваться для того, чтобы начать проигрывание группы различными способами (см. ниже).
=============
SkipAnim

Текущая анимация не проигрывается в этом фрейме.

=============
Флаги:

0 = Обычный
Текущая анимация проиграется полностью, а затем начнется новая анимация.
1 = Немедленный старт
Текущая анимация будет остановлена вне зависимости от того, на каком она сейчас кадре, а затем новая анимация проиграется с начала.
2 = Немедленный цикл
Текущая анимация будет остановлена вне зависимости от того, на каком она сейчас кадре, а затем новая анимация начнет циклично повторяться.


Примечание:
PlayGroup не работает на игроке. С установленным Бладмуном у NPC есть небольшие глюки с анимацией. Когда вы вызываете ее из консоли, она работает нормально, но когда вы пишите в скрипте NPC->PlayGroup, group, 1, может, оказаться, что анимация проигрывается совершенно другая. (Информация с форумов / Kir). Так что придется поэкспериментировать, чтобы найти нужную анимацию. (Посмотрите на список анимаций бездействия NPC для AIWander, Kir работает над инструментом NPC Animation Explorer «NPC Animation Explorer» (Проводник для анимаций NPC), следите за прогрессом!)

* Прим. Garin:  Я представлял NPC Animation Explorer в теме c одноименным названием "NPC Animation Explorer"

Пример:
Это оригинальный скрипт, присоединенный к наружным вывескам и заставляющий их двигаться в зависимости от погоды:

begin OutsideBanner   

; Это скрипт для наружных вывесок, который анимирует их на ветру.   
; Idle — штиль, Idle2 — легкий бриз, и Idle3 — сильный ветер

short ran   
if ( MenuMode == 0 )
    set ran to random 100 
    if ( ran < 30 )    ; 30% шанс, что флаг сделает что-то новое   
        if (GetCurrentWeather  >= 5 )    ; гроза, пылевая буря или мор
            LoopGroup, Idle3, 5
        endif
       ; последняя анимация, вызванная в скрипте, будет проигрываться
        if ( ran <= 10 )
            PlayGroup, Idle
        elseif ( GetCurrentWeather < 5 )
            PlayGroup, Idle2
        endif
    endif
endif   

end OutsideBanner 
« Последнее редактирование: 02 Февраль, 2014, 12:46:13 от kssss »
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Tes 3 Morrowind. Скрипты - Анимация И Al
« Ответ #1 : 21 Май, 2006, 00:03:55 »
0
Привожу описание скриптовых команд для ИИ и управления движениями неписей, использовав информацию, изложенную в MFSD v8.0.
Я не стал приводить примеры некоторых скриптов (12 страниц оригинального текста - это довольно много).
В любом случае это удобнее, чем заглядывать каждый раз в учебник.

====================
"Morrowind Scripting for Dummies 8.0"  ( MSFD v8.0 )[/size]
Автор: GhanBuriGhan
Перевод: Gwathlobal

Скрипты для NPC: ИИ и движение[/font]

----------------------
NPC идет в новую локацию

AiTravel, float_enum_x, float_enum_y, float_enum_z, [ reset ]

   Actor -> AITravel, 1359, 2700, 1045

Чтобы NPC шел между двумя определенными точками в игровом мире, используйте AITravel.
Переменные – мировые координаты x, y, z. Их можно определить, переместив камеру к желаемой точке, или выбрав точку на сетке пути, или объект, в результате координаты будут показаны внизу окна объектов. Использование необязательного флага reset неизвестно.

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

Begin Travel  
AiTravel, 1359, 2700, 1045  
End Travel
Он не будет работать, так как скрипт постоянно добавляет NPC AITravel, и NPC застывает вместо того, чтобы идти.

Begin Travel  
Short do_once    
If (do_once==0)  
    AiTravel, 1359, 2700, 1045  
    Set do_once to 1  endif    
End Travel
Это должно работать, NPC пойдет в нужную точку, как только скрипт станет активным, то есть при загрузке ячейки.

-------------------
Проверка, завершил ли NPC свое движение

GetAIPackageDone   (returns Boolean/short)

if ( GetAIPackageDone == 1 )      
    [делать что-то]
endif


Чтобы проверить, пришел ли NPC в нужное место, можно использовать GetAIPackageDone. Эта функция возвращает 1 в том фрейме, когда текущий пакет ИИ завершен.
Используйте эту функцию, чтобы проверить, завершено ли движение. Этот скрипт показывает, как соединить несколько функций AITravel в одном скрипте, используя переменную состояния и конструкции if-elseif:

Пример скрипта TravelLoop. (*См. оригинальный MSFD v8.0, стр.71)

Хорошие примеры скриптов с AITravel можно найти в “lookoutscript ” (Фаргот, прячущий сокровища) и CharGenWalkNPC  (страж, идущий по кораблю в начале игры). Или поглядите мой плагин Traveling Merchants, чтобы понять, что такое настоящее безумное использование AITravel  :) !
Если вы планирует широко использовать эту функцию, то вам следует знать о следующих проблемах: когда вы покидаете ячейку с путешествующим актером, или вы отдыхаете, скрипт никогда не выполнит условие с GetAIPackageDone, так как ваш NPC стоит все то время, когда вы не в ячейке или спите. Следующий простой код заставит скрипт снова работать (это для предыдущего скрипта):

Пример фрагмента для спасения скрипта – восстанавливает скрипт после выхода из ячейки или сна
(*См. оригинальный MSFD v8.0, стр.72)
-------------------
Поворачиваем актера в нужном направлении

Face x_enum, y_enum

"ActorID" -> Face, -1334, 334

Согласно моим данным эта функция не принимает переменные (по крайней мере, в версии 1.6.1820), но были сообщения, что принимает – возможно, это зависит от версии. Эта функция заставляет NPC посмотреть на указанные координаты. Это прерывает текущую анимацию. На перемещающихся NPC это вызывает прекращение движения, поворот в нужном направлении, затем продолжение движения после того, как поворот закончен. (Информация с форумов / JOG, Dan_Wheeler)
----------------
Задание случайного перемещения Актера

AiWander, range_enum, duration_enum, time_enum, [idle1], [idle2], [idle3], …[idle9], [reset]

"Actor_ID" -> AIWander, 512, 5, 0, 0,20,0,0,10,30,0,0,0

Это алгоритм случайных перемещений, который используют практически все NPC в игре. NPC перемещается вдоль сетки пути, случайно меняет направление и совершает действия простоя (idle).
•   Range:  определяет дистанцию, на которую Актер и существо может отходить от первоначального положения.
•   Duration:  возможно, время (в часах) выполнения Актером данного пакета (до его сброса, что, похоже, происходит, когда игрок или уходит, или спит, не уверен ?) *
•   time:  возможно, определяет время начала исполнения пакета, если у него есть продолжительность.
•   [idle1], …[idle9]:  шансы для движений простоя

* [size=8]Где-то я читал, чуть ли не в хелпе, что на Актерах исполняются все пакеты, которые к ним были добавлены. После завершения исполнения всех пакетов, они начинают опять исполнятся заново в той же последовательности, в какой были добавлены. Потому то в диалогах, когда вы просите кого-то подождать вас, после того как этот непись за вами ходил, ему добавляется AIWander с нулевым временем, то есть чтоб этот пакет исполнялся бесконечно. (Прим. Gwathlobal)[/size]

Простои бывают (тестировалось в игре):

•   Человек мужчина:
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  , 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 - Диалог
Контейнер - Открыть
Дверь - Открыть
Загружающая дверь - Открыть/телепорт(в ту же ячейку)
Оружие, броня, разное и т.д. - Поднять
Книга/Свиток - Читать (для NPC?)
Активаторы - Выполнить действие в скрипте

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

Тестовый скрипт TT_opendoor
Тестовый скрипт TT_pickmace
Тестовый скрипт TT_openloaddoor

     (*См. оригинальный MSFD v8.0 rus, стр.75, 76)

---------------
Следование и эскорт

AiFollow, "Actor ID", duration_f_enum, x_f_enum, y_f_enum, z_f_enum, [reset]
AiFollowCell, "Actor ID", "Cell ID", duration_f_enum, x_f_enum, y_f_enum, z_f_enum, [reset]

Actor -> AIFollow, "Mob2ID", 0,0,0,0

Пакет ИИ «Следовать» (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 неизвестно.

---------------
Определение текущего пакета ИИ

Для сложного скриптинга Актеров возможна переменная, в которой хранится значение текущего типа ИИ и от которой зависят действия скрипта.

GetCurrentAIPackage (returns short)

If ( GetCurrentAIPackage == 2 )
    [делать что-то]
endif


Возвращаемые значения:
Никакой    -1
Wander (Бродить)    0
Travel (Идти)    1
Escort (Эскорт)    2
Follow (Следовать)    3
Activate (Активировать)    4
Pursue (Преследовать)    5

-------------------------------
Заставляем актера красться

ForceSneak      
ClearForceSneak

    "Actor_ID" -> ForceSneak

GetForceSneak    (returns Boolean/short)
    If ( "actor_ID" -> GetForceSneak == 1 )    

Команда ForceSneak переводит актера в режим скрытности, все движения будут выполняться, как будто он крадется. ClearForceSneak завершает режим ForceSneak. К сожалению, нет соответствующей команды для бега (добавлена в Трибунале). GetForceSneak возвращает 1, если режим ForceSneak для вызывающего актера включен. Смотрите LookoutScript  для примера. Вот отрывок:

elseif ( walkstate == 2 )
    Fargoth->ForceSneak; войти в режим скрытности
    Fargoth->AiTravel -11468.595,-71511.531,173.728  ;идти к дереву
    set walkstate to 3
elseif ( walkstate == 3 )
    if ( Fargoth->GetAiPackageDone == 1 )
      ; Fargoth->Equip "torch_infinite_time_unique"
        set walkstate to 4
      ; MessageBox "ДОЛЖЕН БЫТЬ У ДЕРЕВА"
    endif
elseif ( walkstate == 4 )
    set timer to timer + GetSecondsPassed
    Fargoth->ClearForceSneak; выйти из режима скрытности
    Fargoth->AiWander 0 0 0 0 0 0 0 0 0
        if ( timer > 3 )
            Fargoth->ForceSneak; снова войти в режим скрытности
            Fargoth->AiTravel -11410.590,-72057.188,133.644;идти к стене
            set walkstate to 5
        endif

------------------
Заставляем актера бегать и прыгать: Движения в Трибунале

ForceRun
ClearForceRun
GetForceRun (short)

ForceJump
ClearForceJump
GetForceJump (short)

ForceMoveJump
ClearForceMoveJump
GetForceMoveJump (short)


Все эти функции управляют движением указанного NPC. ForceRun заставляет актера всегда бежать при движении, ForceJump заставляет актера постоянно прыгать, ForceMoveJump заставляет актера постоянно прыгать при движении. Версии функций с Get возвращают 1 , если NPC был принужден войти в эти режимы, и 0 в противном случае. Функции Clear используются для сброса эти режимов. Каждый NPC может быть только в одном из этих режимов одновременно. Приоритет для этих режимов: Sneak > Running > Jump > MoveJump.

Пример:
Этот скрипт позволяет объекту контролировать тип движения Athlete (Атлет), NPC, который бесконечно движется по квадрату с четырьмя точками-углами:

Begin AthleteControl
short questionAsked
short button
short isrunning
short isjumping

if ( MenuMode )
    return
endif
if ( OnActivate == 1 )
    set isrunning to ( Athlete->GetForceRun )
    set isjumping to ( Athlete->GetForceMoveJump )
    if ( questionAsked == 0 )
        if ( isrunning )
            MessageBox, "Атлет должен прекратить бежать? "  "Да"  "Нет"
        else
            MessageBox, "Заставить Атлета бежать? "  "Да"  "Нет"
        endif
        set questionAsked to 1
    endif
endif
if ( questionAsked == 1 )
    set button to GetButtonPressed
    if ( button == -1 )
    else
        if ( isrunning == 0 )
            if ( button == 0 )
                Athlete->ClearForceMoveJump
                Athlete->ForceRun
            endif
        else
            if ( button == 0 )
                Athlete->ClearForceRun
            endif
        endif
        if ( isjumping )
            MessageBox, "Атлет должен прекратить прыгать? "  "Да"  "Нет"
        else
            MessageBox, "Заставить Атлета прыгать? "  "Да"  "Нет"
        endif
        set questionAsked to 2
        set button to –1
    endif
endif
if ( questionAsked == 2 )
    set button to GetButtonPressed
    if ( button == -1 )
    else
        if ( isjumping == 0 )
            if ( button == 0 )
                Athlete->ClearForceRun
                Athlete->ForceMoveJump
            endif
        else
            if ( button == 0 )
                Athlete->ClearForceMoveJump
            endif
        endif
        set questionAsked to 0
        set button to –1
    endif
endif

end


--------------------
Проверка действий игрока: бежит, прыгает, крадется?

[no fix] GetPCSneaking (short)
[no fix] GetPCRunning (short)
[no fix] GetPCJumping (short)

   
if ( GetPCRunning )

Эти функции возвращают 1, если игрок выполняет подходящее действие, и 0 – если нет. Поскольку в Морре нет функций прямого тестирования ввода с клавиатуры, это альтернативный способ проверить, что игрок нажал определенную клавишу. Они широко используются в движущихся кораблях, лошадях или в моем моде про скалолазание.

Пример:
Когда этот скрипт помещен на NPC и игрок имеет надетый предмет scissors, появляются сообщения о действиях игрока:
Begin momscript
short warn

if ( player->HasItemEquipped "scissors" )
    if ( warn != 1 )
        if ( GetPCRunning )
            MessageBox "Не бегай с ножницами!"
            set warn to 1
        endif
    endif
    if ( warn != 2 )
        if ( GetPCJumping )
            MessageBox "Не прыгай с ножницами! Ты себе глаз выколешь!"
            set warn to 2
        endif
    endif
    if ( warn != 3 )
        if ( GetPCSneaking )
            MessageBox "Ты не спрячешь ножницы от меня!"
            set warn to 3
        endif
    endif
else
    set warn to 0
endif

end


----------------------
Определение готовности к бою

GetWeaponDrawn (short)
GetSpellReadied (short)

   
if ( player -> GetWeaponDrawn )

Эти функции могут использоваться для определения, достал ли Актер свое оружие (GetWeaponDrawn) или приготовил заклинание для кастинга  (GetSpellReadied).

Пример:  Этот глобальный скрипт выдает сообщения о состоянии готовности оружия и заклинаний:

Begin player_notifications
short weapstate
short spelstate

if ( player->GetWeaponDrawn )
    if ( weapstate != 1 )
        set weapstate to 1
        MessageBox "Игрок вытащил оружие."
    Endif
else
    if ( weapstate != 0 )
        set weapstate to 0
        MessageBox "Игрок зачехлил оружие."
    Endif
endif
if ( player->GetSpellReadied )
    if ( spelstate != 1 )
        set spelstate to 1
        MessageBox "Игрок приготовил заклинание."
    Endif
else
    if ( spelstate != 0 )
        set spelstate to 0
        MessageBox "Игрок отложил вызов заклинания."
    Endif
endif
end

---------------
Заставляем кого-то падать

Fall
   
Actor -> Fall

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

------------------
Доля в экипировке и другие функции компаньонов

[no fix] companion  (is local short)
   
short companion
Set companion to 1


В Трибунале есть опция для дележа вещей с NPC и монстрами. Что ее включить, объявите локальную переменную типа short с именем companion  и установит ее в 1. Установка в 0 отключит возможность дележа.

[no fix] minimumprofit    (is local float)
   
Float minimumprofit
If ( minimumprofit < 0 )


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

Пример:  Вот важная часть скрипта Калвуса (наемник в Морнхолде). Эта секция оперирует изменением состояния, когда Калвус разрывает контракт, или потому что срок контракта истек, или потому что игрок взял вещи Калвуса. Дележ запускается в диалоге (установкой companion в 1), не в самом скрипте:

if ( GetJournalIndex Merc_Calvus_Quit < 1 );если Калвус уже ушел, не делать этого
if ( Contract_Calvus == 1 ); если Калвус не заключил контракт, не делать этого
    if ( minimumProfit < 0 ); Калвус уходит, так как игрок взял его вещи
        AiWander 128 6 0 40 30 20 0 0 0 0 0 0
        Set Companion to 0; прекратить дележ
        StopScript Contract_Calvus
        Set Contract_Calvus to 0
        ForceGreeting
        return
    else
        if ( Contract_Calvus == 0 ); управляет Калвусом после истечения срока
            AiWander 128 6 0 40 30 20 0 0 0 0 0 0
            Set Companion to 0; прекратить дележ
                if ( GetJournalIndex Merc_Calvus < 10 )
                    Journal Merc_Calvus 10; первый контракт истек
                else
                    Journal Merc_Calvus 20; самый недавний контракт истек
                endif
        endif
    endif
endif

endif


[no fix] StayOutside  (is local float)
   
short StayOutside
set StayOutside to 1


Ценная переменная для использования с компаньонами. Когда используется в скрипте, она заставляет всякого, у кого установлена в 1, автоматически оставаться (и ждать) снаружи любого интерьера, пока игрок не вернется (потом автоматически с ним соединяется). (Информация с форумов / Grumpy)
Награды За огромный вклад в развитие Румора

Теги:
 

TES 4: Oblivion. Скрипты - Анимация и Al

Автор GarinРаздел Туториалы по анимации

Ответов: 1
Просмотров: 10313
Последний ответ 21 Май, 2006, 02:47:59
от Garin
Анимация и скрипты - очень важный вопрос! Пожалуйста помогите

Автор @NAVI@Раздел Анимация в TES: Morrowind, Oblivion, Skyrim

Ответов: 2
Просмотров: 5648
Последний ответ 12 Июль, 2008, 20:30:27
от @NAVI@
Анимация в Morrowind

Автор TiaraРаздел Обсуждение готовой анимации

Ответов: 30
Просмотров: 7994
Последний ответ 01 Март, 2011, 08:28:03
от Galib
Программы и утилиты для Morrowind

Автор dx117Раздел Программы и утилиты для TES III

Ответов: 7
Просмотров: 30342
Последний ответ 18 Февраль, 2011, 13:27:41
от Tiara
Скрипты

Автор dx117Раздел Скриптинг под TES III

Ответов: 138
Просмотров: 52046
Последний ответ 20 Ноябрь, 2007, 15:45:28
от Siegrun
Плагины для Morrowind

Автор КаМиРаздел Плагины для TES 3: Morrowind

Ответов: 56
Просмотров: 11856
Последний ответ 26 Декабрь, 2012, 06:50:33
от Tiara
Анимация в Морровинде!

Автор GarinРаздел Туториалы по анимации

Ответов: 75
Просмотров: 32837
Последний ответ 07 Март, 2008, 00:17:46
от DSD3mon
Анимация танцев Groovy Moves от Rx31

Автор GarinРаздел Обсуждение готовой анимации

Ответов: 1
Просмотров: 7835
Последний ответ 09 Май, 2006, 00:28:01
от Garin
Werewolves для Morrowind

Автор ~Max960~Раздел Плагины для TES 3: Morrowind

Ответов: 27
Просмотров: 14549
Последний ответ 05 Март, 2006, 10:14:49
от ~Max960~
Вопрос По Morrowind

Автор dswiftРаздел TES III: Morrowind, Tribunal, Bloodmoon

Ответов: 1
Просмотров: 3603
Последний ответ 15 Январь, 2006, 14:48:45
от zOmb

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal