199 lines
6.0 KiB
Plaintext
199 lines
6.0 KiB
Plaintext
|
scriptName CritterDragonFly extends Critter
|
||
|
{Main Behavior script for dragonfly};[USKP 2.0.1]
|
||
|
;!{Main Behavior script for fish schools}
|
||
|
|
||
|
import Utility
|
||
|
import form
|
||
|
import debug
|
||
|
|
||
|
; Constants
|
||
|
float Property fActorDetectionDistance = 300.0 auto
|
||
|
{The Distance at which an actor will trigger a flee behavior}
|
||
|
float Property fTranslationSpeedMean = 175.0 auto
|
||
|
{The movement speed when going from plant to plant, mean value}
|
||
|
float Property fTranslationSpeedVariance = 75.0 auto
|
||
|
{The movement speed when going from plant to plant, variance}
|
||
|
float Property fFleeTranslationSpeed = 500.0 auto
|
||
|
{The movement speed when fleeing from the player}
|
||
|
float Property fMinScale = 0.5 auto
|
||
|
{Minimum initial scale of the Firefly}
|
||
|
float Property fMaxScale = 0.8 auto
|
||
|
{Maximum initial scale of the Firefly}
|
||
|
float Property fSplineCurvature = 200.0 auto
|
||
|
{Spline curvature}
|
||
|
float Property fMinTimeNotMoving = 1.0 auto
|
||
|
float Property fMaxTimeNotMoving = 5.0 auto
|
||
|
float Property fMinFleeHeight = 2000.0 auto
|
||
|
float Property fMaxFleeHeight = 3000.0 auto
|
||
|
float property fMaxRotationSpeed = 540.0 auto
|
||
|
{Max rotation speed while mocing, default = 540 deg/s}
|
||
|
|
||
|
; Variables
|
||
|
Actor closestActor = none
|
||
|
|
||
|
|
||
|
; Called by the spawner to kick off the processing on this Firefly
|
||
|
Event OnStart()
|
||
|
; Vary size a bit
|
||
|
SetScale(RandomFloat(fMinScale, fMaxScale))
|
||
|
|
||
|
; Play the hover animation
|
||
|
PlayAnimation(PathStartGraphEvent)
|
||
|
;PlayAnimation("WingsFlyingAnim")
|
||
|
;PlayAnimation("FlightLoop")
|
||
|
|
||
|
; test moved to Critter [indent retained] [USKP 2.0.1]
|
||
|
WarpToRandomPoint()
|
||
|
; ; Debug.TraceConditional("DragonFly " + self + " registering for update", bCritterDebug); [USKP 2.0.1]
|
||
|
; ; Debug.TraceConditional("Fish " + self + " registering for update", bCritterDebug)
|
||
|
|
||
|
; Enable the critter
|
||
|
Enable()
|
||
|
|
||
|
if CheckFor3D(self)
|
||
|
; Switch to keyframe state
|
||
|
SetMotionType(Motion_Keyframed, false)
|
||
|
|
||
|
; Get ready to start moving
|
||
|
RegisterForSingleUpdate(0.0)
|
||
|
else
|
||
|
DisableAndDelete(false)
|
||
|
endIf
|
||
|
endEvent
|
||
|
|
||
|
Event OnUpdate()
|
||
|
; Is the player too far?
|
||
|
if CheckViableDistance()
|
||
|
; Check whether we should flee and move faster
|
||
|
if (closestActor != none)
|
||
|
; ;Debug.Trace(self + " Oh noes! there is an Actor " + closestActor + " nearby, Flee")
|
||
|
; Move fast
|
||
|
; Fly far far away
|
||
|
FlyAway(fFleeTranslationSpeed)
|
||
|
else
|
||
|
; Move at regular speed
|
||
|
float fspeed = RandomFloat(fTranslationSpeedMean - fTranslationSpeedVariance, fTranslationSpeedMean + fTranslationSpeedVariance)
|
||
|
|
||
|
; Time to take off for another point
|
||
|
GoToNewPoint(fspeed)
|
||
|
endIf
|
||
|
bCalculating = False; [USKP 2.0.4]
|
||
|
endIf
|
||
|
closestActor = none; [USKP 2.0.4]
|
||
|
endEvent
|
||
|
|
||
|
Event OnCritterGoalReached()
|
||
|
; traceConditional(self + " reached goal", bCritterDebug)
|
||
|
if PlayerRef; interlock, but never delete during Translation [USKP 2.0.1]
|
||
|
closestActor = Game.FindClosestActorFromRef(self, fActorDetectionDistance)
|
||
|
if closestActor
|
||
|
; There is an actor right there, trigger the update right away, so we'll flee
|
||
|
; ; Debug.TraceConditional("Firefly " + self + " registering for immediate update", bCritterDebug)
|
||
|
RegisterForSingleUpdate(0.0)
|
||
|
else
|
||
|
; Wait at the plant, then take off again
|
||
|
; ; Debug.TraceConditional("Firefly " + self + " registering for update at plant", bCritterDebug)
|
||
|
RegisterForSingleUpdate(RandomFloat(fMinTimeNotMoving, fMaxTimeNotMoving))
|
||
|
endIf
|
||
|
endIf
|
||
|
EndEvent
|
||
|
|
||
|
|
||
|
float fTargetX
|
||
|
float fTargetY
|
||
|
float fTargetZ
|
||
|
float fTargetAngleZ
|
||
|
float fTargetAngleX
|
||
|
|
||
|
;/
|
||
|
; returns true on success [USKP 2.0.1]
|
||
|
/;
|
||
|
bool Function PickRandomPoint()
|
||
|
|
||
|
; moved here from GoToNewPoint [USKP 2.0.1]
|
||
|
; safety - make sure me and my spawner are both still loaded!
|
||
|
if !(PlayerRef ;/&& CheckCellAttached(self) && Spawner && CheckCellAttached(Spawner)/;)
|
||
|
return false
|
||
|
endif
|
||
|
|
||
|
; First find a random point within the radius
|
||
|
;/// [USKP 2.0.4] ///;
|
||
|
Float fLength = RandomFloat(0.0, fLeashLength)
|
||
|
fTargetAngleZ = RandomFloat(-180.0, 180.0)
|
||
|
fTargetX = fSpawnerX + fLength * Math.Cos(fTargetAngleZ)
|
||
|
fTargetY = fSpawnerY + fLength * Math.Sin(fTargetAngleZ)
|
||
|
;*** [USKP 2.0.4] ***
|
||
|
|
||
|
; Now pick a random Z
|
||
|
fTargetZ = fSpawnerZ + RandomFloat(0.0, fHeight)
|
||
|
|
||
|
; Pick random target angle
|
||
|
fTargetAngleZ = RandomFloat(-180.0, 180.0)
|
||
|
fTargetAngleX = 0.0
|
||
|
return (PlayerRef != None); check again after lengthy calculations [USKP 2.0.1]
|
||
|
|
||
|
endFunction
|
||
|
|
||
|
Function WarpToRandomPoint()
|
||
|
|
||
|
; Pick a random point
|
||
|
PickRandomPoint()
|
||
|
|
||
|
; And warp to it
|
||
|
SetPosition(fTargetX, fTargetY, fTargetZ)
|
||
|
SetAngle(fTargetAngleX, 0.0, fTargetAngleZ)
|
||
|
|
||
|
endFunction
|
||
|
|
||
|
Function GoToNewPoint(float afSpeed)
|
||
|
|
||
|
; Pick a random point
|
||
|
if !PickRandomPoint()
|
||
|
; ; debug.trace("Tried to run GoToNewPoint, but PickRandomPoint failed. "+self)
|
||
|
bCalculating = False; [USKP 2.0.3]
|
||
|
disableAndDelete()
|
||
|
elseif !CheckViability()
|
||
|
; And travel to it
|
||
|
SplineTranslateTo(fTargetX, ftargetY, ftargetZ, fTargetAngleX, 0.0, fTargetAngleZ, fSplineCurvature, afSpeed, fMaxRotationSpeed)
|
||
|
endif
|
||
|
|
||
|
endFunction
|
||
|
|
||
|
;/
|
||
|
; returns true on success [USKP 2.0.1]
|
||
|
/;
|
||
|
bool Function PickRandomPointOutsideLeash()
|
||
|
|
||
|
; moved here from FlyAway [USKP 2.0.1]
|
||
|
; safety - make sure me and my spawner are both still loaded!
|
||
|
if !(PlayerRef ;/&& CheckCellAttached(self) && Spawner && CheckCellAttached(Spawner)/;)
|
||
|
return false
|
||
|
endif
|
||
|
|
||
|
; Pick a random point far away
|
||
|
;/// [USKP 2.0.4] ///;
|
||
|
Float fLength = RandomFloat(fMaxPlayerDistance, fMaxPlayerDistance * 2.0)
|
||
|
fTargetAngleZ = RandomFloat(-180.0, 180.0)
|
||
|
fTargetX = fSpawnerX + fLength * Math.Cos(fTargetAngleZ)
|
||
|
fTargetY = fSpawnerY + fLength * Math.Sin(fTargetAngleZ)
|
||
|
fTargetZ = fSpawnerZ + RandomFloat(fMinFleeHeight, fMaxFleeHeight)
|
||
|
;*** [USKP 2.0.4] ***
|
||
|
|
||
|
fTargetAngleX = 0.0
|
||
|
;! fTargetAngleZ = RandomFloat(-180.0, 180.0)
|
||
|
return (PlayerRef != None); check again after lengthy calculations [USKP 2.0.1]
|
||
|
|
||
|
endFunction
|
||
|
|
||
|
Function FlyAway(float afSpeed)
|
||
|
|
||
|
if !PickRandomPointOutsideLeash()
|
||
|
; ; debug.trace("Tried to run FlyAway, but PickRandomPointOutsideLeash failed. "+self)
|
||
|
bCalculating = False; [USKP 2.0.3]
|
||
|
disableAndDelete()
|
||
|
elseif !CheckViability()
|
||
|
SplineTranslateTo(fTargetX, ftargetY, ftargetZ, fTargetAngleX, 0.0, fTargetAngleZ, fSplineCurvature, afSpeed, fMaxRotationSpeed)
|
||
|
endif
|
||
|
|
||
|
endFunction
|