Prepare fixtures

This commit is contained in:
dkanus 2026-07-14 20:27:09 +07:00
commit 9c94356263
6021 changed files with 722805 additions and 22 deletions

View file

@ -0,0 +1,9 @@
class BloatZombieController extends KFMonsterController;
// Custom Zombie Thinkerating
// By : Alex
// Randomly plays a different moan sound for the Zombie each time it is called. Gruesome!
defaultproperties
{
}

View file

@ -0,0 +1,99 @@
class BossHPNeedle extends Decoration
NotPlaceable;
#exec obj load file="NewPatchSM.usx"
simulated function DroppedNow()
{
SetCollision(True);
SetPhysics(PHYS_Falling);
bFixedRotationDir = True;
RotationRate = RotRand(True);
}
simulated function HitWall( vector HitNormal, actor HitWall )
{
local rotator R;
if( VSize(Velocity)<40 )
{
SetPhysics(PHYS_None);
R.Roll = Rand(65536);
R.Yaw = Rand(65536);
SetRotation(R);
Return;
}
Velocity = MirrorVectorByNormal(Velocity,HitNormal)*0.75;
if( HitWall!=None && HitWall.Physics!=PHYS_None )
Velocity+=HitWall.Velocity;
}
simulated function Landed( vector HitNormal )
{
HitWall(HitNormal,None);
}
function TakeDamage( int NDamage, Pawn instigatedBy, Vector hitlocation,
Vector momentum, class<DamageType> damageType, optional int HitIndex)
{
if( Physics==PHYS_None )
{
SetPhysics(PHYS_Falling);
bFixedRotationDir = True;
RotationRate = RotRand(True);
Velocity = vect(0,0,0);
}
Velocity+=momentum/10;
}
simulated function Destroyed();
function Bump( actor Other );
singular function PhysicsVolumeChange( PhysicsVolume NewVolume );
// Overriden so it doesn't damage the patriarch when he drops a needle!
singular function BaseChange()
{
if( Velocity.Z < -500 )
TakeDamage( (1-Velocity.Z/30),Instigator,Location,vect(0,0,0) , class'Crushed');
if( base == None )
{
if ( !bInterpolating && bPushable && (Physics == PHYS_None) )
SetPhysics(PHYS_Falling);
}
else if( Pawn(Base) != None )
{
//Base.TakeDamage( (1-Velocity.Z/400)* mass/Base.Mass,Instigator,Location,0.5 * Velocity , class'Crushed');
Velocity.Z = 100;
if (FRand() < 0.5)
Velocity.X += 70;
else
Velocity.Y += 70;
SetPhysics(PHYS_Falling);
}
else if( Decoration(Base)!=None && Velocity.Z<-500 )
{
Base.TakeDamage((1 - Mass/Base.Mass * Velocity.Z/30), Instigator, Location, 0.2 * Velocity, class'Crushed');
Velocity.Z = 100;
if (FRand() < 0.5)
Velocity.X += 70;
else
Velocity.Y += 70;
SetPhysics(PHYS_Falling);
}
else
instigator = None;
}
defaultproperties
{
RemoteRole=ROLE_None
Physics=PHYS_None
StaticMesh=StaticMesh'BossSyringe'
DrawType=DT_StaticMesh
bCollideActors=False
bProjTarget=True
CollisionHeight=4
CollisionRadius=4
bCollideWorld=True
LifeSpan=300
bStatic=False
bNoDelete=False
bBounce=True
}

View file

@ -0,0 +1,64 @@
class BossLAWProj extends LAWProj;
//-----------------------------------------------------------------------------
// PostBeginPlay
//-----------------------------------------------------------------------------
simulated function PostBeginPlay()
{
// Difficulty Scaling
if (Level.Game != none)
{
//log(self$" Beginning ground speed "$default.GroundSpeed);
// If you are playing by yourself, greatly reduce the rocket damage
if( Level.Game.NumPlayers == 1 )
{
if( Level.Game.GameDifficulty < 2.0 )
{
Damage = default.Damage * 0.25;
}
else if( Level.Game.GameDifficulty < 4.0 )
{
Damage = default.Damage * 0.375;
}
else if( Level.Game.GameDifficulty < 5.0 )
{
Damage = default.Damage * 1.15;
}
else // Hardest difficulty
{
Damage = default.Damage * 1.3;
}
}
else
{
if( Level.Game.GameDifficulty < 2.0 )
{
Damage = default.Damage * 0.375;
}
else if( Level.Game.GameDifficulty < 4.0 )
{
Damage = default.Damage * 1.0;
}
else if( Level.Game.GameDifficulty < 5.0 )
{
Damage = default.Damage * 1.15;
}
else // Hardest difficulty
{
Damage = default.Damage * 1.3;
}
}
}
super.PostBeginPlay();
}
defaultproperties
{
Damage=200
MyDamageType=Class'KFMod.DamTypeFrag'
ArmDistSquared=0
}

View file

@ -0,0 +1,379 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class BossZombieController extends KFMonsterController;
var NavigationPoint HidingSpots;
var float WaitAnimTimeout; // How long until the Anim we are waiting for is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim
var int AnimWaitChannel; // The channel we are waiting to end in WaitForAnim
var name AnimWaitingFor; // The animation we are waiting to end in WaitForAnim, mostly used for debugging
var bool bAlreadyFoundEnemy; // The Boss has already found an enemy at least once
function bool CanKillMeYet()
{
return false;
}
function TimedFireWeaponAtEnemy()
{
if ( (Enemy == None) || FireWeaponAt(Enemy) )
SetCombatTimer();
else
SetTimer(0.01, True);
}
// Overridden to support a quick initial attack to get the boss to the players quickly
function FightEnemy(bool bCanCharge)
{
if( KFM.bShotAnim )
{
GoToState('WaitForAnim');
Return;
}
if (KFM.MeleeRange != KFM.default.MeleeRange)
KFM.MeleeRange = KFM.default.MeleeRange;
if ( Enemy == none || Enemy.Health <= 0 )
FindNewEnemy();
if ( (Enemy == FailedHuntEnemy) && (Level.TimeSeconds == FailedHuntTime) )
{
// if ( Enemy.Controller.bIsPlayer )
// FindNewEnemy();
if ( Enemy == FailedHuntEnemy )
{
GoalString = "FAILED HUNT - HANG OUT";
if ( EnemyVisible() )
bCanCharge = false;
}
}
if ( !EnemyVisible() )
{
// Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm
if( bAlreadyFoundEnemy || ZombieBoss(Pawn).SneakCount > 2 )
{
bAlreadyFoundEnemy = true;
GoalString = "Hunt";
GotoState('ZombieHunt');
}
else
{
// Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm
ZombieBoss(Pawn).SneakCount++;
GoalString = "InitialHunt";
GotoState('InitialHunting');
}
return;
}
// see enemy - decide whether to charge it or strafe around/stand and fire
Target = Enemy;
GoalString = "Charge";
PathFindState = 2;
DoCharge();
}
// Get the boss to the players quickly after initial spawn
state InitialHunting extends Hunting
{
event SeePlayer(Pawn SeenPlayer)
{
super.SeePlayer(SeenPlayer);
bAlreadyFoundEnemy = true;
GoalString = "Hunt";
GotoState('ZombieHunt');
}
function BeginState()
{
local float ZDif;
// Added sneakcount hack to try and fix the endless loop crash. Try and track down what was causing this later - Ramm
ZombieBoss(Pawn).SneakCount++;
if( Pawn.CollisionRadius>27 || Pawn.CollisionHeight>46 )
{
ZDif = Pawn.CollisionHeight-44;
Pawn.SetCollisionSize(24,44);
Pawn.MoveSmooth(vect(0,0,-1)*ZDif);
}
super.BeginState();
}
function EndState()
{
local float ZDif;
if( Pawn.CollisionRadius!=Pawn.Default.CollisionRadius || Pawn.CollisionHeight!=Pawn.Default.CollisionHeight )
{
ZDif = Pawn.Default.CollisionRadius-44;
Pawn.MoveSmooth(vect(0,0,1)*ZDif);
Pawn.SetCollisionSize(Pawn.Default.CollisionRadius,Pawn.Default.CollisionHeight);
}
super.EndState();
}
}
state ZombieCharge
{
function bool StrafeFromDamage(float Damage, class<DamageType> DamageType, bool bFindDest)
{
return false;
}
// I suspect this function causes bloats to get confused
function bool TryStrafe(vector sideDir)
{
return false;
}
function Timer()
{
Disable('NotifyBump');
Target = Enemy;
TimedFireWeaponAtEnemy();
}
WaitForAnim:
if ( Monster(Pawn).bShotAnim )
{
Goto('Moving');
}
if ( !FindBestPathToward(Enemy, false,true) )
GotoState('ZombieRestFormation');
Moving:
MoveToward(Enemy);
WhatToDoNext(17);
if ( bSoaking )
SoakStop("STUCK IN CHARGING!");
}
state RunSomewhere
{
Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle;
function BeginState()
{
HidingSpots = None;
Enemy = None;
SetTimer(0.1,True);
}
event SeePlayer(Pawn SeenPlayer)
{
SetEnemy(SeenPlayer);
}
function Timer()
{
if( Enemy==None )
Return;
Target = Enemy;
KFM.RangedAttack(Target);
}
Begin:
if( Pawn.Physics==PHYS_Falling )
WaitForLanding();
While( KFM.bShotAnim )
Sleep(0.25);
if( HidingSpots==None )
HidingSpots = FindRandomDest();
if( HidingSpots==None )
ZombieBoss(Pawn).BeginHealing();
if( ActorReachable(HidingSpots) )
{
MoveTarget = HidingSpots;
HidingSpots = None;
}
else FindBestPathToward(HidingSpots,True,False);
if( MoveTarget==None )
ZombieBoss(Pawn).BeginHealing();
if( Enemy!=None && VSize(Enemy.Location-Pawn.Location)<100 )
MoveToward(MoveTarget,Enemy,,False);
else MoveToward(MoveTarget,MoveTarget,,False);
if( HidingSpots==None || !PlayerSeesMe() )
ZombieBoss(Pawn).BeginHealing();
GoTo'Begin';
}
State SyrRetreat
{
Ignores HearNoise,DamageAttitudeTo,Tick,EnemyChanged,Startle;
function BeginState()
{
HidingSpots = None;
Enemy = None;
SetTimer(0.1,True);
}
event SeePlayer(Pawn SeenPlayer)
{
SetEnemy(SeenPlayer);
}
function Timer()
{
if( Enemy==None )
Return;
Target = Enemy;
KFM.RangedAttack(Target);
}
function FindHideSpot()
{
local NavigationPoint N,BN;
local float Dist,BDist,MDist;
local vector EnemyDir;
if( Enemy==None )
{
HidingSpots = FindRandomDest();
Return;
}
EnemyDir = Normal(Enemy.Location-Pawn.Location);
For( N=Level.NavigationPointList; N!=None; N=N.NextNavigationPoint )
{
MDist = VSize(N.Location-Pawn.Location);
if( MDist<2500 && !FastTrace(N.Location,Enemy.Location) && FindPathToward(N)!=None )
{
Dist = VSize(N.Location-Enemy.Location)/FMax(MDist/800.f,1.5);
if( (EnemyDir Dot Normal(Enemy.Location-N.Location))<0.2 )
Dist/=10;
if( BN==None || BDist<Dist )
{
BN = N;
BDist = Dist;
}
}
}
if( BN==None )
HidingSpots = FindRandomDest();
else HidingSpots = BN;
}
Begin:
if( Pawn.Physics==PHYS_Falling )
WaitForLanding();
While( KFM.bShotAnim )
Sleep(0.25);
if( HidingSpots==None )
FindHideSpot();
if( HidingSpots==None )
ZombieBoss(Pawn).BeginHealing();
if( ActorReachable(HidingSpots) )
{
MoveTarget = HidingSpots;
HidingSpots = None;
}
else FindBestPathToward(HidingSpots,True,False);
if( MoveTarget==None )
ZombieBoss(Pawn).BeginHealing();
if( Enemy!=None && VSize(Enemy.Location-Pawn.Location)<100 )
MoveToward(MoveTarget,Enemy,,False);
else MoveToward(MoveTarget,MoveTarget,,False);
if( HidingSpots==None )
ZombieBoss(Pawn).BeginHealing();
GoTo'Begin';
}
function bool PlayerSeesMe()
{
local Controller C;
For( C=Level.ControllerList; C!=None; C=C.NextController )
{
if( C.bIsPlayer && C.Pawn!=None && C.Pawn!=Pawn && LineOfSightTo(C.Pawn) )
Return True;
}
Return False;
}
// Used to set a timeout for the WaitForAnim state. This is a bit of a hack fix
// for the Patriach getting stuck in its idle anim on a dedicated server when it
// is supposed to doing something. For some reason, on a dedicated server only, it
// never gets an animend call for some of the anims, instead the anim gets
// interrupted by the idle anim. If we figure that bug out, we can
// probably take this out in the future. But for now the fix works - Ramm
function SetWaitForAnimTimout(float NewWaitAnimTimeout, name AnimToWaitFor)
{
WaitAnimTimeout = NewWaitAnimTimeout;
AnimWaitingFor = AnimToWaitFor;
}
state WaitForAnim
{
Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump,Startle;
// The anim has ended, clear the flags and let the AI do its thing
function WaitTimeout()
{
if( bUseFreezeHack )
{
if( Pawn!=None )
{
Pawn.AccelRate = Pawn.Default.AccelRate;
Pawn.GroundSpeed = Pawn.Default.GroundSpeed;
}
bUseFreezeHack = False;
}
AnimEnd(AnimWaitChannel);
}
event AnimEnd(int Channel)
{
/*local name Sequence;
local float Frame, Rate;
Pawn.GetAnimParams( KFMonster(Pawn).ExpectingChannel, Sequence, Frame, Rate );
log(GetStateName()$" AnimEnd for Exp Chan "$KFMonster(Pawn).ExpectingChannel$" = "$Sequence$" Channel = "$Channel);
Pawn.GetAnimParams( 0, Sequence, Frame, Rate );
log(GetStateName()$" AnimEnd for Chan 0 = "$Sequence);
Pawn.GetAnimParams( 1, Sequence, Frame, Rate );
log(GetStateName()$" AnimEnd for Chan 1 = "$Sequence);
log(GetStateName()$" AnimEnd bShotAnim = "$Monster(Pawn).bShotAnim); */
Pawn.AnimEnd(Channel);
if ( !Monster(Pawn).bShotAnim )
WhatToDoNext(99);
}
function Tick( float Delta )
{
Global.Tick(Delta);
if( WaitAnimTimeout > 0 )
{
WaitAnimTimeout -= Delta;
if( WaitAnimTimeout <= 0 )
{
WaitAnimTimeout = 0;
WaitTimeout();
}
}
if( bUseFreezeHack )
{
MoveTarget = None;
MoveTimer = -1;
Pawn.Acceleration = vect(0,0,0);
Pawn.GroundSpeed = 1;
Pawn.AccelRate = 0;
}
}
function EndState()
{
super.EndState();
AnimWaitingFor = '';
}
}
defaultproperties
{
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadBloat extends ZombieBloat;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadBoss extends ZombieBoss;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadClot extends ZombieClot;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadCrawler extends ZombieCrawler;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadFleshPound extends ZombieFleshPound;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadGorefast extends ZombieGorefast;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadHusk extends ZombieHusk;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadScrake extends ZombieScrake;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadSiren extends ZombieSiren;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,15 @@
// for debugging
class BrainDeadStalker extends ZombieStalker;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
ControllerClass=none
}

View file

@ -0,0 +1,17 @@
// for debugging
class BrainDeadZombie extends ZombieClot;
event PostBeginPlay()
{
Super.PostBeginPlay();
SetMovementPhysics();
}
defaultproperties
{
//SoundRadius=10
ControllerClass=none
}

View file

@ -0,0 +1,111 @@
class CrawlerController extends KFMonsterController;
var float LastPounceTime;
var bool bDoneSpottedCheck;
state ZombieHunt
{
event SeePlayer(Pawn SeenPlayer)
{
if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none )
{
// 25% chance of first player to see this Crawler saying something
if ( !KFGameType(Level.Game).bDidSpottedCrawlerMessage && FRand() < 0.25 )
{
PlayerController(SeenPlayer.Controller).Speech('AUTO', 18, "");
KFGameType(Level.Game).bDidSpottedCrawlerMessage = true;
}
bDoneSpottedCheck = true;
}
super.SeePlayer(SeenPlayer);
}
}
function bool IsInPounceDist(actor PTarget)
{
local vector DistVec;
local float time;
local float HeightMoved;
local float EndHeight;
//work out time needed to reach target
DistVec = pawn.location - PTarget.location;
DistVec.Z=0;
time = vsize(DistVec)/ZombieCrawler(pawn).PounceSpeed;
// vertical change in that time
//assumes downward grav only
HeightMoved = Pawn.JumpZ*time + 0.5*pawn.PhysicsVolume.Gravity.z*time*time;
EndHeight = pawn.Location.z +HeightMoved;
//log(Vsize(Pawn.Location - PTarget.Location));
if((abs(EndHeight - PTarget.Location.Z) < Pawn.CollisionHeight + PTarget.CollisionHeight) &&
VSize(pawn.Location - PTarget.Location) < KFMonster(pawn).MeleeRange * 5)
return true;
else
return false;
}
function bool FireWeaponAt(Actor A)
{
local vector aFacing,aToB;
local float RelativeDir;
if ( A == None )
A = Enemy;
if ( (A == None) || (Focus != A) )
return false;
if(CanAttack(A))
{
Target = A;
Monster(Pawn).RangedAttack(Target);
}
else
{
//TODO - base off land time rather than launch time?
if((LastPounceTime + (4.5 - (FRand() * 3.0))) < Level.TimeSeconds )
{
aFacing=Normal(Vector(Pawn.Rotation));
// Get the vector from A to B
aToB=A.Location-Pawn.Location;
RelativeDir = aFacing dot aToB;
if ( RelativeDir > 0.85 )
{
//Facing enemy
if(IsInPounceDist(A) )
{
if(ZombieCrawler(Pawn).DoPounce()==true )
LastPounceTime = Level.TimeSeconds;
}
}
}
}
return false;
}
function bool NotifyLanded(vector HitNormal)
{
if( zombiecrawler(pawn).bPouncing )
{
// restart pathfinding from landing location
GotoState('hunting');
return false;
}
else
return super.NotifyLanded(HitNormal);
}
defaultproperties
{
}

View file

@ -0,0 +1,219 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class FleshpoundZombieController extends KFMonsterController;
var float RageAnimTimeout; // How long until the RageAnim is completed; Hack so the server doesn't get stuck in idle when its doing the Rage anim
var bool bDoneSpottedCheck;
var float RageFrustrationTimer; // Tracks how long we have been walking toward a visible enemy
var float RageFrustrationThreshhold; // Base value for how long the FP should walk torward an enemy without reaching them before getting frustrated and raging
state ZombieHunt
{
event SeePlayer(Pawn SeenPlayer)
{
if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none )
{
// 25% chance of first player to see this Fleshpound saying something
if ( !KFGameType(Level.Game).bDidSpottedFleshpoundMessage && FRand() < 0.25 )
{
PlayerController(SeenPlayer.Controller).Speech('AUTO', 12, "");
KFGameType(Level.Game).bDidSpottedFleshpoundMessage = true;
}
bDoneSpottedCheck = true;
}
super.SeePlayer(SeenPlayer);
}
}
function TimedFireWeaponAtEnemy()
{
if ( (Enemy == None) || FireWeaponAt(Enemy) )
SetCombatTimer();
else
SetTimer(0.01, True);
}
state SpinAttack
{
ignores EnemyNotVisible;
// Don't do this in this state
function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){}
function DoSpinDamage()
{
local Actor A;
//log("FLESHPOUND DOSPINDAMAGE!");
foreach CollidingActors(class'actor', A, (ZombieFleshpound(pawn).MeleeRange * 1.5)+pawn.CollisionRadius, pawn.Location)
zombiefleshpound(pawn).SpinDamage(A);
}
Begin:
WaitForAnim:
While( KFM.bShotAnim )
{
Sleep(0.1);
DoSpinDamage();
}
WhatToDoNext(152);
if ( bSoaking )
SoakStop("STUCK IN SPINATTACK!!!");
}
state ZombieCharge
{
function Tick( float Delta )
{
local ZombieFleshPound ZFP;
Global.Tick(Delta);
// Make the FP rage if we haven't reached our enemy after a certain amount of time
if( RageFrustrationTimer < RageFrustrationThreshhold )
{
RageFrustrationTimer += Delta;
if( RageFrustrationTimer >= RageFrustrationThreshhold )
{
ZFP = ZombieFleshPound(Pawn);
if( ZFP != none && !ZFP.bChargingPlayer )
{
ZFP.StartCharging();
ZFP.bFrustrated = true;
}
}
}
}
function bool StrafeFromDamage(float Damage, class<DamageType> DamageType, bool bFindDest)
{
return false;
}
// I suspect this function causes bloats to get confused
function bool TryStrafe(vector sideDir)
{
return false;
}
function Timer()
{
Disable('NotifyBump');
Target = Enemy;
TimedFireWeaponAtEnemy();
}
function BeginState()
{
super.BeginState();
RageFrustrationThreshhold = default.RageFrustrationThreshhold + (Frand() * 5);
RageFrustrationTimer = 0;
}
WaitForAnim:
if ( Monster(Pawn).bShotAnim )
{
Goto('Moving');
}
if ( !FindBestPathToward(Enemy, false,true) )
GotoState('ZombieRestFormation');
Moving:
MoveToward(Enemy);
WhatToDoNext(17);
if ( bSoaking )
SoakStop("STUCK IN CHARGING!");
}
// Used to set a timeout for the WaitForAnim state. This is a bit of a hack fix
// for the FleshPound getting stuck in its idle anim on a dedicated server when it
// is supposed to be raging. For some reason, on a dedicated server only, it
// never gets an animend call for the PoundRage anim, instead the anim gets
// interrupted by the PoundIdle anim. If we figure that bug out, we can
// probably take this out in the future. But for now the fix works - Ramm
function SetPoundRageTimout(float NewRageTimeOut)
{
RageAnimTimeout = NewRageTimeOut;
}
state WaitForAnim
{
Ignores SeePlayer,HearNoise,Timer,EnemyNotVisible,NotifyBump;
// Don't do this in this state
function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){}
function BeginState()
{
bUseFreezeHack = False;
}
// The rage anim has ended, clear the flags and let the AI do its thing
function RageTimeout()
{
if( bUseFreezeHack )
{
if( Pawn!=None )
{
Pawn.AccelRate = Pawn.Default.AccelRate;
Pawn.GroundSpeed = Pawn.Default.GroundSpeed;
}
bUseFreezeHack = False;
AnimEnd(0);
}
}
function Tick( float Delta )
{
Global.Tick(Delta);
if( RageAnimTimeout > 0 )
{
RageAnimTimeout -= Delta;
if( RageAnimTimeout <= 0 )
{
RageAnimTimeout = 0;
RageTimeout();
}
}
if( bUseFreezeHack )
{
MoveTarget = None;
MoveTimer = -1;
Pawn.Acceleration = vect(0,0,0);
Pawn.GroundSpeed = 1;
Pawn.AccelRate = 0;
}
}
function EndState()
{
if( Pawn!=None )
{
Pawn.AccelRate = Pawn.Default.AccelRate;
Pawn.GroundSpeed = Pawn.Default.GroundSpeed;
}
bUseFreezeHack = False;
}
Begin:
While( KFM.bShotAnim )
{
Sleep(0.15);
}
WhatToDoNext(99);
}
defaultproperties
{
RageFrustrationThreshhold=10.0
}

View file

@ -0,0 +1,29 @@
// Custom code to make the Gorefast act abit more interesting.
class GorefastController extends KFMonsterController;
var bool bDoneSpottedCheck;
state ZombieHunt
{
event SeePlayer(Pawn SeenPlayer)
{
if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none )
{
// 25% chance of first player to see this Gorefast saying something
if ( !KFGameType(Level.Game).bDidSpottedGorefastMessage && FRand() < 0.25 )
{
PlayerController(SeenPlayer.Controller).Speech('AUTO', 13, "");
KFGameType(Level.Game).bDidSpottedGorefastMessage = true;
}
bDoneSpottedCheck = true;
}
global.SeePlayer(SeenPlayer);
}
}
defaultproperties
{
StrafingAbility=0.500000
}

View file

@ -0,0 +1,339 @@
//=============================================================================
// HuskFireProjectile
//=============================================================================
// Fireball projectile for the Husk zombie
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class HuskFireProjectile extends LAWProj;
var Emitter FlameTrail;
var xEmitter Trail;
//-----------------------------------------------------------------------------
// PostBeginPlay
//-----------------------------------------------------------------------------
simulated function PostBeginPlay()
{
if ( Level.NetMode != NM_DedicatedServer )
{
if ( !PhysicsVolume.bWaterVolume )
{
FlameTrail = Spawn(class'FlameThrowerFlameB',self);
Trail = Spawn(class'FlameThrowerFlame',self);
}
}
// Difficulty Scaling
if (Level.Game != none)
{
if( Level.Game.GameDifficulty < 2.0 )
{
Damage = default.Damage * 0.75;
}
else if( Level.Game.GameDifficulty < 4.0 )
{
Damage = default.Damage * 1.0;
}
else if( Level.Game.GameDifficulty < 5.0 )
{
Damage = default.Damage * 1.15;
}
else // Hardest difficulty
{
Damage = default.Damage * 1.3;
}
}
OrigLoc = Location;
if( !bDud )
{
Dir = vector(Rotation);
Velocity = speed * Dir;
}
super(ROBallisticProjectile).PostBeginPlay();
}
simulated function Explode(vector HitLocation, vector HitNormal)
{
local Controller C;
local PlayerController LocalPlayer;
local float ShakeScale;
bHasExploded = True;
// Don't explode if this is a dud
if( bDud )
{
Velocity = vect(0,0,0);
LifeSpan=1.0;
SetPhysics(PHYS_Falling);
}
PlaySound(ExplosionSound,,2.0);
if ( EffectIsRelevant(Location,false) )
{
Spawn(class'KFMod.FlameImpact',,,HitLocation + HitNormal*20,rotator(HitNormal));
Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
}
BlowUp(HitLocation);
Destroy();
// Shake nearby players screens
LocalPlayer = Level.GetLocalPlayerController();
if ( LocalPlayer != none )
{
ShakeScale = GetShakeScale(Location, LocalPlayer.ViewTarget.Location);
if( ShakeScale > 0 )
{
LocalPlayer.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime);
}
}
for ( C=Level.ControllerList; C!=None; C=C.NextController )
{
if ( PlayerController(C) != None && C != LocalPlayer )
{
ShakeScale = GetShakeScale(Location, PlayerController(C).ViewTarget.Location);
if( ShakeScale > 0 )
{
C.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime);
}
}
}
}
// Get the shake amount for when this projectile explodes
simulated function float GetShakeScale(vector ViewLocation, vector EventLocation)
{
local float Dist;
local float scale;
Dist = VSize(ViewLocation - EventLocation);
if (Dist < DamageRadius * 2.0 )
{
scale = (DamageRadius*2.0 - Dist) / (DamageRadius*2.0);
}
return scale;
}
/* HurtRadius()
Hurt locally authoritative actors within the radius.
Overriden so it doesn't attemt to damage the bullet whiz cylinder - TODO: maybe implement the same thing in the superclass - Ramm
*/
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local float damageScale, dist;
local vector dirs;
local int NumKilled;
local KFMonster KFMonsterVictim;
local Pawn P;
local KFPawn KFP;
local array<Pawn> CheckedPawns;
local int i;
local bool bAlreadyChecked;
if ( bHurtEntry )
return;
bHurtEntry = true;
foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation)
{
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims)
&& (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo')
&& ExtendedZCollision(Victims)==None && KFBulletWhipAttachment(Victims)==None )
{
dirs = Victims.Location - HitLocation;
dist = FMax(1,VSize(dirs));
dirs = dirs/dist;
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController( InstigatorController );
if ( Victims == LastTouched )
LastTouched = None;
P = Pawn(Victims);
if( P != none )
{
for (i = 0; i < CheckedPawns.Length; i++)
{
if (CheckedPawns[i] == P)
{
bAlreadyChecked = true;
break;
}
}
if( bAlreadyChecked )
{
bAlreadyChecked = false;
P = none;
continue;
}
KFMonsterVictim = KFMonster(Victims);
if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 )
{
KFMonsterVictim = none;
}
KFP = KFPawn(Victims);
if( KFMonsterVictim != none )
{
damageScale *= KFMonsterVictim.GetExposureTo(HitLocation);
}
else if( KFP != none )
{
damageScale *= KFP.GetExposureTo(HitLocation);
}
CheckedPawns[CheckedPawns.Length] = P;
if ( damageScale <= 0)
{
P = none;
continue;
}
else
{
P = none;
}
}
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs,
(damageScale * Momentum * dirs),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 )
{
NumKilled++;
}
}
}
if ( (LastTouched != None) && (LastTouched != self) && (LastTouched != Instigator) &&
(LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') )
{
Victims = LastTouched;
LastTouched = None;
dirs = Victims.Location - HitLocation;
dist = FMax(1,VSize(dirs));
dirs = dirs/dist;
damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius));
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController(InstigatorController);
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs,
(damageScale * Momentum * dirs),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
if( Role == ROLE_Authority )
{
if( NumKilled >= 4 )
{
KFGameType(Level.Game).DramaticEvent(0.05);
}
else if( NumKilled >= 2 )
{
KFGameType(Level.Game).DramaticEvent(0.03);
}
}
bHurtEntry = false;
}
//==============
// Touching
// Overridden to not touch the bulletwhip attachment
simulated singular function Touch(Actor Other)
{
if ( Other == None || KFBulletWhipAttachment(Other)!=None )
return;
super.Touch(Other);
}
// Don't hit Zed extra collision cylinders
simulated function ProcessTouch(Actor Other, Vector HitLocation)
{
if( ExtendedZCollision(Other) != none )
{
return;
}
super.ProcessTouch(Other, HitLocation);
}
simulated function Destroyed()
{
if ( Trail != none )
{
Trail.mRegen=False;
Trail.SetPhysics(PHYS_None);
Trail.GotoState('');
}
if ( FlameTrail != none )
{
FlameTrail.Kill();
FlameTrail.SetPhysics(PHYS_None);
}
Super.Destroyed();
}
defaultproperties
{
Speed=1800.000000
MaxSpeed=2200.000000
Damage=25
DamageRadius=150.0
ArmDistSquared=0
StaticMesh=StaticMesh'EffectsSM.Ger_Tracer'// StaticMesh'EffectsSM.Ger_Tracer_Ball'
DrawScale=2.0
MyDamageType=class'DamTypeBurned'
ExplosionSound= Sound'KF_EnemiesFinalSnd.Husk.Husk_FireImpact' //Sound'KF_GrenadeSnd.FlameNade_Explode2'
AmbientSound=sound'KF_BaseHusk.husk_fireball_loop'
ExplosionDecal=class'KFMod.FlameThrowerBurnMark'
LightType=LT_Steady
LightBrightness=90.000000
LightRadius=16.000000
LightHue=45
LightSaturation=169
LightCone=16
bDynamicLight=True
bUnlit=True
AmbientGlow=254
}

View file

@ -0,0 +1,333 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class HuskFireProjectile_HALLOWEEN extends LAWProj;
var Emitter FlameTrail;
var xEmitter Trail;
//-----------------------------------------------------------------------------
// PostBeginPlay
//-----------------------------------------------------------------------------
simulated function PostBeginPlay()
{
if ( Level.NetMode != NM_DedicatedServer )
{
if ( !PhysicsVolume.bWaterVolume )
{
FlameTrail = Spawn(class'FlameThrowerFlameB',self);
Trail = Spawn(class'FlameThrowerFlame',self);
}
}
// Difficulty Scaling
if (Level.Game != none)
{
if( Level.Game.GameDifficulty < 2.0 )
{
Damage = default.Damage * 0.75;
}
else if( Level.Game.GameDifficulty < 4.0 )
{
Damage = default.Damage * 1.0;
}
else if( Level.Game.GameDifficulty < 5.0 )
{
Damage = default.Damage * 1.15;
}
else // Hardest difficulty
{
Damage = default.Damage * 1.3;
}
}
OrigLoc = Location;
if( !bDud )
{
Dir = vector(Rotation);
Velocity = speed * Dir;
}
super(ROBallisticProjectile).PostBeginPlay();
}
simulated function Explode(vector HitLocation, vector HitNormal)
{
local Controller C;
local PlayerController LocalPlayer;
local float ShakeScale;
bHasExploded = True;
// Don't explode if this is a dud
if( bDud )
{
Velocity = vect(0,0,0);
LifeSpan=1.0;
SetPhysics(PHYS_Falling);
}
PlaySound(ExplosionSound,,2.0);
if ( EffectIsRelevant(Location,false) )
{
Spawn(class'KFMod.FlameImpact_HALLOWEEN',,,HitLocation + HitNormal*20,rotator(HitNormal));
Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
}
BlowUp(HitLocation);
Destroy();
// Shake nearby players screens
LocalPlayer = Level.GetLocalPlayerController();
if ( LocalPlayer != none )
{
ShakeScale = GetShakeScale(Location, LocalPlayer.ViewTarget.Location);
if( ShakeScale > 0 )
{
LocalPlayer.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime);
}
}
for ( C=Level.ControllerList; C!=None; C=C.NextController )
{
if ( PlayerController(C) != None && C != LocalPlayer )
{
ShakeScale = GetShakeScale(Location, PlayerController(C).ViewTarget.Location);
if( ShakeScale > 0 )
{
C.ShakeView(RotMag * ShakeScale, RotRate, RotTime, OffsetMag * ShakeScale, OffsetRate, OffsetTime);
}
}
}
}
// Get the shake amount for when this projectile explodes
simulated function float GetShakeScale(vector ViewLocation, vector EventLocation)
{
local float Dist;
local float scale;
Dist = VSize(ViewLocation - EventLocation);
if (Dist < DamageRadius * 2.0 )
{
scale = (DamageRadius*2.0 - Dist) / (DamageRadius*2.0);
}
return scale;
}
/* HurtRadius()
Hurt locally authoritative actors within the radius.
Overriden so it doesn't attemt to damage the bullet whiz cylinder - TODO: maybe implement the same thing in the superclass - Ramm
*/
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local float damageScale, dist;
local vector dirs;
local int NumKilled;
local KFMonster KFMonsterVictim;
local Pawn P;
local KFPawn KFP;
local array<Pawn> CheckedPawns;
local int i;
local bool bAlreadyChecked;
if ( bHurtEntry )
return;
bHurtEntry = true;
foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation)
{
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
if( (Victims != self) && (Victims != Instigator) &&(Hurtwall != Victims)
&& (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo')
&& ExtendedZCollision(Victims)==None && KFBulletWhipAttachment(Victims)==None )
{
dirs = Victims.Location - HitLocation;
dist = FMax(1,VSize(dirs));
dirs = dirs/dist;
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController( InstigatorController );
if ( Victims == LastTouched )
LastTouched = None;
P = Pawn(Victims);
if( P != none )
{
for (i = 0; i < CheckedPawns.Length; i++)
{
if (CheckedPawns[i] == P)
{
bAlreadyChecked = true;
break;
}
}
if( bAlreadyChecked )
{
bAlreadyChecked = false;
P = none;
continue;
}
KFMonsterVictim = KFMonster(Victims);
if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 )
{
KFMonsterVictim = none;
}
KFP = KFPawn(Victims);
if( KFMonsterVictim != none )
{
damageScale *= KFMonsterVictim.GetExposureTo(HitLocation);
}
else if( KFP != none )
{
damageScale *= KFP.GetExposureTo(HitLocation);
}
CheckedPawns[CheckedPawns.Length] = P;
if ( damageScale <= 0)
{
P = none;
continue;
}
else
{
P = none;
}
}
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs,
(damageScale * Momentum * dirs),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
if( Role == ROLE_Authority && KFMonsterVictim != none && KFMonsterVictim.Health <= 0 )
{
NumKilled++;
}
}
}
if ( (LastTouched != None) && (LastTouched != self) && (LastTouched != Instigator) &&
(LastTouched.Role == ROLE_Authority) && !LastTouched.IsA('FluidSurfaceInfo') )
{
Victims = LastTouched;
LastTouched = None;
dirs = Victims.Location - HitLocation;
dist = FMax(1,VSize(dirs));
dirs = dirs/dist;
damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius));
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController(InstigatorController);
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dirs,
(damageScale * Momentum * dirs),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
if( Role == ROLE_Authority )
{
if( NumKilled >= 4 )
{
KFGameType(Level.Game).DramaticEvent(0.05);
}
else if( NumKilled >= 2 )
{
KFGameType(Level.Game).DramaticEvent(0.03);
}
}
bHurtEntry = false;
}
//==============
// Touching
// Overridden to not touch the bulletwhip attachment
simulated singular function Touch(Actor Other)
{
if ( Other == None || KFBulletWhipAttachment(Other)!=None )
return;
super.Touch(Other);
}
// Don't hit Zed extra collision cylinders
simulated function ProcessTouch(Actor Other, Vector HitLocation)
{
if( ExtendedZCollision(Other) != none )
{
return;
}
super.ProcessTouch(Other, HitLocation);
}
simulated function Destroyed()
{
if ( Trail != none )
{
Trail.mRegen=False;
Trail.SetPhysics(PHYS_None);
Trail.GotoState('');
}
if ( FlameTrail != none )
{
FlameTrail.Kill();
FlameTrail.SetPhysics(PHYS_None);
}
Super.Destroyed();
}
defaultproperties
{
Speed=1800.000000
MaxSpeed=2200.000000
Damage=25
DamageRadius=150.0
ArmDistSquared=0
StaticMesh=StaticMesh'EffectsSM.Ger_Tracer'// StaticMesh'EffectsSM.Ger_Tracer_Ball'
DrawScale=2.0
MyDamageType=class'DamTypeBurned'
ExplosionSound= Sound'KF_EnemiesFinalSnd_HALLOWEEN.Husk.Husk_FireImpact' //Sound'KF_GrenadeSnd.FlameNade_Explode2'
AmbientSound=sound'KF_BaseHusk_HALLOWEEN.husk_fireball_loop'
ExplosionDecal=class'KFMod.FlameThrowerBurnMark'
LightType=LT_Steady
LightBrightness=90.000000
LightRadius=16.000000
LightHue=45
LightSaturation=169
LightCone=16
bDynamicLight=True
bUnlit=True
AmbientGlow=254
}

View file

@ -0,0 +1,240 @@
//=============================================================================
// HuskZombieController
//=============================================================================
// Controller class for the husk zombie
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class HuskZombieController extends KFMonsterController;
// Overridden to create a delay between when the husk fires his projectiles
function bool FireWeaponAt(Actor A)
{
if ( A == None )
A = Enemy;
if ( (A == None) || (Focus != A) )
return false;
Target = A;
if( (VSize(A.Location - Pawn.Location) >= ZombieHusk(Pawn).MeleeRange + Pawn.CollisionRadius + Target.CollisionRadius) &&
ZombieHusk(Pawn).NextFireProjectileTime - Level.TimeSeconds > 0 )
{
return false;
}
Monster(Pawn).RangedAttack(Target);
return false;
}
/*
AdjustAim()
Returns a rotation which is the direction the bot should aim - after introducing the appropriate aiming error
Overridden to cause the zed to fire at the feet more often - Ramm
*/
function rotator AdjustAim(FireProperties FiredAmmunition, vector projStart, int aimerror)
{
local rotator FireRotation, TargetLook;
local float FireDist, TargetDist, ProjSpeed;
local actor HitActor;
local vector FireSpot, FireDir, TargetVel, HitLocation, HitNormal;
local int realYaw;
local bool bDefendMelee, bClean, bLeadTargetNow;
local bool bWantsToAimAtFeet;
if ( FiredAmmunition.ProjectileClass != None )
projspeed = FiredAmmunition.ProjectileClass.default.speed;
// make sure bot has a valid target
if ( Target == None )
{
Target = Enemy;
if ( Target == None )
return Rotation;
}
FireSpot = Target.Location;
TargetDist = VSize(Target.Location - Pawn.Location);
// perfect aim at stationary objects
if ( Pawn(Target) == None )
{
if ( !FiredAmmunition.bTossed )
return rotator(Target.Location - projstart);
else
{
FireDir = AdjustToss(projspeed,ProjStart,Target.Location,true);
SetRotation(Rotator(FireDir));
return Rotation;
}
}
bLeadTargetNow = FiredAmmunition.bLeadTarget && bLeadTarget;
bDefendMelee = ( (Target == Enemy) && DefendMelee(TargetDist) );
aimerror = AdjustAimError(aimerror,TargetDist,bDefendMelee,FiredAmmunition.bInstantHit, bLeadTargetNow);
// lead target with non instant hit projectiles
if ( bLeadTargetNow )
{
TargetVel = Target.Velocity;
// hack guess at projecting falling velocity of target
if ( Target.Physics == PHYS_Falling )
{
if ( Target.PhysicsVolume.Gravity.Z <= Target.PhysicsVolume.Default.Gravity.Z )
TargetVel.Z = FMin(TargetVel.Z + FMax(-400, Target.PhysicsVolume.Gravity.Z * FMin(1,TargetDist/projSpeed)),0);
else
TargetVel.Z = FMin(0, TargetVel.Z);
}
// more or less lead target (with some random variation)
FireSpot += FMin(1, 0.7 + 0.6 * FRand()) * TargetVel * TargetDist/projSpeed;
FireSpot.Z = FMin(Target.Location.Z, FireSpot.Z);
if ( (Target.Physics != PHYS_Falling) && (FRand() < 0.55) && (VSize(FireSpot - ProjStart) > 1000) )
{
// don't always lead far away targets, especially if they are moving sideways with respect to the bot
TargetLook = Target.Rotation;
if ( Target.Physics == PHYS_Walking )
TargetLook.Pitch = 0;
bClean = ( ((Vector(TargetLook) Dot Normal(Target.Velocity)) >= 0.71) && FastTrace(FireSpot, ProjStart) );
}
else // make sure that bot isn't leading into a wall
bClean = FastTrace(FireSpot, ProjStart);
if ( !bClean)
{
// reduce amount of leading
if ( FRand() < 0.3 )
FireSpot = Target.Location;
else
FireSpot = 0.5 * (FireSpot + Target.Location);
}
}
bClean = false; //so will fail first check unless shooting at feet
// Randomly determine if we should try and splash damage with the fire projectile
if( FiredAmmunition.bTrySplash )
{
if( Skill < 2.0 )
{
if(FRand() > 0.85)
{
bWantsToAimAtFeet = true;
}
}
else if( Skill < 3.0 )
{
if(FRand() > 0.5)
{
bWantsToAimAtFeet = true;
}
}
else if( Skill >= 3.0 )
{
if(FRand() > 0.25)
{
bWantsToAimAtFeet = true;
}
}
}
if ( FiredAmmunition.bTrySplash && (Pawn(Target) != None) && (((Target.Physics == PHYS_Falling)
&& (Pawn.Location.Z + 80 >= Target.Location.Z)) || ((Pawn.Location.Z + 19 >= Target.Location.Z)
&& (bDefendMelee || bWantsToAimAtFeet))) )
{
HitActor = Trace(HitLocation, HitNormal, FireSpot - vect(0,0,1) * (Target.CollisionHeight + 10), FireSpot, false);
bClean = (HitActor == None);
if ( !bClean )
{
FireSpot = HitLocation + vect(0,0,3);
bClean = FastTrace(FireSpot, ProjStart);
}
else
bClean = ( (Target.Physics == PHYS_Falling) && FastTrace(FireSpot, ProjStart) );
}
if ( !bClean )
{
//try middle
FireSpot.Z = Target.Location.Z;
bClean = FastTrace(FireSpot, ProjStart);
}
if ( FiredAmmunition.bTossed && !bClean && bEnemyInfoValid )
{
FireSpot = LastSeenPos;
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
if ( HitActor != None )
{
bCanFire = false;
FireSpot += 2 * Target.CollisionHeight * HitNormal;
}
bClean = true;
}
if( !bClean )
{
// try head
FireSpot.Z = Target.Location.Z + 0.9 * Target.CollisionHeight;
bClean = FastTrace(FireSpot, ProjStart);
}
if ( !bClean && (Target == Enemy) && bEnemyInfoValid )
{
FireSpot = LastSeenPos;
if ( Pawn.Location.Z >= LastSeenPos.Z )
FireSpot.Z -= 0.4 * Enemy.CollisionHeight;
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
if ( HitActor != None )
{
FireSpot = LastSeenPos + 2 * Enemy.CollisionHeight * HitNormal;
if ( Monster(Pawn).SplashDamage() && (Skill >= 4) )
{
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
if ( HitActor != None )
FireSpot += 2 * Enemy.CollisionHeight * HitNormal;
}
bCanFire = false;
}
}
// adjust for toss distance
if ( FiredAmmunition.bTossed )
FireDir = AdjustToss(projspeed,ProjStart,FireSpot,true);
else
FireDir = FireSpot - ProjStart;
FireRotation = Rotator(FireDir);
realYaw = FireRotation.Yaw;
InstantWarnTarget(Target,FiredAmmunition,vector(FireRotation));
FireRotation.Yaw = SetFireYaw(FireRotation.Yaw + aimerror);
FireDir = vector(FireRotation);
// avoid shooting into wall
FireDist = FMin(VSize(FireSpot-ProjStart), 400);
FireSpot = ProjStart + FireDist * FireDir;
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
if ( HitActor != None )
{
if ( HitNormal.Z < 0.7 )
{
FireRotation.Yaw = SetFireYaw(realYaw - aimerror);
FireDir = vector(FireRotation);
FireSpot = ProjStart + FireDist * FireDir;
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
}
if ( HitActor != None )
{
FireSpot += HitNormal * 2 * Target.CollisionHeight;
if ( Skill >= 4 )
{
HitActor = Trace(HitLocation, HitNormal, FireSpot, ProjStart, false);
if ( HitActor != None )
FireSpot += Target.CollisionHeight * HitNormal;
}
FireDir = Normal(FireSpot - ProjStart);
FireRotation = rotator(FireDir);
}
}
SetRotation(FireRotation);
return FireRotation;
}

View file

@ -0,0 +1,94 @@
//-----------------------------------------------------------
// Written by Marco
//-----------------------------------------------------------
class KFMutCrazy extends Mutator;
var int LastSetWave;
function PostBeginPlay()
{
SetTimer(0.1,False);
}
function Timer()
{
local KFGameType KF;
local int i,j;
KF = KFGameType(Level.Game);
if ( KF!=None )
{
for( i=0; i<KF.InitSquads.Length; i++ )
{
for( j=0; j<KF.InitSquads[i].MSquad.Length; j++ )
KF.InitSquads[i].MSquad[j] = GetReplaceClass(KF.InitSquads[i].MSquad[j]);
}
for( i=0; i<KF.MonsterCollection.default.SpecialSquads.Length; i++ )
{
for( j=0; j<KF.MonsterCollection.default.SpecialSquads[i].ZedClass.Length; j++ )
ReplaceMonsterStr(KF.MonsterCollection.default.SpecialSquads[i].ZedClass[j]);
}
for( i=0; i<KF.MonsterCollection.default.FinalSquads.Length; i++ )
{
for( j=0; j<KF.MonsterCollection.default.FinalSquads[i].ZedClass.Length; j++ )
ReplaceMonsterStr(KF.MonsterCollection.default.FinalSquads[i].ZedClass[j]);
}
KF.FallbackMonster = GetReplaceClass( Class<KFMonster>(KF.FallbackMonster) );
KF.MonsterCollection.default.EndGameBossClass = string(Class'ZombieBossMix');
}
Destroy();
}
final function Class<KFMonster> GetReplaceClass( Class<KFMonster> MC )
{
switch( MC )
{
case Class'ZombieClot':
return Class'ZombieClotMix';
case Class'ZombieBloat':
return Class'ZombieBloatMix';
case Class'ZombieCrawler':
return Class'ZombieCrawlerMix';
case Class'ZombieStalker':
return Class'ZombieStalkerMix';
case Class'ZombieSiren':
return Class'ZombieSirenMix';
case Class'ZombieScrake':
return Class'ZombieScrakeMix';
case Class'ZombieFleshPound':
return Class'ZombieFleshPoundMix';
case Class'ZombieGorefast':
return Class'ZombieGorefastMix';
case Class'ZombieBoss':
return Class'ZombieBossMix';
default:
return MC;
}
}
final function ReplaceMonsterStr( out string MC )
{
if( MC~="KFChar.ZombieClot" )
MC = "KFChar.ZombieClotMix";
else if( MC~="KFChar.ZombieBloat" )
MC = "KFChar.ZombieBloatMix";
else if( MC~="KFChar.ZombieCrawler" )
MC = "KFChar.ZombieCrawlerMix";
else if( MC~="KFChar.ZombieStalker" )
MC = "KFChar.ZombieStalkerMix";
else if( MC~="KFChar.ZombieSiren" )
MC = "KFChar.ZombieSirenMix";
else if( MC~="KFChar.ZombieScrake" )
MC = "KFChar.ZombieScrakeMix";
else if( MC~="KFChar.ZombieFleshPound" )
MC = "KFChar.ZombieFleshPoundMix";
else if( MC~="KFChar.ZombieGorefast" )
MC = "KFChar.ZombieGorefastMix";
else if( MC~="KFChar.ZombieBoss" )
MC = "KFChar.ZombieBossMix";
}
DefaultProperties
{
GroupName="KF-MonsterMut"
FriendlyName = "Scramble Mode!"
Description = "Give specimen random models"
}

View file

@ -0,0 +1,69 @@
class SawZombieController extends KFMonsterController;
// Custom Zombie Thinkerating
// By : Alex
var bool bDoneSpottedCheck;
state ZombieHunt
{
event SeePlayer(Pawn SeenPlayer)
{
if ( !bDoneSpottedCheck && PlayerController(SeenPlayer.Controller) != none )
{
// 25% chance of first player to see this Scrake saying something
if ( !KFGameType(Level.Game).bDidSpottedScrakeMessage && FRand() < 0.25 )
{
PlayerController(SeenPlayer.Controller).Speech('AUTO', 14, "");
KFGameType(Level.Game).bDidSpottedScrakeMessage = true;
}
bDoneSpottedCheck = true;
}
super.SeePlayer(SeenPlayer);
}
}
function TimedFireWeaponAtEnemy()
{
if ( (Enemy == None) || FireWeaponAt(Enemy) )
SetCombatTimer();
else SetTimer(0.01, True);
}
state ZombieCharge
{
// Don't do this in this state
function GetOutOfTheWayOfShot(vector ShotDirection, vector ShotOrigin){}
function bool StrafeFromDamage(float Damage, class<DamageType> DamageType, bool bFindDest)
{
return false;
}
function bool TryStrafe(vector sideDir)
{
return false;
}
function Timer()
{
Disable('NotifyBump');
Target = Enemy;
TimedFireWeaponAtEnemy();
}
WaitForAnim:
While( Monster(Pawn).bShotAnim )
Sleep(0.25);
if ( !FindBestPathToward(Enemy, false,true) )
GotoState('ZombieRestFormation');
Moving:
MoveToward(Enemy);
WhatToDoNext(17);
if ( bSoaking )
SoakStop("STUCK IN CHARGING!");
}
defaultproperties
{
}

View file

@ -0,0 +1,6 @@
class SeveredArmBloat extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.bloat_arm_resource'
}

View file

@ -0,0 +1,6 @@
class SeveredArmBloat_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.bloat_clown_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmBloat_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Bloat.Bloat_RedneckZombie_ArmGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmBloat_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.bloat_santa_arm'
}

View file

@ -0,0 +1,8 @@
class SeveredArmClot extends SeveredArm;
defaultproperties
{
DrawType=DT_Mesh
//StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.Clot_Arm_resource'
mesh=SkeletalMesh'KF_Gibbs_Trip.Clot_Arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmClot_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.clot_Circus_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmClot_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Clot.Clot_RedneckZombie_Gore_Arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmClot_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.elf_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmCrawler extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.crawler_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmCrawler_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.crawler_circus_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmCrawler_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Crawler.Crawler_RedneckZombie_Gore_Arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmCrawler_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.reindeer_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmGorefast extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.gorefast_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmGorefast_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.gorefast_circus_Arm_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmGorefast_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Gorefast.Gorefast_RedneckZombie_Gore_Arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmGorefast_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.cookie_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmHusk extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.husk_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmHuskGun extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.husk_gun'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmHuskGun_HALLOWEEN extends SeveredArm;
DefaultProperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Husk.Husk_RedneckZombie_Gore_Gun'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmHusk_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.husk_circus_arm_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmHusk_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Husk.Husk_RedneckZombie_Gore_Arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmHusk_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.snowman_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmPatriarch extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.patriarch_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPatriarch_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.Patriarch_CIRCUS_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPatriarch_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Patriarch.Patriarch_RedneckZombie_ArmGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPatriarch_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.robo_santa_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmPound extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.fleshpound_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPound_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.fleshpound_CIRCUS_arm_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPound_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Fleshpound.Fleshpound_RedneckZombie_ArmGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmPound_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.nutpound_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmScrake extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.scrake_arm_resource'
}

View file

@ -0,0 +1,6 @@
class SeveredArmScrakeSaw extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.scrake_chainsaw_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrakeSaw_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.scrake_chainsaw_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrakeSaw_HALLOWEEN extends SeveredArm;
DefaultProperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Scrake.Scrake_RedneckZombie_ArmGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrakeSaw_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.scrake_frost_blade_arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrake_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.scrake_Circus_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrake_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Scrake.Scrake_RedneckZombie_Left_ArmGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmScrake_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.scrake_frost_arm'
}

View file

@ -0,0 +1,6 @@
class SeveredArmStalker extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.stalker_arm_resource'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmStalker_CIRCUS extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.stalker_circus_Arm_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmStalker_HALLOWEEN extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Stalker.Stalker_RedneckZombie_Gore_Arm'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredArmStalker_XMas extends SeveredArm;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.stalker_misssanta_arm'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadBloat
//=============================================================================
// Detached head gib class for the bloat
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadBloat extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.bloathead'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadBloat
//=============================================================================
// Detached head gib class for the bloat
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadBloat_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.bloat_clown_Head_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadBloat_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Bloat.Bloat_RedneckZombie_HeadGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadBloat_XMas extends SeveredHead;
defaultproperties
{
StaticMesh'kf_gore_trip_sm_xmas.limbs.bloat_santa_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadClot
//=============================================================================
// Detached head gib class for the clot
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadClot extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.gibbs.clothead'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadClot
//=============================================================================
// Detached head gib class for the clot
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadClot_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.clot_Circus_Head_Gore'
}

View file

@ -0,0 +1,10 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadClot_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Clot.Clot_RedneckZombie_Gore_head'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadClot_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.elf_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadCrawler
//=============================================================================
// Detached head gib class for the crawler
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadCrawler extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.crawlerhead'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadCrawler_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.crawler_circus_Head_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadCrawler_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Crawler.crawler_RedneckZombie_Gore_Head'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadCrawler_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.reindeer_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadGorefast
//=============================================================================
// Detached head gib class for the gorefast
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadGorefast extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.gorefasthead'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadGorefast_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.gorefast_circus_Head_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadGorefast_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Gorefast.gorefast_RedneckZombie_Gore_Head'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadGorefast_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.cookie_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadHusk
//=============================================================================
// Detached head gib class for the Husk
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadHusk extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.limbs.husk_head'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadHusk_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.husk_circus_head_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadHusk_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Husk.Husk_RedneckZombie_Gore_Head'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadHusk_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.snowman_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadPatriarch
//=============================================================================
// Detached head gib class for the Patriarch
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadPatriarch extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.patriarchhead'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPatriarch_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.Patriarch_CIRCUS_Head_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPatriarch_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Patriarch.Patriarch_RedneckZombie_HeadGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPatriarch_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.robo_santa_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadPound
//=============================================================================
// Detached head gib class for the FleshPound
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadPound extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.fleshpoundhead'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPound_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.fleshpound_CIRCUS_head_gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPound_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Fleshpound.Fleshpound_RedneckZombie_HeadGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadPound_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.nutpound_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadScrake
//=============================================================================
// Detached head gib class for the scrake
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadScrake extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.scrakehead'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadScrake_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.scrake_Circus_Head_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadScrake_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Scrake.Scrake_RedneckZombie_HeadGore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadScrake_XMas extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_xmas.limbs.scrake_frost_head'
}

View file

@ -0,0 +1,16 @@
//=============================================================================
// SeveredHeadSiren
//=============================================================================
// Detached head gib class for the Siren
//=============================================================================
// Killing Floor Source
// Copyright (C) 2009 Tripwire Interactive LLC
// - John "Ramm-Jaeger" Gibson
//=============================================================================
class SeveredHeadSiren extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm.heads.sirenhead'
}

View file

@ -0,0 +1,9 @@
//=============================================================================
//
//=============================================================================
class SeveredHeadSiren_CIRCUS extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_CIRCUS.limbs.siren_CIRCUS_Head_Gore'
}

View file

@ -0,0 +1,9 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class SeveredHeadSiren_HALLOWEEN extends SeveredHead;
defaultproperties
{
StaticMesh=StaticMesh'kf_gore_trip_sm_HALLOWEEN.Redneck_Siren.Siren_RedneckZombie_HeadGore'
}

Some files were not shown because too many files have changed in this diff Show more