Merge pull request 'update12 + 13' (#32) from update12 into master

Reviewed-on: https://insultplayers.ru/git/dkanus/NicePack/pulls/32
This commit is contained in:
dkanus 2024-08-04 07:03:15 +03:00
commit db84dad047
22 changed files with 316 additions and 787 deletions

View File

@ -71,6 +71,7 @@ simulated function CalculateDamageScales( out float scale1, out float scale2,
local Vector victimPoint1, victimPoint2; local Vector victimPoint1, victimPoint2;
local float swap; local float swap;
victimPoint1 = victim.location; victimPoint1 = victim.location;
victimPoint2.z += victim.CollisionHeight * 0.25;
victimPoint2 = victim.location; victimPoint2 = victim.location;
victimPoint2.z += victim.CollisionHeight * 0.75; victimPoint2.z += victim.CollisionHeight * 0.75;
scale1 = GetDamageScale(victim, explosionLocation, victimPoint1, scale1 = GetDamageScale(victim, explosionLocation, victimPoint1,
@ -93,9 +94,9 @@ simulated function ServerExplode
float momentum, float momentum,
Vector explLocation, Vector explLocation,
Pawn instigator, Pawn instigator,
optional bool allowDoubleExplosion,
optional Actor explosionTarget, optional Actor explosionTarget,
optional vector explosiveDirection optional vector explosiveDirection,
optional bool preventProximityHeadDamage
){ ){
local Actor victim; local Actor victim;
local int numKilled; local int numKilled;
@ -109,26 +110,33 @@ simulated function ServerExplode
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;
niceVictim = NiceMonster(victim);
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 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 // Deal main damage
if(scale1 > 0){ if(scale1 > 0 || scale2 > 0) {
ServerDealDamage( victim, explDamage * scale1, instigator, ServerDealDamage(
hitLocation, scale1 * momentum * dirToVictim, victim,
explDmgType); explDamage * FMax(scale1, scale2),
instigator,
hitLocation,
FMax(scale1, scale2) * momentum * dirToVictim,
explDmgType);
} }
// Deal secondary damage if(niceVictim != none) {
if(allowDoubleExplosion && victim != none && scale2 > 0){ if (niceVictim.health <= 0) {
ServerDealDamage( victim, explDamage * scale2, instigator,
hitLocation, scale2 * momentum * dirToVictim,
explDmgType);
}
niceVictim = NiceMonster(victim);
if(NiceMonster(victim) != none) {
if (NiceMonster(victim).health <= 0) {
numKilled += 1; numKilled += 1;
} }
else { else {

View File

@ -128,7 +128,7 @@ function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> dam
class'NiceSkillDemoReactiveArmor'.default.explExponent, class'NiceSkillDemoReactiveArmor'.default.explExponent,
class'NiceDamTypeDemoSafeExplosion', class'NiceDamTypeDemoSafeExplosion',
class'NiceSkillDemoReactiveArmor'.default.explMomentum, class'NiceSkillDemoReactiveArmor'.default.explMomentum,
killed.location, killed, true killed.location, killed
); );
return true; return true;
} }

View File

@ -15,6 +15,12 @@ static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI){
//return class'NiceMedicNadePoison'; //return class'NiceMedicNadePoison';
return class'NiceNade'; return class'NiceNade';
} }
static function int AddFireDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<NiceWeaponDamageType> DmgType){
if(class<NiceDamTypeFire>(DmgType) != none){
return float(InDamage) * 1.5;
}
return 0.0;
}
static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){ static function float GetHealthBarsDistanceMulti(KFPlayerReplicationInfo KFPRI){
/*if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist')) /*if(KFPRI != none && SomeoneHasSkill(NicePlayerController(KFPRI.Owner), class'NiceSkillCommandoStrategist'))
return class'NiceSkillCommandoStrategist'.default.visionRadius;*/ 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(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(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)) 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 PerkIndex=3
OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando' OnHUDIcon=Texture'KillingFloorHUD.Perks.Perk_Commando'
OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold' OnHUDGoldIcon=Texture'KillingFloor2HUD.Perk_Icons.Perk_Commando_Gold'

View File

@ -3,7 +3,7 @@ class NiceScopedWeapon extends NiceWeapon
#exec OBJ LOAD FILE=ScopeShaders.utx #exec OBJ LOAD FILE=ScopeShaders.utx
#exec OBJ LOAD FILE=..\Textures\NicePackT.utx #exec OBJ LOAD FILE=..\Textures\NicePackT.utx
#exec OBJ LOAD FILE=ScrnWeaponPack_T.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() Material ZoomMat;
var() Sound ZoomSound; var() Sound ZoomSound;
var() int lenseMaterialID; // used since material id's seem to change alot 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 var Material ScriptedTextureFallback; // The texture to render if the users system doesn't support shaders
// new scope vars // new scope vars
var Combiner ScriptedScopeCombiner; var Combiner ScriptedScopeCombiner;
var texture TexturedScopeTexture; var Material TexturedScopeTexture;
var bool bInitializedScope; // Set to true when the scope has been initialized var bool bInitializedScope; // Set to true when the scope has been initialized
var string ZoomMatRef; var string ZoomMatRef;
var string ScriptedTextureFallbackRef; var string ScriptedTextureFallbackRef;
var texture CrosshairTex; var Material CrosshairTex;
var string CrosshairTexRef; 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){ static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount){
local NiceScopedWeapon W; local NiceScopedWeapon W;
super.PreloadAssets(Inv, bSkipRefCount); super.PreloadAssets(Inv, bSkipRefCount);
if(default.ZoomMat == none && default.ZoomMatRef != ""){ if(default.ZoomMat == none && default.ZoomMatRef != ""){
// Try to load as various types of materials default.ZoomMat = PreloadUnknownMaterial(default.ZoomMatRef);
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'));
} }
if(default.ScriptedTextureFallback == none && default.ScriptedTextureFallbackRef != "") 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 != "") if(default.CrosshairTex == none && default.CrosshairTexRef != "")
default.CrosshairTex = Texture(DynamicLoadObject(default.CrosshairTexRef, class'texture')); default.CrosshairTex = PreloadUnknownMaterial(default.CrosshairTexRef);
W = NiceScopedWeapon(Inv); W = NiceScopedWeapon(Inv);
if(W != none){ if(W != none){
W.ZoomMat = default.ZoomMat; W.ZoomMat = default.ZoomMat;

View File

@ -28,9 +28,9 @@ static function Explode(
bullet.charExplosionMomentum, bullet.charExplosionMomentum,
hitLocation, hitLocation,
bullet.instigator, bullet.instigator,
true,
explosionTarget, explosionTarget,
Vector(bullet.Rotation) Vector(bullet.Rotation),
bullet.bStuck
); );
if (KFMonster(bullet.base) != none && bullet.bStuck && bullet.bStuckToHead) { if (KFMonster(bullet.base) != none && bullet.bStuck && bullet.bStuckToHead) {

View File

@ -744,4 +744,5 @@ defaultproperties
activeSpreadScale=1 activeSpreadScale=1
spreadGainedPerShot=0 spreadGainedPerShot=0
spreadLostPerSecond=0 spreadLostPerSecond=0
RecoilVelocityScale = 0
} }

View File

@ -146,6 +146,7 @@ var bool bAutoReloadPaused; // This is used to 'pause' auto relo
var float autoReloadPauseFrame; // Frame at which current pause began 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 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 float autoReloadSpeedModifier;
var bool updatedDefaultReloadValues;
// Acrtive reload-related variables // Acrtive reload-related variables
// Active reload state // Active reload state
enum EActiveReloadState{ enum EActiveReloadState{
@ -219,6 +220,8 @@ static function bool UnloadAssets(){
return default.ReferenceCount == 0; return default.ReferenceCount == 0;
} }
simulated function PostBeginPlay(){ simulated function PostBeginPlay(){
local float swapSpeedMod, reloadSpeedMod;
if(default.recordedZoomTime < 0) if(default.recordedZoomTime < 0)
default.recordedZoomTime = ZoomTime; default.recordedZoomTime = ZoomTime;
recordedZoomTime = default.recordedZoomTime; recordedZoomTime = default.recordedZoomTime;
@ -240,6 +243,31 @@ simulated function PostBeginPlay(){
if(FireModeClass[0] != none) if(FireModeClass[0] != none)
stdFireRate = FireModeClass[0].default.fireRate; stdFireRate = FireModeClass[0].default.fireRate;
super.PostBeginPlay(); 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 // Allows to prevent leaving iron sights unwillingly
@ -1094,6 +1122,7 @@ simulated function int GetMagazineAmmo(){
else else
return MagAmmoRemaining; return MagAmmoRemaining;
} }
simulated function bool AllowReload(){ simulated function bool AllowReload(){
local int actualMagSize; local int actualMagSize;
actualMagSize = GetMagazineAmmo(); actualMagSize = GetMagazineAmmo();
@ -1127,6 +1156,7 @@ simulated function float GetCurrentReloadMult(){
local NiceHumanPawn nicePawn; local NiceHumanPawn nicePawn;
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
nicePawn = NiceHumanPawn(Instigator); nicePawn = NiceHumanPawn(Instigator);
nicePlayer = NicePlayerController(Instigator.Controller); nicePlayer = NicePlayerController(Instigator.Controller);
if(nicePawn != none) if(nicePawn != none)
@ -1624,17 +1654,17 @@ simulated function float GetAmmoMulti()
defaultproperties defaultproperties
{ {
recordedZoomTime=-1.000000 recordedZoomTime=-1.000000
SecondaryCharge=1 SecondaryCharge=1
LaserAttachmentClass=Class'ScrnLaserAttachmentFirstPerson' LaserAttachmentClass=Class'ScrnLaserAttachmentFirstPerson'
LaserDotClass=Class'ScrnLocalLaserDot' LaserDotClass=Class'ScrnLocalLaserDot'
LaserAttachmentBone="LightBone" LaserAttachmentBone="LightBone"
MagazineBone="Magazine" MagazineBone="Magazine"
bHasChargePhase=True bHasChargePhase=True
autoReloadSpeedModifier=1.000000 autoReloadSpeedModifier=1.000000
bCanActiveReload=True bCanActiveReload=True
activeSlowdown=0.850000 activeSlowdown=0.850000
activeSpeedup=1.150000 activeSpeedup=1.150000
activeWindow=0.060000 activeWindow=0.060000
bModeZeroCanDryFire=True bModeZeroCanDryFire=True
} }

View File

@ -19,7 +19,7 @@ defaultproperties
StereoFireSoundRef="KF_LAWSnd.LAW_FireST" StereoFireSoundRef="KF_LAWSnd.LAW_FireST"
NoAmmoSoundRef="KF_LAWSnd.LAW_DryFire" NoAmmoSoundRef="KF_LAWSnd.LAW_DryFire"
DamageType=class'NiceDamTypeLAWBlunt' DamageType=class'NiceDamTypeLAWBlunt'
DamageMax=750 DamageMax=350
bSplashDamage=True bSplashDamage=True
bRecommendSplashDamage=True bRecommendSplashDamage=True
bWaitForRelease=True bWaitForRelease=True

View File

@ -39,114 +39,32 @@ function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Mo
Explode(HitLocation, vect(0,0,1)); Explode(HitLocation, vect(0,0,1));
} }
} }
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> 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<Pawn> CheckedPawns;
local int i;
local bool bAlreadyChecked;
local SRStatsBase Stats;
if ( bHurtEntry ) simulated function HurtRadius(
return; float damageAmount,
bHurtEntry = true; float damageRadius,
class<DamageType> damageType,
if( Role == ROLE_Authority && Instigator != none && Instigator.PlayerReplicationInfo != none ) float momentum,
Stats = SRStatsBase(Instigator.PlayerReplicationInfo.SteamStatsAndAchievements); Vector hitLocation
) {
foreach CollidingActors (class 'Actor', Victims, DamageRadius, HitLocation) local NicePlayerController niceController;
{ local NiceReplicationInfo niceRI;
P = none;
KFMonsterVictim = none;
bMonster = false;
KFP = none;
bAlreadyChecked = false;
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag if (instigator == none) return;
if( (Victims != self) && (Hurtwall != Victims) && (Victims.Role == ROLE_Authority) && !Victims.IsA('FluidSurfaceInfo') niceController = NicePlayerController(instigator.controller);
&& ExtendedZCollision(Victims)==None ) if (niceController == none) return;
{ niceRI = niceController.niceRI;
if( (Instigator==None || Instigator.Health<=0) && KFPawn(Victims)!=None ) if (niceRI == none) return;
Continue;
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if ( Instigator == None || Instigator.Controller == None ) Destroy();
{
Victims.SetDelayedDamageInstigatorController( InstigatorController );
}
P = Pawn(Victims); niceRI.ServerExplode(damageAmount,
if( P != none ) { damageRadius,
for (i = 0; i < CheckedPawns.Length; i++) { 1.0,
if (CheckedPawns[i] == P) { niceExplosiveDamage,
bAlreadyChecked = true; momentum,
break; hitLocation,
} instigator);
}
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;
} }
// Overridden to spawn different AvoidMarker // Overridden to spawn different AvoidMarker
simulated function HitWall( vector HitNormal, actor Wall ){ simulated function HitWall( vector HitNormal, actor Wall ){

View File

@ -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
}

View File

@ -1,316 +1,5 @@
// Modification of the AAR525 weapons by: [B.R]HekuT class NiceHFR extends NiceScopedWeapon;
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;
}
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) simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV)
{ {
local KFPlayerController KFPC; local KFPlayerController KFPC;
@ -333,204 +22,15 @@ simulated function float CalcAspectRatioAdjustedFOV(float AdjustFOV)
return 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 defaultproperties
{ {
reloadPreEndFrame=0.339
reloadEndFrame=0.732
reloadChargeEndFrame=-1.000000
reloadMagStartFrame=0.643
reloadChargeStartFrame=-1.000000
magazineBone="Magazine"
lenseMaterialID=3 lenseMaterialID=3
scopePortalFOVHigh=22.000000 scopePortalFOVHigh=22.000000
scopePortalFOV=12.000000 scopePortalFOV=12.000000
@ -538,13 +38,13 @@ defaultproperties
ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb" ScriptedTextureFallbackRef="NicePackT.HFR.CBLens_cmb"
bHasScope=True bHasScope=True
ZoomedDisplayFOVHigh=35.000000 ZoomedDisplayFOVHigh=35.000000
MagCapacity=10 MagCapacity=50
ReloadRate=3.000000 ReloadRate=3.000000
ReloadAnim="Reload" ReloadAnim="Reload"
ReloadAnimRate=0.600000 ReloadAnimRate=0.600000
WeaponReloadAnim="Reload_M4" WeaponReloadAnim="Reload_M4"
bSteadyAim=True bSteadyAim=True
Weight=7.000000 Weight=5.000000
bHasAimingMode=True bHasAimingMode=True
IdleAimAnim="Idle" IdleAimAnim="Idle"
StandardDisplayFOV=60.000000 StandardDisplayFOV=60.000000
@ -562,7 +62,7 @@ defaultproperties
PlayerIronSightFOV=65.000000 PlayerIronSightFOV=65.000000
ZoomedDisplayFOV=32.000000 ZoomedDisplayFOV=32.000000
FireModeClass(0)=class'NiceHFRPFire' FireModeClass(0)=class'NiceHFRPFire'
FireModeClass(1)=class'NiceHFRBurstFire' FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown" PutDownAnim="PutDown"
AIRating=0.700000 AIRating=0.700000
CurrentRating=0.700000 CurrentRating=0.700000

View File

@ -1,10 +1,10 @@
class NiceHFRAmmo extends KFAmmunition; class NiceHFRAmmo extends NiceAmmo;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx #EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties defaultproperties
{ {
AmmoPickupAmount=15 AmmoPickupAmount=75
MaxAmmo=100 MaxAmmo=300
InitialAmount=40 InitialAmount=75
PickupClass=class'NiceHFRAmmoPickup' PickupClass=class'NiceHFRAmmoPickup'
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

@ -1,7 +1,7 @@
class NiceHFRAmmoPickup extends KFAmmoPickup; class NiceHFRAmmoPickup extends NiceAmmoPickup;
defaultproperties defaultproperties
{ {
AmmoAmount=15 AmmoAmount=50
InventoryType=class'NiceHFRAmmo' InventoryType=class'NiceHFRAmmo'
PickupMessage="Fire balloon" PickupMessage="Fire balloon"
StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo' StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo'

View File

@ -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)
}

View File

@ -1,25 +1,29 @@
class NiceHFRPFire extends KFFire; class NiceHFRPFire extends NiceFire;
defaultproperties defaultproperties
{ {
ProjectileSpeed=1000.000000
FireAimedAnim="Fire_Iron" FireAimedAnim="Fire_Iron"
RecoilRate=0.120000 RecoilRate=0.070000
maxVerticalRecoilAngle=500 maxVerticalRecoilAngle=70
maxHorizontalRecoilAngle=35
bAccuracyBonusForSemiAuto=True bAccuracyBonusForSemiAuto=True
bRandomPitchFireSound=False bRandomPitchFireSound=False
FireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_M" FireSoundRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Fire_M"
StereoFireSoundRef="KF_SP_LongmusketSnd.KFO_Sniper_Fire_S" StereoFireSoundRef="KF_FY_ZEDV2SND.WEP_ZEDV2_Fire_S"
NoAmmoSoundRef="KF_AK47Snd.AK47_DryFire" NoAmmoSoundRef="KF_ZEDGunSnd.KF_WEP_ZED_Dryfire"
DamageType=class'NiceDamTypeHFRAssaultRifle' DamageType=class'NiceDamTypeHFR'
DamageMax=50 DamageMax=50
Momentum=8500.000000 Momentum=8500.000000
bWaitForRelease=True bWaitForRelease=False
TransientSoundVolume=1.200000 TransientSoundVolume=1.200000
TransientSoundRadius=500.000000 TransientSoundRadius=500.000000
FireLoopAnim="Fire" FireLoopAnim="Fire"
FireAnimRate=0.909000 FireAnimRate=0.909000
TweenTime=0.025000 TweenTime=0.025000
FireForce="AssaultRifleFire" FireForce="AssaultRifleFire"
FireRate=0.600000 FireRate=0.096000
bulletClass=class'NiceHFRBullet'
AmmoClass=class'NiceHFRAmmo' AmmoClass=class'NiceHFRAmmo'
AmmoPerFire=1 AmmoPerFire=1
ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000) ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000)
@ -32,5 +36,4 @@ defaultproperties
FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper' FlashEmitterClass=Class'ROEffects.MuzzleFlash1stSPSniper'
aimerror=42.000000 aimerror=42.000000
Spread=0.015000 Spread=0.015000
SpreadStyle=SS_Random
} }

View File

@ -1,18 +1,19 @@
class NiceHFRPickup extends KFWeaponPickup; class NiceHFRPickup extends NiceWeaponPickup;
defaultproperties defaultproperties
{ {
Weight=7.000000 Weight=5.000000
AmmoCost=30 AmmoCost=26
BuyClipSize=15 BuyClipSize=50
PowerValue=100 PowerValue=100
SpeedValue=100 SpeedValue=100
RangeValue=40 RangeValue=40
cost=750
Description="Advanced horzine flame rifle." Description="Advanced horzine flame rifle."
ItemName="Horzine flame rifle" ItemName="Horzine flame rifle"
ItemShortName="HFR" ItemShortName="HFR"
AmmoItemName="Fire balloon" AmmoItemName="Fire balloon"
AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh' AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh'
CorrespondingPerkIndex=5 CorrespondingPerkIndex=3
EquipmentCategoryID=3 EquipmentCategoryID=3
InventoryType=class'NiceHFR' InventoryType=class'NiceHFR'
PickupMessage="You got the HFR." PickupMessage="You got the HFR."

View File

@ -1,6 +1,6 @@
class NiceHFRTendril extends FlameTendril; class NiceHFRTendril extends FlameTendril;
defaultproperties defaultproperties
{ {
Damage=36.000000 Damage=16.000000
MyDamageType=class'NiceDamTypeHFR' MyDamageType=class'NiceDamTypeHFR'
} }

View File

@ -52,7 +52,6 @@ defaultproperties
ClawMeleeDamageRange=85.000000 ClawMeleeDamageRange=85.000000
ImpaleMeleeDamageRange=45.000000 ImpaleMeleeDamageRange=45.000000
fuelRatio=0.400000 fuelRatio=0.400000
bFrugalFuelUsage=False
clientHeadshotScale=1.200000 clientHeadshotScale=1.200000
ZapThreshold=5.000000 ZapThreshold=5.000000
ZappedDamageMod=1.250000 ZappedDamageMod=1.250000

View File

@ -34,17 +34,20 @@ event Landed(vector HitNormal)
} }
event Bump(actor Other) event Bump(actor Other)
{ {
local int actualDamage;
// TODO: is there a better way // TODO: is there a better way
if(bPouncing && KFHumanPawn(Other)!=none ) if(bPouncing && KFHumanPawn(Other)!=none )
{ {
KFHumanPawn(Other).TakeDamage(((MeleeDamage - (MeleeDamage * 0.05)) + (MeleeDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class'NiceZedMeleeDamageType'); actualDamage = MeleeDamage;
if (KFHumanPawn(Other).Health <=0) ModDamageFromZed(actualDamage, class'NiceZedMeleeDamageType');
{ KFHumanPawn(Other).TakeDamage(((actualDamage * 0.95) + (actualDamage * (FRand() * 0.1))), self ,self.Location,self.velocity, class'NiceZedMeleeDamageType');
//TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget if (KFHumanPawn(Other).Health <=0)
KFHumanPawn(Other).SpawnGibs(self.rotation, 1); {
} //TODO - move this to humanpawn.takedamage? Also see KFMonster.MeleeDamageTarget
//After impact, there'll be no momentum for further bumps KFHumanPawn(Other).SpawnGibs(self.rotation, 1);
bPouncing=false; }
//After impact, there'll be no momentum for further bumps
bPouncing=false;
} }
} }
// Blend his attacks so he can hit you in mid air. // Blend his attacks so he can hit you in mid air.

View File

@ -441,7 +441,7 @@ function SpinDamage(actor Target)
local vector HitLocation; local vector HitLocation;
local Name TearBone; local Name TearBone;
local Float dummy; local Float dummy;
local float DamageAmount; local int damageAmount;
local vector PushDir; local vector PushDir;
local KFHumanPawn HumanTarget; local KFHumanPawn HumanTarget;
if(target==none) if(target==none)
@ -456,8 +456,9 @@ function SpinDamage(actor Target)
} }
if (Target !=none && Target.IsA('KFDoorMover')) if (Target !=none && Target.IsA('KFDoorMover'))
{ {
Target.TakeDamage(DamageAmount , self ,HitLocation,pushdir, class'NiceZedMeleeDamageType'); ModDamageFromZed(DamageAmount, class'NiceZedMeleeDamageType');
PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25); Target.TakeDamage(DamageAmount , self ,HitLocation,pushdir, class'NiceZedMeleeDamageType');
PlaySound(MeleeAttackHitSound, SLOT_Interact, 1.25);
} }
if (KFHumanPawn(Target)!=none) if (KFHumanPawn(Target)!=none)
{ {
@ -465,8 +466,9 @@ function SpinDamage(actor Target)
if (HumanTarget.Controller != none) if (HumanTarget.Controller != none)
HumanTarget.Controller.ShakeView(RotMag, RotRate, RotTime, OffsetMag, OffsetRate, OffsetTime); 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? ModDamageFromZed(DamageAmount, class'NiceZedMeleeDamageType');
KFHumanPawn(Target).TakeDamage(DamageAmount, self ,HitLocation,pushdir, 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) if (KFHumanPawn(Target).Health <=0)
{ {

View File

@ -223,7 +223,7 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class<Dama
local float InitMomentum; local float InitMomentum;
local float damageScale, dist; local float damageScale, dist;
local vector dir; local vector dir;
local float UsedDamageAmount; local int UsedDamageAmount;
local KFHumanPawn humanPawn; local KFHumanPawn humanPawn;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
@ -266,7 +266,7 @@ simulated function HurtRadius(float DamageAmount, float DamageRadius, class<Dama
UsedDamageAmount = 100000; // Siren always shatters glass UsedDamageAmount = 100000; // Siren always shatters glass
else else
UsedDamageAmount = DamageAmount; UsedDamageAmount = DamageAmount;
ModDamageFromZed(UsedDamageAmount, DamageType);
Victims.TakeDamage(damageScale * UsedDamageAmount,Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType); Victims.TakeDamage(damageScale * UsedDamageAmount,Instigator, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir, (damageScale * Momentum * dir), DamageType);
if (Instigator != none && Vehicle(Victims) != none && Vehicle(Victims).Health > 0) if (Instigator != none && Vehicle(Victims) != none && Vehicle(Victims).Health > 0)

View File

@ -127,10 +127,7 @@ var float heatDissipationRate;
var float heatTicksPerSecond; var float heatTicksPerSecond;
// Tracks last time heat tick occured // Tracks last time heat tick occured
var float lastHeatTick; var float lastHeatTick;
// If set to 'true' - low-value ticks of fire DoT will waste accordingly small var float MIN_HEAT, MAX_HEAT;
// amount of fuel, otherwise they will always waste some minimal amount,
// resulting in a loss of potential damage
var bool bFrugalFuelUsage;
//============================================================================== //==============================================================================
//============================================================================== //==============================================================================
@ -475,7 +472,7 @@ function AccumulateHeadDamage( float addDamage,
bool bIsHeadshot, bool bIsHeadshot,
NicePlayerController nicePlayer){ NicePlayerController nicePlayer){
if(bIsHeadshot){ if(bIsHeadshot){
AccHeadDamage += addDamage; AccHeadDamage += addDamage * 0.5;
HeadRecoveryCountDown = HeadRecoveryTime; HeadRecoveryCountDown = HeadRecoveryTime;
if(AccHeadDamage > (default.HeadHealth / 1.5) if(AccHeadDamage > (default.HeadHealth / 1.5)
&& (concussionCountdown > 0.0 && IsStunPossible())) && (concussionCountdown > 0.0 && IsStunPossible()))
@ -681,6 +678,19 @@ simulated function float IsHeadshotClient( Vector Loc,
return 1.0 - (distance / (headRadius * headScale * additionalScale)); return 1.0 - (distance / (headRadius * headScale * additionalScale));
return 0.0; 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: // In case of a future modifications:
// check if it's a player doing damage before relying on it // check if it's a player doing damage before relying on it
function ModDamage( out int damage, function ModDamage( out int damage,
@ -691,28 +701,28 @@ function ModDamage( out int damage,
float headshotLevel, float headshotLevel,
KFPlayerReplicationInfo KFPRI, KFPlayerReplicationInfo KFPRI,
optional float lockonTime){ optional float lockonTime){
local NicePlayerController nicePlayer; local NicePlayerController nicePlayer;
local bool hasGiantSlayer; local bool hasGiantSlayer;
local int bonusDamageStacks; local int bonusDamageStacks;
if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return; if(KFPRI == none || KFPRI.ClientVeteranSkill == none) return;
// Add perked damage // Add perked damage
damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self, damage = KFPRI.ClientVeteranSkill.Static.AddDamage( KFPRI, self,
KFPawn(instigatedBy), KFPawn(instigatedBy),
damage, damageType); damage, damageType);
// Skill bonuses // Skill bonuses
if(instigatedBy == none) if(instigatedBy == none)
return; return;
nicePlayer = NicePlayerController(instigatedBy.controller); nicePlayer = NicePlayerController(instigatedBy.controller);
if(nicePlayer == none) if(nicePlayer == none)
return; return;
hasGiantSlayer = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer, hasGiantSlayer = class'NiceVeterancyTypes'.static.hasSkill(nicePlayer,
class'NiceSkillCommandoGiantSlayer'); class'NiceSkillCommandoGiantSlayer');
if(!hasGiantSlayer) if(!hasGiantSlayer)
return; return;
bonusDamageStacks = bonusDamageStacks =
int(health / class'NiceSkillCommandoGiantSlayer'.default.healthStep); int(health / class'NiceSkillCommandoGiantSlayer'.default.healthStep);
damage *= 1.0f + bonusDamageStacks * damage *= 1.0f + bonusDamageStacks *
class'NiceSkillCommandoGiantSlayer'.default.bonusDamageMult; class'NiceSkillCommandoGiantSlayer'.default.bonusDamageMult;
} }
function ModRegularDamage( out int damage, function ModRegularDamage( out int damage,
Pawn instigatedBy, Pawn instigatedBy,
@ -734,9 +744,6 @@ function ModRegularDamage( out int damage,
damage = niceVet.static.AddRegDamage( KFPRI, self, damage = niceVet.static.AddRegDamage( KFPRI, self,
KFPawn(instigatedBy), damage, KFPawn(instigatedBy), damage,
damageType); damageType);
// Add some damage against crispy zeds
if(bCrispified)
damage += (Max(1200 - default.Health, 0) * damage) / 1200;
// Skills bonuses // Skills bonuses
if(nicePlayer == none) return; if(nicePlayer == none) return;
hasOverkillSkill = class'NiceVeterancyTypes'.static. hasOverkillSkill = class'NiceVeterancyTypes'.static.
@ -825,13 +832,15 @@ function int ModBodyDamage( out int damage,
return painDamage; return painDamage;
} }
// Do effects, based on fire damage dealt to monster // Do effects, based on fire damage dealt to monster
function FireDamageEffects( int damage, function FireDamageEffects(out int damage,
Pawn instigatedBy, Pawn instigatedBy,
Vector hitLocation, Vector hitLocation,
Vector momentum, Vector momentum,
class<NiceWeaponDamageType> damageType, class<NiceWeaponDamageType> damageType,
float headshotLevel, float headshotLevel,
KFPlayerReplicationInfo KFPRI){ KFPlayerReplicationInfo KFPRI){
local float heatDelta, bonusFireDamage;
local bool shouldBeSetOnFire, isFireWeapon;
damage = FMax(0.0, damage); damage = FMax(0.0, damage);
iceCrustStrenght = FMax(0.0, iceCrustStrenght); iceCrustStrenght = FMax(0.0, iceCrustStrenght);
if(bFrozenZed){ if(bFrozenZed){
@ -849,24 +858,39 @@ function FireDamageEffects( int damage,
} }
damage /= 10; damage /= 10;
} }
if(damage <= 0) return; if(damage <= 0) {
return;
}
// Turn up the heat! // Turn up the heat!
// (we can only make it twice as hot with that damage, // (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) // 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) )))); * FMin(1.0, FMax(0.0, (2 - Abs(heat) / FMax(25, Abs(damage) ))));
if (concussionCountdown > 0) {
heat += heatDelta * 2;
} else {
heat += heatDelta;
}
CapHeat(); CapHeat();
// Change damage type if new one was stronger // Change damage type if new one was stronger
if(!bOnFire || damage * HeatIncScale() > lastBurnDamage){ if(!bOnFire || damage * HeatIncScale() > lastBurnDamage){
fireDamageClass = damageType; fireDamageClass = damageType;
burnInstigator = instigatedBy; 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 // Set on fire, if necessary
if(heat > GetIgnitionPoint() && !bOnFire && bCanBurn){ shouldBeSetOnFire = (heat > GetIgnitionPoint()) || isFireWeapon;
if(shouldBeSetOnFire && !bOnFire && bCanBurn){
bBurnified = true; bBurnified = true;
bOnFire = true; bOnFire = true;
burnInstigator = instigatedBy; burnInstigator = instigatedBy;
fireDamageClass = damageType; fireDamageClass = damageType;
lastHeatTick = Level.TimeSeconds; lastHeatTick = Level.TimeSeconds;
} }
} }
@ -1001,6 +1025,10 @@ function DealHeadDamage( int damage,
// Actual damage effects // Actual damage effects
// Skull injury killed a zed // Skull injury killed a zed
if(HeadHealth <= 0) return; 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; HeadHealth -= damage;
if(nicePlayer != none && IsFinisher(damage, damageType, nicePlayer, true)) if(nicePlayer != none && IsFinisher(damage, damageType, nicePlayer, true))
HeadHealth -= damage; HeadHealth -= damage;
@ -1183,6 +1211,9 @@ function EPainReaction GetRightPainReaction(int painDamage,
local int stunScore, flinchScore; local int stunScore, flinchScore;
local bool bStunPass, bFlinchPass, bMiniFlinshPass; local bool bStunPass, bFlinchPass, bMiniFlinshPass;
local class<NiceVeterancyTypes> niceVet; local class<NiceVeterancyTypes> niceVet;
if (bOnFire) {
return PREACTION_NONE;
}
if(KFPRI != none) if(KFPRI != none)
niceVet = class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill); niceVet = class<NiceVeterancyTypes>(KFPRI.ClientVeteranSkill);
stunScore = painDamage; stunScore = painDamage;
@ -1633,8 +1664,8 @@ function TakeDamageClient( int damage,
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,
damageType, headshotLevel, KFPRI); momentum, 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
@ -1644,9 +1675,9 @@ function TakeDamageClient( int damage,
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,
hitLocation, momentum, damageType, KFPRI, instigatedBy, hitLocation, momentum, damageType,
headshotLevel, lockonTime); KFPRI, headshotLevel, lockonTime);
AddKillAssistant(instigatedBy, bodyDamage); AddKillAssistant(instigatedBy, bodyDamage);
// Rewrite values of last deal damage, instigator, etc. // Rewrite values of last deal damage, instigator, etc.
UpdateLastDamageVars( instigatedBy, bodyDamage, damageType, UpdateLastDamageVars( instigatedBy, bodyDamage, damageType,
@ -1722,15 +1753,12 @@ function TakeDamage(int damage,
} }
} }
function TakeFireDamage(int damage, Pawn instigator){ function TakeFireDamage(int damage, Pawn instigator){
local bool bLowFuel, bHighHeat;
local Vector DummyHitLoc, DummyMomentum; local Vector DummyHitLoc, DummyMomentum;
super(Skaarj).TakeDamage( damage, instigator, dummyHitLoc, super(Skaarj).TakeDamage( damage, instigator, dummyHitLoc,
dummyMomentum, fireDamageClass); dummyMomentum, fireDamageClass);
lastBurnDamage = damage; lastBurnDamage = damage;
// Melt em' :) // Melt em' :)
bHighHeat = heat > default.health / 20; if(FlameFuel <= 0)
bLowFuel = FlameFuel < 0.75 * InitFlameFuel;
if(FlameFuel <= 0 || bHighHeat && bLowFuel)
ZombieCrispUp(); ZombieCrispUp();
} }
function TakeFrostDamage(int damage, Pawn instigator){ function TakeFrostDamage(int damage, Pawn instigator){
@ -1753,34 +1781,43 @@ simulated function ZombieCrispUp(){
Skins[3]=Combiner'PatchTex.Common.BurnSkinEmbers_cmb'; Skins[3]=Combiner'PatchTex.Common.BurnSkinEmbers_cmb';
} }
simulated function HeatTick(){ simulated function HeatTick(){
local float iceDamage; local float iceDamage, heatDamage;
// Update heat value // Update heat value
if(!bOnFire || flameFuel <= 0) if(!bOnFire || flameFuel <= 0)
heat *= heatDissipationRate; heat *= heatDissipationRate;
else{ else {
if(flameFuel < heat) if(flameFuel < heat) {
heat = flameFuel * 1.1 + (heat - flameFuel) * heatDissipationRate; heat = flameFuel * 1.1 + (heat - flameFuel) * heatDissipationRate;
else } else {
heat = heat * 1.1; heat = heat * 1.1;
if(bFrugalFuelUsage) }
flameFuel -= heat; if (flameFuel >= 0) {
else // Burning always deals at least 5% damage (of the total fuel),
flameFuel -= FMax(heat, InitFlameFuel / 15); // 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(); CapHeat();
if(Abs(heat) < 1) if(Abs(heat) < 1)
heat = 0.0; heat = 0.0;
// Update on-fire status // Update on-fire status
if(bOnFire){ if(bOnFire){
if(heat > 0) if(heat > 0) {
TakeFireDamage(heat + rand(5), burnInstigator); TakeFireDamage(heatDamage, burnInstigator);
else{ }
bBurnified = false; else {
UnSetBurningBehavior(); bBurnified = false;
RemoveFlamingEffects(); UnSetBurningBehavior();
StopBurnFX(); RemoveFlamingEffects();
bOnFire = false; StopBurnFX();
} bOnFire = false;
}
} }
// Update frozen status (always deal frost damage) // Update frozen status (always deal frost damage)
iceCrustStrenght = FMax(iceCrustStrenght, heat); iceCrustStrenght = FMax(iceCrustStrenght, heat);
@ -1799,9 +1836,9 @@ simulated function HeatTick(){
} }
simulated function SetBurningBehavior(){ simulated function SetBurningBehavior(){
bBurningBehavior = true; bBurningBehavior = true;
if(default.Health >= 1000) return; if(default.Health >= 1000) {
if(Role == Role_Authority) return;
Intelligence = BRAINS_Retarded; }
MovementAnims[0] = BurningWalkFAnims[Rand(3)]; MovementAnims[0] = BurningWalkFAnims[Rand(3)];
WalkAnims[0] = BurningWalkFAnims[Rand(3)]; WalkAnims[0] = BurningWalkFAnims[Rand(3)];
MovementAnims[1] = BurningWalkAnims[0]; MovementAnims[1] = BurningWalkAnims[0];
@ -1847,6 +1884,17 @@ simulated function UpdateGroundSpeed() {
if (bDecapitated) { if (bDecapitated) {
groundSpeed *= 0.8; groundSpeed *= 0.8;
} }
if (bCrispified) {
groundSpeed *= 1.25;
}
}
simulated function ModDamageFromZed(
out int damage,
class<DamageType> damageType
) {
if (bCrispified) {
damage *= 2;
}
} }
// If this function returns `true`, then we shouldn't touch speed further, // If this function returns `true`, then we shouldn't touch speed further,
// because a speed hack was used for the zed // because a speed hack was used for the zed
@ -2077,8 +2125,8 @@ function float HeatIncScale(){
return 100.0 / default.health; return 100.0 / default.health;
} }
function CapHeat(){ function CapHeat(){
heat = FMin(heat, 135 + rand(10) - 5); heat = FMin(heat, MAX_HEAT);
heat = FMax(heat, -150 + rand(10) - 5); heat = FMax(heat, MIN_HEAT);
} }
function bool TryMeleeReachTarget(out Vector hitLocation){ function bool TryMeleeReachTarget(out Vector hitLocation){
local Actor hitActor; local Actor hitActor;
@ -2119,6 +2167,7 @@ function bool MeleeDamageTarget(int hitDamage, Vector pushDir){
local KFHumanPawn kfHumanPawn; local KFHumanPawn kfHumanPawn;
if(Level.netMode == NM_Client) return false; if(Level.netMode == NM_Client) return false;
if(controller == none || controller.target == none) return false; if(controller == none || controller.target == none) return false;
ModDamageFromZed(hitDamage, niceZombieDamType);
// Melee for doors // Melee for doors
kfHumanPawn = KFHumanPawn(controller.target); kfHumanPawn = KFHumanPawn(controller.target);
bTargetIsDoor = controller.target.IsA('KFDoorMover'); bTargetIsDoor = controller.target.IsA('KFDoorMover');
@ -2275,7 +2324,6 @@ defaultproperties
fuelRatio=0.750000 fuelRatio=0.750000
heatDissipationRate=0.666000 heatDissipationRate=0.666000
heatTicksPerSecond=3.000000 heatTicksPerSecond=3.000000
bFrugalFuelUsage=True
clientHeadshotScale=1.000000 clientHeadshotScale=1.000000
FrozenMaterial=Texture'HTec_A.Overlay.IceOverlay' FrozenMaterial=Texture'HTec_A.Overlay.IceOverlay'
ShatteredIce=class'NiceIceChunkEmitter' ShatteredIce=class'NiceIceChunkEmitter'
@ -2288,6 +2336,8 @@ defaultproperties
stoppingRecoveryRate=0.025 stoppingRecoveryRate=0.025
maxStoppingEffect=0.25 maxStoppingEffect=0.25
minStoppingThreshold=0.0 minStoppingThreshold=0.0
MIN_HEAT = -150.0
MAX_HEAT = 135.0
Begin Object Class=KarmaParamsSkel Name=KarmaParamsSkelN Begin Object Class=KarmaParamsSkel Name=KarmaParamsSkelN
KConvulseSpacing=(Max=2.200000) KConvulseSpacing=(Max=2.200000)
KLinearDamping=0.150000 KLinearDamping=0.150000