mirror of
https://github.com/Jous99/F4MP.git
synced 2026-01-13 00:20:54 +01:00
130 lines
5 KiB
Text
130 lines
5 KiB
Text
|
|
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
|
||
|
|
|
||
|
|
|
||
|
|
|