I run into a problem and solved it, but in a crude way. Maybe there is a smoother solution.
The problem in one sentence: How to save and restore a Pawn's AttitudeToPlayer (its an Enum) in a (static) array?
I tried it with a way like
Code: Select all
var byte AttitudeArray[512];
...
Pawn.AttitudeToPlayer = AttitudeArray[i]; // results in "Error, Type mismatch"
Code: Select all
Pawn.AttitudeToPlayer = EAttitude(AttitudeArray[i]); // results in "Error, Bad or missing expression in '='"
Code: Select all
Pawn.AttitudeToPlayer = Enum'EAttitude'(AttitudeArray[i]); // results in same as above
I did it finally with:
Code: Select all
var pawn PawnsAttitudeToPlayer[512];
var byte PawnsAttitudeToPlayerAttitudes[ArrayCount(PawnsAttitudeToPlayer)];
var int PawnsAttitudeToPlayerCount;
function SetAttitudeToPawn(Pawn p, byte AttitudeToPlayer) // notice the singular in function name: "Pawn"
{
switch (AttitudeToPlayer)
{
case 0:
p.AttitudeToPlayer = ATTITUDE_Fear;
break;
case 1:
p.AttitudeToPlayer = ATTITUDE_Hate;
break;
case 2:
p.AttitudeToPlayer = ATTITUDE_Frenzy;
break;
case 3:
p.AttitudeToPlayer = ATTITUDE_Threaten;
break;
case 4:
p.AttitudeToPlayer = ATTITUDE_Ignore;
break;
case 5:
p.AttitudeToPlayer = ATTITUDE_Friendly;
break;
case 6:
p.AttitudeToPlayer = ATTITUDE_Follow;
break;
default:
log("Class MonsterHunt.SetAttitudeToPawn: unknown AttitudeToPlayer=" $ AttitudeToPlayer);
break;
}
}
function SetAttitudeToPawns(bool bDoRevert) // notice the plural in function name: "Pawns"
{
local Pawn p;
local int i;
local bool bWarnTooManyNonHaters;
if (bDoRevert)
{
foreach AllActors(class'Pawn', p)
if (! p.IsA('PlayerPawn') && ! p.IsA('Bot'))
p.AttitudeToPlayer = ATTITUDE_Hate;
// restore original values:
for (i=0; i < PawnsAttitudeToPlayerCount; i++)
SetAttitudeToPawn(PawnsAttitudeToPlayer[i], PawnsAttitudeToPlayerAttitudes[i]);
}
else
{
bWarnTooManyNonHaters = False;
PawnsAttitudeToPlayerCount = 0;
foreach AllActors( class'Pawn', p)
if (! p.IsA('PlayerPawn') && ! p.IsA('Bot'))
{
if (p.AttitudeToPlayer != ATTITUDE_Hate) // store all pawns different from ATTITUDE_Hate in array *PawnsAttitudeToPlayer* and their AttitudeToPlayer in array *PawnsAttitudeToPlayerAttitudes*
if (PawnsAttitudeToPlayerCount < ArrayCount(PawnsAttitudeToPlayer))
{
PawnsAttitudeToPlayer[PawnsAttitudeToPlayerCount] = p;
PawnsAttitudeToPlayerAttitudes[PawnsAttitudeToPlayerCount] = p.AttitudeToPlayer;
PawnsAttitudeToPlayerCount++;
}
else
if (! bWarnTooManyNonHaters)
{
Warn("Class MonsterHunt.SetAttitudeToPawns: more than" @ ArrayCount(PawnsAttitudeToPlayer) @ "pawns with AttitudeToPlayer != ATTITUDE_Hate");
bWarnTooManyNonHaters = True; // only one warning per map
}
p.AttitudeToPlayer = ATTITUDE_Ignore;
}
}
}