Merge pull request 'update11' (#31) from update11 into master

Reviewed-on: https://insultplayers.ru/git/dkanus/NicePack/pulls/31
This commit is contained in:
dkanus 2024-03-24 20:25:18 +03:00
commit 08c7d99de9
36 changed files with 296 additions and 238 deletions

View File

@ -107,6 +107,10 @@ function PostRender(Canvas C)
local int x, y, center, barWidth, offset; local int x, y, center, barWidth, offset;
local int missesWidth, missesHeight, missesSpace; local int missesWidth, missesHeight, missesSpace;
local int missesX, missesY; local int missesX, missesY;
local TeamInfo team;
local int healthToGive, totalExpectedHealth;
local float textWidth, textHeight;
local string textToDraw;
// local Vector CamPos, ViewDir; // local Vector CamPos, ViewDir;
// local Rotator CamRot; // local Rotator CamRot;
// local float OffsetX, BarLength, BarHeight, XL, YL, posY; // local float OffsetX, BarLength, BarHeight, XL, YL, posY;
@ -256,6 +260,32 @@ function PostRender(Canvas C)
} }
} }
team = C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team;
//// Draw health still in regen timer
healthToGive = ScrnHumanPawn(C.ViewPort.Actor.Pawn).clientHealthToGive;
if (healthToGive > 0) {
totalExpectedHealth = healthToGive + C.ViewPort.Actor.Pawn.health;;
C.Font = class'ROHUD'.Static.LoadSmallFontStatic(3);
if (totalExpectedHealth >= C.ViewPort.Actor.Pawn.healthMax) {
if(team.teamIndex == 0) {
C.SetDrawColor(255, 64, 64);
}
else {
C.SetDrawColor(
team.teamColor.R,
team.teamColor.G,
team.teamColor.B);
}
}
else {
C.SetDrawColor(128, 128, 128);
}
textToDraw = "+" $ healthToGive;
C.TextSize(textToDraw, textWidth, textHeight);
C.SetPos(C.ClipX * 0.05, C.ClipY * 0.9);
C.DrawText(textToDraw);
}
//// Draw cooldowns //// Draw cooldowns
if (nicePlayer.abilityManager == none) if (nicePlayer.abilityManager == none)
return; return;
@ -273,7 +303,7 @@ function PostRender(Canvas C)
{ {
if (niceMutator.niceCounterSet[i].value != 0 || niceMutator.niceCounterSet[i].bShowZeroValue) if (niceMutator.niceCounterSet[i].value != 0 || niceMutator.niceCounterSet[i].bShowZeroValue)
{ {
DrawCounter(C, niceMutator.niceCounterSet[i], x, y, C.ViewPort.Actor.Pawn.PlayerReplicationInfo.Team); DrawCounter(C, niceMutator.niceCounterSet[i], x, y, team);
x += 128 + 4; x += 128 + 4;
} }
} }

View File

@ -102,31 +102,39 @@ simulated function ServerExplode
local Vector dirToVictim; local Vector dirToVictim;
local Vector hitLocation; local Vector hitLocation;
local float scale1, scale2; local float scale1, scale2;
local NiceMonster niceVictim;
if(Role < ROLE_Authority) return; if(Role < ROLE_Authority) return;
foreach VisibleActors(class'Actor', victim, explRadius, explLocation){ foreach VisibleActors(class'Actor', victim, explRadius, explLocation){
if(victim == none || victim == self) continue; if(victim == none || victim == self) continue;
if(victim.role < ROLE_Authority) continue; if(victim.role < ROLE_Authority) continue;
if(ExtendedZCollision(victim) != none) continue; if(ExtendedZCollision(victim) != none) continue;
if(Trigger(victim) != none) continue; if(Trigger(victim) != none) continue;
dirToVictim = Normal(victim.location - explLocation); dirToVictim = Normal(victim.location - explLocation);
hitLocation = victim.location - 0.5 * hitLocation = victim.location - 0.5 *
(victim.collisionHeight + victim.collisionRadius) * dirToVictim; (victim.collisionHeight + victim.collisionRadius) * dirToVictim;
CalculateDamageScales( scale1, scale2, CalculateDamageScales( scale1, scale2,
victim, explLocation, explRadius, explExp); victim, explLocation, explRadius, explExp);
// Deal main damage // Deal main damage
if(scale1 > 0){ if(scale1 > 0){
ServerDealDamage( victim, explDamage * scale1, instigator, ServerDealDamage( victim, explDamage * scale1, instigator,
hitLocation, scale1 * momentum * dirToVictim, hitLocation, scale1 * momentum * dirToVictim,
explDmgType); explDmgType);
} }
// Deal secondary damage // Deal secondary damage
if(allowDoubleExplosion && victim != none && scale2 > 0){ if(allowDoubleExplosion && victim != none && scale2 > 0){
ServerDealDamage( victim, explDamage * scale2, instigator, ServerDealDamage( victim, explDamage * scale2, instigator,
hitLocation, scale2 * momentum * dirToVictim, hitLocation, scale2 * momentum * dirToVictim,
explDmgType); explDmgType);
} }
if(NiceMonster(victim) != none && NiceMonster(victim).health <= 0) niceVictim = NiceMonster(victim);
numKilled ++; if(NiceMonster(victim) != none) {
if (NiceMonster(victim).health <= 0) {
numKilled += 1;
}
else {
niceVictim.concussionCountdown = 10.0;
}
}
} }
if(numKilled >= 4) if(numKilled >= 4)
KFGameType(level.game).DramaticEvent(0.05); KFGameType(level.game).DramaticEvent(0.05);
@ -203,34 +211,45 @@ simulated function RemovePoisonAndBleed(NiceHumanPawn healed)
} }
// Tells server to heal given human pawn. // Tells server to heal given human pawn.
simulated function ServerHealTarget(NiceHumanPawn healed, float charPotency, simulated function ServerHealTarget(
Pawn instigator){ NiceHumanPawn healed,
float charPotency,
Pawn instigator
) {
local NiceHumanPawn healer; local NiceHumanPawn healer;
local PlayerController healedPC;
local KFPlayerReplicationInfo KFPRI; local KFPlayerReplicationInfo KFPRI;
local NiceMedicGun healingTool;
local float healTotal; local float healTotal;
local float healPotency; local float healPotency;
if(instigator == none || healed == none) return; if(instigator == none || healed == none) return;
if(healed.health <= 0 || healed.health >= healed.healthMax) return; if(healed.health <= 0 || healed.health >= healed.healthMax) return;
KFPRI = KFPlayerReplicationInfo(instigator.PlayerReplicationInfo); KFPRI = KFPlayerReplicationInfo(instigator.PlayerReplicationInfo);
if(KFPRI == none || KFPRI.ClientVeteranSkill == none) if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return;
return;
healer = NiceHumanPawn(instigator); healer = NiceHumanPawn(instigator);
if(healer == none) if(healer == none) return;
return;
healingTool = NiceMedicGun(healer.weapon);
healPotency = KFPRI.ClientVeteranSkill.static.GetHealPotency(KFPRI); healPotency = KFPRI.ClientVeteranSkill.static.GetHealPotency(KFPRI);
healTotal = charPotency * healPotency; healTotal = charPotency * healPotency;
healer.AlphaAmount = 255; healer.AlphaAmount = 255;
if(NiceMedicGun(healer.weapon) != none) if(healingTool != none) {
NiceMedicGun(healer.weapon).ClientSuccessfulHeal(healer, healed); healingTool.ClientSuccessfulHeal(healer, healed);
if(healed.health >= healed.healthMax){ }
healedPC = PlayerController(healed.controller);
if(healedPC != none) {
healedPC.ClientMessage(
"You've been healed by" @ healer.GetPlayerName(),
'CriticalEvent');
}
if(healed.health >= healed.healthMax) {
healed.GiveHealth(healTotal, healed.healthMax); healed.GiveHealth(healTotal, healed.healthMax);
return; return;
} }
HandleNiceHealingMechanicsAndSkills(healer, healed, healPotency); HandleNiceHealingMechanicsAndSkills(healer, healed, healPotency);
if(healed.health < healed.healthMax){ if(healed.health < healed.healthMax) {
healed.TakeHealing( healed, healTotal, healPotency, healed.TakeHealing(healed, healTotal, healPotency, healingTool);
KFWeapon(instigator.weapon));
} }
RemovePoisonAndBleed(healed); RemovePoisonAndBleed(healed);
} }
@ -261,9 +280,6 @@ simulated function HandleNiceDamageMechanicsAndSkills
hasSkill(nicePlayer, class'NiceSkillCommandoTranquilizer'); hasSkill(nicePlayer, class'NiceSkillCommandoTranquilizer');
hasZEDFrenzy = class'NiceVeterancyTypes'.static. hasZEDFrenzy = class'NiceVeterancyTypes'.static.
hasSkill(nicePlayer, class'NiceSkillMedicZEDFrenzy'); hasSkill(nicePlayer, class'NiceSkillMedicZEDFrenzy');
// Medic's suppression
if(hasTranquilizer)
niceZed.mind = FMin(niceZed.mind, 0.5);
// Medic's frenzy // Medic's frenzy
if(hasZEDFrenzy && nicePlayer.IsZedTimeActive()){ if(hasZEDFrenzy && nicePlayer.IsZedTimeActive()){
niceZed.madnessCountDown = niceZed.madnessCountDown =

View File

@ -8,6 +8,7 @@ static function GetHitEffects(out class<xEmitter> HitEffects[4], int VictimHealt
} }
defaultproperties defaultproperties
{ {
stoppingPower=0.5
stunMultiplier=0.600000 stunMultiplier=0.600000
bIsExplosive=True bIsExplosive=True
DeathString="%o filled %k's body with shrapnel." DeathString="%o filled %k's body with shrapnel."

View File

@ -66,15 +66,19 @@ simulated function WeaponTick(float dt){
} }
super.WeaponTick(dt); super.WeaponTick(dt);
} }
simulated function ClientSuccessfulHeal(NiceHumanPawn healer, NiceHumanPawn healed){
if(healed == none) simulated function ClientSuccessfulHeal(
return; NiceHumanPawn healer,
if(instigator != none && PlayerController(instigator.controller) != none) NiceHumanPawn healed
PlayerController(instigator.controller). ){
ClientMessage("You've healed"@healed.GetPlayerName(), 'CriticalEvent'); if(healed == none) {
if(NiceHumanPawn(instigator) != none && PlayerController(healed.controller) != none) return;
PlayerController(healed.controller). }
ClientMessage("You've been healed by"@healer.GetPlayerName(), 'CriticalEvent'); if(instigator != none && PlayerController(instigator.controller) != none) {
PlayerController(instigator.controller).ClientMessage(
"You've healed" @ healed.GetPlayerName(),
'CriticalEvent');
}
} }
defaultproperties defaultproperties

View File

@ -27,6 +27,7 @@ var const int MediumZedMinHealth; // If zed's base Health >= this
var float PenDmgReduction; // Penetration damage reduction after hitting small zed var float PenDmgReduction; // Penetration damage reduction after hitting small zed
var float penDecapReduction; // Penetration decapitaion effectiveness reduction after hitting small zed var float penDecapReduction; // Penetration decapitaion effectiveness reduction after hitting small zed
var float penIncapReduction; // Penetration incapacitation (flinch or stun) effectiveness reduction after hitting small zed var float penIncapReduction; // Penetration incapacitation (flinch or stun) effectiveness reduction after hitting small zed
var float stoppingPower; // How much stopping power the gun has - % amount zeds will be made to slow down when shot
var bool bIsProjectile; // If original damage type's version was derived from 'KFProjectileWeaponDamageType', then set this to true var bool bIsProjectile; // If original damage type's version was derived from 'KFProjectileWeaponDamageType', then set this to true
// Scales exp gain according to given HardcoreLevel // Scales exp gain according to given HardcoreLevel
static function float getScale(int HL){ static function float getScale(int HL){
@ -88,6 +89,7 @@ defaultproperties
BigZedPenDmgReduction=0.500000 BigZedPenDmgReduction=0.500000
BigZedMinHealth=1000 BigZedMinHealth=1000
MediumZedPenDmgReduction=0.750000 MediumZedPenDmgReduction=0.750000
stoppingPower=0.0
MediumZedMinHealth=500 MediumZedMinHealth=500
PenDmgReduction=0.700000 PenDmgReduction=0.700000
PawnDamageEmitter=None PawnDamageEmitter=None

View File

@ -4,8 +4,8 @@ defaultproperties
{ {
WeaponPickupClass=class'NiceM41APickup' WeaponPickupClass=class'NiceM41APickup'
AmmoPickupAmount=66 AmmoPickupAmount=66
MaxAmmo=300 MaxAmmo=264
InitialAmount=75 InitialAmount=66
PickupClass=class'NiceM41AAmmoPickup' PickupClass=class'NiceM41AAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125) IconCoords=(X1=336,Y1=82,X2=382,Y2=125)

View File

@ -3,7 +3,7 @@ class NiceM41APickup extends NiceM41APrimaryPickup;
defaultproperties defaultproperties
{ {
crossPerkIndecies(0)=6 crossPerkIndecies(0)=6
AmmoCost=12 AmmoCost=24
BuyClipSize=1 BuyClipSize=1
SecondaryAmmoShortName="M41A Frag Grenades" SecondaryAmmoShortName="M41A Frag Grenades"
PrimaryWeaponPickup=class'NiceM41APrimaryPickup' PrimaryWeaponPickup=class'NiceM41APrimaryPickup'

View File

@ -3,7 +3,7 @@ defaultproperties
{ {
cost=750 cost=750
Weight=7.000000 Weight=7.000000
AmmoCost=66 AmmoCost=25
BuyClipSize=66 BuyClipSize=66
PowerValue=70 PowerValue=70
SpeedValue=100 SpeedValue=100

View File

@ -3,7 +3,7 @@ defaultproperties
{ {
WeaponPickupClass=class'NiceM41APickup' WeaponPickupClass=class'NiceM41APickup'
AmmoPickupAmount=1 AmmoPickupAmount=1
MaxAmmo=8 MaxAmmo=5
InitialAmount=2 InitialAmount=2
IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=434,Y1=253,X2=506,Y2=292) IconCoords=(X1=434,Y1=253,X2=506,Y2=292)

View File

@ -2,6 +2,7 @@ class NiceDamTypeKrissM extends NiceDamageTypeVetDemolitions
abstract; abstract;
defaultproperties defaultproperties
{ {
HeadShotDamageMult=2.000000 stoppingPower=0.25
HeadShotDamageMult=1.500000
WeaponClass=class'NiceKrissMMedicGun' WeaponClass=class'NiceKrissMMedicGun'
} }

View File

@ -13,8 +13,8 @@ defaultproperties
ShellEjectBoneName="Shell_eject" ShellEjectBoneName="Shell_eject"
NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire" NoAmmoSoundRef="KF_MP7Snd.MP7_DryFire"
DamageType=class'NiceDamTypeKrissM' DamageType=class'NiceDamTypeKrissM'
DamageMin=35 DamageMin=48
DamageMax=35 DamageMax=48
Momentum=12500.000000 Momentum=12500.000000
FireRate=0.040000 FireRate=0.040000
AmmoClass=class'NiceKrissMAmmo' AmmoClass=class'NiceKrissMAmmo'

View File

@ -2,6 +2,7 @@ class NiceDamTypeM7A3M extends NiceDamageTypeVetDemolitions
abstract; abstract;
defaultproperties defaultproperties
{ {
stoppingPower=0.15
HeadShotDamageMult=2.000000 HeadShotDamageMult=2.000000
WeaponClass=class'NiceM7A3MMedicGun' WeaponClass=class'NiceM7A3MMedicGun'
} }

View File

@ -2,6 +2,7 @@ class NiceDamTypeMP5M extends NiceDamageTypeVetDemolitions
abstract; abstract;
defaultproperties defaultproperties
{ {
stoppingPower=0.15
HeadShotDamageMult=2.000000 HeadShotDamageMult=2.000000
WeaponClass=class'NiceMP5MMedicGun' WeaponClass=class'NiceMP5MMedicGun'
} }

View File

@ -5,9 +5,9 @@ defaultproperties
FireEndStereoSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_S" FireEndStereoSoundRef="KF_MP5Snd.MP5_Fire_Loop_End_S"
AmbientFireSoundRef="KF_MP5Snd.MP5_Fire_Loop" AmbientFireSoundRef="KF_MP5Snd.MP5_Fire_Loop"
ProjectileSpeed=21250.000000 ProjectileSpeed=21250.000000
RecoilRate=0.0075000 RecoilRate=0.0100000
maxVerticalRecoilAngle=160 maxVerticalRecoilAngle=40
maxHorizontalRecoilAngle=80 maxHorizontalRecoilAngle=20
RecoilVelocityScale=0.000000 RecoilVelocityScale=0.000000
ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG' ShellEjectClass=Class'ROEffects.KFShellEjectMP5SMG'
ShellEjectBoneName="Shell_eject" ShellEjectBoneName="Shell_eject"
@ -15,7 +15,7 @@ defaultproperties
DamageType=class'NiceDamTypeMP5M' DamageType=class'NiceDamTypeMP5M'
DamageMin=35 DamageMin=35
DamageMax=35 DamageMax=35
Spread=500.0 Spread=750.0
SpreadStyle=SS_Random SpreadStyle=SS_Random
minimalSpreadScale=0.0 minimalSpreadScale=0.0
activeSpreadScale=0.0 activeSpreadScale=0.0

View File

@ -5,5 +5,6 @@ defaultproperties
bPenetrationHSOnly=True bPenetrationHSOnly=True
MaxPenetrations=1 MaxPenetrations=1
HeadShotDamageMult=2.250000 HeadShotDamageMult=2.250000
stoppingPower=0.15
WeaponClass=class'NiceMP7MMedicGun' WeaponClass=class'NiceMP7MMedicGun'
} }

View File

@ -25,7 +25,7 @@ defaultproperties
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000) ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.250000 ShakeOffsetTime=1.250000
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP' FlashEmitterClass=Class'ROEffects.MuzzleFlash1stMP'
Spread=500.0 Spread=750.0
SpreadStyle=SS_Random SpreadStyle=SS_Random
minimalSpreadScale=0.0 minimalSpreadScale=0.0
activeSpreadScale=0.0 activeSpreadScale=0.0

View File

@ -59,4 +59,5 @@ defaultproperties
BotRefireRate=2.500000 BotRefireRate=2.500000
aimerror=2.000000 aimerror=2.000000
Spread=3000.000000 Spread=3000.000000
FireAnimRate=1.25
} }

View File

@ -4,8 +4,8 @@ defaultproperties
{ {
WeaponPickupClass=class'NiceNailGunPickup' WeaponPickupClass=class'NiceNailGunPickup'
AmmoPickupAmount=42 AmmoPickupAmount=42
MaxAmmo=336 MaxAmmo=210
InitialAmount=84 InitialAmount=52
IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=451,Y1=445,X2=510,Y2=500) IconCoords=(X1=451,Y1=445,X2=510,Y2=500)
} }

View File

@ -3,7 +3,7 @@ defaultproperties
{ {
Weight=8.000000 Weight=8.000000
cost=250 cost=250
AmmoCost=17 AmmoCost=27
BuyClipSize=42 BuyClipSize=42
PowerValue=70 PowerValue=70
SpeedValue=55 SpeedValue=55

View File

@ -27,23 +27,20 @@ Ignores StartChargingFP;
bFrustrated = false; bFrustrated = false;
if(Controller != none) if(Controller != none)
NiceZombieFleshPoundController(Controller).RageFrustrationTimer = 0; NiceZombieFleshPoundController(Controller).RageFrustrationTimer = 0;
if( Health>0 && !bZapped )
{
SetGroundSpeed(GetOriginalGroundSpeed());
}
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
ClientChargingAnims(); ClientChargingAnims();
NetUpdateTime = Level.TimeSeconds - 1; NetUpdateTime = Level.TimeSeconds - 1;
} }
simulated function UpdateGroundSpeed() {
super(NiceMonster).UpdateGroundSpeed();
if (!bShotAnim) {
groundSpeed *= 2.3;
}
}
function Tick( float Delta ) function Tick( float Delta )
{ {
if( !bShotAnim )
{
SetGroundSpeed(OriginalGroundSpeed * 2.3);//2.0;
}
// Keep the flesh pound moving toward its target when attacking // Keep the flesh pound moving toward its target when attacking
if( Role == ROLE_Authority && bShotAnim) if( Role == ROLE_Authority && bShotAnim)
{ {

View File

@ -915,9 +915,16 @@ state Charging
// How many charge attacks we can do randomly 1-3 // How many charge attacks we can do randomly 1-3
NumChargeAttacks = Rand(2) + 1; NumChargeAttacks = Rand(2) + 1;
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (bShotAnim) {
groundSpeed *= 1.25;
} else {
groundSpeed *= 2.5;
}
}
function EndState() function EndState()
{ {
SetGroundSpeed(GetOriginalGroundSpeed());
bChargingPlayer = False; bChargingPlayer = False;
ChargeDamage = 0; ChargeDamage = 0;
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
@ -942,7 +949,6 @@ state Charging
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
} }
SetGroundSpeed(OriginalGroundSpeed * 1.25);
if( LookTarget!=none ) if( LookTarget!=none )
{ {
Acceleration = AccelRate * Normal(LookTarget.Location - Location); Acceleration = AccelRate * Normal(LookTarget.Location - Location);
@ -956,16 +962,6 @@ state Charging
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
} }
// Zapping slows him down, but doesn't stop him
if( bZapped )
{
SetGroundSpeed(OriginalGroundSpeed * 1.5);
}
else
{
SetGroundSpeed(OriginalGroundSpeed * 2.5);
}
} }
Global.Tick(Delta); Global.Tick(Delta);
@ -1071,7 +1067,6 @@ State Escaping extends Charging // Got hurt and running away...
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
} }
SetGroundSpeed(GetOriginalGroundSpeed());
} }
else else
{ {
@ -1081,23 +1076,20 @@ State Escaping extends Charging // Got hurt and running away...
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
} }
// Zapping slows him down, but doesn't stop him
if( bZapped )
{
SetGroundSpeed(OriginalGroundSpeed * 1.5);
}
else
{
SetGroundSpeed(OriginalGroundSpeed * 2.5);
}
} }
Global.Tick(Delta); Global.Tick(Delta);
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (bShotAnim) {
groundSpeed *= 1.25;
} else {
groundSpeed *= 2.5;
}
}
function EndState() function EndState()
{ {
SetGroundSpeed(GetOriginalGroundSpeed());
bChargingPlayer = False; bChargingPlayer = False;
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();

View File

@ -98,6 +98,9 @@ defaultproperties
HealthMax=8000.000000 HealthMax=8000.000000
Health=8000 Health=8000
HeadScale=1.300000 HeadScale=1.300000
stoppingRecoveryRate=0.1
maxStoppingEffect=0.2
minStoppingThreshold=0.6
MenuName="Nice Patriarch" MenuName="Nice Patriarch"
MovementAnims(0)="WalkF" MovementAnims(0)="WalkF"
MovementAnims(1)="WalkF" MovementAnims(1)="WalkF"

View File

@ -182,18 +182,6 @@ function TakeDamageClient(int Damage, Pawn InstigatedBy, Vector HitLocation, Vec
if (bDecapitated) if (bDecapitated)
Died(InstigatedBy.Controller, damageType, HitLocation); Died(InstigatedBy.Controller, damageType, HitLocation);
} }
function TakeFireDamage(int Damage, Pawn Instigator)
{
Super.TakeFireDamage(Damage, Instigator);
// Adjust movement speed if not charging
if (!bChargingPlayer)
{
if (bBurnified)
GroundSpeed = GetOriginalGroundSpeed() * BurnGroundSpeedMul;
else
GroundSpeed = GetOriginalGroundSpeed();
}
}
function ClawDamageTarget() function ClawDamageTarget()
{ {
local KFHumanPawn HumanTarget; local KFHumanPawn HumanTarget;
@ -311,19 +299,16 @@ Ignores StartCharging;
NetUpdateTime = Level.TimeSeconds - 1; NetUpdateTime = Level.TimeSeconds - 1;
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
groundSpeed = groundSpeed + ((groundSpeed * 0.75 / maxRageCounter * (rageCounter + 1) * rageSpeedTween));
}
function EndState() function EndState()
{ {
bChargingPlayer = false; bChargingPlayer = false;
NiceZombieBruteController(Controller).RageFrustrationTimer = 0; NiceZombieBruteController(Controller).RageFrustrationTimer = 0;
if (Health > 0)
{
GroundSpeed = GetOriginalGroundSpeed();
if (bBurnified)
GroundSpeed *= BurnGroundSpeedMul;
}
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
ClientChargingAnims(); ClientChargingAnims();
@ -331,12 +316,8 @@ Ignores StartCharging;
} }
function Tick(float Delta) function Tick(float Delta)
{ {
if (!bShotAnim) if (!bShotAnim) {
{
RageSpeedTween = FClamp(RageSpeedTween + (Delta * 0.75), 0, 1.0); RageSpeedTween = FClamp(RageSpeedTween + (Delta * 0.75), 0, 1.0);
GroundSpeed = OriginalGroundSpeed + ((OriginalGroundSpeed * 0.75 / MaxRageCounter * (RageCounter + 1) * RageSpeedTween));
if (bBurnified)
GroundSpeed *= BurnGroundSpeedMul;
} }
Global.Tick(Delta); Global.Tick(Delta);

View File

@ -33,7 +33,6 @@ var bool bServerBlock;
var bool bClientBlock; var bool bClientBlock;
var float BlockDmgMul; // Multiplier for damage taken from blocked shots var float BlockDmgMul; // Multiplier for damage taken from blocked shots
var float BlockFireDmgMul; var float BlockFireDmgMul;
var float BurnGroundSpeedMul; // Multiplier for ground speed when burning
replication replication
{ {
reliable if(Role == ROLE_Authority) reliable if(Role == ROLE_Authority)
@ -61,7 +60,6 @@ defaultproperties
BlockAddScale=2.500000 BlockAddScale=2.500000
BlockDmgMul=0.100000 BlockDmgMul=0.100000
BlockFireDmgMul=1.000000 BlockFireDmgMul=1.000000
BurnGroundSpeedMul=0.700000
StunThreshold=4.000000 StunThreshold=4.000000
flameFuel=0.500000 flameFuel=0.500000
clientHeadshotScale=1.300000 clientHeadshotScale=1.300000
@ -110,6 +108,7 @@ defaultproperties
Health=1000 Health=1000
HeadHeight=2.500000 HeadHeight=2.500000
HeadScale=1.300000 HeadScale=1.300000
minStoppingThreshold=0.1
MenuName="Brute" MenuName="Brute"
MovementAnims(0)="BruteWalkC" MovementAnims(0)="BruteWalkC"
MovementAnims(1)="BruteWalkC" MovementAnims(1)="BruteWalkC"

View File

@ -49,7 +49,6 @@ function SetMindControlled(bool bNewMindControlled)
if( bNewMindControlled != bZedUnderControl ) if( bNewMindControlled != bZedUnderControl )
{ {
SetGroundSpeed(OriginalGroundSpeed * 1.25);
Health *= 1.25; Health *= 1.25;
HealthMax *= 1.25; HealthMax *= 1.25;
} }
@ -252,21 +251,21 @@ Ignores StartChargingFP;
if(fpController == none) if(fpController == none)
fpController.RageFrustrationTimer = 0; fpController.RageFrustrationTimer = 0;
if( Health>0 && !bZapped )
{
SetGroundSpeed(GetOriginalGroundSpeed());
}
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
ClientChargingAnims(); ClientChargingAnims();
NetUpdateTime = Level.TimeSeconds - 1; NetUpdateTime = Level.TimeSeconds - 1;
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (!bShotAnim) {
groundSpeed *= 2.3;
}
}
function Tick( float Delta ) function Tick( float Delta )
{ {
if( !bShotAnim ) if( !bShotAnim )
{ {
SetGroundSpeed(OriginalGroundSpeed * 2.3);//2.0;
if( !bFrustrated && !bZedUnderControl && Level.TimeSeconds>RageEndTime ) if( !bFrustrated && !bZedUnderControl && Level.TimeSeconds>RageEndTime )
{ {
GoToState(''); GoToState('');
@ -330,11 +329,16 @@ Ignores StartChargingFP;
state ChargeToMarker extends RageCharging state ChargeToMarker extends RageCharging
{ {
Ignores StartChargingFP; Ignores StartChargingFP;
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (!bShotAnim) {
groundSpeed *= 2.3;
}
}
function Tick( float Delta ) function Tick( float Delta )
{ {
if( !bShotAnim ) if( !bShotAnim )
{ {
SetGroundSpeed(OriginalGroundSpeed * 2.3);
if( !bFrustrated && !bZedUnderControl && Level.TimeSeconds>RageEndTime ) if( !bFrustrated && !bZedUnderControl && Level.TimeSeconds>RageEndTime )
{ {
GoToState(''); GoToState('');

View File

@ -80,6 +80,8 @@ defaultproperties
Health=1650 Health=1650
HeadHeight=2.500000 HeadHeight=2.500000
HeadScale=1.300000 HeadScale=1.300000
maxStoppingEffect=0.05
minStoppingThreshold=0.68
MenuName="Nice Flesh Pound" MenuName="Nice Flesh Pound"
MovementAnims(0)="PoundWalk" MovementAnims(0)="PoundWalk"
MovementAnims(1)="WalkB" MovementAnims(1)="WalkB"

View File

@ -45,7 +45,6 @@ function SetMindControlled(bool bNewMindControlled)
if( bNewMindControlled != bZedUnderControl ) if( bNewMindControlled != bZedUnderControl )
{ {
SetGroundSpeed(OriginalGroundSpeed * 1.25);
Health *= 1.25; Health *= 1.25;
HealthMax *= 1.25; HealthMax *= 1.25;
} }
@ -73,13 +72,6 @@ function RangedAttack(Actor A){
if(!bShotAnim && !bDecapitated && VSize(A.Location - Location) <= 700) if(!bShotAnim && !bDecapitated && VSize(A.Location - Location) <= 700)
GoToState('RunningState'); GoToState('RunningState');
} }
simulated function Tick(float DeltaTime){
super.Tick(DeltaTime);
if(IsInState('RunningState'))
SetGroundSpeed(GetOriginalGroundSpeed() * 1.875);
else
SetGroundSpeed(GetOriginalGroundSpeed());
}
state RunningState{ state RunningState{
// Set the zed to the zapped behavior // Set the zed to the zapped behavior
simulated function SetZappedBehavior(){ simulated function SetZappedBehavior(){
@ -94,7 +86,6 @@ state RunningState{
if(bZapped) if(bZapped)
GoToState(''); GoToState('');
else{ else{
SetGroundSpeed(OriginalGroundSpeed * 1.875);
bRunning = true; bRunning = true;
if(Level.NetMode != NM_DedicatedServer) if(Level.NetMode != NM_DedicatedServer)
PostNetReceive(); PostNetReceive();
@ -103,7 +94,6 @@ state RunningState{
} }
} }
function EndState(){ function EndState(){
SetGroundSpeed(GetOriginalGroundSpeed());
bRunning = false; bRunning = false;
if(Level.NetMode != NM_DedicatedServer) if(Level.NetMode != NM_DedicatedServer)
PostNetReceive(); PostNetReceive();
@ -112,6 +102,10 @@ state RunningState{
NetUpdateTime = Level.TimeSeconds - 1; NetUpdateTime = Level.TimeSeconds - 1;
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
groundSpeed *= 1.875;
}
function RemoveHead(){ function RemoveHead(){
GoToState(''); GoToState('');
Global.RemoveHead(); Global.RemoveHead();

View File

@ -60,6 +60,7 @@ defaultproperties
HeadHeight=1.000000 HeadHeight=1.000000
HeadScale=1.350000 HeadScale=1.350000
AmbientSoundScaling=8.000000 AmbientSoundScaling=8.000000
stoppingRecoveryRate=0.05
MenuName="Nice Husk" MenuName="Nice Husk"
MovementAnims(0)="WalkF" MovementAnims(0)="WalkF"
MovementAnims(1)="WalkB" MovementAnims(1)="WalkB"

View File

@ -105,15 +105,11 @@ State SawingLoop
else GoToState(''); else GoToState('');
} }
} }
simulated function float GetOriginalGroundSpeed() simulated function UpdateGroundSpeed() {
{ super.UpdateGroundSpeed();
local float result; if (bWasRaged || bCharging) {
result = OriginalGroundSpeed; groundSpeed *= 3.5;
if ( bWasRaged || bCharging ) }
result *= 3.5;
else if( bZedUnderControl )
result *= 1.25;
return result;
} }
state RunningState state RunningState
{ {
@ -124,7 +120,6 @@ state RunningState
GoToState(''); GoToState('');
else { else {
bCharging = true; bCharging = true;
SetGroundSpeed(GetOriginalGroundSpeed());
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
NetUpdateTime = Level.TimeSeconds - 1; NetUpdateTime = Level.TimeSeconds - 1;
@ -133,8 +128,6 @@ state RunningState
function EndState() function EndState()
{ {
bCharging = False; bCharging = False;
if( !bZapped )
SetGroundSpeed(GetOriginalGroundSpeed());
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
} }
@ -163,6 +156,8 @@ defaultproperties
ChallengeSound(2)=None ChallengeSound(2)=None
ChallengeSound(3)=None ChallengeSound(3)=None
ScoringValue=300 ScoringValue=300
maxStoppingEffect=0.25
minStoppingThreshold=0.25
MenuName="Jason" MenuName="Jason"
AmbientSound=Sound'ScrnZedPack_S.Jason.Jason_Sound' AmbientSound=Sound'ScrnZedPack_S.Jason.Jason_Sound'
Mesh=SkeletalMesh'ScrnZedPack_A.JasonMesh' Mesh=SkeletalMesh'ScrnZedPack_A.JasonMesh'

View File

@ -83,7 +83,6 @@ function SetMindControlled(bool bNewMindControlled)
if( bNewMindControlled != bZedUnderControl ) if( bNewMindControlled != bZedUnderControl )
{ {
SetGroundSpeed(OriginalGroundSpeed * 1.25);
Health *= 1.25; Health *= 1.25;
HealthMax *= 1.25; HealthMax *= 1.25;
} }
@ -185,8 +184,9 @@ state RunningState
{ {
return false; return false;
} }
simulated function float GetOriginalGroundSpeed() { simulated function UpdateGroundSpeed() {
return 3.5 * OriginalGroundSpeed; super.UpdateGroundSpeed();
groundSpeed *= 3.5;
} }
function BeginState(){ function BeginState(){
local NiceHumanPawn rageTarget, rageCause; local NiceHumanPawn rageTarget, rageCause;
@ -214,7 +214,6 @@ state RunningState
if(bZapped) if(bZapped)
GoToState(''); GoToState('');
else{ else{
SetGroundSpeed(OriginalGroundSpeed * 3.5);
bCharging = true; bCharging = true;
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
@ -224,10 +223,6 @@ state RunningState
} }
function EndState() function EndState()
{ {
if( !bZapped )
{
SetGroundSpeed(GetOriginalGroundSpeed());
}
bCharging = False; bCharging = False;
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
@ -265,8 +260,9 @@ State SawingLoop
{ {
return false; return false;
} }
simulated function float GetOriginalGroundSpeed() { simulated function UpdateGroundSpeed() {
return OriginalGroundSpeed * AttackChargeRate; super.UpdateGroundSpeed();
groundSpeed *= attackChargeRate;
} }
function bool CanGetOutOfWay() function bool CanGetOutOfWay()
{ {
@ -279,7 +275,6 @@ State SawingLoop
// Randomly have the scrake charge during an attack so it will be less predictable // Randomly have the scrake charge during an attack so it will be less predictable
if(Health/HealthMax < 0.5 || FRand() <= 0.95) if(Health/HealthMax < 0.5 || FRand() <= 0.95)
{ {
SetGroundSpeed(OriginalGroundSpeed * AttackChargeRate);
bCharging = true; bCharging = true;
if( Level.NetMode!=NM_DedicatedServer ) if( Level.NetMode!=NM_DedicatedServer )
PostNetReceive(); PostNetReceive();
@ -327,8 +322,6 @@ State SawingLoop
{ {
AmbientSound=default.AmbientSound; AmbientSound=default.AmbientSound;
MeleeDamage = Max( DifficultyDamageModifer() * default.MeleeDamage, 1 ); MeleeDamage = Max( DifficultyDamageModifer() * default.MeleeDamage, 1 );
SetGroundSpeed(GetOriginalGroundSpeed());
bCharging = False; bCharging = False;
if(Level.NetMode != NM_DedicatedServer) if(Level.NetMode != NM_DedicatedServer)
PostNetReceive(); PostNetReceive();

View File

@ -63,6 +63,8 @@ defaultproperties
HealthMax=1000.000000 HealthMax=1000.000000
Health=1000 Health=1000
HeadHeight=2.200000 HeadHeight=2.200000
maxStoppingEffect=0.15
minStoppingThreshold=0.15
MenuName="Nice Scrake" MenuName="Nice Scrake"
MovementAnims(0)="SawZombieWalk" MovementAnims(0)="SawZombieWalk"
MovementAnims(1)="SawZombieWalk" MovementAnims(1)="SawZombieWalk"

View File

@ -179,7 +179,6 @@ state Running
Global.Tick(Delta); Global.Tick(Delta);
if (RunUntilTime < Level.TimeSeconds) if (RunUntilTime < Level.TimeSeconds)
GotoState(''); GotoState('');
GroundSpeed = GetOriginalGroundSpeed();
} }
function BeginState() function BeginState()
{ {
@ -190,13 +189,12 @@ state Running
function EndState() function EndState()
{ {
bRunning = false; bRunning = false;
GroundSpeed = global.GetOriginalGroundSpeed();
RunCooldownEnd = Level.TimeSeconds + PeriodRunCoolBase + FRand() * PeriodRunCoolRan; RunCooldownEnd = Level.TimeSeconds + PeriodRunCoolBase + FRand() * PeriodRunCoolRan;
MovementAnims[0] = WalkAnim; MovementAnims[0] = WalkAnim;
} }
function float GetOriginalGroundSpeed() simulated function UpdateGroundSpeed() {
{ super.UpdateGroundSpeed();
return global.GetOriginalGroundSpeed() * 2.5; groundSpeed *= 2.5;
} }
function bool CanSpeedAdjust() function bool CanSpeedAdjust()
{ {
@ -219,14 +217,6 @@ simulated function bool AnimNeedsWait(name TestAnim)
} }
return ExpectingChannel == 0; return ExpectingChannel == 0;
} }
simulated function float GetOriginalGroundSpeed()
{
local float result;
result = OriginalGroundSpeed;
if( bZedUnderControl )
result *= 1.25;
return result;
}
simulated function HandleAnimation(float Delta) simulated function HandleAnimation(float Delta)
{ {
// hehehe // hehehe

View File

@ -281,6 +281,12 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class<Dama
function RemoveHead(){ function RemoveHead(){
Super.RemoveHead(); Super.RemoveHead();
} }
simulated function UpdateGroundSpeed() {
super.UpdateGroundSpeed();
if (bShotAnim) {
groundSpeed *= 0.65;
}
}
simulated function Tick( float Delta ) simulated function Tick( float Delta )
{ {
local float currScreamTime; local float currScreamTime;
@ -295,17 +301,11 @@ simulated function Tick( float Delta )
{ {
if( bShotAnim ) if( bShotAnim )
{ {
SetGroundSpeed(GetOriginalGroundSpeed() * 0.65);
if( LookTarget!=none ) if( LookTarget!=none )
{ {
Acceleration = AccelRate * Normal(LookTarget.Location - Location); Acceleration = AccelRate * Normal(LookTarget.Location - Location);
} }
} }
else
{
SetGroundSpeed(GetOriginalGroundSpeed());
}
} }
if(Role == ROLE_Authority && screamStartTime > 0){ if(Role == ROLE_Authority && screamStartTime > 0){
currScreamTime = Level.TimeSeconds - screamStartTime; currScreamTime = Level.TimeSeconds - screamStartTime;

View File

@ -709,7 +709,6 @@ defaultproperties
HealEnergyDrain=0.200000 HealEnergyDrain=0.200000
ProjectileFireInterval=5.000000 ProjectileFireInterval=5.000000
BurnDamageScale=1.000000 BurnDamageScale=1.000000
mind=0.000000
bFireImmune=False bFireImmune=False
MoanVoice=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Talk' MoanVoice=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.Husk.Husk_Talk'
BleedOutDuration=5.000000 BleedOutDuration=5.000000

View File

@ -24,6 +24,7 @@ class NiceMonster extends KFMonster
#exec OBJ LOAD FILE=KF_EnemyGlobalSndTwo.uax #exec OBJ LOAD FILE=KF_EnemyGlobalSndTwo.uax
#exec OBJ LOAD FILE=KFZED_FX_T.utx #exec OBJ LOAD FILE=KFZED_FX_T.utx
var bool initializationComplete;
//============================================================================== //==============================================================================
//============================================================================== //==============================================================================
// > Affliction system // > Affliction system
@ -75,13 +76,15 @@ var float stunLoopStart, stunLoopEnd, idleInsertFrame;
var bool bWasIdleStun; // Were we using idleanimation for stun? var bool bWasIdleStun; // Were we using idleanimation for stun?
var float prevStunAnimFrame; // At which tick we were? var float prevStunAnimFrame; // At which tick we were?
//============================================================================== //==============================================================================
// >> Another default stun system allows tostuns zeds by repeatedly dealing // >> Another default stun system allows to stun zeds by repeatedly dealing
// head damage to them fast enough: // head damage to them fast enough:
// 1. Dealing head damage increases accumulated damage // 1. Dealing head damage increases accumulated damage
// 2. If head damage was received for a certain time period, - // 2. If head damage was received for a certain time period, -
// accumulated damage starts to decrease // accumulated damage starts to decrease
// 3. If accumulated damage is high enough, passes 'IsStunPossible' check // 3. If accumulated damage is high enough, passes 'IsStunPossible' check
// and has low enough mind level - normal duration stun activates // - normal duration stun activates
// How much more time will this zed spend concussed?
var float concussionCountdown;
// Accumulated head damage // Accumulated head damage
var float accHeadDamage; var float accHeadDamage;
// Rate (per second) at which accumulated head damage diminishes // Rate (per second) at which accumulated head damage diminishes
@ -91,16 +94,6 @@ var float headRecoveryTime;
// Count down variable for above mentioned time // Count down variable for above mentioned time
var float headRecoveryCountDown; var float headRecoveryCountDown;
//==============================================================================
//==============================================================================
// > Mind system
// Largly underdeveloped and currently only exists to decide whether or not
// zed can be stunned by accumulating head damage
// Current mind level (1.0 - default and maximum value)
var float mind;
// Treshold, required for stun by accumulated head damage
var float accStunMindLvl;
//============================================================================== //==============================================================================
//============================================================================== //==============================================================================
// > Temperature system // > Temperature system
@ -148,16 +141,14 @@ var bool bFrugalFuelUsage;
// Is a value from 0.0 to 1.0 and `1 - stoppingEffect` acts as speed multiplier // Is a value from 0.0 to 1.0 and `1 - stoppingEffect` acts as speed multiplier
// for the zed // for the zed
var float stoppingEffect; var float stoppingEffect;
// (Absolute) Point in time at which recovery would start, updated when zeds // How much stopping effect would be recovred in a second
// receives another stopping effect from somewhere
var float stoppingRecoveryStartTime;
// How much stopping effect would be rcovred in a second
var float stoppingRecoveryRate; var float stoppingRecoveryRate;
// Maximum stopping effect this zed can tank // Maximum `stoppingEffect` value zed can accumulate
var float maxStoppingEffect; var float maxStoppingEffect;
// Minimal stopping threshold for the zed (supposed to be subtracted from // Minimal stopping threshold for the zed (supposed to be subtracted from
// incoming effects' strenght). // incoming effects' strenght).
var float minStoppingThreshold; var float minStoppingThreshold;
//============================================================================== //==============================================================================
//============================================================================== //==============================================================================
// > Miscellaneous variables // > Miscellaneous variables
@ -241,6 +232,7 @@ simulated function PostBeginPlay(){
SavedExtCollision = MyExtCollision.bCollideActors; SavedExtCollision = MyExtCollision.bCollideActors;
} }
} }
initializationComplete = true;
} }
//============================================================================== //==============================================================================
@ -381,6 +373,15 @@ simulated function FearTick(float deltaTime){
+ 0.75 * accelRate * Normal(Location - fearCenter); + 0.75 * accelRate * Normal(Location - fearCenter);
} }
//============================================================================== //==============================================================================
// >> Decrease active stopping power on the zed as the time goes by
simulated function StoppingPowerTick(float deltaTime) {
if (stoppingEffect <= 0.0 || concussionCountdown > 0.0) {
return;
}
stoppingEffect -= deltaTime * stoppingRecoveryRate;
stoppingEffect = FMax(0, stoppingEffect);
}
//==============================================================================
// >> Set of functions to handle animation changes during stun // >> Set of functions to handle animation changes during stun
simulated function CalcRemainigStunStructure( name seqName, simulated function CalcRemainigStunStructure( name seqName,
float oFrame, float oFrame,
@ -470,14 +471,14 @@ simulated function StunTick(float deltaTime){
} }
//============================================================================== //==============================================================================
// >> Set of functions to handle stun from head damage accumulation // >> Set of functions to handle stun from head damage accumulation
function AccumulateHeadDamage( float addDamage, function AccumulateHeadDamage( float addDamage,
bool bIsHeadshot, bool bIsHeadshot,
NicePlayerController nicePlayer){ NicePlayerController nicePlayer){
if(bIsHeadshot){ if(bIsHeadshot){
AccHeadDamage += addDamage; AccHeadDamage += addDamage;
HeadRecoveryCountDown = HeadRecoveryTime; HeadRecoveryCountDown = HeadRecoveryTime;
if(AccHeadDamage > (default.HeadHealth / 1.5) if(AccHeadDamage > (default.HeadHealth / 1.5)
&& (Mind <= AccStunMindLvl && IsStunPossible())) && (concussionCountdown > 0.0 && IsStunPossible()))
DoStun(nicePlayer.pawn,,,, 1.0); DoStun(nicePlayer.pawn,,,, 1.0);
} }
else if(HeadRecoveryCountDown > 0.0) else if(HeadRecoveryCountDown > 0.0)
@ -485,11 +486,13 @@ function AccumulateHeadDamage( float addDamage,
HeadRecoveryTime / 2); HeadRecoveryTime / 2);
} }
function HeadDamageRecoveryTick(float delta){ function HeadDamageRecoveryTick(float delta){
HeadRecoveryCountDown -= delta; concussionCountdown -= delta;
HeadRecoveryCountDown = FMax(0.0, HeadRecoveryCountDown); concussionCountdown = FMax(0.0, concussionCountdown);
if(HeadRecoveryCountDown <= 0.0) headRecoveryCountDown -= delta;
AccHeadDamage -= delta * HeadDamageRecoveryRate; headRecoveryCountDown = FMax(0.0, headRecoveryCountDown);
AccHeadDamage = FMax(AccHeadDamage, 0.0); if(headRecoveryCountDown <= 0.0)
accHeadDamage -= delta * HeadDamageRecoveryRate;
accHeadDamage = FMax(accHeadDamage, 0.0);
} }
//============================================================================== //==============================================================================
// >> Function that calls actual 'HeatTick' when needed // >> Function that calls actual 'HeatTick' when needed
@ -546,15 +549,6 @@ simulated function FakeHeatTick(float deltaTime){
// >> Ticks from TWI's code // >> Ticks from TWI's code
// Updates zed's speed if it's not relevant; // Updates zed's speed if it's not relevant;
// code, specific to standalone game and listen servers was cut out // code, specific to standalone game and listen servers was cut out
simulated function NonRelevantSpeedupTick(float deltaTime){
if(Level.netMode == NM_Client || !CanSpeedAdjust()) return;
if(Level.TimeSeconds - LastReplicateTime > 0.5)
SetGroundSpeed(default.GroundSpeed * (300.0 / default.GroundSpeed));
else{
LastSeenOrRelevantTime = Level.TimeSeconds;
SetGroundSpeed(GetOriginalGroundSpeed());
}
}
// Kill zed if it has been bleeding long enough // Kill zed if it has been bleeding long enough
simulated function BleedOutTick(float deltaTick) simulated function BleedOutTick(float deltaTick)
@ -605,7 +599,6 @@ simulated function TWITick(float deltaTime){
// If we've flagged this character to be destroyed next tick, handle that // If we've flagged this character to be destroyed next tick, handle that
if(bDestroyNextTick && TimeSetDestroyNextTickTime < Level.TimeSeconds) if(bDestroyNextTick && TimeSetDestroyNextTickTime < Level.TimeSeconds)
Destroy(); Destroy();
NonRelevantSpeedupTick(deltaTime);
// Reset AnimAction // Reset AnimAction
if(bResetAnimAct && ResetAnimActTime < Level.TimeSeconds){ if(bResetAnimAct && ResetAnimActTime < Level.TimeSeconds){
AnimAction = ''; AnimAction = '';
@ -628,8 +621,10 @@ simulated function Tick(float deltaTime){
DecapTick(deltaTime); DecapTick(deltaTime);
FearTick(deltaTime); FearTick(deltaTime);
StunTick(deltaTime); StunTick(deltaTime);
StoppingPowerTick(deltaTime);
HeadDamageRecoveryTick(deltaTime); HeadDamageRecoveryTick(deltaTime);
FakeHeatTick(deltaTime); FakeHeatTick(deltaTime);
UpdateGroundSpeed();
// TWI's tick // TWI's tick
TWITick(deltaTime); TWITick(deltaTime);
} }
@ -1613,7 +1608,7 @@ function UnFreeze(){
GroundSpeed = GetOriginalGroundSpeed(); GroundSpeed = GetOriginalGroundSpeed();
bFrozenZed = false; bFrozenZed = false;
} }
function TakeDamageClient( int damage, function TakeDamageClient( int damage,
Pawn instigatedBy, Pawn instigatedBy,
Vector hitLocation, Vector hitLocation,
Vector momentum, Vector momentum,
@ -1632,22 +1627,24 @@ function TakeDamageClient( int damage,
KFPRI = KFPlayerReplicationInfo(instigatedBy.PlayerReplicationInfo); KFPRI = KFPlayerReplicationInfo(instigatedBy.PlayerReplicationInfo);
if(headHealth <= 0) if(headHealth <= 0)
headshotLevel = 0.0; headshotLevel = 0.0;
// Handle special weapon effects
HandleStoppingPower(damageType, headshotLevel);
// Handle elemental damage components // Handle elemental damage components
ExtractElementalDamage( regDamage, heatDamage, damage, ExtractElementalDamage(regDamage, heatDamage, damage,
instigatedBy, hitLocation, momentum, instigatedBy, hitLocation, momentum,
damageType, KFPRI, headshotLevel, lockonTime); damageType, KFPRI, headshotLevel, lockonTime);
FireDamageEffects( HeatDamage, instigatedBy, hitLocation, momentum, FireDamageEffects( HeatDamage, instigatedBy, hitLocation, momentum,
damageType, headshotLevel, KFPRI); damageType, headshotLevel, KFPRI);
FrostEffects( instigatedBy, hitLocation, momentum, FrostEffects( instigatedBy, hitLocation, momentum,
damageType, headshotLevel, KFPRI); damageType, headshotLevel, KFPRI);
// Handle body parts damage components // Handle body parts damage components
ExtractPartsDamage( bodyDamage, headDamage, painDamage, ExtractPartsDamage( bodyDamage, headDamage, painDamage,
RegDamage + HeatDamage, instigatedBy, RegDamage + HeatDamage, instigatedBy,
hitLocation, momentum, damageType, KFPRI, hitLocation, momentum, damageType, KFPRI,
headshotLevel, lockonTime); headshotLevel, lockonTime);
DoRightPainReaction( painDamage, instigatedBy, hitLocation, momentum, DoRightPainReaction( painDamage, instigatedBy, hitLocation, momentum,
damageType, headshotLevel, KFPRI); damageType, headshotLevel, KFPRI);
DealPartsDamage( bodyDamage, headDamage, instigatedBy, DealPartsDamage( bodyDamage, headDamage, instigatedBy,
hitLocation, momentum, damageType, KFPRI, hitLocation, momentum, damageType, KFPRI,
headshotLevel, lockonTime); headshotLevel, lockonTime);
AddKillAssistant(instigatedBy, bodyDamage); AddKillAssistant(instigatedBy, bodyDamage);
@ -1658,6 +1655,28 @@ function TakeDamageClient( int damage,
// like why the fuck is it being done HERE? Makes no fucking sense // like why the fuck is it being done HERE? Makes no fucking sense
bBackstabbed = false; bBackstabbed = false;
} }
function HandleStoppingPower(
class<NiceWeaponDamageType> damageType,
float headshotLevel
) {
local float strength;
local float actualMinStoppingThreshold, actualMaxStoppingEffect;
strength = damageType.default.stoppingPower;
if (headshotLevel > 0.0) {
strength *= 2;
}
if (concussionCountdown > 0) {
actualMinStoppingThreshold = FMax(0.0, minStoppingThreshold - 0.2);
actualMaxStoppingEffect = FMin(0.9, maxStoppingEffect + 0.2);
}
else {
actualMinStoppingThreshold = minStoppingThreshold;
actualMaxStoppingEffect = maxStoppingEffect;
}
strength = FMax(0, strength - actualMinStoppingThreshold);
stoppingEffect = FMin(actualMaxStoppingEffect, stoppingEffect + strength);
}
function TakeDamage(int damage, function TakeDamage(int damage,
Pawn instigatedBy, Pawn instigatedBy,
Vector hitLocation, Vector hitLocation,
@ -1798,7 +1817,6 @@ simulated function UnSetBurningBehavior(){
if(Role == Role_Authority){ if(Role == Role_Authority){
Intelligence = default.Intelligence; Intelligence = default.Intelligence;
if(!bZapped){ if(!bZapped){
SetGroundSpeed(GetOriginalGroundSpeed());
AirSpeed = default.AirSpeed; AirSpeed = default.AirSpeed;
WaterSpeed = default.WaterSpeed; WaterSpeed = default.WaterSpeed;
} }
@ -1810,6 +1828,39 @@ simulated function UnSetBurningBehavior(){
WalkAnims[i] = default.WalkAnims[i]; WalkAnims[i] = default.WalkAnims[i];
} }
} }
simulated function SetGroundSpeed(float newGroundSpeed) {
if (initializationComplete) {
UpdateGroundSpeed();
} else {
// Let `KFMonster`'s code setup original speed for this zed.
// This is a hack to be removed later, when we'll be untangling
// initialization code
super.SetGroundSpeed(newGroundSpeed);
}
}
simulated function UpdateGroundSpeed() {
if (TryNonRelevantSpeedup()) {
return;
}
groundSpeed = GetOriginalGroundSpeed();
groundSpeed *= (1.0 - stoppingEffect);
if (bDecapitated) {
groundSpeed *= 0.8;
}
}
// If this function returns `true`, then we shouldn't touch speed further,
// because a speed hack was used for the zed
simulated function bool TryNonRelevantSpeedup(){
if(level.netMode == NM_Client || !CanSpeedAdjust()) {
return false;
}
if(level.timeSeconds - lastReplicateTime > 0.5) {
groundSpeed = default.groundSpeed * (300.0 / default.groundSpeed);
return true;
}
lastSeenOrRelevantTime = level.timeSeconds;
return false;
}
simulated function ServerDropFaster(NiceHumanPawn nicePawn){ simulated function ServerDropFaster(NiceHumanPawn nicePawn){
if(nicePawn == none) return; if(nicePawn == none) return;
if(Health > 0) if(Health > 0)
@ -1827,7 +1878,7 @@ simulated function RemoveHead(){
if(kfDmgType != none && kfDmgType.default.bIsMeleeDamage) if(kfDmgType != none && kfDmgType.default.bIsMeleeDamage)
bMeleeDecapitated = true; bMeleeDecapitated = true;
SetAnimAction('HitF'); SetAnimAction('HitF');
SetGroundSpeed(GroundSpeed *= 0.80); UpdateGroundSpeed();
// No more raspy breathin'...cuz he has no throat or mouth :S // No more raspy breathin'...cuz he has no throat or mouth :S
AmbientSound = MiscSound; AmbientSound = MiscSound;
if(Health > 0) if(Health > 0)
@ -2220,8 +2271,6 @@ defaultproperties
lastStunTime=-1.000000 lastStunTime=-1.000000
headDamageRecoveryRate=100.000000 headDamageRecoveryRate=100.000000
headRecoveryTime=1.000000 headRecoveryTime=1.000000
mind=1.000000
accStunMindLvl=0.500000
bCanBurn=True bCanBurn=True
fuelRatio=0.750000 fuelRatio=0.750000
heatDissipationRate=0.666000 heatDissipationRate=0.666000
@ -2236,9 +2285,8 @@ defaultproperties
RagdollLifeSpan=120.000000 RagdollLifeSpan=120.000000
ControllerClass=class'NiceMonsterController' ControllerClass=class'NiceMonsterController'
stoppingEffect=0.0 stoppingEffect=0.0
stoppingRecoveryStartTime=2.0 stoppingRecoveryRate=0.025
stoppingRecoveryRate=0.5 maxStoppingEffect=0.25
maxStoppingEffect=0.5
minStoppingThreshold=0.0 minStoppingThreshold=0.0
Begin Object Class=KarmaParamsSkel Name=KarmaParamsSkelN Begin Object Class=KarmaParamsSkel Name=KarmaParamsSkelN
KConvulseSpacing=(Max=2.200000) KConvulseSpacing=(Max=2.200000)