So I decided to code this 'little bonus':
Code: Select all
//=============================================================================
// ScriptedActions.
//=============================================================================
class ScriptedActions expands NavigationPoint;
struct ScriptArgument
{
var name TagArguments[2];
var int NumberArgument;
};
var(Scripting) ScriptArgument ScriptingArguments[32];
var Pawn PawnsActing[64];
var int PawnActionIndexes[64];
var int NumActions;
var(Scripting) enum EScriptingAction
{
SA_None,
SA_TriggerActor,
SA_TriggerEvent,
SA_EndActions,
SA_TranslocateTo,
SA_TargetPawn,
SA_CauseEvent,
SA_TransferTo,
SA_TransferIfHealthy,
SA_TransferIfInState,
} Actions[32];
function EndActions(Pawn Other, int Index)
{
local int i;
for ( i = Index; i < 63; i++ )
{
if ( PawnsActing[i + 1] == None )
break;
PawnsActing[i] = PawnsActing[i + 1];
PawnActionIndexes[i] = PawnActionIndexes[i + 1];
}
}
function Actor DoAction(EScriptingAction Action, ScriptArgument Argument, Pawn Other, int ActionIndex)
{
local NavigationPoint NP;
local Trigger T;
local Actor A;
local Pawn P;
if ( Action == SA_TransferTo && Other.IsInState(Argument.TagArguments[0]) )
{
foreach AllActors(class'NavigationPoint', NP)
if ( NP.Name == Argument.TagArguments[0] )
return NP;
return None;
}
if ( Action == SA_TransferIfInState && Other.IsInState(Argument.TagArguments[0]) )
{
foreach AllActors(class'NavigationPoint', NP)
if ( NP.Name == Argument.TagArguments[1] )
return NP;
return None;
}
else if ( Action == SA_TransferIfHealthy && Other.Health > Argument.NumberArgument )
{
foreach AllActors(class'NavigationPoint', NP)
if ( NP.Name == Argument.TagArguments[0] )
return NP;
return None;
}
else if ( Action == SA_TriggerActor )
{
foreach AllActors(class'Actor', A)
if ( A.Name == Argument.TagArguments[0] )
break;
foreach AllActors(class'Trigger', T)
{
if ( A == None )
return None;
if ( T.Event == A.Tag )
return T;
}
}
else if ( Action == SA_TriggerEvent )
{
foreach AllActors(class'Trigger', T)
if ( T.Event == Argument.TagArguments[0] )
return T;
return None;
}
else if ( Action == SA_EndActions )
{
EndActions(Other, ActionIndex);
return None;
}
else if ( Action == SA_TargetPawn )
{
foreach AllActors(class'Pawn', P)
if ( P.Name == Argument.TagArguments[0] )
break;
return P;
}
else if ( Action == SA_CauseEvent )
{
foreach AllActors(class'Actor', A, Argument.TagArguments[0])
A.Trigger(self, Other);
return None;
}
warn(self$"'s action "$Action$"did not match any in EScriptingAction enum!");
return None;
}
function Actor ParseAction(int actionIndex, Pawn Other)
{
if ( actionIndex > 31 )
return None;
return DoAction(Actions[actionIndex], ScriptingArguments[actionIndex], Other, actionIndex);
}
function Actor SpecialHandling(Pawn Other)
{
local int i;
local Pawn P;
local Actor A;
for ( i = 0; i < 64; i++ )
if ( PawnsActing[i] == Other || PawnsActing[i] == None )
break;
if ( PawnsActing[i] == None )
{
PawnsActing[i] = Other;
PawnActionIndexes[i] = 0;
}
A = ParseAction(PawnActionIndexes[i], Other);
if ( PawnActionIndexes[i] < 31 )
PawnActionIndexes[i] += 1;
else
EndActions(Other, i);
return A;
}