103 lines
2.7 KiB
Ucode
103 lines
2.7 KiB
Ucode
class FriendlyMonsterAI extends KFMonsterController;
|
|
|
|
|
|
function bool FindNewEnemy()
|
|
{
|
|
local Pawn BestEnemy;
|
|
local bool bSeeNew, bSeeBest;
|
|
local float BestDist, NewDist;
|
|
local KFMonsterController C;
|
|
//local KFOBJMover Bashdoor;
|
|
|
|
if ( Level.Game.bGameEnded )
|
|
return false;
|
|
|
|
ForEach AllActors(class 'KFMonsterController', C)
|
|
{
|
|
if ((C.Pawn != None) && (C.Pawn.Health > 0) && C.Pawn != class 'KFHumanPawn' && C != self )
|
|
{
|
|
if ( BestEnemy == None )
|
|
{
|
|
BestEnemy = C.Pawn;
|
|
BestDist = VSize(BestEnemy.Location - Pawn.Location);
|
|
bSeeBest = CanSee(BestEnemy);
|
|
}
|
|
else
|
|
{
|
|
NewDist = VSize(C.Pawn.Location - Pawn.Location);
|
|
if ( !bSeeBest || (NewDist < BestDist) )
|
|
{
|
|
bSeeNew = CanSee(C.Pawn);
|
|
if ( NewDist < BestDist)
|
|
{
|
|
BestEnemy = C.Pawn;
|
|
BestDist = NewDist;
|
|
bSeeBest = bSeeNew;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if ( BestEnemy == Enemy )
|
|
return false;
|
|
|
|
|
|
if ( BestEnemy != None )
|
|
{
|
|
ChangeEnemy(BestEnemy,CanSee(BestEnemy));
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
function bool SetEnemy( Pawn NewEnemy, optional bool bHateMonster, optional float MonsterHateChanceOverride )
|
|
{
|
|
local float EnemyDist;
|
|
local bool bNewMonsterEnemy;
|
|
|
|
if ( (NewEnemy == None) || (NewEnemy.Health <= 0) || (NewEnemy.Controller == None) || (NewEnemy == Enemy) )
|
|
return false;
|
|
|
|
bNewMonsterEnemy = bHateMonster && (Level.Game.NumPlayers < 4) && !Monster(Pawn).SameSpeciesAs(NewEnemy) && !NewEnemy.Controller.bIsPlayer;
|
|
|
|
if ( NewEnemy == class 'KFHumanPawn' )
|
|
return false;
|
|
|
|
if ( (bNewMonsterEnemy && LineOfSightTo(NewEnemy)) || (Enemy == None) || !EnemyVisible() )
|
|
{
|
|
ChangeEnemy(NewEnemy,CanSee(NewEnemy));
|
|
return true;
|
|
}
|
|
|
|
if ( !CanSee(NewEnemy) )
|
|
return false;
|
|
|
|
if ( !bHateMonster && (Monster(Enemy) != None) && NewEnemy.Controller.bIsPlayer )
|
|
return false;
|
|
|
|
EnemyDist = VSize(Enemy.Location - Pawn.Location);
|
|
if ( EnemyDist < Pawn.MeleeRange )
|
|
return false;
|
|
|
|
if ( EnemyDist > 1.7 * VSize(NewEnemy.Location - Pawn.Location))
|
|
{
|
|
ChangeEnemy(NewEnemy,CanSee(NewEnemy));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
event SeePlayer(Pawn SeenPlayer)
|
|
{
|
|
|
|
if ( Enemy == SeenPlayer )
|
|
{
|
|
Enemy = none;
|
|
GotoState('ZombieRestFormation', 'Begin');
|
|
}
|
|
}
|