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

Автор Тема: Маленькие советы по использованию CK.  (Прочитано 1340 раз)

Описание:

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

Оффлайн AleksTirex

  • *
  • *
  • Сообщений: 529
  • Репутация: 57.3
  • Пол: Мужской
    • Просмотр профиля
    • Email
Как добавить пакет АИ неписю.

Есть разные способы добавления пакета неписю, рассмотрим пока только два таких варианта.

Вариант №1.
1. Создаётся нужный АИ пакет. Для примера сделаем пакет на старт разговора с игроком, тогда тип пакета будет ForceGreet (ID - aForceGreetPackage). Никаких условий на пакет не надо.
2. Создаётся свой квест (если ещё нет своего квеста).
3. В квесте создаётся алиас на уникального актёра, где в графе Unique Actor назначается ваш NPC (ID - AliasNPC).



4. Во вкладке Scenes создаётся новая сцена (ID - aaaaTestQuest01Scene)
5. Добавляется нужный актёр-алиас AliasNPC, правая кнопка New Actor.




6. Добавляется фаза, правая кнопка Add Phase at End.



7. Добавляется акция, правая кнопка New Action - Package. В окне выбора пакетов нажать Add и выбрать свой пакет aForceGreetPackage.



8. ОК и сохраняемся, сцена готова.

9. Для запуска пакета надо запустить сцену командой aaaaTestQuest01Scene.Start() , естественно, в вашем пусковом скрипте должно быть прописано свойство Scene Property aaaaTestQuest01Scene Auto  и ему назначена сцена aaaaTestQuest01Scene.
(Внимание! Сцена из квестового скрипта почти никогда не запускается, любую сцену надо запускать с любого другого скрипта, кроме квестового)
В этом случае запустится сцена и вместе с ней запустится пакет на вашего непися. Как только пакет отработает сцена и пакет сами выключатся и пакет удалится у непися. Однако, надо иметь в виду, что пакеты не имеющие окончания (следовать, бродить и т.д.) сами не закончатся и сцена не остановится. Для этого можно использовать команду aaaaTestQuest01Scene. Stop() .

**************
Вариант №2
1. Создаётся нужный АИ пакет. Для примера сделаем пакет на старт разговора с игроком, тогда тип пакета будет ForceGreet (ID - aForceGreetPackage).
2. Создаётся свой квест (если ещё нет своего квеста).
3. В квесте создаётся "неопределённый" алиас, выбирается режим Specific Reference без указания референса. Необходимо поставить галочку Optional. В окне Alias Package Data добавляется ваш пакет aForceGreetPackage.



4. Для запуска пакета надо инициализировать этот алиас (передать референс актёра этому алиасу) командой AliasNPC.ForceRefTo(akNPC)  и желательно ускорить процесс старта пакета командой akNPC.Evaluatepackage(), где в данном скрипте должно быть свойство ReferenceAlias Property AliasNPC  Auto  на вашего алиаса.
Для выключения/удаления пакета требуется отследить окончание этого пакета. Это можно сделать из топика (с нашем случае, ведь пакет запускает разговор) или по событию OnPackageChange(aForceGreetPackage). Однако, не все пакеты дают события окончания, смотри вариант№1. Для этого можно в сам пакет ввести необходимые условия, и тогда пакет выключится сам. Но вот удалить его всё-равно надо будет командой AliasNPC.Clear(), этой командой мы очищаем все привязки и ссылки алиаса и актёра.


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

 :PS: Это только на первый взгляд кажется всё так сложно, но на самом деле - всё довольно просто.
Будьте осторожны в своих желаниях, они могут исполниться!
Награды За огромные знания и желание делиться ими с форумчанами

Оффлайн Kalian

  • *
  • Сообщений: 63
  • Репутация: 4.1
  • Пол: Мужской
    • Просмотр профиля
    • TesAll
Re: Маленькие советы по использованию CK.
« Ответ #1 : 13 Ноябрь, 2012, 15:36:37 »
0
Должен ли нпс находится где-то в мире или же скрипт сам переместит этого нпс к игроку, где бы тот не был?

И непонятно от чего в скрипте
Scriptname aGKScene extends ObjectReference 
Scene Property aGKQuestScene Auto 
aGKQuestScene.Start()
Компиляция ругается на последнюю строчку: no viable alternative at input '.'
« Последнее редактирование: 13 Ноябрь, 2012, 16:55:11 от Kalian »

Оффлайн AleksTirex

  • *
  • *
  • Сообщений: 529
  • Репутация: 57.3
  • Пол: Мужской
    • Просмотр профиля
    • Email
Re: Маленькие советы по использованию CK.
« Ответ #2 : 13 Ноябрь, 2012, 17:11:00 »
0
Должен ли нпс находится где-то в мире или же скрипт сам переместит этого нпс к игроку, где бы тот не был?
Для обоих вариантов НПС должен быть реальным и быть где-то в игровом мире (интерьер или экстерьер). Впрочем, любое действие и любая команда для непися требует этого, разве что PlaceActorAtMe() этого не требует, т.к. создаёт нового непися ранее не существующего в игровом мире.

А вот местоположение непися будет зависить от варианта.

В варианте с пакетом ForceGreet будет зависить от условий самого пакета. Там есть условие NPC Wait Location - это место, где непись должен искать/ждать собеседника. Если делать по дефолту, то пока собеседник-цель (ГГ) не окажется в данной локации, непись будет стоять там и ждать туда прихода цели. Чтобы непись побежал сам искать цель по всем локациям надо в этом условии выставить Near Reference - Player <Distance>.
Во всех остальных случаях непись будет ждать прихода цели в заданную локацию.

В варианте со сценой непись сразу побежит искать свою цель, и без разницы, где тот и другой находятся, ведь там используется пакет Trevel с целью Player (или иной актёр).

Т.е. непись пойдёт искать цель согласно отработки движка. А вот "скриптовое" принудительное перемещение - на то оно и скриптовое, что его надо в скрипте прописать. Если есть желание так сделать, то после вызова необходимых команд (на старт сцены/пакета) можно переместить непися в точку цели пакета akActor.MoveToPackageLocation() или akActor.MoveToInteractionLocation(Game.GetPlayer()).
Но применение команд на перемещение не всегда хорошо, бывают проблемы. Ведь если цель находится в лесу на неопределённой локации (т.е. там нет локации вообще), то неизвестно куда и как забросит непися. И при перемещениях очень часто неписи теряют текстуры (тела или одежды).

Цитировать (выделенное)
И непонятно от чего в скрипте Scriptname aGKScene extends ObjectReference  Scene Property aGKQuestScene Auto  aGKQuestScene.Start()Компиляция ругается на последнюю строчку: no viable alternative at input '.'
А... это весь скрипт?
Если весь, то так скрипты не работают. Команда должна в чём-то находится, или в событии, или в функции. (это как в Обле, нужен блок)
« Последнее редактирование: 13 Ноябрь, 2012, 17:14:57 от AleksTirex »
Будьте осторожны в своих желаниях, они могут исполниться!
Награды За огромные знания и желание делиться ими с форумчанами

Оффлайн Kalian

  • *
  • Сообщений: 63
  • Репутация: 4.1
  • Пол: Мужской
    • Просмотр профиля
    • TesAll
Re: Маленькие советы по использованию CK.
« Ответ #3 : 13 Ноябрь, 2012, 17:17:11 »
0
Насчет пакета ясно.

А, я не подумал. У меня скрипт висит на книге, значит надо использовать Event Onread. Я далек от скриптов, посему и совершаю такие глупости с ними.

Оффлайн AleksTirex

  • *
  • *
  • Сообщений: 529
  • Репутация: 57.3
  • Пол: Мужской
    • Просмотр профиля
    • Email
Re: Маленькие советы по использованию CK.
« Ответ #4 : 13 Ноябрь, 2012, 17:31:50 »
0
У меня скрипт висит на книге, значит надо использовать Event Onread.
Правильно. Но только учти, что эта команда на старт сцены/пакета будет срабатывать каждый раз, как только ты прочитаешь книгу. Чтобы этого не было, надо сделать чтение одноразовым (если это необходимо).

Scriptname aGKScene extends ObjectReference 
Scene Property aGKQuestScene Auto 

auto state StatDefaulf
Event OnRead()
   aGKQuestScene.Start()
   gotoState("StatDone")
endEvent
endState

state StatDone
  ;
endState
Будьте осторожны в своих желаниях, они могут исполниться!
Награды За огромные знания и желание делиться ими с форумчанами

Оффлайн Kalian

  • *
  • Сообщений: 63
  • Репутация: 4.1
  • Пол: Мужской
    • Просмотр профиля
    • TesAll
Re: Маленькие советы по использованию CK.
« Ответ #5 : 13 Ноябрь, 2012, 17:43:31 »
0
Разумеется, это я знаю.
Спасибо.

Оффлайн AleksTirex

  • *
  • *
  • Сообщений: 529
  • Репутация: 57.3
  • Пол: Мужской
    • Просмотр профиля
    • Email
Re: Маленькие советы по использованию CK.
« Ответ #6 : 05 Декабрь, 2012, 02:35:42 »
0
Применение условий, недоступных для Папируса.

Есть условия, которые поддерживаются Скайримом, но они недоступны для скриптов. Например, IsSwimming – «если объект находится в воде», IsTalking – «если актёр в данный момент разговаривает», IsCloudy – «если в данный момент ясная погода» и многие другие условия. И когда возникает необходимость применить в скрипте такое условие можно использовать магические эффекты или перки, ведь там эти условия работают.

Например, надо в скрипте применить условие IsSwimming (если объект находится в воде).

1. Для этого мы создаём новый магический эффект myMagicEffect с такими параметрами: Script, Постоянный эффект, На себя, ставится галочка Hide in UI (чтобы не было видно этого заклинания в разделе «магия», если оно будет на персонаже игрока).



2. Далее создаём заклинание mySpell с параметрами: Способность, Постоянный эффект, На себя. Добавляем в него наш магический эффект myMagicEffect.



3. Теперь в этом добавленном магическом эффекте назначаем нужное нам условие – IsSwimming, с параметрами: Subject \ IsSwimming == 1



4. Нажимаем ОК, способность готова. Возвращаемся к магическому эффекту. В соответствующем окне добавляем скрипт myMagicEffectScript :



5. Скрипт примерно такой:

Scriptname myMagicEffectScript extends activemagiceffect 

Quest Property myQuest  Auto  ; это свойство объекта со скриптом, где нужно применить условие (квест, объект, актёр и т.д.)

Event OnEffectStart(Actor akTarget, Actor akCaster)
 ; debug.Notification("In Water")
   (myQuest as myQuestScript).akWater = true
EndEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
 ; debug.Notification("No in Water")
   (myQuest as myQuestScript).akWater = false
EndEvent

myQuestScript –скрипт, где надо применить условие IsSwimming
myQuest – объект, на котором прикреплён скрипт
akWater – свойство в скрипте, которое является условием «IsSwimming».
*Естественно, все переменные/свойства пишите свои, эти только как пример.*

6. Далее эта способность добавляется актёру, которого хотите проверить в воде он или нет. Добавить можно скриптом (akActor.addSpell(mySpell)), а можно и в СК. Этим актёром может быть и сам персонаж игрока.

Работает это так: когда актёр находится не в воде, то магический эффект не работает, т.к. условие «ложь». Когда актёр оказывается в воде, то условие становится «истина» и срабатывает магический эффект, в его скрипте отслеживается данное событие и свойство в основном скрипте akWater меняет значение на true, которое можно использовать вместо условия IsSwimming. Когда актёр выходит из воды, то условие магического эффекта опять становится «ложь» и он перестаёт работать, и свойство akWater опять меняет значение на false.

Если надо использовать несколько разных подобных условий, то для каждого условия делается свой магический эффект со своим скриптом, но все эти эффекты можно добавить в одну способность, т.к. каждый эффект и скрипт будут работать сами по себе не мешая друг другу.
Будьте осторожны в своих желаниях, они могут исполниться!
Награды За огромные знания и желание делиться ими с форумчанами

Теги:
 

Советы

Автор AizecРаздел Мастерская TES III

Ответов: 3
Просмотров: 5491
Последний ответ 26 Март, 2005, 22:32:21
от Aizec
Wiki: Morrowind:Общие советы по тесту модов

Автор WikiBotРаздел Мастерская TES III

Ответов: 0
Просмотров: 738
Последний ответ 07 Ноябрь, 2011, 14:01:32
от WikiBot

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal