F4MP/tiltedcode/GameFiles/Skyrim/scripts/source/PetFramework_PetQuest.psc

130 lines
5 KiB
Text
Raw Normal View History

Scriptname PetFramework_PetQuest extends Quest Conditional
{Manages the pet's home location, commands, etc. Some functions are called from the pet actor script.}
PetFramework_ParentQuestScript Property PetFramework_ParentQuest Auto
Message Property PetFramework_PetDismissMessage Auto
Message Property PetFramework_PetMaxReachedMessage Auto
Faction Property PetFramework_PetFollowingFaction Auto
Faction Property PlayerFaction Auto
Faction Property PetFramework_PetFaction Auto
ReferenceAlias Property PetHomeMarker Auto
ReferenceAlias Property PetRefAlias Auto
ReferenceAlias Property PetDynamicHomeMarker Auto
Bool Property MovingTogglePackageOn = False Auto Conditional Hidden ;Hearthfire adoption/move trick - turn on a temporary package
Function MakePetAvailableToPlayer()
{Called when the quest meets the criteria for the pet to be available, i.e. purchase, rescue, whatever scenario. Without this the pet cannot be talked to or recruited.}
PetRefAlias.GetActorReference().SetFactionRank(PetFramework_PetFaction, 1)
;PetRefAlias.GetActorReference().AddToFaction(PlayerFaction)
EndFunction
Function MakePetUnavailableToPlayer()
{If for some reason we want to make the pet unavailable to player, i.e. sell it someone else, etc. this function will do that}
PetRefAlias.GetActorReference().SetFactionRank(PetFramework_PetFaction, 0)
;PetRefAlias.GetActorReference().RemoveFromFaction(PlayerFaction)
EndFunction
Function FollowPlayer(Bool snapIntoInteraction = False)
{Called when the player recruits the pet via dialogue.}
If(PetFramework_ParentQuest.HasMaxPets())
PetFramework_PetMaxReachedMessage.Show()
Else
PetFramework_PetDismissMessage.Show()
return ; STR players ignore the pets.
debug.trace("Pet Framework: " + PetRefAlias.GetActorReference() + " setting to following player")
debug.trace("Pet Framework: " + PetRefAlias.GetActorReference() + " PetFollowingFactionRank: " + PetRefAlias.GetActorReference().GetFactionRank(PetFramework_PetFollowingFaction))
;If the pet was waiting for the player, clear the actor value (no need to check just run it)
WaitForPlayer(False)
;Set the rank to 1, which will enable dialogue commands, etc. (used by shared pet framework)
PetRefAlias.GetActorReference().SetFactionRank(PetFramework_PetFollowingFaction, 1)
debug.trace("Pet Framework: " + PetRefAlias.GetActorReference() + " PetFollowingFactionRank: " + PetRefAlias.GetActorReference().GetFactionRank(PetFramework_PetFollowingFaction))
;Some animals have very long idles they get 'stuck' which feels like recruiting them didn't do anything
If(snapIntoInteraction)
PetRefAlias.GetReference().Disable()
PetRefAlias.GetReference().Enable()
EndIf
PetFramework_ParentQuest.IncrementPetCount()
debug.trace("Pet Count: " + PetFramework_ParentQuest.GetCurrentPetCount())
;Re-evaluate the package stack based on our new conditions
PetRefAlias.GetActorReference().EvaluatePackage()
EndIf
EndFunction
Function WaitForPlayer(Bool doWait = True)
{True/False: Pet will wait for the player or continue to follow.}
DEBUG.TRACE("WaitForPlayer called with value: " + doWait)
If(doWait == True)
debug.trace("PetFramework Setting pet to wait for player")
PetRefAlias.GetActorReference().SetAV("WaitingForPlayer", 1)
Else
debug.trace("PetFramework Setting pet to stop waiting for player")
PetRefAlias.GetActorReference().SetAV("WaitingForPlayer", 0)
EndIf
;Re-evaluate the package stack based on our new conditions
PetRefAlias.GetActorReference().EvaluatePackage()
EndFunction
Function SetHomeToCurrentLocation()
{Makes the "Home" of the pet right where they stand, so they will dismiss and sandbox the area (house mods, camping, etc.)}
;Move the xmarker to where the pet is standing
PetDynamicHomeMarker.GetReference().MoveTo(PetRefAlias.GetReference())
PetDynamicHomeMarker.GetReference().SetAngle(0,0,0)
;Set the home idle marker to the dynamic marker
SetNewHome(PetDynamicHomeMarker, True)
EndFunction
Function SetNewHome(ReferenceAlias newLocation, Bool dismiss = True, Bool doWarp = False)
debug.trace("Set New Home called from actor proxy")
;Clear the waiting flag
WaitForPlayer(False)
;Turn on the temporary package while we change the ref alias data for their idle package - trick from Hearthfire adoption
MovingTogglePackageOn = True ;"Hold"AI package looks at this quest var
PetRefAlias.GetActorReference().EvaluatePackage()
;Set the ref alias to be the pet's new home
PetHomeMarker.ForceRefTo(newLocation.GetReference())
;Remove them from current following faction so they actually go to their new home
If(dismiss)
PetRefAlias.GetActorReference().SetFactionRank(PetFramework_PetFollowingFaction, 0)
EndIf
Utility.Wait(0.1)
MovingTogglePackageOn = False
PetRefAlias.GetActorReference().EvaluatePackage()
If(doWarp)
Utility.Wait(0.01)
PetRefAlias.GetReference().MoveTo(newLocation.GetReference(), 0,0,0,False)
EndIf
PetFramework_PetDismissMessage.Show()
PetFramework_ParentQuest.DecrementPetCount()
debug.trace("Pet Count: " + PetFramework_ParentQuest.GetCurrentPetCount())
EndFunction