Тема для вопросов по скриптингу.
Функции папируса:
На английском
На русском (не все, но базис)
#781
Отправлено
- werr, Chesh¡re и Olechkafum нравится это
#782
Отправлено
Всем привет, пытаюсь в своём моде сделать интеграцию мода Convenient Horses для своих спутников.
Но не выходит присвоить ReferenceAlias из своего квеста в квест CHFollower, тут же сбрасываются в None.
вот как пытался, взял функции из Convenient Horses(кроме SetFollower):
CHFollowerAliasScript[] Property FollowerScripts Auto Quest Property CHFollower Auto Hidden CHFollowerQuestScript Property CHFollowerQuest Auto Hidden ; Find all active followers and fill local aliases. Function GetFollowers() ; * Generic followers from MarkAndRecallFollowerQuest quest. ; By default there is only one follower, and one animal follower which doesn't concern us. ; Some multi-follower mods build uppon this quest by adding new aliases and extending functionality. ; We can support such mods by doing alias ID scan at run-time. int id = 0 int idMax = 20 ; Probe quest for this many IDs. bool endScan = false referenceAlias sourceAlias referenceAlias localAlias actor follower while !endScan ; Alias probe. ;sourceAlias = MarkAndRecallFollowerQuest.GetAlias(id) as ReferenceAlias sourceAlias = (MarkAndRecallFollowerQuest.GetNthAlias(id) as ReferenceAlias) trace(Self + "sourceAlias: " + (sourceAlias.GetActorRef() as Actor).GetActorBase().GetName(), 1) if (sourceAlias != none) ; Reference probe. follower = sourceAlias.GetReference() as actor if follower ; Follower validity checks. if (follower.HasKeyword(ActorTypeNPC) || follower.HasKeyword(JobHireling)) && (follower.IsInFaction(MarkAndRecallCurrentFollower) || follower.IsInFaction(CurrentFollowerFaction)) && !follower.IsInFaction(CHFollowerFaction) trace(Self + "follower: " + follower.GetActorBase().GetName(), 1) ; Find first empty alias. localAlias = (GetCHFollowerScript(None) as ReferenceAlias) ; Add. ;if ((localAlias.GetActorRef() == none) && (follower != none)) ;if ((localAlias) && (follower != none)) if localAlias localAlias.ForceRefTo(follower) ;Notification("id: " + id) Notification("localAlias[" + id + "]: " + (localAlias.GetActorRef() as Actor).GetActorBase().GetName()) Notification("FollowerScripts[" + id + "]: " + (((CHFollower) as CHFollowerQuestScript).FollowerScripts[id].GetActorRef() as Actor).GetActorBase().GetName()) Notification("IsInFaction[" + id + "]: " + ((CHFollower) as CHFollowerQuestScript).FollowerScripts[id].GetActorRef().IsInFaction(CHFollowerFaction)) ;trace(Self + "localAlias: " + (localAlias.GetActorRef() as Actor).GetActorBase().GetName(), 1) ;trace(Self + "FollowerScripts: " + (((CHFollower) as CHFollowerQuestScript).FollowerScripts[id].GetActorRef() as Actor).GetActorBase().GetName(), 1) ; Can't have more generic followers. else;if (localAlias.GetActorRef() == none) Notification("localAlias id: " + id) ;((CHFollower) as CHFollowerQuestScript).FollowerScripts[id].ForceRefTo(follower) endScan = true endif endif endif endif id += 1 endScan = endScan || id >= idMax endwhile EndFunction ; Searches local follower aliases for a given follower ref. ; akFollowerRef: Follower reference to search for. ; abFullSearch: Whether to include unique follower aliases in a search. ; Returns the first follower script (extending ReferenceAlias) matching the given ref. CHFollowerAliasScript Function GetCHFollowerScript(objectReference akFollowerRef) ; Generic search. int index = 0 int count = ((CHFollower) as CHFollowerQuestScript).FollowerScripts.Length ;trace(Self + "FollowerScripts Length: " + ((CHFollower) as CHFollowerQuestScript).FollowerScripts.Length, 1) while index < count if (((CHFollower) as CHFollowerQuestScript).FollowerScripts[index] as ReferenceAlias).GetRef() == akFollowerRef Notification("index[" + index + "]: ") return ((CHFollower) as CHFollowerQuestScript).FollowerScripts[index] endif index += 1 endwhile return None EndFunction Function SetFollower(ObjectReference FollowerRef) actor FollowerActor = FollowerRef as Actor FollowerActor.RemoveFromFaction(DismissedFollowerFaction) iFollowerDismiss = 0 iFollowerRestOrder = 0 iFollowerRelaxOrder = 0 iFollowerTradeOrder = 0 ;FollowerActor.AddToFaction(CurrentFollowerFaction) FollowerActor.AddToFaction(MarkAndRecallCurrentFollower) ;FollowerActor.RemoveFromFaction(CurrentFollowerFaction) If (FollowerActor != MarkAndRecallQuest.MARMerchantRef) If (FollowerActor.IsInFaction(ASDBServicesMerchant)) FollowerActor.RemoveFromFaction(ASDBServicesMerchant) EndIf EndIf If !(FollowerActor.IsInFaction(MarkAndRecallFollower)) FollowerActor.AddToFaction(MarkAndRecallFollower) EndIf If FollowerActor.GetRelationshipRank(GetPlayer()) < 3 && FollowerActor.GetRelationshipRank(GetPlayer()) >= 0 FollowerActor.SetRelationshipRank(GetPlayer(), 3) EndIf FollowerActor.SetPlayerTeammate() ;FollowerActor.SetAV("Morality", 0) pFollowerAlias.ForceRefTo(FollowerActor) FollowerActor.EvaluatePackage() If (MarkAndRecallCheckRequirementsQuest.ConvenientHorsesExtended == true) If((MarkAndRecallQuest.bFollowerHorsesSwitcher == true) && (MarkAndRecallQuest.bisOriginalFollowerHorsesUsed == false)) If !(FollowerActor.IsInFaction(CHFollowerFaction)) GetFollowers() ;FollowerActor.AddToFaction(CHFollowerFaction) EndIf EndIf ;Notification("Convenient Horses: " + MarkAndRecallCheckRequirementsQuest.ConvenientHorsesExtended) ;Notification("CHFollowerFaction: " + CHFollowerFaction) ;If !(FollowerActor.IsInFaction(CHFollowerFaction)) ; FollowerActor.AddToFaction(CHFollowerFaction) ;Notification("FollowerActor not In Faction: " + FollowerActor.GetActorBase().GetName()) ;EndIf EndIf EndFunction
Сообщение отредактировал aaa112aaa: 20 мая 2022 - 01:45
#784
Отправлено
Что-то мне казалось, что Convenient Horses сразу должен работать с моддовыми спутниками.
Ну или после настройки в МСМ.
Разве нет?
Ну во первых в последней версии Convenient Horses нету МСМ меню, а во вторых мои спутники добавляются в собственные фракции (MarkAndRecallCurrentFollower и MarkAndRecallFollower) , а CurrentFollowerFaction исключена, так как дублируются диалоги найма, увольнения и прочего.
#785
Отправлено
Ладно, забил пока на лошадей, сейчас другая проблема:
в скрипте квеста есть:
bool[] Property HasAdventureOutfit = False Auto Hidden Conditional
а в скрипте ReferenceAlias - MarkAndRecallFollowerAliasScript есть функция - SetAdventureOutfit()
в ней присвоение выше упомянутой bool переменной выдаёт ошибку - " loop did not match anything at input '=' "
Сама функция:
Function SetAdventureOutfit() int i i = MarkAndRecallFollowerQuest.GetFollowerIndex(pFollowerAlias.GetActorRef()) If(!(Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit) (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit = new bool[3] EndIf (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit[i] = SetOutfit(MarkAndRecall_OutfitListAdventure[i]) " Error: required (...)+ loop did not match anything at input '=' " endFunction
Что это значит, как исправить?
#786
Отправлено
присвоение выше упомянутой bool переменной выдаёт ошибку - " loop did not match anything at input '=' "
(Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit[i] = SetOutfit(MarkAndRecall_OutfitListAdventure[i])
" Error: required (...)+ loop did not match anything at input '=' "
Проблема решилась вот так:
bool[] Property HasAdventureOutfit Auto Hidden Conditional
Function SetAdventureOutfit() int i i = MarkAndRecallFollowerQuest.GetFollowerIndex(pFollowerAlias.GetActorRef()) If(!(Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit) (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit = new bool[3] EndIf (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit[i] == SetOutfit(MarkAndRecall_OutfitListAdventure[i]) endFunction
Но это не правильное решение проблемы, уже исправил.
Сообщение отредактировал aaa112aaa: 28 мая 2022 - 03:28
#787
Отправлено
Проблема решилась вот так:
bool[] Property HasAdventureOutfit Auto Hidden ConditionalFunction SetAdventureOutfit() int i i = MarkAndRecallFollowerQuest.GetFollowerIndex(pFollowerAlias.GetActorRef()) If(!(Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit) (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit = new bool[3] EndIf (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit[i] == SetOutfit(MarkAndRecall_OutfitListAdventure[i]) endFunctionНо это не правильное решение проблемы, уже исправил.
Здравствуйте! Заинтриговали - а какое тогда правильное? Можно весь скрипт увидеть?
#788
Отправлено
Здравствуйте! Заинтриговали - а какое тогда правильное? Можно весь скрипт увидеть?
в скрипте ReferenceAlias - MarkAndRecallFollowerAliasScript:
bool[] Property arrHasAdventureOutfit Auto
и
Function SetAdventureOutfit() int i = MarkAndRecallFollowerQuest.GetFollowerIndex(pFollowerAlias.GetActorRef()) (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit = Self.SetOutfit(MarkAndRecall_OutfitListAdventure[i]) arrHasAdventureOutfit[i] = (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit ;Notification("SetAdventureOutfit arrHasAdventureOutfit[" + i + "]: " + arrHasAdventureOutfit[i]) ;Notification("SetAdventureOutfit MarkAndRecall_OutfitListAdventure[" + i + "]: " + MarkAndRecall_OutfitListAdventure[i].GetSize()) endFunction
а скрипты выложить могу, но работа там не завершена с нарядами, только вот начал.
#789
Отправлено
в скрипте ReferenceAlias - MarkAndRecallFollowerAliasScript:
bool[] Property arrHasAdventureOutfit Autoи
Function SetAdventureOutfit() int i = MarkAndRecallFollowerQuest.GetFollowerIndex(pFollowerAlias.GetActorRef()) (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit = Self.SetOutfit(MarkAndRecall_OutfitListAdventure[i]) arrHasAdventureOutfit[i] = (Self.GetOwningQuest() as MarkAndRecallFollowerQuestScript).HasAdventureOutfit ;Notification("SetAdventureOutfit arrHasAdventureOutfit[" + i + "]: " + arrHasAdventureOutfit[i]) ;Notification("SetAdventureOutfit MarkAndRecall_OutfitListAdventure[" + i + "]: " + MarkAndRecall_OutfitListAdventure[i].GetSize()) endFunctionа скрипты выложить могу, но работа там не завершена с нарядами, только вот начал.
Делаю один мод с кучей квестов - может посотрудничаем?
#790
Отправлено
Такс, господа. Тут такое дело, кажется, что-то у меня работает не так со скриптами... Мучился со своим скриптом и тут дошло опробовать скомпилировать уже готовый игровой скрипт обратно. А не тут-то было, оно выдаёт ошибку со скриптами из игры. Пробовал компилировать через PapyrusCompiler и через Papyrus Assembler GUI. Или оно обратно игровые ванильные скрипты у всех так не хочет компилировать?
Сообщение отредактировал Unlimited Cloud: 28 июня 2022 - 11:34
#791
Отправлено
Такс, господа. Тут такое дело, кажется, что-то у меня работает не так со скриптами... Мучился со своим скриптом и тут дошло опробовать скомпилировать уже готовый игровой скрипт обратно. А не тут-то было, оно выдаёт ошибку со скриптами из игры. Пробовал компилировать через PapyrusCompiler и через Papyrus Assembler GUI. Или оно обратно игровые ванильные скрипты у всех так не хочет компилировать?
Ты бы хоть ошибку показал.
#792
Отправлено
Ты бы хоть ошибку показал.
Ок. Для примера скрипт под названием transmuteMineralScript, трансмутация руды. Долно же быть нормальным, оно же прямиком из игры... Ещё пару других скриптов пробовал - результат тот же. Попытка компиляции данного скрипта в программе PapyrusCompile заканчивается вот этим:
Warning: No flags selected
[ transmuteMineralScript.psc ]
Starting 1 compile threads for 1 files...
Compiling "transmuteMineralScript"...
No output generated for G:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Source\Scripts\transmuteMineralScript.psc, compilation failed.
Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on G:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Source\Scripts\transmuteMineralScript.psc
--- ERRORS ---
ActiveMagicEffect.psc(1,0): Unknown user flag Hidden
Game.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
Sound.psc(1,0): Unknown user flag Hidden
Message.psc(1,0): Unknown user flag Hidden
Actor.psc(1,0): Unknown user flag Hidden
Actor.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
Actor.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(19,17): type mismatch while assigning to a objectreference (cast missing or types unrelated)
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(20,11): type mismatch on parameter 1 (did you forget a cast?)
transmuteMineralScript.psc(20,31): cannot compare a none to a int (cast missing or types unrelated)
transmuteMineralScript.psc(20,31): cannot relatively compare variables to None
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(22,9): type mismatch on parameter 1 (did you forget a cast?)
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(23,9): type mismatch on parameter 1 (did you forget a cast?)
Game.psc(1,0): Unknown user flag Hidden
Game.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(25,15): type mismatch on parameter 1 (did you forget a cast?)
transmuteMineralScript.psc(25,35): cannot compare a none to a int (cast missing or types unrelated)
transmuteMineralScript.psc(25,35): cannot relatively compare variables to None
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(27,9): type mismatch on parameter 1 (did you forget a cast?)
ObjectReference.psc(1,0): Unknown user flag Hidden
ObjectReference.psc(1,0): Unknown user flag Hidden
MiscObject.psc(1,0): Unknown user flag Hidden
transmuteMineralScript.psc(28,9): type mismatch on parameter 1 (did you forget a cast?)
Game.psc(1,0): Unknown user flag Hidden
Game.psc(1,0): Unknown user flag Hidden
Sound.psc(1,0): Unknown user flag Hidden
Sound.psc(1,0): Unknown user flag Hidden
Message.psc(1,0): Unknown user flag Hidden
Message.psc(1,0): Unknown user flag Hidden
Time: 5,367766 seconds
Input: G:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Source\Scripts\transmuteMineralScript.psc
Output: G:\Games\The Elder Scrolls V Skyrim - Special Edition\Data\Source\transmuteMineralScript.pex
Finished with 48 errors
Сообщение отредактировал Unlimited Cloud: 28 июня 2022 - 23:05
#793
Отправлено
Ещё одна вещь, которая меня беспокоит. Дело в том, что когда создаю скрипт в Креэшен ките на эффекте заклинания, то он не прикрепляется к этому заклинанию. И не отображается для этого. Но в мод менеджере он есть, если открывать отдельно его отдельно от функции прикрепления в магическом эффекте.
Сообщение отредактировал Unlimited Cloud: 29 июня 2022 - 00:00
#794
Отправлено
Попытка компиляции данного скрипта в программе PapyrusCompile заканчивается вот этим:
Хм. Похоже на то, что некорректно распакован или установлен СК. Компилятор не видит флаги и другие скрипты-исходники с определениями, или не может их прочитать.
Проверь, правильно ли распаковал. Папка scripts\source должна быть заполнена. Если там есть под-папки с ДЛЦшными исходниками - их содержимое тоже можно в сурсы перебросить, если ты планируешь со скриптами из ДЛЦ работать.
#795
Отправлено
Хм. Похоже на то, что некорректно распакован или установлен СК. Компилятор не видит флаги и другие скрипты-исходники с определениями, или не может их прочитать.
Проверь, правильно ли распаковал. Папка scripts\source должна быть заполнена. Если там есть под-папки с ДЛЦшными исходниками - их содержимое тоже можно в сурсы перебросить, если ты планируешь со скриптами из ДЛЦ работать.
Реально! Моё почтение! Поставлю статую в моде в честь тебя с именной табличкой.
Сообщение отредактировал Unlimited Cloud: 29 июня 2022 - 10:30
#797
Отправлено
А такой вопросик, какими переменными можно обозначить именно игрока скрипте заклинания, в эвенте?
game.getplayer()
https://www.creation...:Script_Objects
https://www.creation...php?title=Event
Советую добавить в закладки, там много полезного.
#798
Отправлено
game.getplayer()
https://www.creation...:Script_Objects
https://www.creation...php?title=Event
Советую добавить в закладки, там много полезного.
Ну да, оно и так в закладках. Просто пока ещё не выходит ориентироваться хорошо. Посидел, покопался, что-то нашёл. Но это не сработало. И так по кругу много раз. И переменные менял, и в скобках разные варианты пробовал... Пытался даже сделать отдельное заклинание "на себя" сделать, которое боле менее работало, и что бы этот скрипт кастовал то отдельное заклинание.
Самая главная задача на данный момент подобрать нужный Event. Он у меня 90% не правильный. Или что-то надо дописать в нём...
Я пытаюсь сделать заклинание, которое выпускает стрелу в цель и при этом сжирает стрелу на это дело. Пытался через onCastStart и onEffectStart. Но так как заклинание на цель, то и эффект, видимо, применяется на эту цель при прилёте в неё стрелы.
Вот и не знаю, что может помочь уже, идеи закончились. Причём пробовал для теста сделать эффект "на себя" дабы скрипт проверить. Тогда половина скрипта работает. Потому и решил, что именно Event не правильный.
Scriptname UC_ArrowShot_Script extends ActiveMagicEffect
{Если уничтожает железную стрелу, то позволяет выстрелить заклинанием. Иначе блокирует эффект и выводит сообщение об отсутвии стрелы.}
Ammo Property Arrow Auto
Message Property UC_noArrows_MSG Auto
Sound Property FailureSFX Auto
Event OnCastStart(ACTOR akActor)
akActor == game.getPlayer()
if akActor.getItemCount(Arrow) >= 1
akActor.removeItem(Arrow, 1)
else
akActor.InterruptCast()
FailureSFX.play(akActor)
UC_noArrows_MSG.show()
endif
EndEvent
Думаю, опробую вариант с созданием другого заклинания при касте.
Сообщение отредактировал Unlimited Cloud: 01 июля 2022 - 00:44
#800
Отправлено
Сделал, наконец-то, своё заклинание через каст на себя и RemoteCast. Даже две третьих скрипта работает... Но столкнулся с "ложкой дёгтя" - дело в том, что при удалении стрелы из инвентаря выводится сообщение об этом. Можно ли как-то запретить это?
Открой команду RemoveItem на СК вики. Там есть дополнительные параметры, в том числе и для этого.
Темы с аналогичным тегами papyrus, help, скрипты, вопросы
Моддинг →
Моддинг Skyrim →
Восстановление на основе Зала ДозораАвтор Alex_andra, 11 дек 2023 mod, help |
|
|||
|
Моддинг →
Моддинг Skyrim →
Отстройка ВинтерхолдаАвтор Alex_andra, 10 авг 2023 bugs, moding, help |
|
||
Моддинг →
Моддинг Oblivion →
Скрипт Для СнаряженияАвтор БесездаБойчик, 07 сен 2022 скрипты, скрипт |
|
|||
Моддинг →
Моддинг Skyrim →
Нужны добровольцы для теста модаАвтор arkadiy111, 11 апр 2022 help |
|
|||
help
Моддинг →
Моддинг Skyrim →
Ram and Skyrim seАвтор Samurai1, 03 апр 2022 help |
|
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 скрытых