diff --git a/sources/NiceReplicationInfo.uc b/sources/NiceReplicationInfo.uc index 2da7241..5c0c9b7 100644 --- a/sources/NiceReplicationInfo.uc +++ b/sources/NiceReplicationInfo.uc @@ -71,6 +71,7 @@ simulated function CalculateDamageScales( out float scale1, out float scale2, local Vector victimPoint1, victimPoint2; local float swap; victimPoint1 = victim.location; + victimPoint2.z += victim.CollisionHeight * 0.25; victimPoint2 = victim.location; victimPoint2.z += victim.CollisionHeight * 0.75; scale1 = GetDamageScale(victim, explosionLocation, victimPoint1, @@ -93,9 +94,9 @@ simulated function ServerExplode float momentum, Vector explLocation, Pawn instigator, - optional bool allowDoubleExplosion, optional Actor explosionTarget, - optional vector explosiveDirection + optional vector explosiveDirection, + optional bool preventProximityHeadDamage ){ local Actor victim; local int numKilled; @@ -109,26 +110,33 @@ simulated function ServerExplode if(victim.role < ROLE_Authority) continue; if(ExtendedZCollision(victim) != none) continue; if(Trigger(victim) != none) continue; + + niceVictim = NiceMonster(victim); dirToVictim = Normal(victim.location - explLocation); hitLocation = victim.location - 0.5 * (victim.collisionHeight + victim.collisionRadius) * dirToVictim; CalculateDamageScales( scale1, scale2, victim, explLocation, explRadius, explExp); + // Deal head damage if explosion is close enough to the victim's head + if ( niceVictim != none && !preventProximityHeadDamage + && niceVictim.GetDistanceToHead(explLocation) <= explRadius * 0.1) + { + ServerDealDamage( victim, explDamage, instigator, + hitLocation, 0.0 * dirToVictim, + explDmgType, 0.5); + } // Deal main damage - if(scale1 > 0){ - ServerDealDamage( victim, explDamage * scale1, instigator, - hitLocation, scale1 * momentum * dirToVictim, - explDmgType); + if(scale1 > 0 || scale2 > 0) { + ServerDealDamage( + victim, + explDamage * FMax(scale1, scale2), + instigator, + hitLocation, + FMax(scale1, scale2) * momentum * dirToVictim, + explDmgType); } - // Deal secondary damage - if(allowDoubleExplosion && victim != none && scale2 > 0){ - ServerDealDamage( victim, explDamage * scale2, instigator, - hitLocation, scale2 * momentum * dirToVictim, - explDmgType); - } - niceVictim = NiceMonster(victim); - if(NiceMonster(victim) != none) { - if (NiceMonster(victim).health <= 0) { + if(niceVictim != none) { + if (niceVictim.health <= 0) { numKilled += 1; } else { diff --git a/sources/NiceRules.uc b/sources/NiceRules.uc index b2defeb..e94c7df 100644 --- a/sources/NiceRules.uc +++ b/sources/NiceRules.uc @@ -128,7 +128,7 @@ function bool PreventDeath(Pawn Killed, Controller Killer, class dam class'NiceSkillDemoReactiveArmor'.default.explExponent, class'NiceDamTypeDemoSafeExplosion', class'NiceSkillDemoReactiveArmor'.default.explMomentum, - killed.location, killed, true + killed.location, killed ); return true; } diff --git a/sources/Perks/Commando/NiceVetCommando.uc b/sources/Perks/Commando/NiceVetCommando.uc index b0f1658..65abf48 100644 --- a/sources/Perks/Commando/NiceVetCommando.uc +++ b/sources/Perks/Commando/NiceVetCommando.uc @@ -15,6 +15,12 @@ static function class GetNadeType(KFPlayerReplicationInfo KFPRI){ //return class'NiceMedicNadePoison'; return class'NiceNade'; } +static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class DmgType){ + if(class(DmgType) != none){ + return float(InDamage) * 1.5; + } + return 0.0; +} static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){ /*if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) return class'NiceSkillCommandoStrategist'.default.visionRadius;*/ @@ -112,7 +118,7 @@ defaultproperties OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255)) OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.Perk_Commando_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255)) - CustomLevelInfo="Level up by doing damage with perked weapons|15% faster reload with all weapons|10% faster movement speed|You get four additional Zed-Time Extensions|See health and cloacked zeds from 16 meters distance|Better Syringe handling" + CustomLevelInfo="Level up by doing damage with perked weapons|15% faster reload with all weapons|10% faster movement speed|You get four additional Zed-Time Extensions|See health and cloaked zeds from 16 meters distance|Better Syringe handling" PerkIndex=3 OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold' diff --git a/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc b/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc index b5c5e03..009bf41 100644 --- a/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc +++ b/sources/Weapons/BaseWeaponClasses/NiceScopedWeapon.uc @@ -3,7 +3,7 @@ class NiceScopedWeapon extends NiceWeapon #exec OBJ LOAD FILE=ScopeShaders.utx #exec OBJ LOAD FILE=..\Textures\NicePackT.utx #exec OBJ LOAD FILE=ScrnWeaponPack_T.utx -#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx +#exec OBJ LOAD FILE=ScrnWeaponPack_A.ukx var() Material ZoomMat; var() Sound ZoomSound; var() int lenseMaterialID; // used since material id's seem to change alot @@ -18,31 +18,47 @@ var Shader ScopeScriptedShader; // The shader that combi var Material ScriptedTextureFallback; // The texture to render if the users system doesn't support shaders // new scope vars var Combiner ScriptedScopeCombiner; -var texture TexturedScopeTexture; +var Material TexturedScopeTexture; var bool bInitializedScope; // Set to true when the scope has been initialized var string ZoomMatRef; var string ScriptedTextureFallbackRef; -var texture CrosshairTex; +var Material CrosshairTex; var string CrosshairTexRef; + +static function Material PreloadUnknownMaterial(string reference) { + local Material result; + + // Try to load as various types of materials + result = FinalBlend(DynamicLoadObject(reference, class'FinalBlend', true)); + if(result != none) { + return result; + } + result = Combiner(DynamicLoadObject(reference, class'Combiner', true)); + if(result != none) { + return result; + } + result = Shader(DynamicLoadObject(reference, class'Shader', true)); + if(result != none) { + return result; + } + result = Texture(DynamicLoadObject(reference, class'Texture', true)); + if(result != none) { + return result; + } + result = Material(DynamicLoadObject(reference, class'Material')); + return result; +} + static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){ local NiceScopedWeapon W; super.PreloadAssets(Inv, bSkipRefCount); if(default.ZoomMat == none && default.ZoomMatRef != ""){ - // Try to load as various types of materials - default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); - if(default.ZoomMat == none) - default.ZoomMat = Combiner(DynamicLoadObject(default.ZoomMatRef, class'Combiner', true)); - if(default.ZoomMat == none) - default.ZoomMat = Shader(DynamicLoadObject(default.ZoomMatRef, class'Shader', true)); - if(default.ZoomMat == none) - default.ZoomMat = Texture(DynamicLoadObject(default.ZoomMatRef, class'Texture', true)); - if(default.ZoomMat == none) - default.ZoomMat = Material(DynamicLoadObject(default.ZoomMatRef, class'Material')); + default.ZoomMat = PreloadUnknownMaterial(default.ZoomMatRef); } if(default.ScriptedTextureFallback == none && default.ScriptedTextureFallbackRef != "") - default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture')); + default.ScriptedTextureFallback = PreloadUnknownMaterial(default.ScriptedTextureFallbackRef); if(default.CrosshairTex == none && default.CrosshairTexRef != "") - default.CrosshairTex = Texture(DynamicLoadObject(default.CrosshairTexRef, class'texture')); + default.CrosshairTex = PreloadUnknownMaterial(default.CrosshairTexRef); W = NiceScopedWeapon(Inv); if(W != none){ W.ZoomMat = default.ZoomMat; diff --git a/sources/Weapons/NiceBulletAdapter.uc b/sources/Weapons/NiceBulletAdapter.uc index 4234c72..beb7401 100644 --- a/sources/Weapons/NiceBulletAdapter.uc +++ b/sources/Weapons/NiceBulletAdapter.uc @@ -28,9 +28,9 @@ static function Explode( bullet.charExplosionMomentum, hitLocation, bullet.instigator, - true, explosionTarget, - Vector(bullet.Rotation) + Vector(bullet.Rotation), + bullet.bStuck ); if (KFMonster(bullet.base) != none && bullet.bStuck && bullet.bStuckToHead) { diff --git a/sources/Weapons/NiceFire.uc b/sources/Weapons/NiceFire.uc index bc253e4..82812b9 100644 --- a/sources/Weapons/NiceFire.uc +++ b/sources/Weapons/NiceFire.uc @@ -744,4 +744,5 @@ defaultproperties activeSpreadScale=1 spreadGainedPerShot=0 spreadLostPerSecond=0 + RecoilVelocityScale = 0 } diff --git a/sources/Weapons/NiceWeapon.uc b/sources/Weapons/NiceWeapon.uc index b975465..7cada8c 100644 --- a/sources/Weapons/NiceWeapon.uc +++ b/sources/Weapons/NiceWeapon.uc @@ -146,6 +146,7 @@ var bool bAutoReloadPaused; // This is used to 'pause' auto relo var float autoReloadPauseFrame; // Frame at which current pause began var bool bAutoReloadRateApplied; // Flag that remembers whether or not we've already applied reload speed up for current auto reload (to avoid constant animation's speed updates) var float autoReloadSpeedModifier; +var bool updatedDefaultReloadValues; // Acrtive reload-related variables // Active reload state enum EActiveReloadState{ @@ -219,6 +220,8 @@ static function bool UnloadAssets(){ return default.ReferenceCount == 0; } simulated function PostBeginPlay(){ + local float swapSpeedMod, reloadSpeedMod; + if(default.recordedZoomTime < 0) default.recordedZoomTime = ZoomTime; recordedZoomTime = default.recordedZoomTime; @@ -240,6 +243,31 @@ simulated function PostBeginPlay(){ if(FireModeClass[0] != none) stdFireRate = FireModeClass[0].default.fireRate; super.PostBeginPlay(); + // Hack solution - speed up reload and swap speed + swapSpeedMod = 2.0; + reloadSpeedMod = 1.5; + bringUpTime /= swapSpeedMod; + putDownTime /= swapSpeedMod; + selectAnimRate *= swapSpeedMod; + putDownAnimRate *= swapSpeedMod; + quickPutDownTime /= swapSpeedMod; + quickBringUpTime /= swapSpeedMod; + if (!default.updatedDefaultReloadValues) { + if(reloadType == RTYPE_AUTO) { + if (fireModeClass[0] != none) { + fireModeClass[0].default.FireAnimRate *= reloadSpeedMod; + } + if (fireModeClass[1] != none) { + fireModeClass[1].default.FireAnimRate *= reloadSpeedMod; + } + } else { + reloadRate /= reloadSpeedMod; + reloadAnimRate *= reloadSpeedMod; + default.reloadRate = reloadRate; + default.reloadAnimRate = reloadAnimRate; + } + default.updatedDefaultReloadValues = true; + } } // Allows to prevent leaving iron sights unwillingly @@ -1094,6 +1122,7 @@ simulated function int GetMagazineAmmo(){ else return MagAmmoRemaining; } + simulated function bool AllowReload(){ local int actualMagSize; actualMagSize = GetMagazineAmmo(); @@ -1127,6 +1156,7 @@ simulated function float GetCurrentReloadMult(){ local NiceHumanPawn nicePawn; local NicePlayerController nicePlayer; local class niceVet; + nicePawn = NiceHumanPawn(Instigator); nicePlayer = NicePlayerController(Instigator.Controller); if(nicePawn != none) @@ -1624,17 +1654,17 @@ simulated function float GetAmmoMulti() defaultproperties { - recordedZoomTime=-1.000000 - SecondaryCharge=1 - LaserAttachmentClass=Class'ScrnLaserAttachmentFirstPerson' - LaserDotClass=Class'ScrnLocalLaserDot' - LaserAttachmentBone="LightBone" - MagazineBone="Magazine" - bHasChargePhase=True - autoReloadSpeedModifier=1.000000 - bCanActiveReload=True - activeSlowdown=0.850000 - activeSpeedup=1.150000 - activeWindow=0.060000 - bModeZeroCanDryFire=True + recordedZoomTime=-1.000000 + SecondaryCharge=1 + LaserAttachmentClass=Class'ScrnLaserAttachmentFirstPerson' + LaserDotClass=Class'ScrnLocalLaserDot' + LaserAttachmentBone="LightBone" + MagazineBone="Magazine" + bHasChargePhase=True + autoReloadSpeedModifier=1.000000 + bCanActiveReload=True + activeSlowdown=0.850000 + activeSpeedup=1.150000 + activeWindow=0.060000 + bModeZeroCanDryFire=True } diff --git a/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc b/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc index 096355b..93016d8 100644 --- a/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc +++ b/sources/Weapons/Playable/Explosives/LAW/NiceLAWFire.uc @@ -19,7 +19,7 @@ defaultproperties StereoFireSoundRef="KF_LAWSnd.LAW_FireST" NoAmmoSoundRef="KF_LAWSnd.LAW_DryFire" DamageType=class'NiceDamTypeLAWBlunt' - DamageMax=750 + DamageMax=350 bSplashDamage=True bRecommendSplashDamage=True bWaitForRelease=True diff --git a/sources/Weapons/Playable/Grenades/NiceNade.uc b/sources/Weapons/Playable/Grenades/NiceNade.uc index 48b778b..b984b18 100644 --- a/sources/Weapons/Playable/Grenades/NiceNade.uc +++ b/sources/Weapons/Playable/Grenades/NiceNade.uc @@ -39,114 +39,32 @@ function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Mo Explode(HitLocation, vect(0,0,1)); } } -simulated function HurtRadius( float DamageAmount, float DamageRadius, class DamageType, float Momentum, vector HitLocation ) -{ - local actor Victims; - local float damageScale, dist; - local vector dir; - local int NumKilled; - local KFMonster KFMonsterVictim; - local bool bMonster; - local Pawn P; - local KFPawn KFP; - local array CheckedPawns; - local int i; - local bool bAlreadyChecked; - local SRStatsBase Stats; - if ( bHurtEntry ) - return; - bHurtEntry = true; - - if( Role == ROLE_Authority && Instigator != none && Instigator.PlayerReplicationInfo != none ) - Stats = SRStatsBase(Instigator.PlayerReplicationInfo.SteamStatsAndAchievements); - - foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) - { - P = none; - KFMonsterVictim = none; - bMonster = false; - KFP = none; - bAlreadyChecked = false; +simulated function HurtRadius( + float damageAmount, + float damageRadius, + class damageType, + float momentum, + Vector hitLocation +) { + local NicePlayerController niceController; + local NiceReplicationInfo niceRI; - // don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag - if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') - && ExtendedZCollision(Victims)==None ) - { - if( (Instigator==None || Instigator.Health<=0) && KFPawn(Victims)!=None ) - Continue; - dir = Victims.Location - HitLocation; - dist = FMax(1,VSize(dir)); - dir = dir/dist; - damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius); + if (instigator == none) return; + niceController = NicePlayerController(instigator.controller); + if (niceController == none) return; + niceRI = niceController.niceRI; + if (niceRI == none) return; - if ( Instigator == None || Instigator.Controller == None ) - { - Victims.SetDelayedDamageInstigatorController( InstigatorController ); - } + Destroy(); - P = Pawn(Victims); - if( P != none ) { - for (i = 0; i < CheckedPawns.Length; i++) { - if (CheckedPawns[i] == P) { - bAlreadyChecked = true; - break; - } - } - if( bAlreadyChecked ) - continue; - CheckedPawns[CheckedPawns.Length] = P; - - KFMonsterVictim = KFMonster(Victims); - if( KFMonsterVictim != none && KFMonsterVictim.Health <= 0 ) - KFMonsterVictim = none; - - KFP = KFPawn(Victims); - - if( KFMonsterVictim != none ) { - damageScale *= KFMonsterVictim.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); - bMonster = true; // in case TakeDamage() and further Die() deletes the monster - } - else if( KFP != none ) { - damageScale *= KFP.GetExposureTo(Location + 15 * -Normal(PhysicsVolume.Gravity)); - } - - if ( damageScale <= 0) - continue; - } - if(NiceMonster(Victims) != none) - Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir - ,(damageScale * Momentum * dir), niceExplosiveDamage); - else - Victims.TakeDamage(damageScale * DamageAmount,Instigator,Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir - ,(damageScale * Momentum * dir), DamageType); - - if( bMonster && (KFMonsterVictim == none || KFMonsterVictim.Health < 1) ) { - NumKilled++; - } - - if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0) - { - Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation); - } - } - } - - if( Role == ROLE_Authority ) - { - if ( bBlewInHands && NumKilled >= 5 && Stats != none ) - class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'SuicideBomber', 1); - - if ( NumKilled >= 4 ) - { - KFGameType(Level.Game).DramaticEvent(0.05); - } - else if ( NumKilled >= 2 ) - { - KFGameType(Level.Game).DramaticEvent(0.03); - } - } - bHurtEntry = false; + niceRI.ServerExplode(damageAmount, + damageRadius, + 1.0, + niceExplosiveDamage, + momentum, + hitLocation, + instigator); } // Overridden to spawn different AvoidMarker simulated function HitWall( vector HitNormal, actor Wall ){ diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc deleted file mode 100644 index 4bd3a15..0000000 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceDamTypeHFRAssaultRifle.uc +++ /dev/null @@ -1,19 +0,0 @@ -class NiceDamTypeHFRAssaultRifle extends NiceDamTypeFire - abstract; -defaultproperties -{ - heatPart=0.500000 - HeadShotDamageMult=6.000000 - bCheckForHeadShots=True - WeaponClass=class'NiceHFR' - DeathString="%k killed %o (Horzine Flame Rifle)." - FemaleSuicide="%o shot herself in the foot." - MaleSuicide="%o shot himself in the foot." - bRagdollBullet=True - PawnDamageEmitter=Class'ROEffects.ROBloodPuff' - LowGoreDamageEmitter=Class'ROEffects.ROBloodPuffNoGore' - LowDetailEmitter=Class'ROEffects.ROBloodPuffSmall' - KDamageImpulse=5500.000000 - KDeathVel=175.000000 - KDeathUpKick=15.000000 -} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc index 15a1683..e5d0d55 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFR.uc @@ -1,316 +1,5 @@ -// Modification of the AAR525 weapons by: [B.R]HekuT -class NiceHFR extends KFWeapon; -#exec OBJ LOAD FILE=KillingFloorWeapons.utx -#exec OBJ LOAD FILE=KillingFloorHUD.utx -#exec OBJ LOAD FILE=Inf_Weapons_Foley.uax -#exec OBJ LOAD FILE=KF_Weapons5_Scopes_Trip_T.utx -var() Material ZoomMat; -var() int lenseMaterialID; -var() float scopePortalFOVHigh; -var() float scopePortalFOV; -var() vector XoffsetScoped; -var() vector XoffsetHighDetail; -var() int scopePitch; -var() int scopeYaw; -var() int scopePitchHigh; -var() int scopeYawHigh; -var ScriptedTexture ScopeScriptedTexture; -var Shader ScopeScriptedShader; -var Material ScriptedTextureFallback; -var Combiner ScriptedScopeCombiner; -var Combiner ScriptedScopeStatic; -var texture TexturedScopeTexture; -var bool bInitializedScope; -var string ZoomMatRef; -var string ScriptedTextureFallbackRef; -static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount) -{ - super.PreloadAssets(Inv, bSkipRefCount); - default.ZoomMat = FinalBlend(DynamicLoadObject(default.ZoomMatRef, class'FinalBlend', true)); - default.ScriptedTextureFallback = texture(DynamicLoadObject(default.ScriptedTextureFallbackRef, class'texture', true)); - if ( M99SniperRifle(Inv) != none ) - { - M99SniperRifle(Inv).ZoomMat = default.ZoomMat; - M99SniperRifle(Inv).ScriptedTextureFallback = default.ScriptedTextureFallback; - } -} -static function bool UnloadAssets() -{ - if ( super.UnloadAssets() ) - { - default.ZoomMat = none; - default.ScriptedTextureFallback = none; - } - return true; -} -exec function pfov(int thisFOV) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) - return; - scopePortalFOV = thisFOV; -} -exec function pPitch(int num) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) - return; - scopePitch = num; - scopePitchHigh = num; -} -exec function pYaw(int num) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) - return; - scopeYaw = num; - scopeYawHigh = num; -} -simulated exec function TexSize(int i, int j) -{ - if( !class'ROEngine.ROLevelInfo'.static.RODebugMode() ) - return; - ScopeScriptedTexture.SetSize(i, j); -} -simulated function bool ShouldDrawPortal() -{ - if( bAimingRifle ) - return true; - else - return false; -} -simulated function PostBeginPlay() -{ - super.PostBeginPlay(); - KFScopeDetail = class'KFMod.KFWeapon'.default.KFScopeDetail; - UpdateScopeMode(); -} -simulated function UpdateScopeMode() -{ - if (Level.NetMode != NM_DedicatedServer && Instigator != none && Instigator.IsLocallyControlled() && - Instigator.IsHumanControlled() ) - { - if( KFScopeDetail == KF_ModelScope ) - { - scopePortalFOV = default.scopePortalFOV; - ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - if (bAimingRifle) - { - PlayerViewOffset = XoffsetScoped; - } +class NiceHFR extends NiceScopedWeapon; - if( ScopeScriptedTexture == none ) - { - ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); - } - - ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; - ScopeScriptedTexture.SetSize(512,512); - ScopeScriptedTexture.Client = Self; - - if( ScriptedScopeCombiner == none ) - { - ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); - ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; - ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; - ScriptedScopeCombiner.CombineOperation = CO_Multiply; - ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; - ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; - } - - if( ScopeScriptedShader == none ) - { - ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); - ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; - ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; - ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; - } - - bInitializedScope = true; - } - else if( KFScopeDetail == KF_ModelScopeHigh ) - { - scopePortalFOV = scopePortalFOVHigh; - ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); - if (bAimingRifle) - { - PlayerViewOffset = XoffsetHighDetail; - } - - if( ScopeScriptedTexture == none ) - { - ScopeScriptedTexture = ScriptedTexture(Level.ObjectPool.AllocateObject(class'ScriptedTexture')); - } - ScopeScriptedTexture.FallBackMaterial = ScriptedTextureFallback; - ScopeScriptedTexture.SetSize(1024,1024); - ScopeScriptedTexture.Client = Self; - - if( ScriptedScopeCombiner == none ) - { - ScriptedScopeCombiner = Combiner(Level.ObjectPool.AllocateObject(class'Combiner')); - ScriptedScopeCombiner.Material1 = Texture'KF_Weapons5_Scopes_Trip_T.Scope.MilDot'; - ScriptedScopeCombiner.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; - ScriptedScopeCombiner.CombineOperation = CO_Multiply; - ScriptedScopeCombiner.AlphaOperation = AO_Use_Mask; - ScriptedScopeCombiner.Material2 = ScopeScriptedTexture; - } - - if( ScopeScriptedShader == none ) - { - ScopeScriptedShader = Shader(Level.ObjectPool.AllocateObject(class'Shader')); - ScopeScriptedShader.Diffuse = ScriptedScopeCombiner; - ScopeScriptedShader.SelfIllumination = ScriptedScopeCombiner; - ScopeScriptedShader.FallbackMaterial = Shader'ScopeShaders.Zoomblur.LensShader'; - } - - bInitializedScope = true; - } - else if (KFScopeDetail == KF_TextureScope) - { - ZoomedDisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - PlayerViewOffset.X = default.PlayerViewOffset.X; - - bInitializedScope = true; - } - } -} -simulated event RenderTexture(ScriptedTexture Tex) -{ - local rotator RollMod; - RollMod = Instigator.GetViewRotation(); - if(Owner != none && Instigator != none && Tex != none && Tex.Client != none) - Tex.DrawPortal(0,0,Tex.USize,Tex.VSize,Owner,(Instigator.Location + Instigator.EyePosition()), RollMod, scopePortalFOV ); -} -/** - * Handles all the functionality for zooming in including - * setting the parameters for the weapon, pawn, and playercontroller - * - * @param bAnimateTransition whether or not to animate this zoom transition - */ -simulated function ZoomIn(bool bAnimateTransition) -{ - super(BaseKFWeapon).ZoomIn(bAnimateTransition); - bAimingRifle = True; - if( KFHumanPawn(Instigator)!=none ) - KFHumanPawn(Instigator).SetAiming(True); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { - if( AimInSound != none ) - { - PlayOwnedSound(AimInSound, SLOT_Interact,,,,, false); - } - } -} -/** - * Handles all the functionality for zooming out including - * setting the parameters for the weapon, pawn, and playercontroller - * - * @param bAnimateTransition whether or not to animate this zoom transition - */ -simulated function ZoomOut(bool bAnimateTransition) -{ - super.ZoomOut(bAnimateTransition); - bAimingRifle = False; - if( KFHumanPawn(Instigator)!=none ) - KFHumanPawn(Instigator).SetAiming(False); - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { - if( AimOutSound != none ) - { - PlayOwnedSound(AimOutSound, SLOT_Interact,,,,, false); - } - KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); - } -} -simulated event OnZoomInFinished() -{ - local name anim; - local float frame, rate; - GetAnimParams(0, anim, frame, rate); - if (ClientState == WS_ReadyToFire) - { - if (anim == IdleAnim) - { - PlayIdle(); - } - } - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none && - KFScopeDetail == KF_TextureScope ) - { - KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); - } -} -simulated event RenderOverlays(Canvas Canvas) -{ - local int m; - local PlayerController PC; - if (Instigator == none) - return; - PC = PlayerController(Instigator.Controller); - if(PC == none) - return; - if(!bInitializedScope && PC != none ) - { - UpdateScopeMode(); - } - Canvas.DrawActor(none, false, true); - for (m = 0; m < NUM_FIRE_MODES; m++) - { - if (FireMode[m] != none) - { - FireMode[m].DrawMuzzleFlash(Canvas); - } - } - - SetLocation( Instigator.Location + Instigator.CalcDrawOffset(self) ); - SetRotation( Instigator.GetViewRotation() + ZoomRotInterp); - PreDrawFPWeapon(); - - if(bAimingRifle && PC != none && (KFScopeDetail == KF_ModelScope || KFScopeDetail == KF_ModelScopeHigh)) - { - if (ShouldDrawPortal()) - { - if ( ScopeScriptedTexture != none ) - { - Skins[LenseMaterialID] = ScopeScriptedShader; - ScopeScriptedTexture.Client = Self; - ScopeScriptedTexture.Revision = (ScopeScriptedTexture.Revision +1); - } - } - - bDrawingFirstPerson = true; - Canvas.DrawBoundActor(self, false, false,DisplayFOV,PC.Rotation,rot(0,0,0),Instigator.CalcZoomedDrawOffset(self)); - bDrawingFirstPerson = false; - } - else if( KFScopeDetail == KF_TextureScope && PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle) - { - Skins[LenseMaterialID] = ScriptedTextureFallback; - - SetZoomBlendColor(Canvas); - - Canvas.Style = ERenderStyle.STY_Normal; - Canvas.SetPos(0, 0); - Canvas.DrawTile(ZoomMat, (Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); - Canvas.SetPos(Canvas.SizeX, 0); - Canvas.DrawTile(ZoomMat, -(Canvas.SizeX - Canvas.SizeY) / 2, Canvas.SizeY, 0.0, 0.0, 8, 8); - - Canvas.Style = 255; - Canvas.SetPos((Canvas.SizeX - Canvas.SizeY) / 2,0); - Canvas.DrawTile(ZoomMat, Canvas.SizeY, Canvas.SizeY, 0.0, 0.0, 1024, 1024); - - Canvas.Font = Canvas.MedFont; - Canvas.SetDrawColor(200,150,0); - - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.43); - Canvas.DrawText("Zoom: 3.0"); - - Canvas.SetPos(Canvas.SizeX * 0.16, Canvas.SizeY * 0.47); - } - else - { - Skins[LenseMaterialID] = ScriptedTextureFallback; - bDrawingFirstPerson = true; - Canvas.DrawActor(self, false, false, DisplayFOV); - bDrawingFirstPerson = false; - } -} simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) { local KFPlayerController KFPC; @@ -333,204 +22,15 @@ simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV) return AdjustFOV; } } -simulated function AdjustIngameScope() -{ - local PlayerController PC; - if(Instigator == none || PlayerController(Instigator.Controller) == none) - return; - PC = PlayerController(Instigator.Controller); - if( !bHasScope ) - return; - switch (KFScopeDetail) - { - case KF_ModelScope: - if( bAimingRifle ) - DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - if ( PC.DesiredFOV == PlayerIronSightFOV && bAimingRifle ) - { - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { - KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); -} - } - break; - case KF_TextureScope: - if( bAimingRifle ) - DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - if ( bAimingRifle && PC.DesiredFOV != PlayerIronSightFOV ) - { - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { - KFPlayerController(Instigator.Controller).TransitionFOV(PlayerIronSightFOV,0.0); - } - } - break; - - case KF_ModelScopeHigh: - if( bAimingRifle ) - { - if( ZoomedDisplayFOVHigh > 0 ) - { - DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOVHigh); - } - else - { - DisplayFOV = CalcAspectRatioAdjustedFOV(default.ZoomedDisplayFOV); - } - } - if ( bAimingRifle && PC.DesiredFOV == PlayerIronSightFOV ) - { - if( Level.NetMode != NM_DedicatedServer && KFPlayerController(Instigator.Controller) != none ) - { - KFPlayerController(Instigator.Controller).TransitionFOV(KFPlayerController(Instigator.Controller).DefaultFOV,0.0); - } - } - break; - } - UpdateScopeMode(); -} -simulated event Destroyed() -{ - if (ScopeScriptedTexture != none) - { - ScopeScriptedTexture.Client = none; - Level.ObjectPool.FreeObject(ScopeScriptedTexture); - ScopeScriptedTexture=none; - } - if (ScriptedScopeCombiner != none) - { - ScriptedScopeCombiner.Material2 = none; - Level.ObjectPool.FreeObject(ScriptedScopeCombiner); - ScriptedScopeCombiner = none; - } - if (ScopeScriptedShader != none) - { - ScopeScriptedShader.Diffuse = none; - ScopeScriptedShader.SelfIllumination = none; - Level.ObjectPool.FreeObject(ScopeScriptedShader); - ScopeScriptedShader = none; - } - Super.Destroyed(); -} -simulated function PreTravelCleanUp() -{ - if (ScopeScriptedTexture != none) - { - ScopeScriptedTexture.Client = none; - Level.ObjectPool.FreeObject(ScopeScriptedTexture); - ScopeScriptedTexture=none; - } - if (ScriptedScopeCombiner != none) - { - ScriptedScopeCombiner.Material2 = none; - Level.ObjectPool.FreeObject(ScriptedScopeCombiner); - ScriptedScopeCombiner = none; - } - if (ScopeScriptedShader != none) - { - ScopeScriptedShader.Diffuse = none; - ScopeScriptedShader.SelfIllumination = none; - Level.ObjectPool.FreeObject(ScopeScriptedShader); - ScopeScriptedShader = none; - } -} -state PendingClientWeaponSet -{ - simulated function Timer() - { - if ( Pawn(Owner) != none && !bIsReloading ) - { - ClientWeaponSet(bPendingSwitch); - } - - if ( IsInState('PendingClientWeaponSet') ) - { - SetTimer(0.1, false); - } - } - simulated function BeginState() - { - SetTimer(0.1, false); - } - simulated function EndState() - { - } -} -simulated function SetZoomBlendColor(Canvas c) -{ - local Byte val; - local Color clr; - local Color fog; - clr.R = 255; - clr.G = 255; - clr.B = 255; - clr.A = 255; - if( Instigator.Region.Zone.bDistanceFog ) - { - fog = Instigator.Region.Zone.DistanceFogColor; - val = 0; - val = Max( val, fog.R); - val = Max( val, fog.G); - val = Max( val, fog.B); - if( val > 128 ) - { - val -= 128; - clr.R -= val; - clr.G -= val; - clr.B -= val; - } - } - c.DrawColor = clr; -} -function bool RecommendRangedAttack() -{ - return true; -} -function float SuggestAttackStyle() -{ - return -1.0; -} -function bool RecommendLongRangedAttack() -{ - return true; -} -simulated function AnimEnd(int channel) -{ - if(!FireMode[1].IsInState('FireLoop')) - { - Super.AnimEnd(channel); - } -} -simulated function WeaponTick(float dt) -{ - Super.WeaponTick(dt); -} -simulated function bool StartFire(int Mode) -{ - if( Mode == 0 ) - return super.StartFire(Mode); - if( !super.StartFire(Mode) ) - return false; - - if( AmmoAmount(0) <= 0 ) - { - return false; - } - AnimStopLooping(); - if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(0) > 0) ) - { - FireMode[Mode].StartFiring(); - return true; - } - else - { - return false; - } - return true; -} defaultproperties { + reloadPreEndFrame=0.339 + reloadEndFrame=0.732 + reloadChargeEndFrame=-1.000000 + reloadMagStartFrame=0.643 + reloadChargeStartFrame=-1.000000 + magazineBone="Magazine" lenseMaterialID=3 scopePortalFOVHigh=22.000000 scopePortalFOV=12.000000 @@ -538,13 +38,13 @@ defaultproperties ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb" bHasScope=True ZoomedDisplayFOVHigh=35.000000 - MagCapacity=10 + MagCapacity=50 ReloadRate=3.000000 ReloadAnim="Reload" ReloadAnimRate=0.600000 WeaponReloadAnim="Reload_M4" bSteadyAim=True - Weight=7.000000 + Weight=5.000000 bHasAimingMode=True IdleAimAnim="Idle" StandardDisplayFOV=60.000000 @@ -562,7 +62,7 @@ defaultproperties PlayerIronSightFOV=65.000000 ZoomedDisplayFOV=32.000000 FireModeClass(0)=class'NiceHFRPFire' - FireModeClass(1)=class'NiceHFRBurstFire' + FireModeClass(1)=Class'KFMod.NoFire' PutDownAnim="PutDown" AIRating=0.700000 CurrentRating=0.700000 diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc index 2d11ca5..04466fc 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmo.uc @@ -1,10 +1,10 @@ -class NiceHFRAmmo extends KFAmmunition; +class NiceHFRAmmo extends NiceAmmo; #EXEC OBJ LOAD FILE=KillingFloorHUD.utx defaultproperties { - AmmoPickupAmount=15 - MaxAmmo=100 - InitialAmount=40 + AmmoPickupAmount=75 + MaxAmmo=300 + InitialAmount=75 PickupClass=class'NiceHFRAmmoPickup' IconMaterial=Texture'KillingFloorHUD.Generic.HUD' IconCoords=(X1=336,Y1=82,X2=382,Y2=125) diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc index 40d9353..6eeaba4 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRAmmoPickup.uc @@ -1,7 +1,7 @@ -class NiceHFRAmmoPickup extends KFAmmoPickup; +class NiceHFRAmmoPickup extends NiceAmmoPickup; defaultproperties { - AmmoAmount=15 + AmmoAmount=50 InventoryType=class'NiceHFRAmmo' PickupMessage="Fire balloon" StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBullet.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBullet.uc new file mode 100644 index 0000000..09fc990 --- /dev/null +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRBullet.uc @@ -0,0 +1,11 @@ +class NiceHFRBullet extends NiceBullet; + +defaultproperties +{ + bDisableComplexMovement=False + trailXClass=None + StaticMeshRef="ZED_FX_SM.Energy.ZED_FX_Energy_Card" + DrawScale=0.500000 + ambientSoundRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Projectile_Loop" + explosionImpact=(bImportanEffect=True,decalClass=Class'KFMod.FlameThrowerBurnMark_Medium',EmitterClass=Class'KFMod.ZEDMKIIPrimaryProjectileImpact',emitterShiftWall=20.000000,emitterShiftPawn=20.000000,noiseRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Projectile_Explode",noiseVolume=2.000000) +} diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc index 142fb8d..5601513 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPFire.uc @@ -1,25 +1,29 @@ -class NiceHFRPFire extends KFFire; +class NiceHFRPFire extends NiceFire; + defaultproperties { + ProjectileSpeed=1000.000000 FireAimedAnim="Fire_Iron" - RecoilRate=0.120000 - maxVerticalRecoilAngle=500 + RecoilRate=0.070000 + maxVerticalRecoilAngle=70 + maxHorizontalRecoilAngle=35 bAccuracyBonusForSemiAuto=True bRandomPitchFireSound=False - FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" - StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" - NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" - DamageType=class'NiceDamTypeHFRAssaultRifle' + FireSoundRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Fire_M" + StereoFireSoundRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Fire_S" + NoAmmoSoundRef="KF_ZEDGunSnd.KF_WEP_ZED_Dryfire" + DamageType=class'NiceDamTypeHFR' DamageMax=50 Momentum=8500.000000 - bWaitForRelease=True + bWaitForRelease=False TransientSoundVolume=1.200000 TransientSoundRadius=500.000000 FireLoopAnim="Fire" FireAnimRate=0.909000 TweenTime=0.025000 FireForce="AssaultRifleFire" - FireRate=0.600000 + FireRate=0.096000 + bulletClass=class'NiceHFRBullet' AmmoClass=class'NiceHFRAmmo' AmmoPerFire=1 ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) @@ -32,5 +36,4 @@ defaultproperties FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' aimerror=42.000000 Spread=0.015000 - SpreadStyle=SS_Random } diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc index 8fc434a..295e41d 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRPickup.uc @@ -1,18 +1,19 @@ -class NiceHFRPickup extends KFWeaponPickup; +class NiceHFRPickup extends NiceWeaponPickup; defaultproperties { - Weight=7.000000 - AmmoCost=30 - BuyClipSize=15 + Weight=5.000000 + AmmoCost=26 + BuyClipSize=50 PowerValue=100 SpeedValue=100 RangeValue=40 + cost=750 Description="Advanced horzine flame rifle." ItemName="Horzine flame rifle" ItemShortName="HFR" AmmoItemName="Fire balloon" AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh' - CorrespondingPerkIndex=5 + CorrespondingPerkIndex=3 EquipmentCategoryID=3 InventoryType=class'NiceHFR' PickupMessage="You got the HFR." diff --git a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc index c175971..4d6c567 100644 --- a/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc +++ b/sources/Weapons/Playable/Incendiary/HFR/NiceHFRTendril.uc @@ -1,6 +1,6 @@ class NiceHFRTendril extends FlameTendril; defaultproperties { - Damage=36.000000 + Damage=16.000000 MyDamageType=class'NiceDamTypeHFR' } diff --git a/sources/Zeds/Nice/NiceZombieBossBase.uc b/sources/Zeds/Nice/NiceZombieBossBase.uc index cd05c38..3e5eea6 100644 --- a/sources/Zeds/Nice/NiceZombieBossBase.uc +++ b/sources/Zeds/Nice/NiceZombieBossBase.uc @@ -52,7 +52,6 @@ defaultproperties ClawMeleeDamageRange=85.000000 ImpaleMeleeDamageRange=45.000000 fuelRatio=0.400000 - bFrugalFuelUsage=False clientHeadshotScale=1.200000 ZapThreshold=5.000000 ZappedDamageMod=1.250000 diff --git a/sources/Zeds/Nice/NiceZombieCrawler.uc b/sources/Zeds/Nice/NiceZombieCrawler.uc index a4ce6cf..43c0ad1 100644 --- a/sources/Zeds/Nice/NiceZombieCrawler.uc +++ b/sources/Zeds/Nice/NiceZombieCrawler.uc @@ -34,17 +34,20 @@ event Landed(vector HitNormal) } event Bump(actor Other) { + local int actualDamage; // TODO: is there a better way if(bPouncing && KFHumanPawn(Other)!=none ) { - KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class'NiceZedMeleeDamageType'); - if (KFHumanPawn(Other).Health <=0) - { - //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget - KFHumanPawn(Other).SpawnGibs(self.rotation, 1); - } - //After impact, there'll be no momentum for further bumps - bPouncing=false; + actualDamage = MeleeDamage; + ModDamageFromZed(actualDamage, class'NiceZedMeleeDamageType'); + KFHumanPawn(Other).TakeDamage(((actualDamage * 0.95) + (actualDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class'NiceZedMeleeDamageType'); + if (KFHumanPawn(Other).Health <=0) + { + //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget + KFHumanPawn(Other).SpawnGibs(self.rotation, 1); + } + //After impact, there'll be no momentum for further bumps + bPouncing=false; } } // Blend his attacks so he can hit you in mid air. diff --git a/sources/Zeds/Nice/NiceZombieFleshPound.uc b/sources/Zeds/Nice/NiceZombieFleshPound.uc index 8d5056d..17c0fa5 100644 --- a/sources/Zeds/Nice/NiceZombieFleshPound.uc +++ b/sources/Zeds/Nice/NiceZombieFleshPound.uc @@ -441,7 +441,7 @@ function SpinDamage(actor Target) local vector HitLocation; local Name TearBone; local Float dummy; - local float DamageAmount; + local int damageAmount; local vector PushDir; local KFHumanPawn HumanTarget; if(target==none) @@ -456,8 +456,9 @@ function SpinDamage(actor Target) } if (Target !=none && Target.IsA('KFDoorMover')) { - Target.TakeDamage(DamageAmount , self ,HitLocation,pushdir, class'NiceZedMeleeDamageType'); - PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25); + ModDamageFromZed(DamageAmount, class'NiceZedMeleeDamageType'); + Target.TakeDamage(DamageAmount , self ,HitLocation,pushdir, class'NiceZedMeleeDamageType'); + PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25); } if (KFHumanPawn(Target)!=none) { @@ -465,8 +466,9 @@ function SpinDamage(actor Target) if (HumanTarget.Controller != none) HumanTarget.Controller.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); - //TODO - line below was KFPawn. Does this whole block need to be KFPawn, or is it OK as KFHumanPawn? - KFHumanPawn(Target).TakeDamage(DamageAmount, self ,HitLocation,pushdir, class'NiceZedMeleeDamageType'); + ModDamageFromZed(DamageAmount, class'NiceZedMeleeDamageType'); + //TODO - line below was KFPawn. Does this whole block need to be KFPawn, or is it OK as KFHumanPawn? + KFHumanPawn(Target).TakeDamage(DamageAmount, self ,HitLocation,pushdir, class'NiceZedMeleeDamageType'); if (KFHumanPawn(Target).Health <=0) { diff --git a/sources/Zeds/Nice/NiceZombieSiren.uc b/sources/Zeds/Nice/NiceZombieSiren.uc index 1ea867c..6f13cf4 100644 --- a/sources/Zeds/Nice/NiceZombieSiren.uc +++ b/sources/Zeds/Nice/NiceZombieSiren.uc @@ -223,7 +223,7 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class niceVet; @@ -266,7 +266,7 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class 0) diff --git a/sources/Zeds/NiceMonster.uc b/sources/Zeds/NiceMonster.uc index 0c13d76..e07c396 100644 --- a/sources/Zeds/NiceMonster.uc +++ b/sources/Zeds/NiceMonster.uc @@ -127,10 +127,7 @@ var float heatDissipationRate; var float heatTicksPerSecond; // Tracks last time heat tick occured var float lastHeatTick; -// If set to 'true' - low-value ticks of fire DoT will waste accordingly small -// amount of fuel, otherwise they will always waste some minimal amount, -// resulting in a loss of potential damage -var bool bFrugalFuelUsage; +var float MIN_HEAT, MAX_HEAT; //============================================================================== //============================================================================== @@ -475,7 +472,7 @@ function AccumulateHeadDamage( float addDamage, bool bIsHeadshot, NicePlayerController nicePlayer){ if(bIsHeadshot){ - AccHeadDamage += addDamage; + AccHeadDamage += addDamage * 0.5; HeadRecoveryCountDown = HeadRecoveryTime; if(AccHeadDamage > (default.HeadHealth / 1.5) && (concussionCountdown > 0.0 && IsStunPossible())) @@ -681,6 +678,19 @@ simulated function float IsHeadshotClient( Vector Loc, return 1.0 - (distance / (headRadius * headScale * additionalScale)); return 0.0; } +// Calculates distance from `location` to this zed's head. +simulated function float GetDistanceToHead(Vector location) { + local Coords headBoneCoords; + local Vector headLocation; + + if(headBone == '') { + return 0.0; + } + headBoneCoords = GetBoneCoords(headBone); + headLocation = + headBoneCoords.Origin + headHeight * headScale * headBoneCoords.XAxis; + return VSize(location - headLocation); +} // In case of a future modifications: // check if it's a player doing damage before relying on it function ModDamage( out int damage, @@ -691,28 +701,28 @@ function ModDamage( out int damage, float headshotLevel, KFPlayerReplicationInfo KFPRI, optional float lockonTime){ - local NicePlayerController nicePlayer; - local bool hasGiantSlayer; - local int bonusDamageStacks; - if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return; - // Add perked damage - damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self, - KFPawn(instigatedBy), - damage, damageType); - // Skill bonuses - if(instigatedBy == none) - return; - nicePlayer = NicePlayerController(instigatedBy.controller); - if(nicePlayer == none) - return; - hasGiantSlayer = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, - class'NiceSkillCommandoGiantSlayer'); - if(!hasGiantSlayer) - return; - bonusDamageStacks = - int(health / class'NiceSkillCommandoGiantSlayer'.default.healthStep); - damage *= 1.0f + bonusDamageStacks * - class'NiceSkillCommandoGiantSlayer'.default.bonusDamageMult; + local NicePlayerController nicePlayer; + local bool hasGiantSlayer; + local int bonusDamageStacks; + if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return; + // Add perked damage + damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self, + KFPawn(instigatedBy), + damage, damageType); + // Skill bonuses + if(instigatedBy == none) + return; + nicePlayer = NicePlayerController(instigatedBy.controller); + if(nicePlayer == none) + return; + hasGiantSlayer = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, + class'NiceSkillCommandoGiantSlayer'); + if(!hasGiantSlayer) + return; + bonusDamageStacks = + int(health / class'NiceSkillCommandoGiantSlayer'.default.healthStep); + damage *= 1.0f + bonusDamageStacks * + class'NiceSkillCommandoGiantSlayer'.default.bonusDamageMult; } function ModRegularDamage( out int damage, Pawn instigatedBy, @@ -734,9 +744,6 @@ function ModRegularDamage( out int damage, damage = niceVet.static.AddRegDamage( KFPRI, self, KFPawn(instigatedBy), damage, damageType); - // Add some damage against crispy zeds - if(bCrispified) - damage += (Max(1200 - default.Health, 0) * damage) / 1200; // Skills bonuses if(nicePlayer == none) return; hasOverkillSkill = class'NiceVeterancyTypes'.static. @@ -825,13 +832,15 @@ function int ModBodyDamage( out int damage, return painDamage; } // Do effects, based on fire damage dealt to monster -function FireDamageEffects( int damage, +function FireDamageEffects(out int damage, Pawn instigatedBy, Vector hitLocation, Vector momentum, class damageType, float headshotLevel, KFPlayerReplicationInfo KFPRI){ + local float heatDelta, bonusFireDamage; + local bool shouldBeSetOnFire, isFireWeapon; damage = FMax(0.0, damage); iceCrustStrenght = FMax(0.0, iceCrustStrenght); if(bFrozenZed){ @@ -849,24 +858,39 @@ function FireDamageEffects( int damage, } damage /= 10; } - if(damage <= 0) return; + if(damage <= 0) { + return; + } // Turn up the heat! // (we can only make it twice as hot with that damage, // but set limit at least at 50, as if we've dealt at least 25 heat damage) - heat += (damage * HeatIncScale()) + heatDelta = (damage * HeatIncScale()) * FMin(1.0, FMax(0.0, (2 - Abs(heat) / FMax(25, Abs(damage) )))); + if (concussionCountdown > 0) { + heat += heatDelta * 2; + } else { + heat += heatDelta; + } CapHeat(); // Change damage type if new one was stronger if(!bOnFire || damage * HeatIncScale() > lastBurnDamage){ fireDamageClass = damageType; burnInstigator = instigatedBy; } + // Double heat damage at the cost of the fuel, if zed is already on fire + isFireWeapon = (damageType.default.heatPart >= 0.75); + if (bOnFire && isFireWeapon) { + bonusFireDamage = FMax(FMin(damage, flameFuel), 0); + flameFuel -= bonusFireDamage; + damage += bonusFireDamage; + } // Set on fire, if necessary - if(heat > GetIgnitionPoint() && !bOnFire && bCanBurn){ + shouldBeSetOnFire = (heat > GetIgnitionPoint()) || isFireWeapon; + if(shouldBeSetOnFire && !bOnFire && bCanBurn){ bBurnified = true; bOnFire = true; burnInstigator = instigatedBy; - fireDamageClass = damageType; + fireDamageClass = damageType; lastHeatTick = Level.TimeSeconds; } } @@ -1001,6 +1025,10 @@ function DealHeadDamage( int damage, // Actual damage effects // Skull injury killed a zed if(HeadHealth <= 0) return; + // Additional weakpoint damage to burning zeds from non-flame weapons + if (bOnFire && damageType.default.heatPart < 0.75) { + damage += 100; + } HeadHealth -= damage; if(nicePlayer != none && IsFinisher(damage, damageType, nicePlayer, true)) HeadHealth -= damage; @@ -1183,6 +1211,9 @@ function EPainReaction GetRightPainReaction(int painDamage, local int stunScore, flinchScore; local bool bStunPass, bFlinchPass, bMiniFlinshPass; local class niceVet; + if (bOnFire) { + return PREACTION_NONE; + } if(KFPRI != none) niceVet = class(KFPRI.ClientVeteranSkill); stunScore = painDamage; @@ -1633,8 +1664,8 @@ function TakeDamageClient( int damage, ExtractElementalDamage(regDamage, heatDamage, damage, instigatedBy, hitLocation, momentum, damageType, KFPRI, headshotLevel, lockonTime); - FireDamageEffects( HeatDamage, instigatedBy, hitLocation, momentum, - damageType, headshotLevel, KFPRI); + FireDamageEffects(HeatDamage, instigatedBy, hitLocation, + momentum, damageType, headshotLevel, KFPRI); FrostEffects( instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); // Handle body parts damage components @@ -1644,9 +1675,9 @@ function TakeDamageClient( int damage, headshotLevel, lockonTime); DoRightPainReaction( painDamage, instigatedBy, hitLocation, momentum, damageType, headshotLevel, KFPRI); - DealPartsDamage( bodyDamage, headDamage, instigatedBy, - hitLocation, momentum, damageType, KFPRI, - headshotLevel, lockonTime); + DealPartsDamage( bodyDamage, headDamage, + instigatedBy, hitLocation, momentum, damageType, + KFPRI, headshotLevel, lockonTime); AddKillAssistant(instigatedBy, bodyDamage); // Rewrite values of last deal damage, instigator, etc. UpdateLastDamageVars( instigatedBy, bodyDamage, damageType, @@ -1722,15 +1753,12 @@ function TakeDamage(int damage, } } function TakeFireDamage(int damage, Pawn instigator){ - local bool bLowFuel, bHighHeat; local Vector DummyHitLoc, DummyMomentum; super(Skaarj).TakeDamage( damage, instigator, dummyHitLoc, dummyMomentum, fireDamageClass); lastBurnDamage = damage; // Melt em' :) - bHighHeat = heat > default.health / 20; - bLowFuel = FlameFuel < 0.75 * InitFlameFuel; - if(FlameFuel <= 0 || bHighHeat && bLowFuel) + if(FlameFuel <= 0) ZombieCrispUp(); } function TakeFrostDamage(int damage, Pawn instigator){ @@ -1753,34 +1781,43 @@ simulated function ZombieCrispUp(){ Skins[3]=Combiner'PatchTex.Common.BurnSkinEmbers_cmb'; } simulated function HeatTick(){ - local float iceDamage; + local float iceDamage, heatDamage; + // Update heat value if(!bOnFire || flameFuel <= 0) heat *= heatDissipationRate; - else{ - if(flameFuel < heat) - heat = flameFuel * 1.1 + (heat - flameFuel) * heatDissipationRate; - else + else { + if(flameFuel < heat) { + heat = flameFuel * 1.1 + (heat - flameFuel) * heatDissipationRate; + } else { heat = heat * 1.1; - if(bFrugalFuelUsage) - flameFuel -= heat; - else - flameFuel -= FMax(heat, InitFlameFuel / 15); + } + if (flameFuel >= 0) { + // Burning always deals at least 5% damage (of the total fuel), + // up to additional 5%, depending on the heat levels. + heatDamage = 5 + 5 * FMin(heat, flameFuel) / initFlameFuel; // calc % + heatDamage = FMin(flameFuel, healthMax * heatDamage / 100.0); + flameFuel -= heatDamage; + } else { + // 5 damage for burning without fuel + heatDamage = 5.0; + } } CapHeat(); if(Abs(heat) < 1) heat = 0.0; // Update on-fire status if(bOnFire){ - if(heat > 0) - TakeFireDamage(heat + rand(5), burnInstigator); - else{ - bBurnified = false; - UnSetBurningBehavior(); - RemoveFlamingEffects(); - StopBurnFX(); - bOnFire = false; - } + if(heat > 0) { + TakeFireDamage(heatDamage, burnInstigator); + } + else { + bBurnified = false; + UnSetBurningBehavior(); + RemoveFlamingEffects(); + StopBurnFX(); + bOnFire = false; + } } // Update frozen status (always deal frost damage) iceCrustStrenght = FMax(iceCrustStrenght, heat); @@ -1799,9 +1836,9 @@ simulated function HeatTick(){ } simulated function SetBurningBehavior(){ bBurningBehavior = true; - if(default.Health >= 1000) return; - if(Role == Role_Authority) - Intelligence = BRAINS_Retarded; + if(default.Health >= 1000) { + return; + } MovementAnims[0] = BurningWalkFAnims[Rand(3)]; WalkAnims[0] = BurningWalkFAnims[Rand(3)]; MovementAnims[1] = BurningWalkAnims[0]; @@ -1847,6 +1884,17 @@ simulated function UpdateGroundSpeed() { if (bDecapitated) { groundSpeed *= 0.8; } + if (bCrispified) { + groundSpeed *= 1.25; + } +} +simulated function ModDamageFromZed( + out int damage, + class damageType +) { + if (bCrispified) { + damage *= 2; + } } // If this function returns `true`, then we shouldn't touch speed further, // because a speed hack was used for the zed @@ -2077,8 +2125,8 @@ function float HeatIncScale(){ return 100.0 / default.health; } function CapHeat(){ - heat = FMin(heat, 135 + rand(10) - 5); - heat = FMax(heat, -150 + rand(10) - 5); + heat = FMin(heat, MAX_HEAT); + heat = FMax(heat, MIN_HEAT); } function bool TryMeleeReachTarget(out Vector hitLocation){ local Actor hitActor; @@ -2119,6 +2167,7 @@ function bool MeleeDamageTarget(int hitDamage, Vector pushDir){ local KFHumanPawn kfHumanPawn; if(Level.netMode == NM_Client) return false; if(controller == none || controller.target == none) return false; + ModDamageFromZed(hitDamage, niceZombieDamType); // Melee for doors kfHumanPawn = KFHumanPawn(controller.target); bTargetIsDoor = controller.target.IsA('KFDoorMover'); @@ -2275,7 +2324,6 @@ defaultproperties fuelRatio=0.750000 heatDissipationRate=0.666000 heatTicksPerSecond=3.000000 - bFrugalFuelUsage=True clientHeadshotScale=1.000000 FrozenMaterial=Texture'HTec_A.Overlay.IceOverlay' ShatteredIce=class'NiceIceChunkEmitter' @@ -2288,6 +2336,8 @@ defaultproperties stoppingRecoveryRate=0.025 maxStoppingEffect=0.25 minStoppingThreshold=0.0 + MIN_HEAT = -150.0 + MAX_HEAT = 135.0 Begin Object Class=KarmaParamsSkel Name=KarmaParamsSkelN KConvulseSpacing=(Max=2.200000) KLinearDamping=0.150000