Здравствуйте. Помогите пожалуйста: сделал компаньона добавил ему собственное озвучивание с помощью квестов, настроил скрипты к фразам и все работает вот только постоянно бегает за мной как только загружусь, без найма. И у него работают все диалоги которые имеет обычный спутник: расстаться, показать инвентарь и прочее. В чем может быть проблема?
Multigone, нет с фракцией все правильно. Это плавный намек на недостаток информации? Что надо показать или скинуть чтобы было более понятно в чем проблема?
GlobalVariable Property pPlayerFollowerCount Auto ReferenceAlias Property pFollowerAlias Auto Faction Property pDismissedFollower Auto Message Property FollowerDismissMessage Auto Message Property FollowerDismissMessageWedding Auto Message Property FollowerDismissMessageCompanions Auto Message Property FollowerDismissMessageCompanionsMale Auto Message Property FollowerDismissMessageCompanionsFemale Auto Message Property FollowerDismissMessageWait Auto
;Property to tell follower to say dismissal line Int Property iFollowerDismiss Auto Conditional
; PATCH 1.9: 77615: remove unplayable hunting bow when follower is dismissed Weapon Property FollowerHuntingBow Auto Ammo Property FollowerIronArrow Auto
Function SetFollower(ObjectReference FollowerRef)
actor FollowerActor = FollowerRef as Actor FollowerActor.RemoveFromFaction(pDismissedFollower) If FollowerActor.GetRelationshipRank(Game.GetPlayer()) < 3 && FollowerActor.GetRelationshipRank(Game.GetPlayer()) >= 0 FollowerActor.SetRelationshipRank(Game.GetPlayer(), 3) EndIf FollowerActor.SetPlayerTeammate() ;FollowerActor.SetAV("Morality", 0) pFollowerAlias.ForceRefTo(FollowerActor) pPlayerFollowerCount.SetValue(1)
EndFunction
Function FollowerWait()
actor FollowerActor = pFollowerAlias.GetActorRef() as Actor FollowerActor.SetAv("WaitingForPlayer", 1) ;SetObjectiveDisplayed(10, abforce = true) ;follower will wait 3 days pFollowerAlias.RegisterForUpdateGameTime(72)
EndFunction
Function FollowerFollow()
actor FollowerActor = pFollowerAlias.GetActorRef() as Actor FollowerActor.SetAv("WaitingForPlayer", 0) SetObjectiveDisplayed(10, abdisplayed = false)
EndFunction
Function DismissFollower(Int iMessage = 0, Int iSayLine = 1)
; PATCH 1.9: 77615: remove unplayable hunting bow when follower is dismissed DismissedFollowerActor.RemoveItem(FollowerHuntingBow, 999, true) DismissedFollowerActor.RemoveItem(FollowerIronArrow, 999, true) ; END Patch 1.9 fix
If iSayLine == 1 iFollowerDismiss = 1 DismissedFollowerActor.EvaluatePackage() ;Wait for follower to say line Utility.Wait(2) EndIf pFollowerAlias.Clear() iFollowerDismiss = 0 ;don't set count to 0 if Companions have replaced follower If iMessage == 2 ;do nothing Else pPlayerFollowerCount.SetValue(0) EndIf EndIf
EndFunction
Дальше скрипт который находится на вкладке Quest Aliases у персонажа которого я добавил:
DialogueFollowerScript Property DialogueFollower Auto
Event OnUpdateGameTime()
;kill the update if the follower isn't waiting anymore If Self.GetActorRef().GetAv("WaitingforPlayer") == 0 UnRegisterForUpdateGameTime() Else ; debug.trace(self + "Dismissing the follower because he is waiting and 3 days have passed.") DialogueFollower.DismissFollower(5) UnRegisterForUpdateGameTime() EndIf
EndEvent
Event OnUnload()
;if follower unloads while waiting for the player, wait three days then dismiss him. If Self.GetActorRef().GetAv("WaitingforPlayer") == 1 (GetOwningQuest() as DialogueFollowerScript).FollowerWait() EndIf
EndEvent
Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
If (akTarget == Game.GetPlayer()) ; debug.trace(self + "Dismissing follower because he is now attacking the player") (GetOwningQuest() as DialogueFollowerScript).DismissFollower(0, 0) EndIf
EndEvent
Event OnDeath(Actor akKiller)
; debug.trace(self + "Clearing the follower because the player killed him.") PlayerFollowerCount.SetValue(0) Self.Clear()
EndEvent GlobalVariable Property PlayerFollowerCount Auto
Далее я приложу скрипты и условия которые находятся на ветках диалога:
_0RossenDilogueDismiss Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__0200537C Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE If !(akspeaker.IsInFaction(DismissedFollowerFaction)) (p_0RossenFollower as _0RossenFollowerScript).DismissFollower(0, 0) EndIf ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
Quest Property p_0RossenFollower Auto
Faction Property DismissedFollowerFaction Auto
Условия: GetInFaction CurrentFollowerFaction == 1
_0RossenDialogueTrade Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__02005379 Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE akspeaker.OpenInventory() ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
Условия: GetInFaction CurrentFollowerFaction == 1
_0RossenDialogueRecruit Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__02005385 Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE (p_0RossenFollower as _0RossenFollowerScript).SetFollower(akspeaker) ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
_0RossenDialogueWait Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__02005376 Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE (GetOwningQuest() as _0RossenFollowerScript).FollowerWait() ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
_0RossenDialogueFollow Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__0200537F Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE (GetOwningQuest() as _0RossenFollowerScript).FollowerFollow() ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
_0RossenDialogueFavorState Скрипт: ;BEGIN FRAGMENT CODE - Do not edit anything between this and the end comment ;NEXT FRAGMENT INDEX 1 Scriptname TIF__02005382 Extends TopicInfo Hidden
;BEGIN FRAGMENT Fragment_0 Function Fragment_0(ObjectReference akSpeakerRef) Actor akSpeaker = akSpeakerRef as Actor ;BEGIN CODE akspeaker.SetDoingFavor() ;END CODE EndFunction ;END FRAGMENT
;END FRAGMENT CODE - Do not edit anything between this and the begin comment
Условия: GetInFaction CurrentFollowerFaction == 1
_0RossenDialogueDoingFavorBlocking писать наверное не буду, потому что там все работает.
Изначально в Quest Data в окошке Quest Dialogue Conditions прописаны: GetIsID Actor: '_0Rossen' == 1 GetIsVoiceType VoiceType: '_0RossenVoice' == 1 (на всякий случай)
Внимание: язык скриптов папируса я вообще не понимаю, все это было получено путем Ctrl +C Ctrl + V из ванильных квестов диалогов, и интуитивном редактировании при переводе гугл переводчком. И еще я так понимаю в скриптах все что под ; это комментирование и можно смело убирать?
Забыл добавить, что сегодня выяснилось, что работают только 2 диалога: на выполнение приказов и на ожидание игрока. Все остальное как об стенку горох.
Если под алиасом ты имеешь в виду персонажа в вкладке Quest Aliases то там все точно также как и в DialogueFollower за исключением скрипта и галочки в Fill Type (вместо Specific Reference у меня Unique Actor и ID компаньона)
Насчет Property:
После того как прочитал сообщение проверил все скрипты и оказалось, что в первом (_0RossenAliasScript который используется в вкладке Quest Aliases) некоторые строчки ссылались (или что они там делают) на DialogueFollower и DialogueFollowerScript, я их заменил на свои и все скомпилировалось без проблем. После зашел в Property этого файла, и там одна настройка типа GlobalVariable ссылалась на PlayerFollowerCount который я решил не трогать, т. к. про него ты ничего не говорил.
_0RossenDialogue - это квест где я делаю диалоги. _0RossenAliasScript - это скрипт который используется в вкладке Quest Aliases. _0RossenFollowerScript - это скрипт который используется в вкладке Scripts.
Далее скидываю список Property этих двух скриптов ибо это мне проще.
DialogueFollowerScript Property DialogueFollower Auto
Event OnUpdateGameTime()
;kill the update if the follower isn't waiting anymore If Self.GetActorRef().GetAv("WaitingforPlayer") == 0 UnRegisterForUpdateGameTime() Else ; debug.trace(self + "Dismissing the follower because he is waiting and 3 days have passed.") DialogueFollower.DismissFollower(5) UnRegisterForUpdateGameTime() EndIf
EndEvent
Event OnUnload()
;if follower unloads while waiting for the player, wait three days then dismiss him. If Self.GetActorRef().GetAv("WaitingforPlayer") == 1 (GetOwningQuest() as DialogueFollowerScript).FollowerWait() EndIf
EndEvent
Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
If (akTarget == Game.GetPlayer()) ; debug.trace(self + "Dismissing follower because he is now attacking the player") (GetOwningQuest() as DialogueFollowerScript).DismissFollower(0, 0) EndIf
EndEvent
Event OnDeath(Actor akKiller)
; debug.trace(self + "Clearing the follower because the player killed him.") PlayerFollowerCount.SetValue(0) Self.Clear()
EndEvent GlobalVariable Property PlayerFollowerCount Auto
_0RossenFollowerScript Property _0RossenDialogue Auto
Event OnUpdateGameTime()
;kill the update if the follower isn't waiting anymore If Self.GetActorRef().GetAv("WaitingforPlayer") == 0 UnRegisterForUpdateGameTime() Else ; debug.trace(self + "Dismissing the follower because he is waiting and 3 days have passed.") _0RossenDialogue.DismissFollower(5) UnRegisterForUpdateGameTime() EndIf
EndEvent
Event OnUnload()
;if follower unloads while waiting for the player, wait three days then dismiss him. If Self.GetActorRef().GetAv("WaitingforPlayer") == 1 (GetOwningQuest() as _0RossenFollowerScript).FollowerWait() EndIf
EndEvent
Event OnCombatStateChanged(Actor akTarget, int aeCombatState)
If (akTarget == Game.GetPlayer()) ; debug.trace(self + "Dismissing follower because he is now attacking the player") (GetOwningQuest() as _0RossenFollowerScript).DismissFollower(0, 0) EndIf
EndEvent
Event OnDeath(Actor akKiller)
; debug.trace(self + "Clearing the follower because the player killed him.") PlayerFollowerCount.SetValue(0) Self.Clear()
EndEvent GlobalVariable Property PlayerFollowerCount Auto
Multigone, спасибо большое, помогло. Поначалу конечно она не реагировала на нажатие клавиши Е, но с добавлением самого обычного активатора в основной скрипт все изменилось. Остался последний вопрос. SEQ файлы это что-то вроде архива для скриптов? Если да, то как скрипты туда запихнуть?
Нет, я о файлах расширения SEQ, просто я заметил что в некоторых модах на спутников помимо bsa архивов имеется папка SEQ. И я почему-то подумал, что для скриптов нужен отдельный архиватор. Обознался немного.