update15 #34

Merged
dkanus merged 7 commits from update15 into master 2024-11-25 22:10:57 +03:00
7 changed files with 83 additions and 9 deletions

View File

@ -710,7 +710,7 @@ function Stick(Actor target, Vector hitLocation) {
expData.affectedByScream = charAffectedByScream; expData.affectedByScream = charAffectedByScream;
if (!target.IsA('NiceMonster')) { if (!target.IsA('NiceMonster')) {
hitLocation -= target.location; hitLocation = (hitLocation - target.location) << target.rotation;
boneStick = 'None'; boneStick = 'None';
resultTarget = target; resultTarget = target;
} else { } else {

View File

@ -259,6 +259,7 @@ static function SpawnStuckProjectile(
} else { } else {
spawnedBullet.SetBase(base); spawnedBullet.SetBase(base);
spawnedBullet.SetRelativeLocation(shift); spawnedBullet.SetRelativeLocation(shift);
spawnedBullet.SetRelativeRotation(direction - base.rotation);
} }
} }

View File

@ -37,7 +37,7 @@ function RangedAttack(Actor A) {
//Increment the number of consecutive shtos taken and apply the cool down if needed //Increment the number of consecutive shtos taken and apply the cool down if needed
totalShots ++; totalShots ++;
consecutiveShots ++; consecutiveShots ++;
if(consecutiveShots < 3 && totalShots > maxNormalShots) if(consecutiveShots < 3 && totalShots > maxNormalShots && VSize(a.location - location) <= 900)
NextFireProjectileTime = Level.TimeSeconds; NextFireProjectileTime = Level.TimeSeconds;
else{ else{
NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0); NextFireProjectileTime = Level.TimeSeconds + ProjectileFireInterval + (FRand() * 2.0);

View File

@ -5,6 +5,8 @@ class NiceZombieClot extends NiceZombieClotBase;
#exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx #exec OBJ LOAD FILE=KF_Specimens_Trip_T.utx
#exec OBJ LOAD FILE=MeanZedSkins.utx #exec OBJ LOAD FILE=MeanZedSkins.utx
var float sirenBoostTimeout;
function ClawDamageTarget() function ClawDamageTarget()
{ {
local vector PushDir; local vector PushDir;
@ -109,9 +111,33 @@ simulated function int DoAnimAction( name AnimName )
} }
return super.DoAnimAction( AnimName ); return super.DoAnimAction( AnimName );
} }
function DealDecapDamage( int damage,
Pawn instigatedBy,
Vector hitLocation,
Vector momentum,
class<NiceWeaponDamageType> damageType,
float headshotLevel,
KFPlayerReplicationInfo KFPRI,
optional float lockonTime) {
if (sirenBoostTimeout > 0) {
RemoveHead();
} else {
super.DealDecapDamage(damage, instigatedBy, hitLocation, momentum,
damageType, headshotLevel, KFPRI, lockonTime);
}
}
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (sirenBoostTimeout > 0) {
groundSpeed *= 1.5;
}
}
simulated function Tick(float DeltaTime) simulated function Tick(float DeltaTime)
{ {
super.Tick(DeltaTime); super.Tick(DeltaTime);
if (sirenBoostTimeout >= 0) {
sirenBoostTimeout -= deltaTime;
}
if( bShotAnim && Role == ROLE_Authority ) if( bShotAnim && Role == ROLE_Authority )
{ {
if( LookTarget!=none ) if( LookTarget!=none )

View File

@ -3,6 +3,7 @@ class NiceZombieShiver extends NiceZombieShiverBase;
var float TeleportBlockTime; var float TeleportBlockTime;
var float HeadOffsetY; var float HeadOffsetY;
var transient bool bRunning, bClientRunning; var transient bool bRunning, bClientRunning;
var float teleportAttackCooldownEndTime;
replication replication
{ {
reliable if ( Role == ROLE_Authority) reliable if ( Role == ROLE_Authority)
@ -38,6 +39,39 @@ simulated function PostBeginPlay()
} }
} }
} }
function bool CanAttack(Actor target) {
if (level.timeSeconds < teleportAttackCooldownEndTime)
return false;
return super.CanAttack(target);
}
simulated event SetAnimAction(name NewAction) {
local int meleeAnimIndex;
if (bFrozenZed) return;
if (newAction == '') return;
if (newAction == 'Claw') {
meleeAnimIndex = Rand(2); // Shivers only have two animations now
newAction = meleeAnims[meleeAnimIndex];
currentDamtype = zombieDamType[meleeAnimIndex];
} else if(newAction == 'DoorBash') {
currentDamtype = zombieDamType[Rand(3)];
}
expectingChannel = DoAnimAction(NewAction);
if (AnimNeedsWait(newAction)) {
bWaitForAnim = true;
} else {
bWaitForAnim = false;
}
if (level.netMode != NM_Client) {
animAction = newAction;
bResetAnimAct = True;
resetAnimActTime = level.timeSeconds + 0.3;
}
}
simulated function Destroyed() simulated function Destroyed()
{ {
if (Level.NetMode != NM_DedicatedServer && MatAlphaSkin != none) if (Level.NetMode != NM_DedicatedServer && MatAlphaSkin != none)
@ -281,7 +315,7 @@ simulated function Tick(float Delta)
{ {
SetCollision(true, true); SetCollision(true, true);
FlashTeleport(); FlashTeleport();
SetCollision(false, false); SetCollision(true, false);
FadeStage = 2; FadeStage = 2;
} }
} }
@ -322,7 +356,7 @@ function StartTeleport()
{ {
FadeStage = 1; FadeStage = 1;
AlphaFader = 255; AlphaFader = 255;
SetCollision(false, false); SetCollision(true, false);
bFlashTeleporting = true; bFlashTeleporting = true;
} }
function FlashTeleport() function FlashTeleport()
@ -380,6 +414,7 @@ function FlashTeleport()
Teleported: Teleported:
bFlashTeleporting = false; bFlashTeleporting = false;
LastFlashTime = Level.TimeSeconds; LastFlashTime = Level.TimeSeconds;
teleportAttackCooldownEndTime = level.timeSeconds + 0.5;
} }
function Died(Controller Killer, class<DamageType> damageType, vector HitLocation) function Died(Controller Killer, class<DamageType> damageType, vector HitLocation)
{ {
@ -429,10 +464,16 @@ simulated function int DoAnimAction( name AnimName )
} }
defaultproperties defaultproperties
{ {
HeadOffsetY=-3.000000 headOffsetY=-3.000000
idleInsertFrame=0.468000 idleInsertFrame=0.468000
OnlineHeadshotOffset=(X=19.000000,Z=39.000000) onlineHeadshotOffset=(X=19.000000,Z=39.000000)
ScoringValue=15 scoringValue=15
HeadRadius=8.000000 headRadius=8.000000
HeadHeight=3.000000 headHeight=3.000000
// Override third animation just in case.
// However it shouldn't be required since we've already changed
// `SetAnimAction` function to only use first two animations
meleeAnims(0)="Claw"
meleeAnims(1)="Claw2"
meleeAnims(2)="Claw"
} }

View File

@ -226,6 +226,7 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class<Dama
local int UsedDamageAmount; local int UsedDamageAmount;
local KFHumanPawn humanPawn; local KFHumanPawn humanPawn;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
local NiceZombieClot niceClot;
if (bHurtEntry || Health <= 0 || HeadHealth <= 0 || bIsStunned) if (bHurtEntry || Health <= 0 || HeadHealth <= 0 || bIsStunned)
return; return;
@ -243,6 +244,10 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class<Dama
if (Victims.bStatic || Victims.Physics == PHYS_None || !FastTrace(Victims.Location, Location) ) if (Victims.bStatic || Victims.Physics == PHYS_None || !FastTrace(Victims.Location, Location) )
continue; // skip this actor continue; // skip this actor
niceClot = NiceZombieClot(victims);
if (niceClot != none) {
niceClot.sirenBoostTimeout = 10.0;
}
Momentum = InitMomentum; Momentum = InitMomentum;
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
// Or Karma actors in this case. Self inflicted Death due to flying chairs is uncool for a zombie of your stature. // Or Karma actors in this case. Self inflicted Death due to flying chairs is uncool for a zombie of your stature.

View File

@ -480,6 +480,7 @@ function bool SetEnemy( pawn newEnemy,
// Do fight if we can // Do fight if we can
if(bCanForceFight) if(bCanForceFight)
{ {
moveTarget = newEnemy;
ChangeEnemy(newEnemy, true); ChangeEnemy(newEnemy, true);
FightEnemy(false); FightEnemy(false);
return true; return true;