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

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');
}
}