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

261 lines
6.7 KiB
Ucode

class ZombieGoreFastOS extends KFMonsterOS;
var bool bRunning;
replication
{
reliable if(Role == ROLE_Authority)
bRunning;
}
simulated function PostNetReceive()
{
if( !bZapped )
{
if (bRunning)
MovementAnims[0]='ZombieRun';
else
MovementAnims[0]=default.MovementAnims[0];
}
}
// This zed has been taken control of. Boost its health and speed
function SetMindControlled(bool bNewMindControlled)
{
if( bNewMindControlled )
{
NumZCDHits++;
// if we hit him a couple of times, make him rage!
if( NumZCDHits > 1 )
{
if( !IsInState('ChargeToMarker') )
{
GotoState('ChargeToMarker');
}
else
{
NumZCDHits = 1;
if( IsInState('ChargeToMarker') )
{
GotoState('');
}
}
}
else
{
if( IsInState('ChargeToMarker') )
{
GotoState('');
}
}
if( bNewMindControlled != bZedUnderControl )
{
SetGroundSpeed(OriginalGroundSpeed * 1.25);
Health *= 1.25;
HealthMax *= 1.25;
}
}
else
{
NumZCDHits=0;
}
bZedUnderControl = bNewMindControlled;
}
// Handle the zed being commanded to move to a new location
function GivenNewMarker()
{
if( bRunning && NumZCDHits > 1 )
{
GotoState('ChargeToMarker');
}
else
{
GotoState('');
}
}
function PlayZombieAttackHitSound()
{
local int MeleeAttackSounds;
MeleeAttackSounds = rand(3);
switch(MeleeAttackSounds)
{
case 0:
PlaySound(sound'KFOldSchoolZeds_Sounds.Stab_Hit1', SLOT_Interact);
break;
case 1:
PlaySound(sound'KFOldSchoolZeds_Sounds.Stab_Hit2', SLOT_Interact);
break;
case 2:
PlaySound(sound'KFOldSchoolZeds_Sounds.Stab_Hit3', SLOT_Interact);
}
}
function RangedAttack(Actor A)
{
super.RangedAttack(A);
if( !bShotAnim && !bDecapitated && VSize(A.Location-Location)<=700 )
GoToState('RunningState');
}
state RunningState
{
//Fixes slow charge for charging zeds
//Credits:NikC for forum link, aleat0r for the code
simulated function float GetOriginalGroundSpeed()
{
return 1.875 * OriginalGroundSpeed;
}
simulated function SetZappedBehavior()
{
Global.SetZappedBehavior();
GoToState('');
}
function bool CanSpeedAdjust()
{
return false;
}
//Dont play hit anims while charging so people don't complain about broken head hitboxes :)
function OldPlayHit(float Damage, Pawn InstigatedBy, vector HitLocation, class<DamageType> damageType, vector Momentum, optional int HitIndex){}
function BeginState()
{
if( bZapped )
GoToState('');
else
{
SetGroundSpeed(OriginalGroundSpeed * 1.875);
bRunning = true;
if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive();
OnlineHeadshotOffset.Z = 32;
OnlineHeadshotOffset.X = 32;
NetUpdateTime = Level.TimeSeconds - 1;
}
}
function EndState()
{
if( !bZapped )
SetGroundSpeed(GetOriginalGroundSpeed());
bRunning = false;
if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive();
OnlineHeadshotOffset = default.OnlineHeadshotOffset;
NetUpdateTime = Level.TimeSeconds - 1;
}
function RemoveHead()
{
GoToState('');
Global.RemoveHead();
}
function RangedAttack(Actor A)
{
if ( bShotAnim || Physics == PHYS_Swimming)
return;
else if ( CanAttack(A) )
{
OnlineHeadshotOffset = default.OnlineHeadshotOffset;
bShotAnim = true;
SetAnimAction('Claw');
Controller.bPreparingMove = true;
Acceleration = vect(0,0,0);
GoToState('');
return;
}
}
Begin:
GoTo('CheckCharge');
CheckCharge:
if( Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700 )
{
Sleep(0.5+ FRand() * 0.5);
GoTo('CheckCharge');
}
else
GoToState('');
}
state RunningToMarker extends RunningState
{
Begin:
GoTo('CheckCharge');
CheckCharge:
if( bZedUnderControl || (Controller!=none && Controller.Target!=none && VSize(Controller.Target.Location-Location)<700) )
{
Sleep(0.5+ FRand() * 0.5);
GoTo('CheckCharge');
}
else
GoToState('');
}
static simulated function PreCacheMaterials(LevelInfo myLevel)
{
myLevel.AddPrecacheMaterial(Texture'KFOldSchoolZeds_Textures.Gorefast.GorefastSkin');
}
defaultproperties
{
MeleeAnims(0)="GoreAttack1"
MeleeAnims(1)="GoreAttack2"
MeleeAnims(2)="GoreAttack1"
MoanVoice=SoundGroup'KFOldSchoolZeds_Sounds.GoreFast.GoreFast_Speech'
bCannibal=True
MeleeDamage=15
damageForce=5000
JumpSound=Sound'KFOldSchoolZeds_Sounds.Shared.Male_ZombieJump'
CrispUpThreshhold=8
bUseExtendedCollision=True
ColOffset=(Z=52.000000)
ColRadius=25.000000
ColHeight=10.000000
PlayerCountHealthScale=0.150000
OnlineHeadshotOffset=(X=16.000000,Y=-8.000000,Z=38.000000)
OnlineHeadshotScale=1.200000
MotionDetectorThreat=0.500000
HitSound(0)=SoundGroup'KFOldSchoolZeds_Sounds.Shared.Male_ZombiePain'
DeathSound(0)=SoundGroup'KFOldSchoolZeds_Sounds.Shared.Male_ZombieDeath'
ScoringValue=12
IdleHeavyAnim="GoreIdle"
IdleRifleAnim="GoreIdle"
MeleeRange=45.000000
GroundSpeed=120.000000
WaterSpeed=140.000000
HealthMax=250.000000
Health=250
HeadRadius=8.000000
HeadHeight=5.000000
MenuName="Gorefast 2.5"
ControllerClass=Class'KFOldSchoolZeds.ControllerGorefastOS'
MovementAnims(0)="GoreWalk"
WalkAnims(0)="GoreWalk"
WalkAnims(1)="GoreWalk"
WalkAnims(2)="GoreWalk"
WalkAnims(3)="GoreWalk"
IdleCrouchAnim="GoreIdle"
IdleWeaponAnim="GoreIdle"
IdleRestAnim="GoreIdle"
AmbientSound=Sound'KFOldSchoolZeds_Sounds.Shared.Male_ZombieBreath'
Mesh=SkeletalMesh'KFCharacterModelsOldSchool.GoreFast'
Skins(0)=Texture'KFOldSchoolZeds_Textures.GoreFast.GorefastSkin'
Mass=350.000000
RotationRate=(Yaw=45000,Roll=0)
}