Модератор форума: Kris†a™  
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)

Вопросы по скриптам Papyrus
sansuli  Offline  Сообщение №1 написано: 31 августа 2012, 13:29 | Отредактировано: Multigone - 23 апреля 2020, 14:24


The Red Sun


193
Уроки по скриптованию на языке Papyrus
Прежде чем задать вопрос просмотрите вышеуказанные уроки.
ok


Тема регламентирована.


• Прежде, чем задать вопрос, пожалуйста, убедитесь, что такой вопрос не задавался раньше. Старайтесь описать суть вопроса как можно подробней.
• Прежде, чем опубликовать ответ на вопрос, пожалуйста, убедитесь, что обладаете необходимыми для этого знаниями. Старайтесь cформулировать суть ответа как можно лаконичней.
• При желании ответить в приватном порядке, пожалуйста, воспользуйтесь ЛС.
• При желании поблагодарить ответившего, пожалуйста, воспользуйтесь кнопкой "
+" полезного сообщения.

Сообщения, не относящиеся к вопросам по скриптам Papyrus, ответам на них или уточнениям, являются оффтопом и могут быть удалены.

Красное солнце
Есть вопросы по скриптам Papyrus? Пиши не в ЛС, а в эту тему.
AleksTirex  Offline  Сообщение №391 написано: 7 октября 2013, 20:27 | Отредактировано: AleksTirex - 7 октября 2013, 21:33


Архимаг


371
Цитата anton

можно ли в Папирусе можно создать двухмерный массив



Не уверен, но вроде бы нельзя.

Array = {1,2,3} не многим отличается от Array[1]=1, Array[2]=2, Array[3]=3 , есть ли смысл заморачиваться?
Если массив объектный, то можно форм-лист составить, если цифровой, то можно циклом прописать используя коэффициент (*2.3 или /1.28 или + 1 и т.д). А если цифры хаотичные, то проще вручную прописать Array[1]=1, Array[2]=2, Array[3]=3

Если это для времени анимации, то лучше вручную, т.к. всё равно придётся корректировать не один раз.

anton  Offline  Сообщение №392 написано: 8 октября 2013, 08:54



362
Цитата AleksTirex

Если это для времени анимации


Нет, не для времени анимации, но для определения какая анимация может запустится следующей, в зависимости от того, какая только что закончилась. :)

В общем, идея мода такая:
Должно получиться развлекалочка, типа "Emotes", как оно есть в ММО типа Тера, Аион и т.п..
ГГ получает "малую способность", при активации которой стартует моя анимация (а точнее их набор) добавленные в игру с помощью FNIS. Анимация имеет начало, несколько лупов, которые рандомно меняются, и конец. Анимация играет бесконечно, до тех пор, пока пользователь снова не нажмёт кнопку использования "малой способности". Только тогда проигрывается конец.
Основа уже есть и прекрасно работает. Осталось подкорректировать анимации, чтобы были плавные переходы, и написать правила их вызова. Вот чтобы эти правила было легче писать я и хотел создать матрицу допустимых вариантов, и потом после каждого рандома проверять, можно ли запустить новую анимацию, или запустить рандом снова.

Мой Блог
AleksTirex  Offline  Сообщение №393 написано: 8 октября 2013, 12:26


Архимаг


371
В принципе, идея понятна.
 
Можно и "провиртуалить" массивы, но можно и просто сделать два массива (строковый и числовой) с равной длиной, где порядок заполнения будет соответствовать друг другу:
anim[0] - анимашка №1
fTime[0] - время работы анимашки №1
anim[1] - анимашка №2
fTime[1] - время работы анимашки №2
(пример такого использования чуть ниже)
 
"допустимых вариантов" - а что, есть несовместимые анимации? И много ли таких вариантов?
 
Возможно, проще разбить анимации по своим массивам по принципу совместимости.
Или индексировать анимации по совместимости, например, несовместимые раскидывать в начало и конец массива. Тогда:
 
int index
While ...
if index < 5 ; активная анимашка в зоне плохой совместимости
  index = RandomInt(0, 20) ; после 20 идут анимашки с плохой совместимостью с анимашками 0-5
elseif index > 20
  index = RandomInt(5, 25)
else
  index = RandomInt(0, 25)
endif
SendAnimationEvent(player, anim[index])
Wait(fTime[index])
...
endWhile

anton  Offline  Сообщение №394 написано: 8 октября 2013, 18:30 | Отредактировано: anton - 8 октября 2013, 18:32



362
Цитата AleksTirex

а что, есть несовместимые анимации? И много ли таких вариантов?



Ещё как есть, и чем больше вариантов анимаций - тем больше несовместимостей.

К примеру, у меня уже готовы 4 повторяемые анимации:
(1) Есть луп покачивания в положении лёжа.
(2) Есть переход из положения лёжа в положение сидя.
(3) Есть луп покачивания в положении сидя.
(4) Есть переход из положения сидя в положение лёжа.

Так вот:
- если выполнилась анимация (1), то следующей можно выполнить только анимации (1) или (2).
- если выполнилась анимация (2), то следующей можно выполнить только анимацию (3).
- если выполнилась анимация (3), то следующей можно выполнить только анимации (3) или (4).
- если выполнилась анимация (4), то следующей можно выполнить только анимацию (1).

Если эти правила не прописать, переходы будут дёрганные и не логичные. Выглядеть это будет ужасно. Я проверял :)

Как их упорядочить пока не представляю. Тем более, что на подходе ещё 4 анимации. А там может и больше добавлю...

Самый лучший способ на данный момент, который я придумал, это создать такую себе матрицу вариантов.
Строкой матрицы - будет индекс выполнившейся анимации, а с ячейках каждой строки - всевозможные разрешённые (или запрещённые) индексы анимаций.
Потом делаем цикл, в котором генерим случайное число из диапазона всех анимаций и проверяем его на пригодность. Если оно, допустим, не совпало ни с одним элементом соответствующей строки - значит анимацию с этим индексом выполнить можно, цикл прерывается и анимация запускается.
Иначе - генерим случайное число снова и опять проверяем его; и так до победного конца.

Алгоритм вроде бы достаточно линеен и прост. Реализовать не сложно. Жаль только что с массивами подизвратиться придётся.

Мой Блог
StanislavD  Offline  Сообщение №395 написано: 13 октября 2013, 10:31



123
подскажите где отключение перехода вида в этой строчке: Game.DisablePlayerControls(True, True, True, False, True, False, True)?
мне просто нужно сохранение от первого лица в сцене а то эффект портиться.  как не включаю/выключаю в игре колесо мыши крутану, и вид меняется...

toozikoos  Offline  Сообщение №396 написано: 13 октября 2013, 13:02



21

StanislavD  Offline  Сообщение №397 написано: 13 октября 2013, 16:45 | Отредактировано: StanislavD - 13 октября 2013, 18:19



123
читал её... ставил, но стоит в игре повернуть колесо мыши от 3 лица вид(

нифига не выходит... надо отключить практически всё управление, ато портится вся картина((

вот скрипт:

ObjectReference Property Point1 Auto
ObjectReference Property Point2 Auto
ObjectReference Property Point3 Auto
ObjectReference Property Point4 Auto
ObjectReference Property Point5 Auto
ObjectReference Property Point6 Auto
ObjectReference Property Point7 Auto
ObjectReference Property Panel Auto
ObjectReference Property mySound Auto

Event OnTriggerEnter(ObjectReference akActionRef)
If akActionRef == Game.GetPlayer() ; Limit this trigger to the player only.
Game.GetPlayer().SetAlpha(0)
Game.GetPlayer().SetGhost(True)
Game.DisablePlayerControls(1, 1, 1, 0, 1, 0, 1); Блокировка всего управления кроме обзора.
Utility.Wait(0.1)
Game.GetPlayer().TranslateToRef(Point1, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point2, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point3, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point4, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point5, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point6, 200)
Utility.Wait(0.0)
Game.GetPlayer().TranslateToRef(Point7, 200)
Utility.Wait(0.0)
Panel.Disable()
Game.GetPlayer().SetAlpha(1)
Game.GetPlayer().SetGhost(False)
Game.EnablePlayerControls()
EndIf
EndEvent

поинты - маркеры передвижения, панель колизия, соунд звуковое сопровождение

в выделенной строчке меняю параметры... а они не влияют((( хотя по сату смотрел должны отключать и включать...

Alliria  Offline  Сообщение №398 написано: 13 октября 2013, 20:38 | Отредактировано: Alliria - 13 октября 2013, 23:18



706
Нарисовалась пара вопросов:
1. куда цеплять SKSE скрипты типа FormScript?
2. Есть ли возможность в Quest Script определить, когда управление ГГ передано AI в сценах (как например в начале игры в Хелгене)?
3. Что не так в скрипте?
Код
Scriptname aaAlliriaMaterialPlayerAliasScript extends ReferenceAlias

Quest property aaAlliriaRCRwaStartQuest auto
Quest property aaAlliriaRCRwaUpdateQuest auto
Spell Property AbAlliriaRCRMaterialAbility auto
;bool Function HasSpell(Spell AbAlliriaRCRMaterialAbility) native
Bool clearAliasARCR
Int i = 0
Int j = 0
ReferenceAlias refAliasARCR
ReferenceAlias objAliasToAddARCR
ObjectReference objRefARCR
ObjectReference objRefToAddARCR

Event OnInit()
     RegisterForUpdate(5.0)
EndEvent

Event OnUpdate()
     While ((aaAlliriaRCRwaUpdateQuest.GetID () > (i-1) ) && (aaAlliriaRCRwaStartQuest.GetID () > (j-1)))
            refAliasARCR = aaAlliriaRCRwaUpdateQuest.GetID () as ReferenceAlias
            If(refAliasARCR)
               objRefARCR = refAliasARCR.GetReference ()     
                 If(!objRefARCR)
                   objAliasToAddARCR = aaAlliriaRCRwaStartQuest.GetID () as ReferenceAlias
                   If(objAliasToAddARCR)
                      objRefToAddARCR = objARCRAliasToAdd.GetReference ()  
                      If(objRefToAddARCR)
                         refAliasARCR.ForceRefTo (objRefToAddARCR)  
                      endIf
                      j += 1
                   endIf
                 ElseIf(objARCRRef.GetDistance (playerRef) > 30000)
                     ARCRrefAlias.Clear ()
                     (objARCRRef as Actor).RemoveSpell (AbAlliriaRCRMaterialAbility)
                 ElseIf ((objARCRRef as Actor).IsDead ())
                     ARCRrefAlias.Clear ()
                     (objARCRRef as Actor).RemoveSpell (AbAlliriaRCRMaterialAbility)
                 endIf
            endIf
         i += 1
     EndWhile
EndEvent

AleksTirex  Offline  Сообщение №399 написано: 15 октября 2013, 01:08


Архимаг


371
Цитата StanislavD

Game.DisablePlayerControls(false, false, true, false, false, false, false)



Сравни эти два варианта (второй от сюда: http://www.creationkit.com/DisablePlayerControls_-_Game ), есть разница?
 
*********
TranslateToRef() - это не латентная функция, в отличии от Wait(), скрипт не будет ждать её исполнения, а сразу же начнёт исполнять следующую команду. Для "ожидания" есть своё событие OnTranslationComplete().
Поэтому можно было сразу написать Game.GetPlayer().TranslateToRef(Point7, 200), т.к. только эта функция будет работать (она заменит все предыдущие).
Писать Utility.Wait(0.0) не стоит - время нулевое, поэтому никаких действий не будет.

Myprism  Offline  Сообщение №400 написано: 15 октября 2013, 07:00


Физик


Можно ли сделать скрипт на кольцо, который бы при одевании и снимании кольца менял один Outfit персонажа, одевшего кольцо, на другой?
Поясню. В игре есть объекты Outfit. Это списки, содержащие элементы брони и одежды. Каждому персонажу (кроме ГГ) в игре назначен один из стандартных Outfit. Персонаж одевает всё, что есть в этом списке, пока ГГ не возьмёт его в компаньоны. Но когда персонаж будет взят на службу, броня из Outfit будет замещаться на то, что будет выдано игроком персонажу, но только в том случае, если новая шмотка круче по мнению компьютера. В результате, хускарлов игрок не может переодеть в платье или раздеть. Мне нужно кольцо, которое можно было бы дать компаньону так, чтобы оно сделало Outfit персонажа пустым. Я вижу это так. Папирус позиционируется как объектно-ориентированный язык, значит, надо для каждого экземпляра кольца создать две локальные переменные со ссылками на Outfit0 и Outfit1. В игре создать пустой Outfit0. При одевании кольца заменять Outfit1 на Outfit персонажа, а Outfit персонажа на Outfit0. При снимании кольца операция проходит наоборот.
Проблема в том, что я не знаком с папирусом. Поэтому подскажите, возможно ли это, или не стоить терять время, и, если возможно, то с чего надо начинать копать и что брать за прототип.

StanislavD  Offline  Сообщение №401 написано: 15 октября 2013, 19:37



123
Цитата 1001990

Писать Utility.Wait(0.0) не стоит - время нулевое, поэтому никаких действий не будет.


я знаю просто время вылавливал...
лучше поясни по скриптам что не так.. я пробовал включать каждый параметр отдельно и с 0/1 и с false/true...  почемуто дергая колесо менялся вид с первого лица на вид от третьего

AleksTirex  Offline  Сообщение №402 написано: 17 октября 2013, 13:30 | Отредактировано: AleksTirex - 17 октября 2013, 13:46


Архимаг


371
Цитата 1002019

Можно ли сделать скрипт на кольцо, который бы при одевании и снимании кольца менял один Outfit персонажа, одевшего кольцо, на другой?



Scriptname aaJewelryOutfitScript extends ObjectReference

Outfit Property kOutfitEmpty  Auto ; пустой оутфит
Outfit kOutfit

Event OnEquipped(Actor akActor)
 if akActor != Game.GetPlayer()
  if !kOutfit
   kOutfit = akActor.GetActorBase().GetOutfit()
   akActor.RemoveAllItems(Game.GetPlayer())
   akActor.SetOutfit(kOutfitEmpty)
   akActor.QueueNiNodeUpdate()
  endif
 endIf
endEvent

Event OnUnequipped(Actor akActor)
 if akActor != Game.GetPlayer()
  akActor.RemoveAllItems(Game.GetPlayer())
  akActor.SetOutfit(kOutfit)
  akActor.QueueNiNodeUpdate()
  kOutfit = none
 endIf
endEvent

------------------------
Требуется SKSE !!!

Без SKSE не узнать, какой именно оутфит носил НПС.
 
Возврат ВСЕЙ одежды обратно ГГ необходим потому, что при смене оутфитов одежда бесследно удаляется у НПС (не только надетая, а практически вся броня и шмотки, кольца и амулеты не исчезают, это дефолтный баг/эффект). Для упрощения сделан возврат игроку всего содержимого инвентаря непися (можно и только одежду возвращать, но тогда скрипт заметно усложнится).
В блоке OnEquipped команду на удаление вещей можно и не писать, если игрок предварительно заберёт сам всю одежду у НПС, но это неудобно. Но здесь есть "баг" - броня-оутфит тоже перемещается к ГГ.
Чтобы было всё красиво и без недостатков, надо заметно усложнить скрипт.

Myprism  Offline  Сообщение №403 написано: 17 октября 2013, 20:03


Физик


AleksTirex, огромное спасибо! Одна беда, вопрос я задавал, ещё находясь дома, а сейчас отвечаю, уже и гостиницы в Армении, где у меня нет ни редактора ни Скайрима. Ничего, через несколько дней буду всё это отрабатывать.

AleksTirex  Offline  Сообщение №404 написано: 17 октября 2013, 20:53


Архимаг


371
Myprism, так же попробуй вариант не с перемещением вещей НПС к игроку, а с сундуком. Т.е. сперва все вещи НПС перемещаешь в свой сундук, потом меняешь оутфит, а после этого из того сундука все вещи возвращаешь НПС.
Какой вариант больше понравится.

ObjectReference Property akChest Auto
 
   akActor.RemoveAllItems(akChest)
   akActor.SetOutfit(kOutfitEmpty)
   akChest.RemoveAllItems(akActor)

Kepper  Offline  Сообщение №405 написано: 19 октября 2013, 08:41



860
При попадании плевка паутиной. Персонаж(ГГ/НПС) падает на землю и начинает извиваться. пауки теряют к нему интерес. Через некоторое время паутина истаевает или персонаж её разрывает. Контроль за персонажем полностью отключается, пока он облеплен паутиной. После окончания эффекта, некоторое время плевки не оказывают действия.
Я добавил
- возможность управлять камерой(гораздо интересней когда её можно покрутить)
- подключил звук(ато извивался молча)

Вопросы
1. Скрипт работает. Можете оценить насколько он безопасен для сейвов?
2. Можно ли заблокировать доступ в инвентарь, оставив при этом доступ в меню магии? Параметр abJournalTabs в DisablePlayerControls блокирует слишком много
3. Случайно не знаете где находится подходящий звуковой файл? Никак не могу найти звук дыхания во время спринта.

Код
Scriptname mslZaZAPWebAttackSCR extends activemagiceffect   

Event OnEffectStart(Actor akTarget, Actor akCaster)
  Debug.Notification("Effect started!")
  ;WebbedFXS.Play(Victim, 30)
  Victim = akTarget
  Spider = akCaster
  ;Victim.SetRestrained(true)
  Victim.EquipItem(mslZaZAPWebBody, true, true)
  Victim.PlayIdle(mslZaZAPWebbed)
  Victim.EquipItem(mslZaZAPWebbing, true, true)
  RegisterForSingleUpdate(mslZaZAPDelayInit.GetValue())
  ;Victim.SetUnconscious(true)

  ActorBase VictimBase = Victim.GetBaseObject() as ActorBase
  If VictimBase.GetSex() == 0
   aiInstanceID  = SoundMale.Play(Victim)
  Else
   aiInstanceID  = SoundFemale .Play(Victim)
  EndIf
  ;Victim.SetUnconscious(false)
  Debug.Notification("aiInstanceID  :" + aiInstanceID)
  Victim.StopCombatAlarm()
  If Victim == Game.GetPlayer()
   Game.ForceThirdPerson()
   Game.DisablePlayerControls(abMovement =true, abFighting = true, abCamSwitch = true, abLooking = false, abSneaking = true, abMenu = true, abJournalTabs= true)
  Else
   Victim.SetUnconscious(true)
  EndIf

EndEvent

Event OnUpdate()
  Debug.Notification("Before stop aiInstanceID  :" + aiInstanceID)
  Sound.StopInstance(aiInstanceID)
  Debug.Notification("After stop aiInstanceID  :" + aiInstanceID)
  float Struggle = (Utility.RandomInt(0,100) + Victim.GetAV("Stamina")/10)
  Debug.Notification("Check:" + Struggle + " vs " + (mslZaZAPDifficulty.GetValue() + Spider.GetLevel()))
  If Struggle < (mslZaZAPDifficulty.GetValue() + Spider.GetLevel())
   RegisterForSingleUpdate(mslZaZAPDelayUpdate.GetValue())
   ActorBase VictimBase = Victim.GetBaseObject() as ActorBase
   If VictimBase.GetSex() == 0
    aiInstanceID  = SoundMale.Play(Victim)
   Else
    aiInstanceID  = SoundFemale .Play(Victim)
   EndIf
   Debug.Notification("NEW aiInstanceID  :" + aiInstanceID)
  Else
   WebbedFXS.Play(Victim, 30)
   BreakFree()
  Endif
EndEvent

Event OnEffectFinish(Actor akTarget, Actor akCaster)
  Sound.StopInstance(aiInstanceID)
   
  Debug.Notification("Effect end!")
  WebbedFXS.Play(Victim, 30)
  BreakFree()
EndEvent

Function BreakFree()
  Debug.Notification("Effect stopped!")
  mslZaZAPGrace.Cast(Victim)
  ;Victim.SetUnconscious(false)
  ;Victim.SetRestrained(false)
  Victim.RemoveItem(mslZaZAPWebbing, 99, true)
  Victim.PushActorAway(Victim, 2)
  Victim.RemoveItem(mslZaZAPWebBody, 99, true)
  self.dispel()

  If Victim == Game.GetPlayer()
   Game.EnablePlayerControls()
   ;Victim.StartCombat(Spider)    
  Else
   Victim.SetUnconscious(false)
  EndIf
   
EndFunction

Idle Property mslZaZAPWebbed  Auto   
Actor Property Victim  Auto
Actor Property Spider  Auto
Armor Property mslZaZAPWebbing  Auto   
Armor Property mslZaZAPWebBody  Auto   
GlobalVariable Property mslZaZAPDelayInit  Auto
GlobalVariable Property mslZaZAPDelayUpdate  Auto
GlobalVariable Property mslZaZAPDifficulty  Auto
EffectShader Property WebbedFXS  Auto   

int Property aiInstanceID Auto
Sound Property SoundMale Auto
Sound Property SoundFemale Auto

SPELL Property mslZaZAPGrace  Auto   
  

VALKNUT  Offline  Сообщение №406 написано: 19 октября 2013, 19:00



Всем привет!

Ребята, подскажите, как НПС назначить нужный пакет через диалог?
То есть у НПС его изначально нет, но мне нужно пакет назначить по одной ветке диалога, а по другой пакет убрать...

Назначать пакету кондишн и управлять стадиями как-то сильно уж смахивает на забивание гвоздя микроскопом...

Буду благодарен за любую подсказку.

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Myprism  Offline  Сообщение №407 написано: 19 октября 2013, 23:47 | Отредактировано: Myprism - 20 октября 2013, 10:10


Физик


VALKNUT, как я понимаю, в результате диалогов меняются числовые параметры игрока. Например, у НПС стоит, что он может следовать за игроком, но возможности следования присвоена цифра -1. В результате диалога она меняется. В параметрах пакетов же есть условия их выполнения. Т.е. пакет не ставится НПС в процессе игры, он там уже должен стоять, но в процессе игры меняются условия, которые включают тот или иной пакет.

VALKNUT  Offline  Сообщение №408 написано: 20 октября 2013, 03:33



Myprism, ну... в обычных случаях я так и делал, а вот допустим я не знаю заранее, что за НПС получит от меня пакет(ветку диалога) всем НПС добавлять пакет на перспективу не есть правильно...

Суть того, что делаю.
Условия: спутник или супруг (проверка выполняется на уровне диалога, тут все просто)

Диалог1: Жди в месте "Х"
Действие1: НПС топает по воле пакета

Диалог2: Все. За мной.
Действие2: НПС избавляется от пакета

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
tyrn  Offline  Сообщение №409 написано: 20 октября 2013, 16:15



1
Подскажите пожалуйста скрип(если это скрипт)где прописано какие расы могут заражать болезнями и прописаны эти болезни

Myprism  Offline  Сообщение №410 написано: 21 октября 2013, 17:06 | Отредактировано: Myprism - 21 октября 2013, 15:58


Физик


AleksTirex, я в папирусе пока новичок. Как компилировать скрипт использующий функции из СКСЕ? Компилятор же выдаёт ошибки:
(9,36): GetOutfit is not a function or does not exist
(12,11): QueueNiNodeUpdate is not a function or does not exist
(21,10): QueueNiNodeUpdate is not a function or does not exist

SKSE поставил 1_06_16. Может, там надо давать ссылку на конкретный скрипт из SKSE?

Оп! Причину нашёл. Оказывается, надо ставить SKSE не в виде инсталлера, а в виде зип-архива. Они различаются папкой src, которая инсталлером не ставится. С ней всё скомпилировалось!

Добавлено (21 Октября 2013, 21:06)
---------------------------------------------
AleksTirex, ну вот, пошли первые результаты! Прежде всего, ещё раз хочу поблагодарить за пропуск мне в мир скриптов. Мне, главное, нужно было получить образец, зацепку, которую я дальше буду изменять.

Результаты очень интересные. Строка akActor.RemoveAllItems(Game.GetPlayer()) оказалась не нужна вообще. Дело в том, что в игре есть фича восстановления персонажей в исходное состояние. Она действует так: после удаления последней шмотки полностью восстанавливается до Оутфит одёжка персонажа. Так, например, аналогичной консольной командой раздеть персонажа не получится, так как он тут же оденется. То же самое оказалось и тут. Но выяснилась одна деталь: этот механизм восстанавливает персонажа не до нового оутфита, а до родного игрового. Таким образом, эта строка полностью отменяет все действия скрипта. А вот убирание этой строки (два раза, естественно), дало как раз такой результат, как нужно. При этом при выдаче кольца, оутфит полностью пропадает, но восстанавливается, если кольцо забрать назад.


AleksTirex  Offline  Сообщение №411 написано: 21 октября 2013, 23:14


Архимаг


371
Цитата Myprism

Результаты очень интересные. Строка akActor.RemoveAllItems(Game.GetPlayer()) оказалась не нужна вообще.



Должен огорчить - нужна эта команда. Если её нет, то при смене оутфита из инвентаря НПС-компаньона пропадёт одежда, практически вся, которую ты туда положил, что весьма жалко.
 
Вот посмотри:
1. На НПС одежда из родного оутфит, ты поменял оутфит и НПС теперь имеет новую одежду (или ничего, если оутфит пустой).
2. Теперь ты удалил всё из инвентаря НПС, он типа опять оделся в одежду из родного оутфит. После этого меняешь оутфит на новый и... и получаешь 100% эффект из пункта №1.
 
К тому же, при смене оутфита старые шмотки автоматически удаляются из инвентаря.
Т.е. разницы быть не должно ни при каком варианте, если скрипт написан правильно и пустой оутфит сделан и назначен тоже правильно. Оутфит сменится в любом случае, у НПС не может остаться старый родной.
 
Если все потенциальные актёры - уникальные, то можешь поиграться с актёр-базовый актёр.
akActor.SetOutfit(kOutfitEmpty)
akActor.GetActorBase().SetOutfit(kOutfitEmpty)
Результаты таких команд разные.
 
*******************
 
VALKNUT, пакеты добавляются через алиасы или сцены. Если пакет долговременный (не на пару минут), то делаешь алиас, в него добавляешь нужный пакет, потом в топике akMyAlias.ForceRefTo(akSpeaker). И теперь говорящий прописан в алиас, а на алиасе пакет, и пакет получится на этом актёре. Для удаления пакта - akMyAlias.Clear().
Если НПС принадлежит нескольким алиасам, то приоритетный пакет тот, чей квест имеет выше приоритет.

VALKNUT  Offline  Сообщение №412 написано: 22 октября 2013, 03:38 | Отредактировано: VALKNUT - 22 октября 2013, 03:55



Цитата AleksTirex

VALKNUT, пакеты добавляются через алиасы или сцены.


Благодарю! Я нашел в инете твой тутор по этой теме, со скриншотами. Делал как в примере 2. Но при компиляции выскакивает ошибка.
Код
Starting 1 compile threads for 1 files...
Compiling "VKN__TIF__0101CD85"...
F:\games\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\VKN__TIF__0101CD85.psc(9,9): ForceRefTo is not a function or does not exist
No output generated for VKN__TIF__0101CD85, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on VKN__TIF__0101CD85
Код
Starting 1 compile threads for 1 files...
Compiling "VKN__TIF__0101CD88"...
F:\games\steam\steamapps\common\skyrim\Data\Scripts\Source\temp\VKN__TIF__0101CD88.psc(9,9): Clear is not a function or does not exist
No output generated for VKN__TIF__0101CD88, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on VKN__TIF__0101CD88


Что-то я видать недопонял...

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Myprism  Offline  Сообщение №413 написано: 22 октября 2013, 04:17


Физик


Цитата AleksTirex

2. Теперь ты удалил всё из инвентаря НПС, он типа опять оделся в одежду из родного оутфит. После этого меняешь оутфит на новый и... и получаешь 100% эффект из пункта №1.

А вот тут нет. Движок игры при опустошении инвентаря ставит старый оутфит и игнорирует, что он был заменён. У персонажа он был заменён, но игра поставит старый. Реально это выглядит так: при одевании кольца герой на мгновение становится прозрачным, на второе мгновение - голым (в новом оутфите нет одежды), и тут же одевает старый оутфит. Дальше это можно продолжать до бесконечности :) Скорее всего, ставя новый оутфит, игра сама помнит дефолтный. А механизм "починки" инвентаря персонажа не чинит текущий оутфит, а возвращает дефолтный. Это пока первые результаты, а дальше мне предстоит играться тут много. Дело в том, что я не пустой оутфит использую. Там у меня компоненты тела. Я хочу не только дать возможность игроку без ограничений переодевать компаньона, но и менять ему модель тела, не используя реплейсеров для всей игры. Тут мне ещё придётся много играться с занимаемыми многокомпонентной бронёй слотами :(

Да, все персонажи - потенциальные компаньоны являются уникальными актёрами. Для следования нужно ставить отношения к главному герою, а это можно сделать только для уникальных актёров.

Немного из другой области, но всё равно, на всякий случай спрошу. В игре для персонажей предусмотрены два оутфита. Ещё и оутфит для сна. Пакеты позволяют его установить именно для сна, но в игре это не работает. На самом деле, во всём Скайриме разработчики установили спальный оутфит всего нескольким персонажам. Я проверил всех, не переодевается ни один. Как будто механизм предусмотрен, но почему то не работает. Может знаешь, как починить?

Kepper  Offline  Сообщение №414 написано: 22 октября 2013, 07:26



860
Правильно ли я понимаю что команда
[Actor].SheatheWeapon()
приказывает актёру убрать оружие(выйти из боевой стойки)?

Можно ли как-нибудь еще вывести персонажа из боевой стойки?
А то эта команда не срабатывает.

Я даже ставил Utility.Wait(5) до и после команды чтобы анимация отрабатывалась, но персонаж даже не дёргается.

toozikoos  Offline  Сообщение №415 написано: 22 октября 2013, 08:28



21
Kepper, 
game.disablePlayerControls(false, true)
game.enablePlayerControls(true, true)


Artem13  Offline  Сообщение №416 написано: 22 октября 2013, 08:29


Mercenaries. Со смертью на ты.


Kepper, а рядом врагов нет? А то там, скорее всего, надо бой останавливать сначала.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Kepper  Offline  Сообщение №417 написано: 22 октября 2013, 09:14 | Отредактировано: Kepper - 22 октября 2013, 09:17



860
Цитата toozikoos

game.disablePlayerControls(false, true)
game.enablePlayerControls(true, true)


Попробую но сомневаюсь, что отключение контроля игрока за ударами персонажа, поможет в этом случае.
Ни же в этой же функции у меня стоит строка.
Game.DisablePlayerControls(abMovement =true, abFighting = true, abCamSwitch = true, abLooking = false, abSneaking = true, abMenu = true, abJournalTabs= true)
Проблема в том, что после этого DisablePlayerControls, если ГГ был в боевой стойке, то он вращается за движением мышки.

Alliria  Offline  Сообщение №418 написано: 22 октября 2013, 10:30 | Отредактировано: Alliria - 22 октября 2013, 10:41



706
VALKNUT, та же самая фигня в скрипте алиаса, только с функциями GetActorReference() и GetReference(). unsure
по-моему, это глюк конструктора. Есть хитрожопый вариант.
Открываем ReferenceAlias.psc (дефолтный скрипт), выделяем все, кроме первых двух строк, и копируем в конец Alias.pcs (скрипт SKSE). Компиллируем Alias.pcs. Вуаля, все компиллируется.

Artem13  Offline  Сообщение №419 написано: 22 октября 2013, 10:36


Mercenaries. Со смертью на ты.


Kepper, кстати, посмотри для примера квест Лекарство от безумия (это линейка ТБ). Там в определённый момент (когда добираемся до Цицерона) ГГ насильно зачехляют оружие и не дают его обнажить.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
VALKNUT  Offline  Сообщение №420 написано: 22 октября 2013, 10:57



Цитата Alliria

Открываем ReferenceAlias.psc (дефолтный скрипт), выделяем все, кроме первых двух строк, и копируем в конец Alias.pcs (скрипт SKSE). Компиллируем Alias.pcs. Вуаля, все компиллируется.

А я не юзаю СКСЕ... по крайней мере в модах своих..

Кто к нам с чем и за чем, тот от того и того... ʘ_ʘ
<a class="link" href="http://modgames.net/load/0-0-200451-0-17" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Форум » TES V: Skyrim » Мастерская » Вопросы по скриптам Papyrus (О скриптах Papyrus (Skyrim). Скриптеры не проходите мимо!)
Поиск:





Ответ на жалобу смотрите в разделе жалоб