Тема для вопросов по скриптингу.
Функции папируса:
На английском
На русском (не все, но базис)
#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, 07 янв 2025 |
|
|
||
Моддинг →
Моддинг Skyrim →
Восстановление на основе Зала ДозораАвтор Alex_andra, 11 дек 2023 |
|
|
||
![]() |
Моддинг →
Моддинг Skyrim →
Отстройка ВинтерхолдаАвтор Alex_andra, 10 авг 2023 |
|
|
|
Моддинг →
Моддинг Oblivion →
Скрипт Для СнаряженияАвтор БесездаБойчик, 07 сен 2022 |
|
|
||
Моддинг →
Моддинг Skyrim →
Нужны добровольцы для теста модаАвтор arkadiy111, 11 апр 2022 |
|
|
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 скрытых






