rott/kf_sources/GamePlay/Classes/ScriptedSequence.uc
2026-07-14 20:27:09 +07:00

149 lines
3.4 KiB
Ucode

//=============================================================================
// ScriptedSequence
// used for setting up scripted sequences for pawns.
// A ScriptedController is spawned to carry out the scripted sequence.
//=============================================================================
class ScriptedSequence extends AIScript;
var(AIScript) export editinline Array<ScriptedAction> Actions;
var class<ScriptedController> ScriptControllerClass;
function PostBeginPlay()
{
local int i;
super.PostBeginPlay();
for ( i=0; i<Actions.Length; i++ )
if ( Actions[i] != None )
Actions[i].PostBeginPlay( Self );
}
event Reset()
{
local int i;
super.Reset();
for ( i=0; i<Actions.Length; i++ )
if ( Actions[i] != None )
Actions[i].Reset();
}
/* SpawnController()
Spawn and initialize an AI Controller (called by a non-player controlled Pawn at level startup)
*/
function SpawnControllerFor(Pawn P)
{
Super.SpawnControllerFor(P);
TakeOver(P);
}
function bool CheckForErrors()
{
if ( Actions.Length > 0 )
{
log(self$" has no Actions!");
return true;
}
return Super.CheckForErrors();
}
/* TakeOver()
Spawn a scripted controller, which temporarily takes over the actions of the pawn,
unless pawn is currently controlled by a scripted controller - then just change its script
*/
function TakeOver(Pawn P)
{
local ScriptedController S;
if ( ScriptedController(P.Controller) != None )
S = ScriptedController(P.Controller);
else
{
S = spawn(ScriptControllerClass);
S.PendingController = P.Controller;
if ( S.PendingController != None )
S.PendingController.PendingStasis();
}
S.MyScript = self;
S.TakeControlOf(P);
S.SetNewScript(self);
}
//*****************************************************************************************
// Script Changes
function bool ValidAction(Int N)
{
return true;
}
function SetActions(ScriptedController C)
{
local ScriptedSequence NewScript;
local bool bDone;
if ( C.CurrentAnimation != None )
C.CurrentAnimation.SetCurrentAnimationFor(C);
while ( !bDone )
{
if ( C.ActionNum < Actions.Length )
{
if ( ValidAction(C.ActionNum) )
NewScript = Actions[C.ActionNum].GetScript(self);
else
{
NewScript = None;
warn(GetItemName(string(self))$" action "$C.ActionNum@Actions[C.ActionNum].GetActionString()$" NOT VALID!!!");
}
}
else
NewScript = None;
if ( NewScript == None )
{
C.CurrentAction = None;
return;
}
if ( NewScript != self )
{
C.SetNewScript(NewScript);
return;
}
if ( Actions[C.ActionNum] == None )
{
Warn(self$" no action "$C.ActionNum$"!!!");
C.CurrentAction = None;
return;
}
bDone = Actions[C.ActionNum].InitActionFor(C);
if ( bLoggingEnabled )
log(GetItemName(string(C.Pawn))$" script "$GetItemName(string(tag))$" action "$C.ActionNum@Actions[C.ActionNum].GetActionString());
if ( !bDone )
{
if ( Actions[C.ActionNum] == None )
{
Warn(self$" has no action "$C.ActionNum$"!!!");
C.CurrentAction = None;
return;
}
Actions[C.ActionNum].ActionCompleted();
Actions[C.ActionNum].ProceedToNextAction(C);
}
}
}
defaultproperties
{
bStatic=true
ScriptControllerClass=class'Gameplay.ScriptedController'
bCollideWhenPlacing=true
CollisionRadius=+00050.000000
CollisionHeight=+00100.000000
bDirectional=true
bNavigate=true
bLoggingEnabled=false
}