Prepare fixtures

This commit is contained in:
dkanus 2026-07-14 20:27:09 +07:00
commit 9c94356263
6021 changed files with 722805 additions and 22 deletions

View file

@ -0,0 +1,202 @@
class CryoNade extends Nade;
#exec OBJ LOAD FILE=KF_GrenadeSnd.uax
#exec OBJ LOAD FILE=Inf_WeaponsTwo.uax
#exec OBJ LOAD FILE=KF_LAWSnd.uax
var() int TotalFreezes; // haw many times do freezing
var() float FreezeRate; // How often to do Freezeing
var transient float NextFreezeTime; // The next time that this nade will Freeze friendlies or hurt enemies
var() sound ExplosionSound; // The sound of the rocket exploding
var bool bNeedToPlayEffects; // Whether or not effects have been played yet
replication
{
reliable if (Role==ROLE_Authority)
bNeedToPlayEffects;
}
simulated function PostNetReceive()
{
super.PostNetReceive();
if( !bHasExploded && bNeedToPlayEffects )
{
bNeedToPlayEffects = false;
Explode(Location, vect(0,0,1));
}
}
simulated function Explode(vector HitLocation, vector HitNormal)
{
bHasExploded = True;
BlowUp(HitLocation);
PlaySound(ExplosionSound,,TransientSoundVolume);
if( Role == ROLE_Authority )
{
bNeedToPlayEffects = true;
AmbientSound=Sound'Inf_WeaponsTwo.smoke_loop';
}
if ( EffectIsRelevant(Location,false) )
{
Spawn(Class'CryoNadeCloud',,, HitLocation, rotator(vect(0,0,1)));
Spawn(ExplosionDecal,self,,HitLocation, rotator(-HitNormal));
if ( Level.DetailMode >= DM_High )
Spawn(class'NitroGroundEffect',self,,Location);
}
}
function Timer()
{
if( !bHidden )
{
if( !bHasExploded )
{
Explode(Location, vect(0,0,1));
}
}
else if( bDisintegrated )
{
AmbientSound=none;
Destroy();
}
}
simulated function BlowUp(vector HitLocation)
{
DoFreeze(Damage,DamageRadius, MyDamageType, MomentumTransfer, HitLocation);
if ( Role == ROLE_Authority )
MakeNoise(1.0);
}
function DoFreeze(float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation)
{
local KFMonster KFM;
if ( bHurtEntry )
return;
bHurtEntry = true;
NextFreezeTime = Level.TimeSeconds + FreezeRate;
// if( Fear != none )
// Fear.StartleBots();
foreach CollidingActors (class 'KFMonster', KFM, DamageRadius, HitLocation) {
if ( KFM.Health <= 0 )
continue;
if ( Instigator == None || Instigator.Controller == None )
KFM.SetDelayedDamageInstigatorController( InstigatorController );
KFM.TakeDamage(DamageAmount,Instigator,KFM.Location,vect(0,0,0),DamageType);
}
bHurtEntry = false;
}
function TakeDamage( int Damage, Pawn InstigatedBy, Vector Hitlocation, Vector Momentum, class<DamageType> damageType, optional int HitIndex)
{
if( damageType == class'SirenScreamDamage')
Disintegrate(HitLocation, vect(0,0,1));
}
// Overridden to tweak the handling of the impact sound
simulated function HitWall( vector HitNormal, actor Wall )
{
local Vector VNorm;
local PlayerController PC;
if ( (Pawn(Wall) != None) || (GameObjective(Wall) != None) )
{
Explode(Location, HitNormal);
return;
}
if (!bTimerSet)
{
SetTimer(ExplodeTimer, false);
bTimerSet = true;
}
// Reflect off Wall w/damping
VNorm = (Velocity dot HitNormal) * HitNormal;
Velocity = -VNorm * DampenFactor + (Velocity - VNorm) * DampenFactorParallel;
RandSpin(100000);
DesiredRotation.Roll = 0;
RotationRate.Roll = 0;
Speed = VSize(Velocity);
if ( Speed < 20 )
{
bBounce = False;
PrePivot.Z = -1.5;
SetPhysics(PHYS_None);
Timer();
SetTimer(0.0,False);
DesiredRotation = Rotation;
DesiredRotation.Roll = 0;
DesiredRotation.Pitch = 0;
SetRotation(DesiredRotation);
// if( Fear == none )
// {
// //(jc) Changed to use MedicNade-specific grenade that's overridden to not make the ringmaster fear it
// Fear = Spawn(class'AvoidMarker_MedicNade');
// Fear.SetCollisionSize(DamageRadius,DamageRadius);
// Fear.StartleBots();
// }
if ( Trail != None )
Trail.mRegen = false; // stop the emitter from regenerating
}
else
{
if ( (Level.NetMode != NM_DedicatedServer) && (Speed > 50) )
PlaySound(ImpactSound, SLOT_Misc );
else
{
bFixedRotationDir = false;
bRotateToDesired = true;
DesiredRotation.Pitch = 0;
RotationRate.Pitch = 50000;
}
if ( !Level.bDropDetail && (Level.DetailMode != DM_Low) && (Level.TimeSeconds - LastSparkTime > 0.5) && EffectIsRelevant(Location,false) )
{
PC = Level.GetLocalPlayerController();
if ( (PC.ViewTarget != None) && VSize(PC.ViewTarget.Location - Location) < 6000 )
Spawn(HitEffectClass,,, Location, Rotator(HitNormal));
LastSparkTime = Level.TimeSeconds;
}
}
}
function Tick( float DeltaTime )
{
if( TotalFreezes > 0 && NextFreezeTime > 0 && NextFreezeTime < Level.TimeSeconds ) {
TotalFreezes--;
DoFreeze(Damage,DamageRadius, MyDamageType, MomentumTransfer, Location);
if( TotalFreezes == 0 )
AmbientSound=none;
}
}
defaultproperties
{
TotalFreezes=10
FreezeRate=0.500000
ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode'
Damage=10.000000
DamageRadius=175.000000
MyDamageType=Class'ScrnHTec.DamTypeCryoNade'
ExplosionDecal=Class'ScrnHTec.NitroDecal'
StaticMesh=StaticMesh'KF_pickups5_Trip.nades.MedicNade_Pickup'
LifeSpan=8.000000
DrawScale=1.000000
SoundVolume=150
SoundRadius=100.000000
TransientSoundVolume=2.000000
TransientSoundRadius=200.000000
}

View file

@ -0,0 +1,62 @@
class CryoNadeCloud extends Emitter;
var bool bFlashed;
simulated function PostBeginPlay()
{
Super.Postbeginplay();
NadeLight();
}
simulated function NadeLight()
{
if ( !Level.bDropDetail && (Instigator != None)
&& ((Level.TimeSeconds - LastRenderTime < 0.2) || (PlayerController(Instigator.Controller) != None)) )
{
bDynamicLight = true;
SetTimer(0.25, false);
}
else Timer();
}
simulated function Timer()
{
bDynamicLight = false;
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseColorScale=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
ColorScale(0)=(Color=(B=255,G=235,R=215,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=245,G=225,R=205,A=255))
FadeOutFactor=(W=0.000000,X=0.000000,Y=0.000000,Z=0.000000)
FadeOutStartTime=5.000000
SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000))
StartSpinRange=(X=(Min=-0.500000,Max=0.500000),Y=(Max=1.000000),Z=(Max=1.000000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=5.000000)
StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000))
InitialParticlesPerSecond=5000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=7.000000,Max=7.000000)
StartVelocityRange=(X=(Min=-750.000000,Max=750.000000),Y=(Min=-750.000000,Max=750.000000))
VelocityLossRange=(X=(Min=10.000000,Max=10.000000),Y=(Min=10.000000,Max=10.000000),Z=(Min=10.000000,Max=10.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.CryoNadeCloud.SpriteEmitter0'
AutoDestroy=True
bNoDelete=False
RemoteRole=ROLE_SimulatedProxy
bNotOnDedServer=False
}

View file

@ -0,0 +1,168 @@
class CryoThrower extends KFWeapon;
simulated function bool StartFire(int Mode)
{
if( Mode == 1 )
return super.StartFire(Mode);
if( !super.StartFire(Mode) ) // returns false when mag is empty
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;
}
// Allow this weapon to auto reload on alt fire
simulated function AltFire(float F)
{
if( MagAmmoRemaining < FireMode[1].AmmoPerFire && !bIsReloading &&
FireMode[1].NextFireTime <= Level.TimeSeconds )
{
// We're dry, ask the server to autoreload
ServerRequestAutoReload();
PlayOwnedSound(FireMode[1].NoAmmoSound,SLOT_None,2.0,,,,false);
}
super.AltFire(F);
}
simulated function AnimEnd(int channel)
{
if(!FireMode[0].IsInState('FireLoop'))
{
Super.AnimEnd(channel);
}
}
function bool RecommendRangedAttack()
{
return true;
}
function float SuggestAttackStyle()
{
return -1.0;
}
//TODO: LONG ranged?
function bool RecommendLongRangedAttack()
{
return true;
}
simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax )
{
local Inventory Inv;
local bool bOutOfAmmo;
local KFWeapon KFWeap;
if ( Super(Weapon).ConsumeAmmo(Mode, Load, bAmountNeededIsMax) )
{
if ( Load > 0 && (Mode == 0 || bReduceMagAmmoOnSecondaryFire) )
MagAmmoRemaining -= Load;
NetUpdateTime = Level.TimeSeconds - 1;
if ( FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo &&
(Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire) &&
(Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire) )
{
bOutOfAmmo = true;
for ( Inv = Instigator.Inventory; Inv != none; Inv = Inv.Inventory )
{
KFWeap = KFWeapon(Inv);
if ( Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo &&
((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) ||
(KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire)) )
{
bOutOfAmmo = false;
break;
}
}
if ( bOutOfAmmo )
{
PlayerController(Instigator.Controller).Speech('AUTO', 3, "");
}
}
return true;
}
return false;
}
// exec function ProjX(float value)
// {
// BaseProjectileFire(FireMode[1]).ProjSpawnOffset.X = value;
// }
// exec function ProjY(float value)
// {
// BaseProjectileFire(FireMode[1]).ProjSpawnOffset.Y = value;
// }
// exec function ProjZ(float value)
// {
// BaseProjectileFire(FireMode[1]).ProjSpawnOffset.Z = value;
// }
defaultproperties
{
MagCapacity=120
ReloadRate=4.140000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_IJC_BlowerThrower"
MinimumFireRange=50
Weight=8.000000
bHasAimingMode=True
IdleAimAnim="Idle"
QuickPutDownTime=0.250000
StandardDisplayFOV=70.000000
bModeZeroCanDryFire=True
TraderInfoTexture=Texture'KF_IJC_HUD.Trader_Weapon_Icons.Trader_BlowerThrower'
bIsTier2Weapon=True
MeshRef="KF_IJC_Halloween_Weps_2.BlowerThrower"
SkinRefs(0)="HTec_A.CryoThrower.CryoThrower_cmb"
SelectSoundRef="KF_FY_BlowerThrowerSND.WEP_Bile_Foley_Select"
HudImageRef="KF_IJC_HUD.WeaponSelect.BlowerThrower_unselected"
SelectedHudImageRef="KF_IJC_HUD.WeaponSelect.BlowerThrower"
ZoomInRotation=(Pitch=-1000,Roll=1500)
ZoomedDisplayFOV=60.000000
FireModeClass(0)=Class'ScrnHTec.CryoThrowerFire'
FireModeClass(1)=Class'ScrnHTec.CryoThrowerAltFire'
PutDownAnim="PutDown"
PutDownTime=0.500000
AIRating=0.700000
CurrentRating=0.700000
Description="A leaf blower modified to spray liquid nitrogen."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=70.000000
Priority=103
InventoryGroup=4
GroupOffset=21
PickupClass=Class'ScrnHTec.CryoThrowerPickup'
PlayerViewOffset=(X=15.000000,Y=20.000000,Z=-3.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnHTec.CryoThrowerAttachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="HTec Cryo Thrower"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,117 @@
class CryoThrowerAltFire extends KFShotgunFire;
simulated function bool AllowFire()
{
if(KFWeapon(Weapon).bIsReloading)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if(KFPawn(Instigator).bThrowingNade)
return false;
if(KFWeapon(Weapon).MagAmmoRemaining < 1)
{
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( AIController(Instigator.Controller)!=None )
KFWeapon(Weapon).ReloadMeNow();
return false;
}
return super(WeaponFire).AllowFire();
}
// Handle setting new recoil
simulated function HandleRecoil(float Rec)
{
local rotator NewRecoilRotation;
local KFPlayerController KFPC;
local KFPawn KFPwn;
local vector AdjustedVelocity;
local float AdjustedSpeed;
if( Instigator != none )
{
KFPC = KFPlayerController(Instigator.Controller);
KFPwn = KFPawn(Instigator);
}
if( KFPC == none || KFPwn == none )
return;
if( !KFPC.bFreeCamera )
{
if( Weapon.GetFireMode(1).bIsFiring )
{
NewRecoilRotation.Pitch = RandRange( maxVerticalRecoilAngle * 0.5, maxVerticalRecoilAngle );
NewRecoilRotation.Yaw = RandRange( maxHorizontalRecoilAngle * 0.5, maxHorizontalRecoilAngle );
if( Rand( 2 ) == 1 )
NewRecoilRotation.Yaw = -NewRecoilRotation.Yaw;
if( Weapon.Owner != none && Weapon.Owner.Physics == PHYS_Falling &&
Weapon.Owner.PhysicsVolume.Gravity.Z > class'PhysicsVolume'.default.Gravity.Z )
{
AdjustedVelocity = Weapon.Owner.Velocity;
// Ignore Z velocity in low grav so we don't get massive recoil
AdjustedVelocity.Z = 0;
AdjustedSpeed = VSize(AdjustedVelocity);
//log("AdjustedSpeed = "$AdjustedSpeed$" scale = "$(AdjustedSpeed* RecoilVelocityScale * 0.5));
// Reduce the falling recoil in low grav
NewRecoilRotation.Pitch += (AdjustedSpeed* 3 * 0.5);
NewRecoilRotation.Yaw += (AdjustedSpeed* 3 * 0.5);
}
else
{
//log("Velocity = "$VSize(Weapon.Owner.Velocity)$" scale = "$(VSize(Weapon.Owner.Velocity)* RecoilVelocityScale));
NewRecoilRotation.Pitch += (VSize(Weapon.Owner.Velocity)* 3);
NewRecoilRotation.Yaw += (VSize(Weapon.Owner.Velocity)* 3);
}
NewRecoilRotation.Pitch += (Instigator.HealthMax / Instigator.Health * 5);
NewRecoilRotation.Yaw += (Instigator.HealthMax / Instigator.Health * 5);
NewRecoilRotation *= Rec;
KFPC.SetRecoil(NewRecoilRotation,RecoilRate * (default.FireRate/FireRate));
}
}
}
defaultproperties
{
KickMomentum=(X=-85.000000,Z=15.000000)
maxVerticalRecoilAngle=1500
maxHorizontalRecoilAngle=900
FireAimedAnim="FireALL_Iron"
bRandomPitchFireSound=False
FireSoundRef="KF_FY_BlowerThrowerSND.WEP_Blower_Secondary_Fire_M"
StereoFireSoundRef="KF_FY_BlowerThrowerSND.WEP_Blower_Secondary_Fire_S"
NoAmmoSoundRef="KF_FlamethrowerSnd.FT_DryFire"
ProjPerFire=1
ProjSpawnOffset=(X=15.000000,Z=-20.000000)
bWaitForRelease=True
bAttachSmokeEmitter=True
TransientSoundVolume=2.000000
TransientSoundRadius=500.000000
FireAnim="FireALL"
FireAnimRate=0.950000
FireRate=0.965000
AmmoClass=Class'ScrnHTec.CryoThrowerAmmo'
AmmoPerFire=10
ShakeRotMag=(X=50.000000,Y=50.000000,Z=400.000000)
ShakeRotRate=(X=12500.000000,Y=12500.000000,Z=12500.000000)
ShakeRotTime=5.000000
ShakeOffsetMag=(X=6.000000,Y=2.000000,Z=10.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=3.000000
ProjectileClass=Class'ScrnHTec.CryoThrowerAltProjectile'
BotRefireRate=1.500000
FlashEmitterClass=Class'ScrnHTec.NitroMuzzleFlash'
aimerror=1.000000
Spread=1000.000000
SpreadStyle=SS_Line
}

View file

@ -0,0 +1,9 @@
class CryoThrowerAltProjectile extends CryoThrowerProjectile;
defaultproperties
{
Speed=500.000000
MaxSpeed=500.000000
TossZ=100.000000
DamageRadius=200.000000
}

View file

@ -0,0 +1,14 @@
class CryoThrowerAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=120
MaxAmmo=840
InitialAmount=300
PickupClass=Class'ScrnHTec.CryoThrowerAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="Liquid Nitrogen"
}

View file

@ -0,0 +1,9 @@
class CryoThrowerAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=120
InventoryType=Class'ScrnHTec.CryoThrowerAmmo'
PickupMessage="ML of Liquid Nitrogen"
StaticMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh'
}

View file

@ -0,0 +1,86 @@
class CryoThrowerAttachment extends KFWeaponAttachment;
var array<string> SkinRefs;
static function PreloadAssets(optional KFWeaponAttachment Spawned)
{
local int i;
super.PreloadAssets(Spawned);
for ( i = 0; i < default.SkinRefs.Length; i++ )
default.Skins[i] = Material(DynamicLoadObject(default.SkinRefs[i], class'Material'));
if ( Spawned != none ){
for ( i = 0; i < default.SkinRefs.Length; i++ )
Spawned.Skins[i] = default.Skins[i];
}
}
static function bool UnloadAssets()
{
local int i;
super.UnloadAssets();
for ( i = 0; i < default.SkinRefs.Length; i++ )
default.Skins[i] = none;
return true;
}
// No dynamic light when firing this
simulated function WeaponLight(){}
defaultproperties
{
SkinRefs(0)="HTec_A.CryoThrower.CryoThrower_3rd_D"
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun'
MovementAnims(0)="JogF_IJC_BlowerThrower"
MovementAnims(1)="JogB_IJC_BlowerThrower"
MovementAnims(2)="JogL_IJC_BlowerThrower"
MovementAnims(3)="JogR_IJC_BlowerThrower"
TurnLeftAnim="TurnL_IJC_BlowerThrower"
TurnRightAnim="TurnR_IJC_BlowerThrower"
CrouchAnims(0)="CHWalkF_IJC_BlowerThrower"
CrouchAnims(1)="CHWalkB_IJC_BlowerThrower"
CrouchAnims(2)="CHWalkL_IJC_BlowerThrower"
CrouchAnims(3)="CHWalkR_IJC_BlowerThrower"
WalkAnims(0)="WalkF_IJC_BlowerThrower"
WalkAnims(1)="WalkB_IJC_BlowerThrower"
WalkAnims(2)="WalkL_IJC_BlowerThrower"
WalkAnims(3)="WalkR_IJC_BlowerThrower"
CrouchTurnRightAnim="CH_TurnR_IJC_BlowerThrower"
CrouchTurnLeftAnim="CH_TurnL_IJC_BlowerThrower"
IdleCrouchAnim="CHIdle_IJC_BlowerThrower"
IdleWeaponAnim="Idle_IJC_BlowerThrower"
IdleRestAnim="Idle_IJC_BlowerThrower"
IdleChatAnim="Idle_IJC_BlowerThrower"
IdleHeavyAnim="Idle_IJC_BlowerThrower"
IdleRifleAnim="Idle_IJC_BlowerThrower"
FireAnims(0)="Fire_IJC_BlowerThrower"
FireAnims(1)="Fire_IJC_BlowerThrower"
FireAnims(2)="Fire_IJC_BlowerThrower"
FireAnims(3)="Fire_IJC_BlowerThrower"
FireAltAnims(0)="Fire_IJC_BlowerThrower"
FireAltAnims(1)="Fire_IJC_BlowerThrower"
FireAltAnims(2)="Fire_IJC_BlowerThrower"
FireAltAnims(3)="Fire_IJC_BlowerThrower"
FireCrouchAnims(0)="CHFire_IJC_BlowerThrower"
FireCrouchAnims(1)="CHFire_IJC_BlowerThrower"
FireCrouchAnims(2)="CHFire_IJC_BlowerThrower"
FireCrouchAnims(3)="CHFire_IJC_BlowerThrower"
FireCrouchAltAnims(0)="CHFire_IJC_BlowerThrower"
FireCrouchAltAnims(1)="CHFire_IJC_BlowerThrower"
FireCrouchAltAnims(2)="CHFire_IJC_BlowerThrower"
FireCrouchAltAnims(3)="CHFire_IJC_BlowerThrower"
HitAnims(0)="HitF_IJC_BlowerThrower"
HitAnims(1)="HitB_IJC_BlowerThrower"
HitAnims(2)="HitL_IJC_BlowerThrower"
HitAnims(3)="HitR_IJC_BlowerThrower"
PostFireBlendStandAnim="Blend_IJC_BlowerThrower"
PostFireBlendCrouchAnim="CHBlend_IJC_BlowerThrower"
MeshRef="KF_Weapons3rd3_IJC.BlowerThrower_3rd"
WeaponAmbientScale=2.000000
}

View file

@ -0,0 +1,20 @@
class CryoThrowerFire extends NitroFire;
function float MaxRange()
{
return 2500;
}
defaultproperties
{
EffectiveRange=2500.000000
maxVerticalRecoilAngle=500
maxHorizontalRecoilAngle=250
ProjSpawnOffset=(X=15.000000,Z=-40.000000)
FireLoopAnim="Fire"
FireEndAnim="Fire_End"
AmmoClass=Class'ScrnHTec.CryoThrowerAmmo'
ProjectileClass=Class'ScrnHTec.CryoThrowerProjectile'
Spread=2500.000000
}

View file

@ -0,0 +1,26 @@
class CryoThrowerPickup extends KFWeaponPickup;
defaultproperties
{
Weight=8.000000
AmmoCost=55
BuyClipSize=100
PowerValue=50
SpeedValue=80
RangeValue=20
Description="A leaf blower modified to spray liquid nitrogen."
ItemName="HTec Cryo Thrower"
ItemShortName="HTec Cryo Thrower"
AmmoItemName="Bile"
AmmoMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh'
CorrespondingPerkIndex=11
EquipmentCategoryID=3
InventoryType=Class'ScrnHTec.CryoThrower'
PickupMessage="You got the CryoThrower"
PickupSound=Sound'KF_FY_BlowerThrowerSND.foley.WEP_Bile_Foley_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'HTec_A.CryoThrower_Pickup'
DrawScale=0.900000
CollisionRadius=30.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,9 @@
class CryoThrowerProjectile extends NitroProjectile;
defaultproperties
{
Speed=1200.000000
MaxSpeed=1200.000000
TossZ=250.000000
MyDamageType=Class'ScrnHTec.DamTypeCryoThrower'
}

View file

@ -0,0 +1,9 @@
class DamTypeCryoNade extends DamTypeFreezerBase
abstract;
defaultproperties
{
FreezeRatio=12.000000
bCheckForHeadShots=False
bLocationalHit=False
}

View file

@ -0,0 +1,10 @@
class DamTypeCryoThrower extends DamTypeFreezerBase
abstract;
defaultproperties
{
FreezeRatio=5.000000
bCheckForHeadShots=False
WeaponClass=Class'ScrnHTec.CryoThrower'
bLocationalHit=False
}

View file

@ -0,0 +1,39 @@
class DamTypeFreezerBase extends KFWeaponDamageType
abstract;
var float FreezeRatio; // percent of damage used for freezing effect
// Freeze over Time
var int FoT_Duration; // for how long zed will freeze after receiving this damage
var float FoT_Ratio; // freeze per second in percent of damage received
var float ShatteringDamageMult; // damage multiplier to already frozen zeds
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
// do not count kills of decapitated specimens - those are counted in ScoredHeadshot()
if ( Killed != none && Killed.bDecapitated )
return;
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> MonsterClass, bool bLaserSightedM14EBRKill)
{
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
defaultproperties
{
FreezeRatio=1.000000
ShatteringDamageMult=1.000000
WeaponClass=Class'ScrnHTec.FreezerGun'
DeathString="%o frozen by %k."
FemaleSuicide="%o froze till death."
MaleSuicide="%o froze till death."
bArmorStops=False
DeathOverlayMaterial=Texture'HTec_A.Overlay.IceOverlay'
DeathOverlayTime=5.000000
}

View file

@ -0,0 +1,10 @@
class DamTypeFreezerDart extends DamTypeFreezerBase
abstract;
defaultproperties
{
FreezeRatio=0.600000
FoT_Duration=2
FoT_Ratio=0.200000
ShatteringDamageMult=1.500000
}

View file

@ -0,0 +1,9 @@
class DamTypeFreezerNitro extends DamTypeFreezerBase
abstract;
defaultproperties
{
FreezeRatio=5.000000
bCheckForHeadShots=False
bLocationalHit=False
}

View file

@ -0,0 +1,9 @@
class DamTypeFreezerNoDmgBonus extends DamTypeFreezerBase
abstract;
defaultproperties
{
FreezeRatio=0.600000
FoT_Duration=2
FoT_Ratio=0.200000
}

View file

@ -0,0 +1,24 @@
class DamTypeHTecZEDGun extends DamTypeZEDGun
abstract;
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
// do not count kills of decapitated specimens - those are counted in ScoredHeadshot()
if ( Killed != none && Killed.bDecapitated )
return;
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> MonsterClass, bool bLaserSightedM14EBRKill)
{
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
defaultproperties
{
WeaponClass=Class'ScrnHTec.HTecZEDGun'
}

View file

@ -0,0 +1,23 @@
class DamTypeHTecZEDGunMKII extends DamTypeZEDGunMKII
abstract;
static function AwardKill(KFSteamStatsAndAchievements KFStatsAndAchievements, KFPlayerController Killer, KFMonster Killed )
{
// do not count kills of decapitated specimens - those are counted in ScoredHeadshot()
if ( Killed != none && Killed.bDecapitated )
return;
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
static function ScoredHeadshot(KFSteamStatsAndAchievements KFStatsAndAchievements, class<KFMonster> MonsterClass, bool bLaserSightedM14EBRKill)
{
if( SRStatsBase(KFStatsAndAchievements)!=None && SRStatsBase(KFStatsAndAchievements).Rep!=None )
SRStatsBase(KFStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg',1);
}
defaultproperties
{
WeaponClass=Class'ScrnHTec.HTecZEDMKII'
}

View file

@ -0,0 +1,14 @@
class DamTypeKVolt extends DamTypeFreezerBase
abstract;
defaultproperties
{
FoT_Duration=4
FoT_Ratio=0.500000
ShatteringDamageMult=2.000000
WeaponClass=Class'ScrnHTec.KVolt'
bRagdollBullet=True
KDamageImpulse=1500.000000
KDeathVel=210.000000
KDeathUpKick=2.000000
}

View file

@ -0,0 +1,13 @@
class DamTypeSirenDart extends DamTypeZombieAttack
abstract;
defaultproperties
{
DeathString="%o was pierced by %k's ice shards."
FemaleSuicide="%o was pierced by ice shards."
MaleSuicide="%o was pierced by ice shards."
bDetonatesGoop=True
bRagdollBullet=True
KDeathVel=400.000000
KDeathUpKick=120.000000
}

View file

@ -0,0 +1,22 @@
Class FreezeAch extends ScrnAchievements;
defaultproperties
{
AchDefs(0)=(id="Freeze_Dosh",DisplayName="Frozen DO$H",Description="Collect £%c from shattered zeds",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=1337,DataSize=11)
AchDefs(1)=(id="Freeze_IceAge",DisplayName="Ice Age 2015",Description="Freeze %c zeds",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=2015,DataSize=11)
AchDefs(2)=(id="Freeze_Chainsaw",DisplayName="Ice Sculpting",Description="Cut %c frozen zeds with a Chainsaw",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=93,DataSize=7,Group="TW")
AchDefs(3)=(id="Freeze_Storm",DisplayName="Ice Storm",Description="Blow up 10 frozen zeds at once (x%c)",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=15,DataSize=4)
AchDefs(4)=(id="Freeze_Expert",DisplayName="Cryo Expert",Description="Do everything yourself: freeze zed, shatter it and collect all 5 pieces of frozen dosh (x%c)",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=50,DataSize=6,Group="Master")
AchDefs(5)=(id="Freeze_Dart",DisplayName="Cryo Sniper",Description="Decapitate 30 zeds with ice darts in a single wave(x%c)",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=10,DataSize=4)
AchDefs(6)=(id="Freeze_Festival",DisplayName="Ice Sculpture Festival",Description="Get 20 frozen zeds at the same time",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=1,DataSize=1)
AchDefs(7)=(id="Freeze_CR",DisplayName="Spider Rain",Description="Freeze %c Crawlers in midair",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=30,DataSize=5)
AchDefs(8)=(id="Freeze_FP",DisplayName="Frozen Flesh",Description="Freeze the Fleshpound",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=1,DataSize=1)
AchDefs(9)=(id="Freeze_Pat",DisplayName="Frozen Scientist",Description="Freeze the Patriarch",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=1,DataSize=1)
AchDefs(10)=(id="Freeze_ShatterPat",DisplayName="Death to the Frozen Scientist",Description="Shatter frozen Patriarch",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=1,DataSize=1,Group="TW")
AchDefs(11)=(id="Freeze_ShatterZeds",DisplayName="TeamWork: Shattering Ice",Description="Shatter %c zeds frozen by teammates",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=250,DataSize=8,Group="TW")
AchDefs(12)=(id="Freeze_DoshSui",DisplayName="Suicidal Dosh Maniac",Description="Grab £%c of frozen dosh while your health is below 25%",Icon=Texture'ScrnAch_T.Achievements.Checked_Cryo',MaxProgress=99,DataSize=7)
AchDefs(13)=(id="OP_HTec",DisplayName="Is HTec OP?",Description="Survive 3+player game where everybody is playing Horzine Technician",Icon=Texture'ScrnAch_T.Teamwork.Checked_TW',MaxProgress=1,DataSize=1,Group="TW")
DefaultAchGroup="weap"
GroupInfo(1)=(Group="weap",Caption="Custom Weapons")
ProgressName="Cryo Achievements"
}

View file

@ -0,0 +1,41 @@
class FreezeAchHandler extends ScrnAchHandlerBase;
var FreezeRules FreezeRules;
function FindGameRules()
{
if ( GameRules != none )
return;
super.FindGameRules();
// make sure that FreezeRules are spawned after ScrnGameRules
if ( GameRules != none ) {
FreezeRules = Class'FreezeRules'.static.FindOrSpawnMe(Level.Game);
FreezeRules.ScrnGameRules = GameRules;
}
}
function WaveEnded(byte WaveNum)
{
local ScrnPlayerInfo SPI;
local int i, decaps;
for ( SPI=GameRules.PlayerInfo; SPI!=none; SPI=SPI.NextPlayerInfo ) {
if ( SPI.PlayerOwner == none )
continue; // player disconnected
decaps = 0;
for ( i=0; i<SPI.WeapInfos.length; ++i ) {
if ( ClassIsChildOf(SPI.WeapInfos[i].DamType, class'DamTypeFreezerBase') )
decaps += SPI.WeapInfos[i].DecapsPerWave;
}
if ( decaps >= 30 )
SPI.ProgressAchievement('Freeze_Dart', 1);
}
}
defaultproperties
{
}

View file

@ -0,0 +1,6 @@
class FreezeParticlesBase extends Emitter;
defaultproperties
{
bNoDelete=False
}

View file

@ -0,0 +1,13 @@
class FreezeParticlesDirectional extends FreezeParticlesBase;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
Emitters[0].SpawnParticle(1);
}
defaultproperties
{
Style=STY_Additive
bHardAttach=True
bDirectional=True
}

View file

@ -0,0 +1,122 @@
// FreezeRules controls Zed freezing on server side.
// FreezeReplicationInfo is used to replciate freezing effects to clients.
class FreezeReplicationInfo extends ReplicationInfo;
var KFLevelRules KFLevelRules;
var byte FrozenCount;
var array<KFMonster> Frozen;
var const material FrozenMaterial;
replication {
reliable if ( bNetDirty && Role == ROLE_Authority )
FrozenCount;
}
static function RemoveAnimations(KFMonster M)
{
local int i;
for ( i=0; i<ArrayCount(M.MeleeAnims); ++i )
M.MeleeAnims[i] = '';
for ( i=0; i<ArrayCount(M.HitAnims); ++i )
M.HitAnims[i] = '';
M.KFHitFront = '';
M.KFHitBack = '';
M.KFHitLeft = '';
M.KFHitRight = '';
M.IdleCrouchAnim = '';
M.IdleWeaponAnim = '';
M.IdleSwimAnim = '';
M.IdleRestAnim = '';
M.IdleHeavyAnim = '';
M.IdleRifleAnim = '';
}
static function RestoreAnimations(KFMonster M)
{
local int i;
for ( i=0; i<ArrayCount(M.MeleeAnims); ++i )
M.MeleeAnims[i] = M.default.MeleeAnims[i];
for ( i=0; i<ArrayCount(M.HitAnims); ++i )
M.HitAnims[i] = M.default.HitAnims[i];
M.KFHitFront = M.default.KFHitFront;
M.KFHitBack = M.default.KFHitBack;
M.KFHitLeft = M.default.KFHitLeft;
M.KFHitRight = M.default.KFHitRight;
M.IdleCrouchAnim = M.default.IdleCrouchAnim;
M.IdleWeaponAnim = M.default.IdleWeaponAnim;
M.IdleSwimAnim = M.default.IdleSwimAnim;
M.IdleRestAnim = M.default.IdleRestAnim;
M.IdleHeavyAnim = M.default.IdleHeavyAnim;
M.IdleRifleAnim = M.default.IdleRifleAnim;
}
// adds IJC_Project_Santa Gun to the shot
auto simulated state InitShop
{
Begin:
while ( KFLevelRules == none && FrozenCount == 0 ) {
sleep(1.0);
foreach DynamicActors(class'KFLevelRules', KFLevelRules)
break;
}
KFLevelRules.NeutItemForSale.insert(0,1);
KFLevelRules.NeutItemForSale[0] = class'FreezerPickup';
if ( Role < ROLE_Authority )
GotoState('Freezing');
else
GotoState('');
}
simulated state Freezing
{
simulated function LoadFrozen()
{
local KFMonster M;
local int i;
for ( i=0; i<Frozen.length; ++i )
RestoreAnimations(Frozen[i]);
foreach DynamicActors(class'KFMonster', M) {
if ( M.Health > 0 && M.OverlayMaterial == FrozenMaterial ) {
RemoveAnimations(M);
Frozen[i++] = M;
}
}
Frozen.length = i;
}
simulated function Tick(float DeltaTime)
{
local int i;
// remove dead or unfrozen zeds first
while ( i < Frozen.length ) {
if ( Frozen[i] == none || Frozen[i].Health <= 0 || Frozen[i].OverlayMaterial != FrozenMaterial )
Frozen.remove(i, 1);
else
++i;
}
if ( Frozen.length != FrozenCount )
LoadFrozen();
for ( i=0; i<Frozen.length; ++i ) {
Frozen[i].bIsIdle = false;
Frozen[i].bWaitForAnim = true;
Frozen[i].StopAnimating();
}
}
}
defaultproperties
{
FrozenMaterial=Texture'HTec_A.Overlay.IceOverlay'
}

View file

@ -0,0 +1,485 @@
// FreezeRules controls Zed freezing on server side.
// FreezeReplicationInfo is used to replciate freezing effects to clients.
class FreezeRules extends GameRules;
var ScrnGameRules ScrnGameRules;
var FreezeReplicationInfo FreezeRI;
var float FreezeTreshold; // % of HealthMax to be done to fully freeze zed
var float FrozenDamageResistance; // frozen zed gets less damage
var float FrozenDamageMult; // but it is possible to break the ice and instant kill zed
var float FrozenDamageMultHS; // damage that can do headshots does more damage to ice
var float FrozenDamageMultSG; // shotgun-specific damage mult
var class<Emitter> ShatteredIce;
var transient PlayerController LastShatteredBy; //last player who shattered zed
var transient float LastShaterTime;
var transient int InstantShatterCounter;
var transient float NextChainsawTime;
var bool bDosh;
struct SFrozen {
var KFMonster M;
var KFPlayerController LastFrozenBy;
var class<DamTypeFreezerBase> LastFrozenDamType;
var bool bFrozen, bWasFrozen;
var float CurrentFreeze;
var float FreezeTreshold; // when CurrentFreeze reaches this value, zed becomes completely frozen
// FoT: Freeze over Time
var float FoT;
var float FoT_Remaining;
var float WarmTime; // time after which zed should get warmed up
var int Damage; // damage done during freeze
var vector FocalPoint;
};
var transient array<SFrozen> Frozen;
final static function FreezeRules FindOrSpawnMe(GameInfo Game)
{
local GameRules GR;
local FreezeRules FR;
FR = FreezeRules(Game.GameRulesModifiers);
if ( FR == none ) {
for ( GR = Game.GameRulesModifiers; GR != none && FR == none; GR = GR.NextGameRules )
FR = FreezeRules(Game.GameRulesModifiers);
// Freeze rules not found. Spawn it now
if ( FR == none ) {
FR = Game.Spawn(Class'FreezeRules', Game);
if( Game.GameRulesModifiers==None )
Game.GameRulesModifiers = FR;
else
Game.GameRulesModifiers.AddGameRules(FR);
}
}
return FR;
}
function PostBeginPlay()
{
FreezeRI = spawn(class'FreezeReplicationInfo', self);
class'ZombieSirenCryo'.default.FreezeRules = self;
}
function AddGameRules(GameRules GR)
{
if ( GR.class != self.class ) //prevent adding same rules more than once
Super.AddGameRules(GR);
}
function int NetDamage( int OriginalDamage, int Damage, pawn injured, pawn instigatedBy,
vector HitLocation, out vector Momentum, class<DamageType> DamageType )
{
local class<KFWeaponDamageType> KFDamType;
local class<DamTypeFreezerBase> FreezeDT;
local KFPlayerController PC;
local KFPlayerReplicationInfo KFPRI;
local class<KFVeterancyTypes> Perk;
local KFMonster ZedVictim;
local int idx;
KFDamType = class<KFWeaponDamageType>(damageType);
ZedVictim = KFMonster(injured);
if ( instigatedBy != none )
PC = KFPlayerController(instigatedBy.Controller);
if ( PC != none )
KFPRI = KFPlayerReplicationInfo(PC.PlayerReplicationInfo);
if ( KFPRI != none )
Perk = KFPRI.ClientVeteranSkill;
else
Perk = class'KFVeterancyTypes';
if ( KFDamType != none && ZedVictim != none && ZedVictim.Controller != none && ZedVictim.Health > 0 )
{
FreezeDT = class<DamTypeFreezerBase>(damageType);
if ( FreezeDT != none ) {
if ( ZedVictim.bBurnified ) {
ZedVictim.BurnDown /= 2;
if ( ZedVictim.BurnDown == 0 ) {
ZedVictim.bBurnified = false;
ZedVictim.Timer(); // stop burning behavior
}
}
if ( !ZedVictim.bBurnified ) {
idx = FrozenIndex(ZedVictim, true);
if ( KFPRI != none && KFPRI.ClientVeteranSkill != none )
Frozen[idx].CurrentFreeze += Damage * FreezeDT.default.FreezeRatio;
if ( Frozen[idx].bFrozen ) {
Frozen[idx].WarmTime = fmax(Frozen[idx].WarmTime, Level.TimeSeconds + 0.5);
// allow shattering for ice darts
if ( FreezeDT.default.bCheckForHeadShots ) {
Damage *= FrozenDamageResistance * FreezeDT.default.HeadShotDamageMult
* FreezeDT.default.ShatteringDamageMult;
Frozen[idx].Damage += Damage * FrozenDamageMultHS;
if ( ZedVictim.Health <= Damage + Frozen[idx].Damage ) {
Damage += Frozen[idx].Damage;
ShatterZed(ZedVictim, idx, instigatedBy.Controller, DamageType);
}
}
else
Damage = 0;
}
else {
Frozen[idx].LastFrozenBy = PC;
Frozen[idx].LastFrozenDamType = FreezeDT;
// Freeze over Time
if ( FreezeDT.default.FoT_Duration > 0 && (Frozen[idx].FoT_Remaining < 0.5
|| Frozen[idx].FoT < Damage * FreezeDT.default.FoT_Ratio) )
{
Frozen[idx].FoT_Remaining = FreezeDT.default.FoT_Duration;
Frozen[idx].FoT = Damage * FreezeDT.default.FoT_Ratio;
}
if ( Frozen[idx].CurrentFreeze >= Frozen[idx].FreezeTreshold ) {
// enough damage to freeze zed
FreezeZed(ZedVictim, idx);
Frozen[idx].bFrozen = true;
Frozen[idx].WarmTime = fmax(Frozen[idx].WarmTime, Level.TimeSeconds + 2.0);
}
else
Frozen[idx].WarmTime = fmax(Frozen[idx].WarmTime, Level.TimeSeconds + 1.0);
}
}
//debug
// Level.GetLocalPlayerController().ClientMessage(Frozen[idx].CurrentFreeze $" / "$ Frozen[idx].FreezeTreshold);
}
else {
idx = FrozenIndex(ZedVictim, false);
if ( idx != -1 ) {
if ( KFDamType.default.bDealBurningDamage ) {
// fire instantly unfreezes zed
if ( Frozen[idx].bFrozen )
UnfreezeZed(ZedVictim, idx);
Frozen.remove(idx, 1);
}
else if ( Frozen[idx].bFrozen ) {
if ( KFDamType.default.bCheckForHeadShots && class<DamTypeCrossbuzzsaw>(KFDamType) == none ) {
Damage *= KFDamType.default.HeadShotDamageMult;
if ( KFDamType.default.bIsPowerWeapon || KFDamType.default.bIsMeleeDamage ) {
Frozen[idx].Damage += Damage * FrozenDamageMultSG;
if ( ClassIsChildOf(KFDamType, class'DamTypeChainsaw')
&& Level.TimeSeconds > NextChainsawTime )
{
ProgressAchievement(PC, 'Freeze_Chainsaw', 1);
ProgressAchievement(Frozen[idx].LastFrozenBy, 'Freeze_Chainsaw', 1);
NextChainsawTime = Level.TimeSeconds + 1;
}
}
else
Frozen[idx].Damage += Damage * FrozenDamageMultHS;
}
else
Frozen[idx].Damage += Damage * FrozenDamageMult;
Damage *= FrozenDamageResistance;
if ( ZedVictim.Health <= Damage + Frozen[idx].Damage ) {
Damage += Frozen[idx].Damage;
ShatterZed(ZedVictim, idx, instigatedBy.Controller, DamageType);
}
}
}
}
}
if ( NextGameRules != None )
return NextGameRules.NetDamage( OriginalDamage,Damage,injured,instigatedBy,HitLocation,Momentum,DamageType);
return Damage;
}
function bool PreventDeath(Pawn Killed, Controller Killer, class<DamageType> damageType, vector HitLocation)
{
local KFMonster M;
local PlayerController Zapper;
if ( (NextGameRules != None) && NextGameRules.PreventDeath(Killed,Killer, damageType,HitLocation) )
return true;
M = KFMonster(Killed);
if ( M != none && M.ZappedBy != none )
Zapper = PlayerController(M.ZappedBy.Controller);
// killing zapped zed gives perk progression to zapper
if ( Zapper != none && SRStatsBase(Zapper.SteamStatsAndAchievements) != none
&& SRStatsBase(Zapper.SteamStatsAndAchievements).Rep != none )
SRStatsBase(Zapper.SteamStatsAndAchievements).Rep.ProgressCustomValue(Class'HTecProg', min(1, M.default.ZapThreshold * 4.01));
return false;
}
function bool IsFrozen(KFMonster M)
{
local int i;
i = FrozenIndex(M, false);
return i >= 0 && Frozen[i].bFrozen;
}
function int FrozenIndex(KFMonster M, bool bCreate)
{
local int i;
for ( i=0; i < Frozen.length; ++i )
if ( Frozen[i].M == M )
return i;
if ( bCreate ) {
Frozen.insert(i, 1);
Frozen[i].M = M;
Frozen[i].FreezeTreshold = M.HealthMax * FreezeTreshold;
Frozen[i].WarmTime = Level.TimeSeconds + 2.0;
return i;
}
return -1;
}
function int GetFrozenCount()
{
local int i, c;
for ( i=0; i < Frozen.length; ++i )
if ( Frozen[i].bFrozen && Frozen[i].M != none && Frozen[i].M.Health > 0 )
++c;
return c;
}
function Tick(float DeltaTime)
{
local int i;
local bool bRemove;
local byte FrozenCount;
while ( i < Frozen.length ) {
bRemove = Frozen[i].M == none || Frozen[i].M.Health <= 0;
if ( !bRemove ) {
if ( Frozen[i].FoT_Remaining > 0 ) {
Frozen[i].CurrentFreeze += Frozen[i].FoT * DeltaTime;
Frozen[i].FoT_Remaining -= DeltaTime;
Frozen[i].WarmTime = fmax(Frozen[i].WarmTime, Level.TimeSeconds + 1.0);
if ( !Frozen[i].bFrozen && Frozen[i].CurrentFreeze >= Frozen[i].FreezeTreshold ) {
FreezeZed(Frozen[i].M, i);
Frozen[i].bFrozen = true;
}
}
else {
if ( Frozen[i].CurrentFreeze > 0 && Level.TimeSeconds >= Frozen[i].WarmTime ) {
Frozen[i].CurrentFreeze -= fmax(Frozen[i].CurrentFreeze * 0.2, 20.0) * DeltaTime;
if ( Frozen[i].bFrozen && Frozen[i].CurrentFreeze < Frozen[i].FreezeTreshold ) {
UnfreezeZed(Frozen[i].M, i);
Frozen[i].bFrozen = false;
Frozen[i].Damage = 0;
Frozen[i].CurrentFreeze *= 0.80;
}
if ( Frozen[i].CurrentFreeze <= 0 )
bRemove = true;
}
}
if ( Frozen[i].bFrozen ) {
FrozenCount++;
if ( Frozen[i].M.IsAnimating(0) || Frozen[i].M.IsAnimating(1) )
FreezeZed(Frozen[i].M, i);
else if ( Frozen[i].M.Controller != none ) {
// prevent rotating
Frozen[i].M.Controller.FocalPoint = Frozen[i].FocalPoint;
Frozen[i].M.Controller.Enemy = none;
Frozen[i].M.Controller.Focus = none;
}
}
}
if ( bRemove )
Frozen.Remove(i, 1);
else
i++;
}
if ( FrozenCount != FreezeRI.FrozenCount ) {
FreezeRI.FrozenCount = FrozenCount;
FreezeRI.NetUpdateTime = Level.TimeSeconds - 1;
}
}
// call it only if zed isn't frozen yet
function FreezeZed(KFMonster M, int FrozenIndex)
{
if ( !Frozen[FrozenIndex].bWasFrozen ) {
Frozen[FrozenIndex].bWasFrozen = true;
if ( ZombieCrawler(M) != none && M.Physics == PHYS_Falling )
ProgressAchievement(Frozen[FrozenIndex].LastFrozenBy, 'Freeze_CR', 1);
else if ( ZombieFleshpound(M) != none )
ProgressAchievement(Frozen[FrozenIndex].LastFrozenBy, 'Freeze_FP', 1);
else if ( ZombieBoss(M) != none )
ProgressAchievement(Frozen[FrozenIndex].LastFrozenBy, 'Freeze_Pat', 1);
ProgressAchievement(Frozen[FrozenIndex].LastFrozenBy, 'Freeze_IceAge', 1);
}
if ( Frozen.length >= 20 && GetFrozenCount() >= 20 )
ScrnGameRules.ProgressAchievementForAllPlayers('Freeze_Festival', 1, true);
M.SetOverlayMaterial(FreezeRI.FrozenMaterial, 999, true);
Frozen[FrozenIndex].FocalPoint = M.Location + 512*vector(M.Rotation);
M.Velocity = M.PhysicsVolume.Gravity;
M.AnimAction = '';
M.bShotAnim = true;
M.bWaitForAnim = true;
M.Disable('AnimEnd');
class'FreezeReplicationInfo'.static.RemoveAnimations(M);
M.Acceleration = vect(0, 0, 0);
M.SetTimer(0, false);
M.StopAnimating();
if ( M.HeadRadius > 0 )
M.HeadRadius = -M.HeadRadius; // disable headshots
if ( M.Controller != none ) {
M.Controller.FocalPoint = Frozen[FrozenIndex].FocalPoint;
M.Controller.Enemy = none;
M.Controller.Focus = none;
if ( !M.Controller.IsInState('WaitForAnim') )
M.Controller.GoToState('WaitForAnim');
KFMonsterController(M.Controller).bUseFreezeHack = True;
}
}
function UnfreezeZed(KFMonster M, int FrozenIndex)
{
if ( M == none || M.Controller == none || M.Health <= 0 )
return;
M.SetOverlayMaterial(none, 0.1, true);
if ( M.HeadRadius < 0 )
M.HeadRadius = -M.HeadRadius; //enable headshots
M.bShotAnim = false;
M.bWaitForAnim = false;
M.Enable('AnimEnd');
class'FreezeReplicationInfo'.static.RestoreAnimations(M);
M.AnimEnd(1);
M.AnimEnd(0);
//KFMonsterController(M.Controller).WhatToDoNext(99);
M.Controller.GotoState('ZombieHunt');
M.GroundSpeed = M.GetOriginalGroundSpeed();
// this should "wake up" raged scrakes
M.TakeDamage(1, M, M.Location, vect(0,0,0), class'DamTypeFreezerBase');
}
function bool ShatterZed(KFMonster ZedVictim, int FrozenIdx, Controller Killer, class<DamageType> DamageType)
{
local vector loc;
local rotator r;
local FrozenDosh Dosh, PrevDosh, HeadDosh;
local int i;
local int MaxDosh;
local KFPlayerReplicationInfo KFPRI;
local SRStatsBase FreezerStats;
if ( FrozenIdx < 0 )
FrozenIdx = FrozenIndex(ZedVictim, false);
if ( FrozenIdx < 0 )
return false; // zed is not frozen
if ( Killer != none )
KFPRI = KFPlayerReplicationInfo(Killer.PlayerReplicationInfo);
FreezerStats = SRStatsBase(Frozen[FrozenIdx].LastFrozenBy.SteamStatsAndAchievements);
loc = ZedVictim.Location;
if ( bDosh && !ZedVictim.bDecapitated && DamageType != class'SirenScreamDamage' ) {
if ( KFPRI != none && KFPRI.ClientVeteranSkill != none )
MaxDosh = KFPRI.ClientVeteranSkill.static.GetCostScaling(KFPRI, class'FrozenDosh')
* 0.2 * ZedVictim.ScoringValue;
else
MaxDosh = ZedVictim.ScoringValue / 5;
}
if ( LastShatteredBy == Killer && LastShaterTime == Level.TimeSeconds ) {
if ( ++InstantShatterCounter == 10 ) {
ProgressAchievement(PlayerController(Killer), 'Freeze_Storm', 1);
InstantShatterCounter = 0;
}
}
else {
LastShatteredBy = PlayerController(Killer);
LastShaterTime = Level.TimeSeconds;
InstantShatterCounter = 1;
}
if ( FreezerStats != none && !ZedVictim.bDecapitated ) {
if (ZedVictim.default.Health >= 1500)
i = 4;
if (ZedVictim.default.Health >= 1000)
i = 3;
else if (ZedVictim.default.Health >= 500)
i = 2;
else
i = 1;
FreezerStats.Rep.ProgressCustomValue(Class'HTecProg', i);
if ( LastShatteredBy != none && LastShatteredBy != Frozen[FrozenIdx].LastFrozenBy ) {
class'ScrnAchievements'.static.ProgressAchievementByID(FreezerStats.Rep, 'Freeze_ShatterZeds', 1);
ProgressAchievement(LastShatteredBy, 'Freeze_ShatterZeds', 1);
}
}
if ( ZombieBoss(ZedVictim) != none )
ScrnGameRules.ProgressAchievementForAllPlayers('Freeze_ShatterPat', 1, true);
Spawn(ShatteredIce,,,loc);
ZedVictim.bHidden = true;
ZedVictim.Died(Killer, DamageType, loc );
// DO$H DO$H DO$H DO$H DO$H
if ( MaxDosh > 0 ) {
r = ZedVictim.GetViewRotation();
for ( i=0; i<5; ++i ) {
Dosh = Spawn(class'FrozenDosh',,, loc);
if ( Dosh != none ) {
// link all doshes together
if ( HeadDosh == none )
HeadDosh = Dosh;
Dosh.HeadDosh = HeadDosh;
if ( PrevDosh != none )
PrevDosh.NextDosh = Dosh;
Dosh.CashAmount = 1 + rand(MaxDosh);
Dosh.RespawnTime = 0;
Dosh.bDroppedCash = True;
if ( Killer == Frozen[FrozenIdx].LastFrozenBy )
Dosh.DroppedBy = Killer;
Dosh.Velocity = Vector(r) * 100;
Dosh.Velocity.Z += 500;
Dosh.InitDroppedPickupFor(None);
PrevDosh = Dosh;
}
r.Yaw += 13107;
}
}
return true;
}
function bool ProgressAchievement(PlayerController PC, name ID, int Prog)
{
if ( PC != none && SRStatsBase(PC.SteamStatsAndAchievements) != none )
return class'ScrnAchievements'.static.ProgressAchievementByID(SRStatsBase(PC.SteamStatsAndAchievements).Rep, ID, Prog);
return false;
}
defaultproperties
{
FreezeTreshold=0.333333
FrozenDamageResistance=0.500000
FrozenDamageMult=1.500000
FrozenDamageMultHS=4.500000
FrozenDamageMultSG=2.500000
ShatteredIce=Class'ScrnHTec.IceChunkEmitter'
bDosh=True
}

View file

@ -0,0 +1,35 @@
class FreezerAltFire extends NitroFire;
function float MaxRange()
{
return 1500;
}
simulated function bool AllowFire()
{
local FreezerGun W;
W = FreezerGun(Weapon);
if( W.bIsReloading || KFPawn(Instigator).SecondaryItem != none || KFPawn(Instigator).bThrowingNade )
return false;
if ( W.AltMagAmmoRemaining < 1 ) {
if ( Level.TimeSeconds - LastClickTime > FireRate ) {
W.PlayOwnedSound(NoAmmoSound, SLOT_Interact, TransientSoundVolume,,,, false);
LastClickTime = Level.TimeSeconds;
if(Weapon.HasAnim(EmptyAnim))
Weapon.PlayAnim(EmptyAnim, EmptyAnimRate, 0.0);
}
return false;
}
LastClickTime = Level.TimeSeconds;
return Super(WeaponFire).AllowFire();
}
defaultproperties
{
AmmoClass=Class'ScrnHTec.FreezerAmmo'
ProjectileClass=Class'ScrnHTec.FreezerNitroProjectile'
}

View file

@ -0,0 +1,14 @@
class FreezerAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=90
MaxAmmo=540
InitialAmount=180
PickupClass=Class'ScrnHTec.FreezerAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="Liquid Nitrogen"
}

View file

@ -0,0 +1,9 @@
class FreezerAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=90
InventoryType=Class'ScrnHTec.FreezerAmmo'
PickupMessage="ML of Liquid Nitrogen"
StaticMesh=StaticMesh'KillingFloorStatics.FT_AmmoMesh'
}

View file

@ -0,0 +1,57 @@
class FreezerAttachment extends KFWeaponAttachment;
#exec OBJ LOAD FILE=HTec_A.ukx
// No dynamic light when firing this
simulated function WeaponLight(){}
defaultproperties
{
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun'
MovementAnims(0)="JogF_Cheetah"
MovementAnims(1)="JogB_Cheetah"
MovementAnims(2)="JogL_Cheetah"
MovementAnims(3)="JogR_Cheetah"
TurnLeftAnim="TurnL_Cheetah"
TurnRightAnim="TurnR_Cheetah"
CrouchAnims(0)="CHwalkF_Cheetah"
CrouchAnims(1)="CHwalkB_Cheetah"
CrouchAnims(2)="CHwalkL_Cheetah"
CrouchAnims(3)="CHwalkR_Cheetah"
WalkAnims(0)="WalkF_Cheetah"
WalkAnims(1)="WalkB_Cheetah"
WalkAnims(2)="WalkL_Cheetah"
WalkAnims(3)="WalkR_Cheetah"
CrouchTurnRightAnim="CH_TurnR_Cheetah"
CrouchTurnLeftAnim="CH_TurnL_Cheetah"
IdleCrouchAnim="CHIdle_Cheetah"
IdleWeaponAnim="Idle_Cheetah"
IdleRestAnim="Idle_Cheetah"
IdleChatAnim="Idle_Cheetah"
IdleHeavyAnim="Idle_Cheetah"
IdleRifleAnim="Idle_Cheetah"
FireAnims(0)="Fire_AK47"
FireAnims(1)="Fire_AK47"
FireAnims(2)="Fire_AK47"
FireAnims(3)="Fire_AK47"
FireAltAnims(0)="Fire_AK47"
FireAltAnims(1)="Fire_AK47"
FireAltAnims(2)="Fire_AK47"
FireAltAnims(3)="Fire_AK47"
FireCrouchAnims(0)="CHFire_AK47"
FireCrouchAnims(1)="CHFire_AK47"
FireCrouchAnims(2)="CHFire_AK47"
FireCrouchAnims(3)="CHFire_AK47"
FireCrouchAltAnims(0)="CHFire_AK47"
FireCrouchAltAnims(1)="CHFire_AK47"
FireCrouchAltAnims(2)="CHFire_AK47"
FireCrouchAltAnims(3)="CHFire_AK47"
HitAnims(0)="HitF_Cheetah"
HitAnims(1)="HitB_Cheetah"
HitAnims(2)="HitL_Cheetah"
HitAnims(3)="HitR_Cheetah"
PostFireBlendStandAnim="Blend_Cheetah"
PostFireBlendCrouchAnim="CHBlend_Cheetah"
MeshRef="HTec_A.FreezerGun_3rd"
Mesh=SkeletalMesh'HTec_A.FreezerGun_3rd'
}

View file

@ -0,0 +1,6 @@
class FreezerDart extends IceDart;
defaultproperties
{
MyDamageType=Class'ScrnHTec.DamTypeFreezerDart'
}

View file

@ -0,0 +1,14 @@
class FreezerDartAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=30
MaxAmmo=240
InitialAmount=90
PickupClass=Class'ScrnHTec.FreezerDartAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="Ice Shards"
}

View file

@ -0,0 +1,8 @@
class FreezerDartAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=30
InventoryType=Class'ScrnHTec.FreezerDartAmmo'
PickupMessage="Ice Shards"
}

View file

@ -0,0 +1,67 @@
class FreezerFire extends KFShotgunFire;
simulated function PostBeginPlay()
{
super.PostBeginPlay();
Load = ProjPerFire; // don't use AmmoPerFire here
}
simulated function bool AllowFire()
{
if(KFWeapon(Weapon).bIsReloading)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if(KFPawn(Instigator).bThrowingNade)
return false;
if(KFWeapon(Weapon).MagAmmoRemaining < AmmoPerFire)
{
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( AIController(Instigator.Controller)!=None )
KFWeapon(Weapon).ReloadMeNow();
return false;
}
return super(WeaponFire).AllowFire();
}
event ModeDoFire()
{
super.ModeDoFire();
Load = ProjPerFire; // don't use AmmoPerFire here
}
defaultproperties
{
RecoilRate=0.130000
maxVerticalRecoilAngle=200
maxHorizontalRecoilAngle=75
FireAimedAnim="Fire_Iron"
FireSoundRef="HTec_A.Fire1mono"
StereoFireSoundRef="HTec_A.Fire1"
NoAmmoSoundRef="KF_NailShotgun.Fire.KF_NailShotgun_Dryfire"
ProjPerFire=1
ProjSpawnOffset=(X=18.000000,Z=-8.000000)
TransientSoundVolume=1.000000
FireLoopAnim="Fire"
FireAnimRate=1.200000
TweenTime=0.001500
FireRate=0.150000
AmmoClass=Class'ScrnHTec.FreezerDartAmmo'
ShakeRotMag=(X=50.000000,Y=50.000000,Z=350.000000)
ShakeRotRate=(X=5000.000000,Y=5000.000000,Z=5000.000000)
ShakeRotTime=0.750000
ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=7.500000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.250000
ProjectileClass=Class'ScrnHTec.FreezerDart'
BotRefireRate=0.990000
FlashEmitterClass=Class'ScrnHTec.IceDartMuzzleFlash'
aimerror=42.000000
Spread=0.008000
}

View file

@ -0,0 +1,431 @@
class FreezerGun extends KFWeapon;
#exec OBJ LOAD FILE=HTec_A.ukx
var ScriptedTexture AmmoCounterScrTex;
var string AmmoCounterScrTexRef;
var string MyMessage;
var Font MyFont, SmallMyFont;
var String FontRef, FontSmallRef;
var color MyFontColor;
var int AltMagAmmoRemaining;
var() int AltMagCapacity;
var int RenderedValue;
var localized string ReloadMessage;
var localized string EmptyMessage;
var array<Material> GlowSkins; // 0 - glow off, length-1 - all lights on
var array<string> GlowSkinRefs; // 0 - glow off, length-1 - all lights on
replication
{
reliable if(Role == ROLE_Authority)
AltMagAmmoRemaining;
reliable if( bNetDirty && bNetOwner && Role==ROLE_Authority )
AltMagCapacity;
}
static function PreloadAssets(Inventory Inv, optional bool bSkipRefCount)
{
local FreezerGun W;
local int i;
super.PreloadAssets(Inv, bSkipRefCount);
default.AmmoCounterScrTex = ScriptedTexture(DynamicLoadObject(default.AmmoCounterScrTexRef, class'ScriptedTexture', true));
default.MyFont = Font(DynamicLoadObject(default.FontRef, class'Font', true));
default.SmallMyFont = Font(DynamicLoadObject(default.FontSmallRef, class'Font', true));
for ( i = 0; i < default.GlowSkinRefs.Length; i++ )
default.GlowSkins[i] = Material(DynamicLoadObject(default.GlowSkinRefs[i], class'Material'));
W = FreezerGun(Inv);
if ( W != none ) {
W.AmmoCounterScrTex = default.AmmoCounterScrTex;
W.SmallMyFont = default.SmallMyFont;
W.MyFont = default.MyFont;
for ( i = 0; i < default.GlowSkins.Length; i++ )
W.GlowSkins[i] = default.GlowSkins[i];
}
}
static function bool UnloadAssets()
{
local int i;
if ( super.UnloadAssets() ) {
default.AmmoCounterScrTex = none;
default.SmallMyFont = none;
default.MyFont = none;
for ( i = 0; i < default.GlowSkins.Length; i++ )
default.GlowSkins[i] = none;
return true;
}
return false;
}
simulated final function SetTextColor( byte R, byte G, byte B )
{
MyFontColor.R = R;
MyFontColor.G = G;
MyFontColor.B = B;
MyFontColor.A = 255;
}
simulated function RenderOverlays( Canvas Canvas )
{
local float CurValue;
CurValue = (AmmoAmount(0) + AmmoAmount(1))*1000 + MagAmmoRemaining + AltMagAmmoRemaining;
if( MagAmmoRemaining <= 0 && AltMagAmmoRemaining <= 0 )
{
if( RenderedValue!=-5 )
{
RenderedValue = -5;
MyFont = SmallMyFont;
SetTextColor(218,18,18);
MyMessage = EmptyMessage;
++AmmoCounterScrTex.Revision;
GlowOff();
}
}
else if( bIsReloading )
{
if( RenderedValue!=-4 )
{
RenderedValue = -4;
MyFont = SmallMyFont;
SetTextColor(30,38,43);
MyMessage = ReloadMessage;
++AmmoCounterScrTex.Revision;
}
}
else if( RenderedValue != CurValue )
{
RenderedValue = CurValue;
MyFont = SmallMyFont;
//if ((MagAmmoRemaining ) <= (MagCapacity/2))
// SetTextColor(32,60,77);
if ( MagAmmoRemaining < 10 || AltMagAmmoRemaining < 30 )
SetTextColor(224,44,56);
else
SetTextColor(30,38,43);
MyMessage = MagAmmoRemaining $ " / " $ AltMagAmmoRemaining;
++AmmoCounterScrTex.Revision;
// glowstage
if ( AltMagAmmoRemaining == 0 )
GlowOff();
else
GlowStage(AltMagAmmoRemaining/15 + 1);
}
AmmoCounterScrTex.Client = Self;
Super.RenderOverlays(Canvas);
AmmoCounterScrTex.Client = None;
}
simulated function RenderTexture( ScriptedTexture Tex )
{
local int w, h;
// Ammo - ( w / 2 ) - ( h / 1.2 )
Tex.TextSize( MyMessage, MyFont, w, h );
Tex.DrawText( ( Tex.USize / 2.4) - ( w / 2 ), (Tex.VSize / 2 ) - ( h / 2 ),MyMessage, MyFont, MyFontColor );
}
simulated function bool ConsumeAmmo( int Mode, float Load, optional bool bAmountNeededIsMax )
{
local Inventory Inv;
local bool bOutOfAmmo;
local KFWeapon KFWeap;
if ( Load > 0 )
Load = FireMode[Mode].AmmoPerFire;
if ( Super(Weapon).ConsumeAmmo(Mode, Load, bAmountNeededIsMax) )
{
if ( Load > 0 && (Mode == 0 || bReduceMagAmmoOnSecondaryFire) ) {
MagAmmoRemaining -= Load; // Changed from "MagAmmoRemaining--" -- PooSH
if ( MagAmmoRemaining < 0 )
MagAmmoRemaining = 0;
}
else if ( Load > 0 && Mode == 1 ) {
AltMagAmmoRemaining -= Load;
if ( AltMagAmmoRemaining < 0 )
AltMagAmmoRemaining = 0;
}
if ( AltMagAmmoRemaining == 0 )
GlowOff();
NetUpdateTime = Level.TimeSeconds - 1;
if ( FireMode[Mode].AmmoPerFire > 0 && InventoryGroup > 0 && !bMeleeWeapon && bConsumesPhysicalAmmo
&& (Ammo[0] == none || FireMode[0] == none || FireMode[0].AmmoPerFire <= 0 || Ammo[0].AmmoAmount < FireMode[0].AmmoPerFire)
&& (Ammo[1] == none || FireMode[1] == none || FireMode[1].AmmoPerFire <= 0 || Ammo[1].AmmoAmount < FireMode[1].AmmoPerFire) )
{
bOutOfAmmo = true;
for ( Inv = Instigator.Inventory; Inv != none; Inv = Inv.Inventory )
{
KFWeap = KFWeapon(Inv);
if ( Inv.InventoryGroup > 0 && KFWeap != none && !KFWeap.bMeleeWeapon && KFWeap.bConsumesPhysicalAmmo &&
((KFWeap.Ammo[0] != none && KFWeap.FireMode[0] != none && KFWeap.FireMode[0].AmmoPerFire > 0 &&KFWeap.Ammo[0].AmmoAmount >= KFWeap.FireMode[0].AmmoPerFire) ||
(KFWeap.Ammo[1] != none && KFWeap.FireMode[1] != none && KFWeap.FireMode[1].AmmoPerFire > 0 && KFWeap.Ammo[1].AmmoAmount >= KFWeap.FireMode[1].AmmoPerFire)) )
{
bOutOfAmmo = false;
break;
}
}
if ( bOutOfAmmo )
{
PlayerController(Instigator.Controller).Speech('AUTO', 3, "");
}
}
return true;
}
return false;
}
simulated function bool StartFire(int Mode)
{
if( Mode == 0 )
return super.StartFire(Mode);
if( !super.StartFire(Mode) ) // returns false when mag is empty
return false;
if( AmmoAmount(Mode) <= 0 )
return false;
AnimStopLooping();
if( !FireMode[Mode].IsInState('FireLoop') && (AmmoAmount(Mode) > 0) )
{
FireMode[Mode].StartFiring();
return true;
}
else
{
return false;
}
return true;
}
simulated function AnimEnd(int channel)
{
if(!FireMode[1].IsInState('FireLoop'))
{
Super.AnimEnd(channel);
}
}
// Allow this weapon to auto reload on alt fire
simulated function Fire(float F)
{
if( MagAmmoRemaining < FireMode[0].AmmoPerFire && !bIsReloading &&
FireMode[0].NextFireTime <= Level.TimeSeconds )
{
// We're dry, ask the server to autoreload
ServerRequestAutoReload();
PlayOwnedSound(FireMode[0].NoAmmoSound,SLOT_None,2.0,,,,false);
}
super.Fire(F);
}
simulated function AltFire(float F)
{
if( AltMagAmmoRemaining < FireMode[1].AmmoPerFire && !bIsReloading &&
FireMode[1].NextFireTime <= Level.TimeSeconds )
{
// We're dry, ask the server to autoreload
ServerRequestAutoReload();
PlayOwnedSound(FireMode[1].NoAmmoSound,SLOT_None,2.0,,,,false);
}
super.AltFire(F);
}
simulated function bool AllowReload()
{
if ( bIsReloading )
return false;
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
if ( (MagAmmoRemaining >= MagCapacity || AmmoAmount(0) <= MagAmmoRemaining)
&& (AltMagAmmoRemaining >= AltMagCapacity || AmmoAmount(1) <= AltMagAmmoRemaining) )
return false;
if ( KFInvasionBot(Instigator.Controller) != none || KFFriendlyAI(Instigator.Controller) != none )
return true;
return !FireMode[0].IsFiring() && !FireMode[1].IsFiring()
&& ClientState != WS_BringUp
&& Level.TimeSeconds > FireMode[0].NextFireTime + 0.1
&& Level.TimeSeconds > FireMode[1].NextFireTime + 0.1;
}
simulated function UpdateMagCapacity(PlayerReplicationInfo PRI)
{
local float bonus;
bonus = 1.0;
if ( KFPlayerReplicationInfo(PRI) != none && KFPlayerReplicationInfo(PRI).ClientVeteranSkill != none )
{
bonus = KFPlayerReplicationInfo(PRI).ClientVeteranSkill.Static.GetMagCapacityMod(KFPlayerReplicationInfo(PRI), self);
}
MagCapacity = default.MagCapacity * bonus;
AltMagCapacity = default.AltMagCapacity * bonus;
}
simulated function WeaponTick(float dt)
{
if ( Role == ROLE_Authority && bIsReloading && (Level.TimeSeconds - ReloadTimer) >= ReloadRate ) {
AddReloadedAmmo();
ActuallyFinishReloading();
}
super.WeaponTick(dt);
}
function AddReloadedAmmo()
{
UpdateMagCapacity(Instigator.PlayerReplicationInfo);
MagAmmoRemaining = min(MagCapacity, AmmoAmount(0));
AltMagAmmoRemaining = min(AltMagCapacity, AmmoAmount(1));
if( !bHoldToReload )
{
ClientForceAmmoUpdate(0, AmmoAmount(0));
ClientForceAmmoUpdate(1, AmmoAmount(1));
}
if ( PlayerController(Instigator.Controller) != none && KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements) != none )
{
KFSteamStatsAndAchievements(PlayerController(Instigator.Controller).SteamStatsAndAchievements).OnWeaponReloaded();
}
}
simulated function ClientFinishReloading()
{
bIsReloading = false;
// Reload animation longs 4.5s while weapon becomes ready in 3.6s
// Continue animation for last 0.9s if player is not shooting
// -- PooSH
//PlayIdle();
SetTimer(0.9, false);
if(Instigator.PendingWeapon != none && Instigator.PendingWeapon != self)
Instigator.Controller.ClientSwitchToBestWeapon();
}
function GiveTo( pawn Other, optional Pickup Pickup )
{
UpdateMagCapacity(Other.PlayerReplicationInfo);
if ( KFWeaponPickup(Pickup)!=None && Pickup.bDropped ) {
MagAmmoRemaining = Clamp(KFWeaponPickup(Pickup).MagAmmoRemaining, 0, MagCapacity);
AltMagAmmoRemaining = Clamp(FreezerPickup(Pickup).AltMagAmmoRemaining, 0, AltMagCapacity);
}
else {
MagAmmoRemaining = MagCapacity;
AltMagAmmoRemaining = AltMagCapacity;
}
Super(Weapon).GiveTo(Other,Pickup);
}
simulated function GlowOn()
{
GlowStage(255);
}
simulated function GlowOff()
{
GlowStage(0);
}
simulated function GlowStage(byte Stage)
{
Skins[0] = GlowSkins[min(Stage,GlowSkins.length-1)];
}
simulated function Timer()
{
if ( ClientState == WS_ReadyToFire )
PlayIdle();
else
super.Timer();
}
defaultproperties
{
AmmoCounterScrTexRef="HTec_A.Counter.Counter_Scripted"
FontRef="IJCFonts.DigitalBig"
FontSmallRef="IJCFonts.DigitalMed"
MyFontColor=(B=177,G=148,R=76,A=255)
AltMagCapacity=90
ReloadMessage="REL"
EmptyMessage="---"
GlowSkinRefs(0)="HTec_A.FreezerGun.FreezerGun_shdr_off"
GlowSkinRefs(1)="HTec_A.FreezerGun.FreezerGun_shdr_1"
GlowSkinRefs(2)="HTec_A.FreezerGun.FreezerGun_shdr_2"
GlowSkinRefs(3)="HTec_A.FreezerGun.FreezerGun_shdr_3"
GlowSkinRefs(4)="HTec_A.FreezerGun.FreezerGun_shdr"
MagCapacity=30
ReloadRate=3.600000
bHasSecondaryAmmo=True
bReduceMagAmmoOnSecondaryFire=False
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_M7A3"
Weight=7.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=65.000000
bModeZeroCanDryFire=True
SleeveNum=3
TraderInfoTexture=Texture'HTec_A.HUD.Trader_FreezerGun'
bIsTier3Weapon=True
MeshRef="HTec_A.FreezerGun"
SkinRefs(0)="HTec_A.FreezerGun.FreezerGun_shdr"
SkinRefs(1)="HTec_A.Counter.Counter_Shdr"
SkinRefs(2)="HTec_A.FreezerGun.FreezerGun_Sight_shdr"
SelectSoundRef="KF_NailShotgun.Handling.KF_NailShotgun_Pickup"
HudImageRef="HTec_A.HUD.FreezerGun_Unselected"
SelectedHudImageRef="HTec_A.HUD.FreezerGun"
PlayerIronSightFOV=70.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'ScrnHTec.FreezerFire'
FireModeClass(1)=Class'ScrnHTec.FreezerAltFire'
PutDownAnim="PutDown"
SelectForce="SwitchToAssaultRifle"
AIRating=0.550000
CurrentRating=0.550000
bShowChargingBar=True
Description="Cryo Mass Driver v014 or simply a 'Freezer Gun' is developed to ... blah blah blah ... freeze zeds"
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=65.000000
Priority=150
InventoryGroup=4
GroupOffset=15
PickupClass=Class'ScrnHTec.FreezerPickup'
PlayerViewOffset=(X=25.000000,Y=23.000000,Z=-5.000000)
BobDamping=4.500000
AttachmentClass=Class'ScrnHTec.FreezerAttachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="Cryo Mass Driver 14 SE"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,5 @@
class FreezerNitroProjectile extends NitroProjectile;
defaultproperties
{
}

View file

@ -0,0 +1,9 @@
class FreezerPickup extends FreezerPrimaryPickup;
defaultproperties
{
AmmoCost=40
BuyClipSize=90
SecondaryAmmoShortName="-- Liquid Nitrogen"
PrimaryWeaponPickup=Class'ScrnHTec.FreezerPrimaryPickup'
}

View file

@ -0,0 +1,40 @@
class FreezerPrimaryPickup extends KFWeaponPickup
abstract;
var int AltMagAmmoRemaining;
function InitDroppedPickupFor(Inventory Inv)
{
local FreezerGun W;
W = FreezerGun(Inv);
if ( W != none ) {
AltMagAmmoRemaining = W.AltMagAmmoRemaining;
}
super.InitDroppedPickupFor(Inv);
}
defaultproperties
{
Weight=7.000000
cost=4000
AmmoCost=25
BuyClipSize=30
PowerValue=30
SpeedValue=55
RangeValue=25
Description="Cryo Mass Driver v014 or simply a 'Freezer Gun' is developed to ... blah blah blah ... freeze zeds"
ItemName="Cryo Mass Driver 14 SE"
ItemShortName="Cryo MD14 SE"
AmmoItemName="Ice Darts"
CorrespondingPerkIndex=11
EquipmentCategoryID=3
InventoryType=Class'ScrnHTec.FreezerGun'
PickupMessage="You got the Cryo Mass Driver 14"
PickupSound=Sound'KF_NailShotgun.Handling.KF_NailShotgun_Pickup'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'HTec_A.FreezerGun_Pickup'
DrawScale=1.500000
CollisionRadius=35.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,57 @@
class FrozenDosh extends ScrnCashPickup;
var FrozenDosh HeadDosh, NextDosh;
var bool bCryoExpertAchFailed;
// fixes none reference issue -- PooSH
function GiveCashTo( Pawn Other )
{
local SRStatsBase Stats;
if( Other.Controller!=None && Other.Controller.PlayerReplicationInfo!=none ) {
Other.Controller.PlayerReplicationInfo.Score += CashAmount;
Stats = SRStatsBase(PlayerController(Other.Controller).SteamStatsAndAchievements);
if ( Stats != none ) {
if ( Other.Health < 25 )
class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'Freeze_DoshSui', CashAmount);
class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'Freeze_Dosh', CashAmount);
}
}
if ( DroppedBy != none && DroppedBy == Other.Controller ) {
if ( HeadDosh == self && NextDosh == none && !bCryoExpertAchFailed )
class'ScrnAchievements'.static.ProgressAchievementByID(Stats.Rep, 'Freeze_Expert', 1);
}
else if ( HeadDosh != none )
HeadDosh.bCryoExpertAchFailed = true;
AnnouncePickup(Other);
Destroy();
}
simulated function Destroyed()
{
local FrozenDosh dosh;
local int c;
if ( HeadDosh == self ) {
for ( dosh=NextDosh; dosh!=none && (++c)<=10; dosh=dosh.NextDosh ) {
dosh.HeadDosh = NextDosh;
dosh.bCryoExpertAchFailed = bCryoExpertAchFailed;
}
}
else {
for ( dosh=HeadDosh; dosh!=none && (++c)<=10; dosh=dosh.NextDosh )
if ( dosh.NextDosh == self ) {
dosh.NextDosh = NextDosh;
break;
}
}
super.Destroyed();
}
defaultproperties
{
FadeOutTime=20.000000
bAutoFadeOutTime=False
DrawScale=0.300000
UV2Texture=None
}

View file

@ -0,0 +1,18 @@
class HTecMut extends Mutator;
function PostBeginPlay()
{
// FreezeRules are spawned inside FreezeAchHandler, which ensures that they are added
// AFTER ScrnGameRules. Don't spawn them anywhere else.
class'ScrnAchievements'.static.RegisterAchievements(class'FreezeAch');
Level.Game.Spawn(class'FreezeAchHandler');
Destroy();
}
defaultproperties
{
bAddToServerPackages=True
GroupName="KF-Freezer"
FriendlyName="ScrN Horzine Technician"
Description="Horzine Technician featuring IJC Cryo Mass Driver 14. Requires ScrN Balance v9+."
}

View file

@ -0,0 +1,6 @@
class HTecProg extends SRCustomProgressInt;
defaultproperties
{
ProgressName="Frozen/Zapped ZEDs"
}

View file

@ -0,0 +1,11 @@
class HTecZEDGun extends ZEDGun;
defaultproperties
{
Weight=7.000000
UnlockedByAchievement=-1
FireModeClass(0)=Class'ScrnHTec.HTecZEDGunFire'
FireModeClass(1)=Class'ScrnHTec.HTecZEDGunAltFire'
PickupClass=Class'ScrnHTec.HTecZEDGunPickup'
ItemName="HTec ZED Eradication Device"
}

View file

@ -0,0 +1,5 @@
class HTecZEDGunAltFire extends ZEDGunAltFire;
defaultproperties
{
}

View file

@ -0,0 +1,6 @@
class HTecZEDGunFire extends ZEDGunFire;
defaultproperties
{
ProjectileClass=Class'ScrnHTec.HTecZEDGunProjectile'
}

View file

@ -0,0 +1,9 @@
class HTecZEDGunPickup extends ZEDGunPickup;
defaultproperties
{
Weight=7.000000
ItemName="HTec ZED Gun"
CorrespondingPerkIndex=11
InventoryType=Class'ScrnHTec.HTecZEDGun'
}

View file

@ -0,0 +1,7 @@
class HTecZEDGunProjectile extends ZEDGunProjectile;
defaultproperties
{
HeadShotDamageMult=1.100000
MyDamageType=Class'ScrnHTec.DamTypeHTecZEDGun'
}

View file

@ -0,0 +1,9 @@
class HTecZEDMKII extends ScrnZEDMKIIWeapon;
defaultproperties
{
FireModeClass(0)=Class'ScrnHTec.HTecZEDMKIIFire'
FireModeClass(1)=Class'ScrnHTec.HTecZEDMKIIAltFire'
PickupClass=Class'ScrnHTec.HTecZEDMKIIPickup'
ItemName="HTec ZED Eradication Device MKII"
}

View file

@ -0,0 +1,6 @@
class HTecZEDMKIIAltFire extends ScrnZEDMKIIAltFire;
defaultproperties
{
ProjectileClass=Class'ScrnHTec.HTecZEDMKIISecondaryProjectile'
}

View file

@ -0,0 +1,6 @@
class HTecZEDMKIIFire extends ZEDMKIIFire;
defaultproperties
{
ProjectileClass=Class'ScrnHTec.HTecZEDMKIIPrimaryProjectile'
}

View file

@ -0,0 +1,9 @@
class HTecZEDMKIIPickup extends ScrnZEDMKIIPickup;
defaultproperties
{
ItemName="HTec ZED Gun MKII"
ItemShortName="ZED Gun MKII"
CorrespondingPerkIndex=11
InventoryType=Class'ScrnHTec.HTecZEDMKII'
}

View file

@ -0,0 +1,6 @@
class HTecZEDMKIIPrimaryProjectile extends ZEDMKIIPrimaryProjectile;
defaultproperties
{
MyDamageType=Class'ScrnHTec.DamTypeHTecZEDGunMKII'
}

View file

@ -0,0 +1,5 @@
class HTecZEDMKIISecondaryProjectile extends ScrnZEDMKIISecondaryProjectile;
defaultproperties
{
}

View file

@ -0,0 +1,351 @@
class IceChunkEmitter extends Emitter;
var() array<Sound> ImpactSounds;
simulated function PostBeginPlay()
{
if( ImpactSounds.Length>0 )
PlaySound(ImpactSounds[Rand(ImpactSounds.Length)]);
}
defaultproperties
{
ImpactSounds(0)=Sound'KFWeaponSound.bullethitglass'
ImpactSounds(1)=Sound'KFWeaponSound.bullethitglass2'
Begin Object Class=MeshEmitter Name=MeshEmitter0
StaticMesh=StaticMesh'HTec_A.IceChunk1'
UseCollision=True
RespawnDeadParticles=False
SpinParticles=True
DampRotation=True
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-1000.000000)
DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=5
SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
StartSizeRange=(X=(Min=5.000000,Max=8.000000),Y=(Min=5.000000,Max=8.000000),Z=(Min=5.000000,Max=8.000000))
InitialParticlesPerSecond=10000.000000
StartVelocityRange=(X=(Min=-75.000000,Max=75.000000),Y=(Min=-75.000000,Max=75.000000),Z=(Min=-100.000000,Max=300.000000))
End Object
Emitters(0)=MeshEmitter'ScrnHTec.IceChunkEmitter.MeshEmitter0'
Begin Object Class=MeshEmitter Name=MeshEmitter2
StaticMesh=StaticMesh'HTec_A.IceChunk2'
UseCollision=True
RespawnDeadParticles=False
SpinParticles=True
DampRotation=True
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-1000.000000)
DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=8
DetailMode=DM_High
SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
StartSizeRange=(X=(Min=3.000000,Max=6.000000),Y=(Min=3.000000,Max=6.000000),Z=(Min=3.000000,Max=6.000000))
InitialParticlesPerSecond=10000.000000
StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-100.000000,Max=500.000000))
End Object
Emitters(1)=MeshEmitter'ScrnHTec.IceChunkEmitter.MeshEmitter2'
Begin Object Class=MeshEmitter Name=MeshEmitter3
StaticMesh=StaticMesh'HTec_A.IceChunk3'
UseCollision=True
RespawnDeadParticles=False
SpinParticles=True
DampRotation=True
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-1000.000000)
DampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
MaxParticles=12
DetailMode=DM_High
SpinsPerSecondRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000),Y=(Min=-1.000000,Max=1.000000),Z=(Min=-1.000000,Max=1.000000))
RotationDampingFactorRange=(X=(Min=0.200000,Max=0.200000),Y=(Min=0.200000,Max=0.200000),Z=(Min=0.200000,Max=0.200000))
StartSizeRange=(X=(Min=2.000000,Max=5.000000),Y=(Min=2.000000,Max=5.000000),Z=(Min=2.000000,Max=5.000000))
InitialParticlesPerSecond=10000.000000
StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-100.000000,Max=500.000000))
End Object
Emitters(2)=MeshEmitter'ScrnHTec.IceChunkEmitter.MeshEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter8
UseCollision=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
Acceleration=(Z=-1000.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
FadeOutStartTime=0.500000
MaxParticles=55
DetailMode=DM_SuperHigh
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=0.700000,Max=1.700000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.400000,Max=1.400000)
StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000))
End Object
Emitters(3)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter8'
Begin Object Class=SpriteEmitter Name=SpriteEmitter9
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-1000.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.500000
FadeOutStartTime=0.442500
FadeInEndTime=0.007500
MaxParticles=25
DetailMode=DM_High
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.700000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000)
StartSizeRange=(X=(Min=20.000000,Max=40.000000),Y=(Min=20.000000,Max=40.000000),Z=(Min=20.000000,Max=40.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.watersplatter2'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-25.000000,Max=300.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter9'
Begin Object Class=SpriteEmitter Name=SpriteEmitter10
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=0.175000
MaxParticles=5
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
AddLocationFromOtherEmitter=0
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000))
InitialParticlesPerSecond=1.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=0.350000,Max=0.350000)
End Object
Emitters(5)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter10'
Begin Object Class=SpriteEmitter Name=SpriteEmitter11
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=0.175000
MaxParticles=8
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
AddLocationFromOtherEmitter=1
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000))
InitialParticlesPerSecond=1.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=0.350000,Max=0.350000)
End Object
Emitters(6)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter11'
Begin Object Class=SpriteEmitter Name=SpriteEmitter12
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=0.175000
MaxParticles=12
DetailMode=DM_High
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
AddLocationFromOtherEmitter=2
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=6.000000,Max=60.000000),Y=(Min=6.000000,Max=60.000000),Z=(Min=6.000000,Max=60.000000))
InitialParticlesPerSecond=1.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=0.350000,Max=0.350000)
End Object
Emitters(7)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter12'
Begin Object Class=SpriteEmitter Name=SpriteEmitter13
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-1000.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=0.442500
FadeInEndTime=0.007500
MaxParticles=12
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.900000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000)
StartSizeRange=(X=(Min=25.000000,Max=45.000000),Y=(Min=25.000000,Max=45.000000),Z=(Min=25.000000,Max=45.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.watersplashcloud'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=-150.000000,Max=150.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-5.000000,Max=150.000000))
End Object
Emitters(8)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter13'
Begin Object Class=SpriteEmitter Name=SpriteEmitter14
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-22.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.500000
FadeOutStartTime=2.720000
MaxParticles=25
DetailMode=DM_High
StartLocationRange=(X=(Min=-10.000000,Max=10.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.150000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=2.200000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=3.200000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=4.000000)
StartSizeRange=(X=(Min=1.000000,Max=20.000000),Y=(Min=1.000000,Max=20.000000),Z=(Min=1.000000,Max=20.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
StartVelocityRange=(X=(Min=-350.000000,Max=350.000000),Y=(Min=-350.000000,Max=350.000000),Z=(Min=-5.000000,Max=50.000000))
VelocityLossRange=(X=(Min=3.000000,Max=3.000000),Y=(Min=3.000000,Max=3.000000))
End Object
Emitters(9)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter14'
Begin Object Class=SpriteEmitter Name=SpriteEmitter15
UseCollision=True
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
Acceleration=(Z=-1000.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=174,G=174,R=205,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=174,G=174,R=205,A=255))
FadeOutStartTime=0.500000
MaxParticles=15
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=0.700000,Max=1.700000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.400000,Max=1.400000)
StartVelocityRange=(X=(Min=-200.000000,Max=200.000000),Y=(Min=-200.000000,Max=200.000000),Z=(Min=-300.000000,Max=350.000000))
End Object
Emitters(10)=SpriteEmitter'ScrnHTec.IceChunkEmitter.SpriteEmitter15'
AutoDestroy=True
bNoDelete=False
bNetTemporary=True
RemoteRole=ROLE_SimulatedProxy
LifeSpan=5.000000
TransientSoundVolume=150.000000
TransientSoundRadius=80.000000
}

View file

@ -0,0 +1,115 @@
class IceDart extends ShotgunBullet
abstract;
var Emitter TrailEffect;
simulated function PostBeginPlay()
{
Super(Projectile).PostBeginPlay();
Velocity = Speed * Vector(Rotation); // starts off slower so combo can be done closer
if ( Level.NetMode != NM_DedicatedServer )
{
if ( !PhysicsVolume.bWaterVolume )
{
Trail = Spawn(class'IceDartTracer',self);
Trail.Lifespan = Lifespan;
if ( Level.DetailMode >= DM_SuperHigh ) {
TrailEffect = Spawn(class'IceDartTrail',self);
TrailEffect.Lifespan = Lifespan;
}
}
}
}
simulated function Destroyed()
{
if (TrailEffect !=None) {
TrailEffect.Kill();
TrailEffect.SetPhysics(PHYS_NONE);
}
Super.Destroyed();
}
simulated function ProcessTouch (Actor Other, vector HitLocation)
{
local vector X;
local Vector TempHitLocation, HitNormal;
local array<int> HitPoints;
local KFPawn HitPawn;
if ( Other == none || Other == Instigator || Other.Base == Instigator || !Other.bBlockHitPointTraces )
return;
X = Vector(Rotation);
if( ROBulletWhipAttachment(Other) != none )
{
if(!Other.Base.bDeleteMe)
{
Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1);
if( Other == none || HitPoints.Length == 0 )
return;
HitPawn = KFPawn(Other);
if (Role == ROLE_Authority)
{
if ( HitPawn != none )
{
// Hit detection debugging
/*log("Bullet hit "$HitPawn.PlayerReplicationInfo.PlayerName);
HitPawn.HitStart = HitLocation;
HitPawn.HitEnd = HitLocation + (65535 * X);*/
if( !HitPawn.bDeleteMe )
HitPawn.ProcessLocationalDamage(Damage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), MyDamageType,HitPoints);
// Hit detection debugging
//if( Level.NetMode == NM_Standalone)
// HitPawn.DrawBoneLocation();
}
}
}
}
else
{
if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0))
{
Pawn(Other).TakeDamage(Damage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
}
else
{
Other.TakeDamage(Damage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
}
}
if ( ImpactEffect != None && (Level.NetMode != NM_DedicatedServer) && !Level.bDropDetail && Level.DetailMode > DM_Low )
Spawn(ImpactEffect,,, Location, rotator(-HitNormal));
// no penetration
Destroy();
}
defaultproperties
{
ImpactSounds(0)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
ImpactSounds(1)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
ImpactSounds(2)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
ImpactSounds(3)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
ImpactSounds(4)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
ImpactSounds(5)=SoundGroup'ProjectileSounds.Bullets.Impact_Metal'
PenDamageReduction=0.000000
ImpactEffect=Class'ScrnHTec.IceDartHitEffect'
Speed=5000.000000
MaxSpeed=7000.000000
Damage=45.000000
MyDamageType=Class'ScrnHTec.DamTypeFreezerBase'
ExplosionDecal=Class'KFMod.NailGunDecal'
StaticMesh=StaticMesh'HTec_A.IceDart-PROJ'
LifeSpan=5.000000
DrawScale=0.500000
}

View file

@ -0,0 +1,27 @@
class IceDartHitEffect extends ROHitEffect;
#exec OBJ LOAD FILE=..\Sounds\ProjectileSounds.uax
defaultproperties
{
HitEffects(0)=(HitDecal=Class'ROEffects.BulletHoleDirt',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Dirt')
HitEffects(1)=(HitDecal=Class'ROEffects.BulletHoleConcrete',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Asphalt')
HitEffects(2)=(HitDecal=Class'ROEffects.BulletHoleDirt',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Dirt')
HitEffects(3)=(HitDecal=Class'ROEffects.BulletHoleMetal',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Metal')
HitEffects(4)=(HitDecal=Class'ROEffects.BulletHoleWood',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Wood')
HitEffects(5)=(HitDecal=Class'ROEffects.BulletHoleDirt',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Grass')
HitEffects(6)=(HitDecal=Class'ROEffects.BulletHoleFlesh',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Mud')
HitEffects(7)=(HitDecal=Class'ROEffects.BulletHoleIce',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Glass')
HitEffects(8)=(HitDecal=Class'ROEffects.BulletHoleSnow',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Snow')
HitEffects(9)=(HitEffect=Class'ROEffects.ROBulletHitWaterEffect',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Snow')
HitEffects(10)=(HitDecal=Class'ROEffects.BulletHoleIce',HitEffect=Class'ROEffects.ROBreakingGlass',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Glass')
HitEffects(11)=(HitDecal=Class'ROEffects.BulletHoleConcrete',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Gravel')
HitEffects(12)=(HitDecal=Class'ROEffects.BulletHoleConcrete',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Asphalt')
HitEffects(13)=(HitDecal=Class'ROEffects.BulletHoleWood',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Wood')
HitEffects(14)=(HitDecal=Class'ROEffects.BulletHoleSnow',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Mud')
HitEffects(15)=(HitDecal=Class'ROEffects.BulletHoleMetalArmor',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Metal')
HitEffects(16)=(HitDecal=Class'ROEffects.BulletHoleConcrete',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Wood')
HitEffects(17)=(HitDecal=Class'ROEffects.BulletHoleCloth',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Dirt')
HitEffects(18)=(HitDecal=Class'ROEffects.BulletHoleMetal',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Dirt')
HitEffects(19)=(HitDecal=Class'ROEffects.BulletHoleDirt',HitEffect=Class'ScrnHTec.IceDartImpact',HitSound=SoundGroup'ProjectileSounds.Bullets.Impact_Mud')
}

View file

@ -0,0 +1,115 @@
class IceDartImpact extends FreezeParticlesDirectional;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=200,G=150,R=64,A=60))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=200,G=150,R=64,A=60))
Opacity=0.200000
FadeOutStartTime=0.028000
FadeInEndTime=0.006000
MaxParticles=1
StartSizeRange=(X=(Min=50.000000),Y=(Min=50.000000),Z=(Min=50.000000))
InitialParticlesPerSecond=10000.000000
Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.IceDartImpact.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-5.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
ColorScaleRepeats=1.000000
FadeOutStartTime=1.500000
MaxParticles=3
SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000))
StartSpinRange=(X=(Max=0.400000),Y=(Max=1.000000),Z=(Max=1.000000))
SizeScale(1)=(RelativeSize=0.300000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=75.000000),Y=(Min=75.000000),Z=(Min=75.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=3.000000,Max=3.000000)
StartVelocityRange=(X=(Min=-5.000000,Max=5.000000),Y=(Min=-5.000000,Max=5.000000),Z=(Min=-5.000000,Max=5.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnHTec.IceDartImpact.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
UseCollision=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
Acceleration=(Z=-1000.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.750000
FadeOutStartTime=0.500000
MaxParticles=7
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=0.500000,Max=2.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.400000,Max=1.400000)
StartVelocityRange=(X=(Min=-400.000000,Max=400.000000),Y=(Min=-400.000000,Max=400.000000),Z=(Min=-400.000000,Max=600.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnHTec.IceDartImpact.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
ColorScaleRepeats=1.000000
Opacity=0.500000
FadeOutStartTime=1.500000
MaxParticles=6
SpinsPerSecondRange=(X=(Min=0.050000,Max=0.100000),Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000))
StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
SizeScale(1)=(RelativeSize=0.400000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=50.000000,Max=75.000000),Y=(Min=50.000000,Max=75.000000),Z=(Min=50.000000,Max=75.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=3.000000,Max=3.000000)
StartVelocityRange=(X=(Min=-7.500000,Max=7.500000),Y=(Min=-7.500000,Max=7.500000),Z=(Min=-20.000000,Max=20.000000))
End Object
Emitters(3)=SpriteEmitter'ScrnHTec.IceDartImpact.SpriteEmitter3'
LifeSpan=5.000000
}

View file

@ -0,0 +1,338 @@
class IceDartMuzzleFlash extends ROMuzzleFlash1st;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
local int i;
for ( i=0; i<Emitters.length; ++i ) {
Emitters[i].SpawnParticle(1);
}
}
defaultproperties
{
Begin Object Class=BeamEmitter Name=BeamEmitter0
BeamDistanceRange=(Min=3.000000,Max=300.000000)
RotatingSheets=1
LowFrequencyNoiseRange=(X=(Min=60.000000,Max=60.000000),Y=(Min=60.000000,Max=60.000000),Z=(Min=60.000000,Max=60.000000))
LowFrequencyPoints=8
HighFrequencyNoiseRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000))
HighFrequencyPoints=3
UseLowFrequencyScale=True
UseBranching=True
BranchProbability=(Min=1.000000,Max=1.000000)
BranchEmitter=1
BranchSpawnAmountRange=(Min=1.000000,Max=2.000000)
FadeOut=True
RespawnDeadParticles=False
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=1.120000
MaxParticles=8
RotationNormal=(X=40.000000,Y=40.000000,Z=40.000000)
StartSizeRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.700000,Max=0.700000))
Texture=Texture'HTec_A.fx.Streak'
InitialTimeRange=(Max=0.250000)
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-60.000000,Max=60.000000),Y=(Min=-60.000000,Max=60.000000),Z=(Min=-60.000000,Max=60.000000))
End Object
Emitters(0)=BeamEmitter'ScrnHTec.IceDartMuzzleFlash.BeamEmitter0'
Begin Object Class=SparkEmitter Name=SparkEmitter0
LineSegmentsRange=(Min=0.000000,Max=0.000000)
TimeBetweenSegmentsRange=(Min=0.150000,Max=0.150000)
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=150,G=150,R=150,A=32))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=150,G=150,R=150,A=32))
Opacity=0.110000
FadeOutStartTime=0.250000
FadeInEndTime=0.250000
MaxParticles=3
StartLocationShape=PTLS_Sphere
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.sparkfinal2'
LifetimeRange=(Min=0.200000,Max=0.200000)
StartVelocityRange=(X=(Min=200.000000,Max=350.000000),Y=(Min=-150.000000,Max=150.000000),Z=(Min=-150.000000,Max=150.000000))
End Object
Emitters(1)=SparkEmitter'ScrnHTec.IceDartMuzzleFlash.SparkEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.150000
FadeOutStartTime=0.640000
MaxParticles=1
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=45.000000),Y=(Min=45.000000),Z=(Min=45.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'HTec_A.fx.Dart_Muzzle-1'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=1.000000,Max=1.000000)
StartVelocityRange=(Z=(Min=-25.000000,Max=-15.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=200,G=150,R=64,A=60))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=200,G=150,R=64,A=60))
Opacity=0.200000
FadeOutStartTime=0.028000
FadeInEndTime=0.006000
MaxParticles=1
StartSizeRange=(X=(Min=30.000000,Max=60.000000),Y=(Min=30.000000,Max=60.000000),Z=(Min=30.000000,Max=60.000000))
Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(3)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.350000
FadeOutStartTime=0.132000
FadeInEndTime=0.015000
MaxParticles=1
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.600000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=15.000000,Max=35.000000),Y=(Min=15.000000,Max=35.000000),Z=(Min=15.000000,Max=35.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.Smoke.LightSmoke_8Frame'
TextureUSubdivisions=4
TextureVSubdivisions=4
LifetimeRange=(Min=0.300000,Max=0.300000)
StartVelocityRange=(X=(Min=60.000000,Max=150.000000),Z=(Min=-50.000000,Max=-15.000000))
End Object
Emitters(4)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.350000
FadeOutStartTime=0.296000
FadeInEndTime=0.016000
MaxParticles=8
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.600000)
SizeScale(1)=(RelativeTime=0.680000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=5.000000,Max=50.000000),Y=(Min=5.000000,Max=50.000000),Z=(Min=5.000000,Max=50.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.800000,Max=0.800000)
StartVelocityRange=(X=(Max=150.000000),Z=(Min=-50.000000,Max=-25.000000))
End Object
Emitters(5)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
UseCollision=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
Acceleration=(X=150.000000,Z=-1000.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.600000
FadeOutStartTime=0.500000
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=0.700000,Max=1.700000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.400000,Max=1.400000)
StartVelocityRange=(X=(Min=500.000000,Max=800.000000),Y=(Min=-300.000000,Max=300.000000),Z=(Min=-300.000000,Max=300.000000))
End Object
Emitters(6)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter4'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.400000
FadeOutStartTime=0.045000
MaxParticles=1
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=1.000000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.900000)
StartSizeRange=(X=(Min=4.000000,Max=45.000000),Y=(Min=4.000000,Max=45.000000),Z=(Min=4.000000,Max=45.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.Smoke.grenadesmoke_fill'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(7)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter5'
Begin Object Class=SpriteEmitter Name=SpriteEmitter6
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.400000
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=0.050000,Max=0.050000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.300000)
StartSizeRange=(X=(Min=15.000000,Max=20.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowfinal2'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.300000,Max=1.300000)
StartVelocityRange=(X=(Min=50.000000,Max=250.000000),Y=(Min=-10.000000,Max=10.000000),Z=(Min=-50.000000,Max=-25.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.475000,RelativeVelocity=(X=0.100000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(8)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter6'
Begin Object Class=SpriteEmitter Name=SpriteEmitter7
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.650000
FadeOutStartTime=0.175000
MaxParticles=3
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=35.000000,Max=60.000000),Y=(Min=35.000000,Max=60.000000),Z=(Min=35.000000,Max=60.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=0.450000,Max=0.450000)
StartVelocityRange=(Z=(Min=-20.000000,Max=-15.000000))
End Object
Emitters(9)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter7'
Begin Object Class=SpriteEmitter Name=SpriteEmitter8
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
BlendBetweenSubdivisions=True
UseRandomSubdivision=True
UseVelocityScale=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.450000
MaxParticles=6
UseRotationFrom=PTRS_Actor
SpinsPerSecondRange=(X=(Min=-0.100000,Max=0.100000))
StartSpinRange=(X=(Min=-0.250000,Max=0.250000))
SizeScale(0)=(RelativeSize=0.600000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=1.700000)
StartSizeRange=(X=(Min=20.000000,Max=27.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=1.000000,Max=1.000000)
StartVelocityRange=(X=(Min=120.000000,Max=220.000000),Y=(Min=-75.000000,Max=75.000000),Z=(Min=-75.000000,Max=75.000000))
VelocityScale(0)=(RelativeVelocity=(X=1.000000,Y=1.000000,Z=1.000000))
VelocityScale(1)=(RelativeTime=0.475000,RelativeVelocity=(X=0.100000,Y=0.200000,Z=0.200000))
VelocityScale(2)=(RelativeTime=1.000000)
End Object
Emitters(10)=SpriteEmitter'ScrnHTec.IceDartMuzzleFlash.SpriteEmitter8'
}

View file

@ -0,0 +1,24 @@
class IceDartTracer extends pclSmoke;
defaultproperties
{
mParticleType=PT_Stream
mStartParticles=0
mMaxParticles=40
mLifeRange(0)=0.100000
mLifeRange(1)=0.100000
mRegenRange(0)=60.000000
mRegenRange(1)=60.000000
mSpawnVecB=(X=20.000000,Z=0.000000)
mSizeRange(0)=5.000000
mSizeRange(1)=5.000000
mGrowthRate=-0.500000
mColorRange(0)=(B=200,G=128,R=128,A=64)
mColorRange(1)=(B=200,G=128,R=128,A=64)
mNumTileColumns=1
mNumTileRows=1
Physics=PHYS_Trailer
LifeSpan=2.900000
Skins(0)=Texture'kf_fx_trip_t.Misc.NailTrailT'
Style=STY_Additive
}

View file

@ -0,0 +1,81 @@
class IceDartTrail extends FreezeParticlesDirectional;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
FadeIn=True
UniformSize=True
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.330000
FadeOutStartTime=1.080000
FadeInEndTime=0.120000
MaxParticles=40
SpinsPerSecondRange=(X=(Min=0.400000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000))
StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
StartSizeRange=(X=(Min=0.500000,Max=1.400000),Y=(Min=0.500000,Max=1.400000),Z=(Min=0.500000,Max=1.400000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowfinal2'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-300.000000,Max=300.000000),Y=(Min=-300.000000,Max=300.000000),Z=(Min=-300.000000,Max=300.000000))
VelocityLossRange=(X=(Max=5.000000),Y=(Max=5.000000),Z=(Max=5.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.IceDartTrail.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
UseColorScale=True
FadeOut=True
FadeIn=True
SpinParticles=True
UseSizeScale=True
UniformSize=True
ColorScale(0)=(Color=(B=140,G=140,R=140,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=120,G=120,R=120,A=150))
Opacity=0.750000
FadeOutStartTime=0.900000
FadeInEndTime=0.200000
MaxParticles=50
StartLocationShape=PTLS_Polar
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=2.000000))
StartSpinRange=(X=(Min=-0.350000,Max=0.400000))
StartSizeRange=(X=(Min=2.000000,Max=4.000000),Y=(Min=2.000000,Max=4.000000),Z=(Min=2.000000,Max=4.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'HTec_A.fx.Ice_Trail'
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(Y=(Min=-100.000000,Max=100.000000),Z=(Min=-100.000000,Max=100.000000))
VelocityLossRange=(Y=(Max=10.000000),Z=(Max=10.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnHTec.IceDartTrail.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
UseColorScale=True
FadeOut=True
FadeIn=True
SpinParticles=True
UseSizeScale=True
UniformSize=True
ColorScale(0)=(Color=(B=140,G=140,R=140,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=120,G=120,R=120,A=180))
Opacity=0.750000
FadeOutStartTime=0.900000
FadeInEndTime=0.200000
MaxParticles=50
StartLocationShape=PTLS_Sphere
SpinsPerSecondRange=(X=(Min=1.000000,Max=3.000000))
StartSpinRange=(X=(Min=-0.350000,Max=0.400000))
StartSizeRange=(X=(Min=1.000000,Max=3.000000),Y=(Min=1.000000,Max=3.000000),Z=(Min=1.000000,Max=3.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'HTec_A.fx.Ice_Trail'
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(Y=(Min=-100.000000,Max=100.000000),Z=(Min=-100.000000,Max=100.000000))
VelocityLossRange=(Y=(Max=10.000000),Z=(Max=10.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnHTec.IceDartTrail.SpriteEmitter3'
Physics=PHYS_Trailer
LifeSpan=5.000000
}

View file

@ -0,0 +1,110 @@
//=============================================================================
// K-VOLT 2
//=============================================================================
class KVolt extends KFWeapon
config(user);
#exec OBJ LOAD FILE=HTec_A.ukx
//=============================================================================
// Dynamic Asset Load
//=============================================================================
//=============================================================================
// Functions
//=============================================================================
exec function ReloadMeNow()
{
if(!AllowReload())
return;
if ( ThirdPersonActor != none && Level.NetMode != NM_DedicatedServer )
KVoltAttachment(ThirdPersonActor).PlayReload();
super.ReloadMeNow();
}
function bool RecommendRangedAttack()
{
return true;
}
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;
}
defaultproperties
{
MagCapacity=40
ReloadRate=2.900000
ReloadAnim="Reload"
ReloadAnimRate=1.000000
WeaponReloadAnim="Reload_Kriss"
Weight=3.000000
bHasAimingMode=True
IdleAimAnim="Idle_Iron"
StandardDisplayFOV=70.000000
bModeZeroCanDryFire=True
TraderInfoTexture=Texture'HTec_A.KVolt.kvolt_trader'
MeshRef="HTec_A.kvolt_mesh"
SkinRefs(0)="HTec_A.KVolt.kvolt_tex_a"
SkinRefs(2)="HTec_A.KVolt.kvolt_text"
SkinRefs(3)="HTec_A.KVolt.kvolt_a_shdr"
SkinRefs(4)="HTec_A.KVolt.kvolt_b_shdr"
SelectSoundRef="HTec_A.KVolt.kvolt_deploy"
HudImageRef="HTec_A.KVolt.kvolt_unsel"
SelectedHudImageRef="HTec_A.KVolt.kvolt_sel"
PlayerIronSightFOV=65.000000
ZoomedDisplayFOV=40.000000
FireModeClass(0)=Class'ScrnHTec.KVoltFire'
FireModeClass(1)=Class'KFMod.NoFire'
PutDownAnim="PutDown"
SelectAnimRate=1.000000
BringUpTime=0.700000
SelectForce="SwitchToAssaultRifle"
AIRating=0.550000
CurrentRating=0.550000
bShowChargingBar=True
Description="Horzine modification of The K-Volt Prototype to fire cryo darts. K-Volt's cryo darts are weaker than Mass Driver's, but they have longer aftereffect and enhanced shattering capability."
EffectOffset=(X=100.000000,Y=25.000000,Z=-10.000000)
DisplayFOV=70.000000
Priority=70
CustomCrosshair=11
CustomCrossHairTextureName="Crosshairs.HUD.Crosshair_Cross5"
InventoryGroup=3
GroupOffset=1
PickupClass=Class'ScrnHTec.KVoltPickup'
PlayerViewOffset=(X=20.000000,Y=21.500000,Z=-9.000000)
BobDamping=6.000000
AttachmentClass=Class'ScrnHTec.KVoltAttachment'
IconCoords=(X1=245,Y1=39,X2=329,Y2=79)
ItemName="HTec K-VOLT Cryo"
TransientSoundVolume=1.250000
}

View file

@ -0,0 +1,17 @@
//=============================================================================
// L85 Ammo.
//=============================================================================
class KVoltAmmo extends KFAmmunition;
#EXEC OBJ LOAD FILE=KillingFloorHUD.utx
defaultproperties
{
AmmoPickupAmount=50
MaxAmmo=400
InitialAmount=150
PickupClass=Class'ScrnHTec.KVoltAmmoAmmoPickup'
IconMaterial=Texture'KillingFloorHUD.Generic.HUD'
IconCoords=(X1=336,Y1=82,X2=382,Y2=125)
ItemName="Cryo darts"
}

View file

@ -0,0 +1,9 @@
class KVoltAmmoAmmoPickup extends KFAmmoPickup;
defaultproperties
{
AmmoAmount=50
InventoryType=Class'ScrnHTec.KVoltAmmo'
PickupMessage="Cryo Darts"
StaticMesh=StaticMesh'KillingFloorStatics.L85Ammo'
}

View file

@ -0,0 +1,47 @@
class KVoltAttachment extends KrissMAttachment;
var transient bool bReloading;
var transient float ReloadFinishTime;
var name ReloadAnim3rd;
var name InstigatorReloadAnim; // pawn's animation name
var float InstigatorReloadRate; // shouldn't be sligthly longer than pawns's reload animation to avoid double playing
simulated function Tick(float dt)
{
super.Tick(dt);
if ( bReloading && Level.TimeSeconds > ReloadFinishTime )
bReloading = false;
else if ( !bReloading && Level.NetMode == NM_Client && Instigator != none && Instigator.AnimAction == InstigatorReloadAnim )
PlayReload();
}
simulated function PlayReload()
{
if ( bReloading )
return;
bReloading = true;
ReloadFinishTime = Level.TimeSeconds + InstigatorReloadRate;
PlayAnim(ReloadAnim3rd);
}
simulated function Notify_3rd_HideMag()
{
SetBoneScale(0,0.0,'kvolt_mag');
}
simulated function Notify_3rd_ShowMag()
{
SetBoneScale(0,1.0,'kvolt_mag');
}
defaultproperties
{
ReloadAnim3rd="Reload"
InstigatorReloadAnim="Reload_Kriss"
InstigatorReloadRate=3.500000
mMuzFlashClass=Class'ROEffects.MuzzleFlash3rdNailGun'
mShellCaseEmitterClass=None
MeshRef="HTec_A.kvolt_3rd"
}

View file

@ -0,0 +1,9 @@
class KVoltDart extends IceDart;
defaultproperties
{
Speed=3000.000000
MaxSpeed=5000.000000
Damage=22.000000
MyDamageType=Class'ScrnHTec.DamTypeKVolt'
}

View file

@ -0,0 +1,57 @@
//=============================================================================
//L85 Fire
//=============================================================================
class KVoltFire extends KFShotgunFire;
simulated function bool AllowFire()
{
if(KFWeapon(Weapon).bIsReloading)
return false;
if(KFPawn(Instigator).SecondaryItem!=none)
return false;
if(KFPawn(Instigator).bThrowingNade)
return false;
if(KFWeapon(Weapon).MagAmmoRemaining < AmmoPerFire)
{
if( Level.TimeSeconds - LastClickTime>FireRate )
{
LastClickTime = Level.TimeSeconds;
}
if( AIController(Instigator.Controller)!=None )
KFWeapon(Weapon).ReloadMeNow();
return false;
}
return super(WeaponFire).AllowFire();
}
defaultproperties
{
RecoilRate=0.070000
maxVerticalRecoilAngle=125
maxHorizontalRecoilAngle=50
FireAimedAnim="Fire_Iron"
FireSoundRef="HTec_A.KVolt.kvolt_fire_m"
StereoFireSoundRef="HTec_A.KVolt.kvolt_fire_s"
NoAmmoSoundRef="KF_NailShotgun.Fire.KF_NailShotgun_Dryfire"
ProjPerFire=1
bPawnRapidFireAnim=True
TransientSoundVolume=1.000000
TweenTime=0.015000
FireForce="AssaultRifleFire"
FireRate=0.075000
AmmoClass=Class'ScrnHTec.KVoltAmmo'
ShakeRotMag=(X=75.000000,Y=75.000000,Z=250.000000)
ShakeRotRate=(X=10000.000000,Y=10000.000000,Z=10000.000000)
ShakeRotTime=0.500000
ShakeOffsetMag=(X=6.000000,Y=3.000000,Z=10.000000)
ShakeOffsetRate=(X=1000.000000,Y=1000.000000,Z=1000.000000)
ShakeOffsetTime=1.000000
ProjectileClass=Class'ScrnHTec.KVoltDart'
BotRefireRate=0.990000
FlashEmitterClass=Class'ScrnHTec.IceDartMuzzleFlash'
aimerror=42.000000
Spread=0.010000
}

View file

@ -0,0 +1,30 @@
//=============================================================================
// KVOLT 2 PICKUP
//=============================================================================
class KVoltPickup extends KFWeaponPickup;
defaultproperties
{
Weight=3.000000
cost=1000
AmmoCost=23
BuyClipSize=40
PowerValue=54
SpeedValue=90
RangeValue=80
Description="Horzine modification of The K-Volt Prototype to fire cryo darts. K-Volt's cryo darts are weaker than Mass Driver's, but they have longer aftereffect and enhanced shattering capability."
ItemName="HTec K-VOLT Cryo"
ItemShortName="HTec K-VOLT"
AmmoItemName="Cryo Darts"
AmmoMesh=StaticMesh'KillingFloorStatics.L85Ammo'
CorrespondingPerkIndex=11
EquipmentCategoryID=2
InventoryType=Class'ScrnHTec.KVolt'
PickupMessage="You got the HTec K-VOLT Cryo"
PickupSound=Sound'HTec_A.KVolt.kvolt_magin'
PickupForce="AssaultRiflePickup"
StaticMesh=StaticMesh'HTec_A.kvolt_pickup'
DrawScale=1.200000
CollisionRadius=25.000000
CollisionHeight=5.000000
}

View file

@ -0,0 +1,18 @@
class NitroDecal extends ProjectedDecal;
#exec OBJ LOAD FILE=HTec_A.ukx
simulated function BeginPlay()
{
if ( !Level.bDropDetail && FRand() < 0.4 )
ProjTexture = texture'HTec_A.Nitro.NitroSplat';
Super.BeginPlay();
}
defaultproperties
{
bClipStaticMesh=True
CullDistance=7000.000000
LifeSpan=5.000000
DrawScale=0.500000
}

View file

@ -0,0 +1,209 @@
class NitroFire extends CrossbowFire
abstract;
// sound
var sound FireEndSound; // The sound to play at the end of the ambient fire sound
var sound FireEndStereoSound; // The sound to play at the end of the ambient fire sound in first person stereo
var float AmbientFireSoundRadius; // The sound radius for the ambient fire sound
var sound AmbientFireSound; // How loud to play the looping ambient fire sound
var byte AmbientFireVolume; // The ambient fire sound
var string FireEndSoundRef;
var string FireEndStereoSoundRef;
var string AmbientFireSoundRef;
static function PreloadAssets(LevelInfo LevelInfo, optional KFShotgunFire Spawned)
{
local NitroFire F;
super.PreloadAssets(LevelInfo, Spawned);
if ( default.FireEndSoundRef != "" )
{
default.FireEndSound = sound(DynamicLoadObject(default.FireEndSoundRef, class'sound', true));
}
if ( LevelInfo.bLowSoundDetail || (default.FireEndStereoSoundRef == "" && default.FireEndStereoSound == none) )
{
default.FireEndStereoSound = default.FireEndSound;
}
else
{
default.FireEndStereoSound = sound(DynamicLoadObject(default.FireEndStereoSoundRef, class'Sound', true));
}
if ( default.AmbientFireSoundRef != "" )
{
default.AmbientFireSound = sound(DynamicLoadObject(default.AmbientFireSoundRef, class'sound', true));
}
F = NitroFire(Spawned);
if ( F != none ) {
F.FireEndSound = default.FireEndSound;
F.FireEndStereoSound = default.FireEndStereoSound;
F.AmbientFireSound = default.AmbientFireSound;
}
}
static function bool UnloadAssets()
{
default.FireEndSound = none;
default.FireEndStereoSound = none;
default.AmbientFireSound = none;
return super.UnloadAssets();
}
// Sends the fire class to the looping state
function StartFiring()
{
GotoState('FireLoop');
}
// Handles toggling the weapon attachment's ambient sound on and off
function PlayAmbientSound(Sound aSound)
{
local WeaponAttachment WA;
WA = WeaponAttachment(Weapon.ThirdPersonActor);
if ( Weapon == none || (WA == none))
return;
if(aSound == None)
{
WA.SoundVolume = WA.default.SoundVolume;
WA.SoundRadius = WA.default.SoundRadius;
}
else
{
WA.SoundVolume = AmbientFireVolume;
WA.SoundRadius = AmbientFireSoundRadius;
}
WA.AmbientSound = aSound;
}
// Make sure we are in the fire looping state when we fire
event ModeDoFire()
{
if( AllowFire() && IsInState('FireLoop'))
{
Super.ModeDoFire();
}
}
simulated function bool AllowFire()
{
if(KFWeapon(Weapon).bIsReloading)
return false;
if(KFWeapon(Weapon).MagAmmoRemaining < 1)
{
if(Level.TimeSeconds - LastClickTime > FireRate)
{
Weapon.PlayOwnedSound(NoAmmoSound, SLOT_Interact, TransientSoundVolume,,,, false);
LastClickTime = Level.TimeSeconds;
if(Weapon.HasAnim(EmptyAnim))
weapon.PlayAnim(EmptyAnim, EmptyAnimRate, 0.0);
}
return false;
}
LastClickTime = Level.TimeSeconds;
return Super.AllowFire();
}
/* =================================================================================== *
* FireLoop
* This state handles looping the firing animations and ambient fire sounds as well
* as firing rounds.
*
* modified by: Ramm 1/17/05
* =================================================================================== */
state FireLoop
{
function BeginState()
{
NextFireTime = Level.TimeSeconds - 0.1; //fire now!
Weapon.LoopAnim(FireLoopAnim, FireLoopAnimRate, TweenTime);
PlayAmbientSound(AmbientFireSound);
}
// Overriden because we play an anbient fire sound
function PlayFiring() {}
function ServerPlayFiring() {}
function EndState()
{
Weapon.AnimStopLooping();
PlayAmbientSound(none);
if( Weapon.Instigator != none && Weapon.Instigator.IsLocallyControlled() &&
Weapon.Instigator.IsFirstPerson() && StereoFireSound != none )
{
Weapon.PlayOwnedSound(FireEndStereoSound,SLOT_None,AmbientFireVolume/127,,AmbientFireSoundRadius,,false);
}
else
{
Weapon.PlayOwnedSound(FireEndSound,SLOT_None,AmbientFireVolume/127,,AmbientFireSoundRadius);
}
Weapon.StopFire(ThisModeNum);
}
function StopFiring()
{
GotoState('');
}
function ModeTick(float dt)
{
Super.ModeTick(dt);
if ( !bIsFiring || !AllowFire() ) // stopped firing, magazine empty
{
GotoState('');
return;
}
}
}
function float MaxRange()
{
return 1500;
}
defaultproperties
{
AmbientFireSoundRadius=500.000000
AmbientFireVolume=255
FireEndSoundRef="HTec_A.Fire2endmono"
FireEndStereoSoundRef="HTec_A.Fire2endstereo"
AmbientFireSoundRef="HTec_A.Fire2loopstereo"
EffectiveRange=1500.000000
maxVerticalRecoilAngle=300
maxHorizontalRecoilAngle=150
FireSoundRef=
NoAmmoSoundRef="KF_FlamethrowerSnd.FT_DryFire"
ProjSpawnOffset=(X=12.000000,Y=5.000000,Z=-22.000000)
bSplashDamage=True
bRecommendSplashDamage=True
bWaitForRelease=False
bAttachSmokeEmitter=True
TransientSoundVolume=1.000000
TransientSoundRadius=500.000000
FireAnim="'"
FireLoopAnim="FireAlt"
FireEndAnim="FireAltEnd"
FireRate=0.070000
ShakeRotMag=(X=0.000000,Y=0.000000,Z=0.000000)
ShakeRotRate=(X=0.000000,Y=0.000000,Z=0.000000)
ShakeOffsetMag=(X=0.000000,Y=0.000000,Z=0.000000)
ProjectileClass=Class'ScrnHTec.NitroProjectile'
BotRefireRate=0.070000
FlashEmitterClass=Class'ScrnHTec.NitroMuzzleFlash'
Spread=1500.000000
SpreadStyle=SS_Random
}

View file

@ -0,0 +1,37 @@
class NitroGroundEffect extends FreezeParticlesDirectional;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ExtentMultiplier=(X=0.000000,Y=0.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.470000
FadeOutStartTime=0.940000
FadeInEndTime=0.300000
MaxParticles=50
StartLocationShape=PTLS_Polar
SpinsPerSecondRange=(X=(Max=0.035000))
StartSpinRange=(X=(Min=-0.200000,Max=0.300000))
SizeScale(0)=(RelativeTime=0.500000,RelativeSize=0.900000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.500000)
StartSizeRange=(X=(Min=15.000000,Max=35.000000),Y=(Min=15.000000,Max=35.000000),Z=(Min=15.000000,Max=35.000000))
InitialParticlesPerSecond=60.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-85.000000,Max=85.000000),Y=(Min=-85.000000,Max=85.000000))
StartVelocityRadialRange=(Min=-40.000000,Max=40.000000)
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.NitroGroundEffect.SpriteEmitter0'
LifeSpan=5.000000
}

View file

@ -0,0 +1,67 @@
class NitroImpact extends FreezeParticlesDirectional;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-5.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
ColorScaleRepeats=1.000000
FadeOutStartTime=1.500000
MaxParticles=3
SpinsPerSecondRange=(Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000))
StartSpinRange=(X=(Max=0.400000),Y=(Max=1.000000),Z=(Max=1.000000))
SizeScale(1)=(RelativeSize=0.300000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=65.000000,Max=120.000000),Y=(Min=65.000000,Max=120.000000),Z=(Min=65.000000,Max=120.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=3.000000,Max=3.000000)
StartVelocityRange=(X=(Min=-5.000000,Max=5.000000),Y=(Min=-5.000000,Max=5.000000),Z=(Min=-5.000000,Max=5.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.NitroImpact.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
ColorScaleRepeats=1.000000
Opacity=0.500000
FadeOutStartTime=1.500000
MaxParticles=8
SpinsPerSecondRange=(X=(Min=0.050000,Max=0.100000),Y=(Min=0.050000,Max=0.100000),Z=(Min=0.050000,Max=0.100000))
StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
SizeScale(1)=(RelativeSize=0.400000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=0.250000)
StartSizeRange=(X=(Min=45.000000,Max=65.000000),Y=(Min=45.000000,Max=65.000000),Z=(Min=45.000000,Max=65.000000))
InitialParticlesPerSecond=10000.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=3.000000,Max=3.000000)
StartVelocityRange=(X=(Min=-7.500000,Max=7.500000),Y=(Min=-7.500000,Max=7.500000),Z=(Min=-20.000000,Max=20.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnHTec.NitroImpact.SpriteEmitter3'
LifeSpan=5.000000
}

View file

@ -0,0 +1,306 @@
class NitroMuzzleFlash extends ROMuzzleFlash1st;
simulated function Trigger(Actor Other, Pawn EventInstigator)
{
local int i;
for ( i=0; i<Emitters.length; ++i ) {
Emitters[i].SpawnParticle(1);
}
}
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseCollision=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
UseRandomSubdivision=True
Acceleration=(X=150.000000,Z=-1000.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
FadeOutStartTime=0.500000
MaxParticles=45
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=0.700000,Max=1.700000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowchunksfinal'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=1.400000,Max=1.400000)
StartVelocityRange=(X=(Min=150.000000,Max=650.000000),Y=(Min=-155.000000,Max=155.000000),Z=(Min=-155.000000,Max=155.000000))
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter0'
Begin Object Class=BeamEmitter Name=BeamEmitter0
BeamDistanceRange=(Min=3.000000,Max=300.000000)
RotatingSheets=1
LowFrequencyNoiseRange=(X=(Min=60.000000,Max=60.000000),Y=(Min=60.000000,Max=60.000000),Z=(Min=60.000000,Max=60.000000))
LowFrequencyPoints=8
HighFrequencyNoiseRange=(X=(Min=-3.000000,Max=3.000000),Y=(Min=-3.000000,Max=3.000000),Z=(Min=-3.000000,Max=3.000000))
HighFrequencyPoints=3
UseLowFrequencyScale=True
UseBranching=True
BranchProbability=(Min=1.000000,Max=1.000000)
BranchEmitter=1
BranchSpawnAmountRange=(Min=1.000000,Max=2.000000)
FadeOut=True
RespawnDeadParticles=False
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.370000
FadeOutStartTime=1.120000
MaxParticles=5
RotationNormal=(X=40.000000,Y=40.000000,Z=40.000000)
StartSizeRange=(X=(Min=0.700000,Max=0.700000),Y=(Min=0.700000,Max=0.700000),Z=(Min=0.700000,Max=0.700000))
Texture=Texture'HTec_A.fx.Streak'
InitialTimeRange=(Max=0.250000)
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-40.000000,Max=40.000000),Y=(Min=-40.000000,Max=40.000000),Z=(Min=-40.000000,Max=40.000000))
End Object
Emitters(1)=BeamEmitter'ScrnHTec.NitroMuzzleFlash.BeamEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.100000
FadeOutStartTime=0.540000
FadeInEndTime=0.015000
MaxParticles=16
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.300000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.600000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=45.000000,Max=80.000000),Y=(Min=45.000000,Max=80.000000),Z=(Min=45.000000,Max=80.000000))
Texture=Texture'HTec_A.fx.Liquid'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=200.000000,Max=600.000000),Z=(Min=-50.000000,Max=-15.000000))
End Object
Emitters(2)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter1'
Begin Object Class=SpriteEmitter Name=SpriteEmitter2
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.500000
FadeOutStartTime=0.442500
FadeInEndTime=0.007500
MaxParticles=12
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.700000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000)
StartSizeRange=(X=(Min=40.000000,Max=50.000000),Y=(Min=40.000000,Max=50.000000),Z=(Min=40.000000,Max=50.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.watersplatter2'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=150.000000,Max=650.000000),Z=(Min=-50.000000,Max=-15.000000))
End Object
Emitters(3)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter2'
Begin Object Class=SpriteEmitter Name=SpriteEmitter3
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
Acceleration=(Z=-15.000000)
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.850000
FadeOutStartTime=0.175000
MaxParticles=8
StartLocationRange=(X=(Min=10.000000,Max=10.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.200000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.560000,RelativeSize=1.000000)
StartSizeRange=(X=(Min=35.000000,Max=60.000000),Y=(Min=35.000000,Max=60.000000),Z=(Min=35.000000,Max=60.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=0.350000,Max=0.350000)
End Object
Emitters(4)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter3'
Begin Object Class=SpriteEmitter Name=SpriteEmitter4
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.250000
FadeOutStartTime=0.442500
FadeInEndTime=0.007500
MaxParticles=12
StartLocationRange=(X=(Min=20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.400000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.900000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.300000)
StartSizeRange=(X=(Min=35.000000,Max=55.000000),Y=(Min=35.000000,Max=55.000000),Z=(Min=35.000000,Max=55.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.watersplashcloud'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=350.000000,Max=600.000000),Z=(Min=-50.000000,Max=-15.000000))
End Object
Emitters(5)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter4'
Begin Object Class=SparkEmitter Name=SparkEmitter0
LineSegmentsRange=(Min=0.000000,Max=0.000000)
TimeBetweenSegmentsRange=(Min=0.150000,Max=0.150000)
UseColorScale=True
FadeOut=True
RespawnDeadParticles=False
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=150,G=150,R=150,A=32))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=150,G=150,R=150,A=32))
Opacity=0.110000
FadeOutStartTime=0.250000
FadeInEndTime=0.250000
MaxParticles=8
StartLocationShape=PTLS_Sphere
UseRotationFrom=PTRS_Actor
StartSizeRange=(X=(Min=50.000000,Max=50.000000),Y=(Min=50.000000,Max=50.000000),Z=(Min=50.000000,Max=50.000000))
Texture=Texture'Effects_Tex.BulletHits.sparkfinal2'
LifetimeRange=(Min=0.500000,Max=0.500000)
StartVelocityRange=(X=(Min=800.000000,Max=1500.000000),Y=(Min=-250.000000,Max=250.000000),Z=(Min=-250.000000,Max=250.000000))
End Object
Emitters(6)=SparkEmitter'ScrnHTec.NitroMuzzleFlash.SparkEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter5
UseColorScale=True
RespawnDeadParticles=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=200,G=150,R=64,A=60))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=200,G=150,R=64,A=60))
Opacity=0.200000
FadeOutStartTime=0.100000
MaxParticles=1
StartSizeRange=(X=(Min=45.000000,Max=60.000000),Y=(Min=45.000000,Max=60.000000),Z=(Min=45.000000,Max=60.000000))
Texture=Texture'Effects_Tex.Smoke.MuzzleCorona1stP'
LifetimeRange=(Min=0.100000,Max=0.100000)
End Object
Emitters(7)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter5'
Begin Object Class=SpriteEmitter Name=SpriteEmitter6
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.300000
FadeOutStartTime=2.760000
FadeInEndTime=0.640000
MaxParticles=60
StartLocationRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000),Z=(Min=-20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.150000))
StartSpinRange=(X=(Min=-1.000000,Max=1.000000))
SizeScale(0)=(RelativeSize=2.200000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=3.200000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=4.000000)
StartSizeRange=(X=(Min=1.000000,Max=20.000000),Y=(Min=1.000000,Max=20.000000),Z=(Min=1.000000,Max=20.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
StartVelocityRange=(X=(Min=15.000000,Max=130.000000),Y=(Min=-15.000000,Max=15.000000),Z=(Min=-15.000000,Max=15.000000))
End Object
Emitters(8)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter6'
Begin Object Class=SpriteEmitter Name=SpriteEmitter7
ProjectionNormal=(Y=1.000000,Z=0.000000)
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
AutomaticInitialSpawning=False
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.300000
FadeOutStartTime=0.300000
FadeInEndTime=0.022500
MaxParticles=20
StartLocationRange=(X=(Min=-20.000000,Max=20.000000))
UseRotationFrom=PTRS_Actor
SpinCCWorCW=(X=0.000000)
SpinsPerSecondRange=(X=(Max=0.300000))
StartSpinRange=(X=(Min=-0.300000,Max=0.300000))
SizeScale(0)=(RelativeSize=0.300000)
SizeScale(1)=(RelativeTime=0.500000,RelativeSize=0.600000)
SizeScale(2)=(RelativeTime=1.000000,RelativeSize=1.600000)
StartSizeRange=(X=(Min=35.000000,Max=80.000000),Y=(Min=35.000000,Max=80.000000),Z=(Min=35.000000,Max=80.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
TextureUSubdivisions=1
TextureVSubdivisions=1
LifetimeRange=(Min=0.750000,Max=0.750000)
StartVelocityRange=(X=(Min=150.000000,Max=550.000000))
End Object
Emitters(9)=SpriteEmitter'ScrnHTec.NitroMuzzleFlash.SpriteEmitter7'
}

View file

@ -0,0 +1,250 @@
class NitroProjectile extends ShotgunBullet
abstract;
var class<Emitter> Trail1Class, Trail2Class;
var Emitter Trail1, Trail2;
simulated function PostBeginPlay()
{
SetTimer(0.2, true);
Velocity = Speed * Vector(Rotation);
if ( Level.NetMode != NM_DedicatedServer )
{
if ( !PhysicsVolume.bWaterVolume )
{
Trail1 = Spawn(Trail1Class,self);
Trail2 = Spawn(Trail2Class,self);
}
}
Velocity.z += TossZ;
}
simulated function PostNetBeginPlay()
{
local PlayerController PC;
Super.PostNetBeginPlay();
if ( Level.NetMode == NM_DedicatedServer )
{
return;
}
if ( Level.bDropDetail || (Level.DetailMode == DM_Low) )
{
bDynamicLight = false;
LightType = LT_None;
}
else
{
PC = Level.GetLocalPlayerController();
if ( (Instigator != None) && (PC == Instigator.Controller) )
{
return;
}
if ( (PC == None) || (PC.ViewTarget == None) || (VSize(PC.ViewTarget.Location - Location) > 3000) )
{
bDynamicLight = false;
LightType = LT_None;
}
}
}
simulated function Landed( vector HitNormal )
{
Explode(Location,HitNormal);
if ( Level.DetailMode >= DM_High )
Spawn(class'NitroGroundEffect',self,,Location);
}
simulated function Explode(vector HitLocation,vector HitNormal)
{
if ( Role == ROLE_Authority )
{
HurtRadius(Damage, DamageRadius, MyDamageType, MomentumTransfer, HitLocation );
}
PlaySound(ImpactSound, SLOT_Misc);
if ( KFHumanPawn(Instigator) != none && !Level.bDropDetail ) {
if ( EffectIsRelevant(Location,false) ) {
Spawn(ExplosionDecal,self,,Location, rotator(-HitNormal));
if ( Level.DetailMode > DM_Low ) {
Spawn(class'NitroSplash',self,,HitLocation,rotator(HitNormal));
if ( Level.DetailMode >= DM_SuperHigh )
Spawn(class'NitroImpact',self,,HitLocation,rotator(-HitNormal));
}
}
}
SetCollisionSize(0.0, 0.0);
Destroy();
}
// overrided to don't damage projectiles
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local float damageScale, dist;
local vector dir;
if ( bHurtEntry )
return;
bHurtEntry = true;
foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation )
{
// 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') && !Victims.IsA('Projectile') )
{
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 )
Victims.SetDelayedDamageInstigatorController( InstigatorController );
if ( Victims == LastTouched )
LastTouched = None;
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
(damageScale * Momentum * dir),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
}
if ( (LastTouched != None) && (LastTouched != self) && (LastTouched.Role == ROLE_Authority)
&& !LastTouched.IsA('FluidSurfaceInfo') && !Victims.IsA('Projectile') )
{
Victims = LastTouched;
LastTouched = None;
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
damageScale = FMax(Victims.CollisionRadius/(Victims.CollisionRadius + Victims.CollisionHeight),1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius));
if ( Instigator == None || Instigator.Controller == None )
Victims.SetDelayedDamageInstigatorController(InstigatorController);
Victims.TakeDamage
(
damageScale * DamageAmount,
Instigator,
Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,
(damageScale * Momentum * dir),
DamageType
);
if (Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(DamageAmount, DamageRadius, InstigatorController, DamageType, Momentum, HitLocation);
}
bHurtEntry = false;
}
simulated function Destroyed()
{
if ( Trail != none ) {
Trail.mRegen=False;
Trail.SetPhysics(PHYS_None);
}
if ( Trail1 != none ) {
Trail1.Kill();
Trail1.SetPhysics(PHYS_None);
}
if ( Trail2 != none ) {
Trail2.Kill();
Trail2.SetPhysics(PHYS_None);
}
Super.Destroyed();
}
simulated function ProcessTouch (Actor Other, vector HitLocation)
{
if ( Other == none || Other == Instigator || Other.Base == Instigator )
return;
if ( Other != Instigator && !Other.IsA('PhysicsVolume') && !Other.IsA('Projectile')
&& !Other.IsA('ROBulletWhipAttachment') )
{
// Don't allow hits on people on the same team
// if( KFHumanPawn(Other) != none && Instigator != none
// && KFHumanPawn(Other).GetTeamNum() == Instigator.GetTeamNum() )
// return;
if ( KFPawn(Other) != none && KFPawn(Other).BurnDown > 1 )
KFPawn(Other).BurnDown /= 2;
Explode(self.Location,self.Location);
}
}
simulated singular function HitWall(vector HitNormal, actor Wall)
{
if ( Role == ROLE_Authority )
{
if ( !Wall.bStatic && !Wall.bWorldGeometry )
{
if ( Instigator == None || Instigator.Controller == None )
{
Wall.SetDelayedDamageInstigatorController( InstigatorController );
}
Wall.TakeDamage( Damage, instigator, Location, MomentumTransfer * Normal(Velocity), MyDamageType);
if ( DamageRadius > 0 && Vehicle(Wall) != None && Vehicle(Wall).Health > 0 )
{
Vehicle(Wall).DriverRadiusDamage(Damage, DamageRadius, InstigatorController, MyDamageType, MomentumTransfer, Location);
}
HurtWall = Wall;
}
MakeNoise(1.0);
}
Explode(Location + ExploWallOut * HitNormal, HitNormal);
HurtWall = None;
}
// simulated function Timer()
// {
// if ( Trail2 != none )
// Trail2.SetDrawScale(Trail2.DrawScale * 1.5);
// }
defaultproperties
{
Trail1Class=Class'ScrnHTec.NitroTrail'
Trail2Class=Class'ScrnHTec.NitroTrailB'
MaxPenetrations=1
PenDamageReduction=0.000000
HeadShotDamageMult=1.000000
Speed=750.000000
MaxSpeed=750.000000
TossZ=200.000000
Damage=5.000000
DamageRadius=120.000000
MomentumTransfer=0.000000
MyDamageType=Class'ScrnHTec.DamTypeFreezerNitro'
ImpactSound=SoundGroup'KF_EnemiesFinalSnd.Bloat.Bloat_AcidSplash'
ExplosionDecal=Class'ScrnHTec.NitroDecal'
DrawType=DT_None
StaticMesh=None
Physics=PHYS_Falling
LifeSpan=5.000000
DrawScale=5.000000
Style=STY_None
bBlockHitPointTraces=False
}

View file

@ -0,0 +1,6 @@
class NitroSplash extends AlienSmallHit;
defaultproperties
{
Skins(0)=Texture'HTec_A.Nitro.NitroSplash'
}

View file

@ -0,0 +1,57 @@
class NitroTrail extends FreezeParticlesBase;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UniformSize=True
ColorScale(0)=(Color=(B=255,G=240,R=190,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=240,R=190,A=255))
FadeOutStartTime=0.378000
FadeInEndTime=0.014000
MaxParticles=40
SpinsPerSecondRange=(X=(Max=0.025000))
StartSpinRange=(X=(Min=-0.200000,Max=0.200000))
StartSizeRange=(X=(Min=3.000000,Max=32.000000),Y=(Min=3.000000,Max=32.000000),Z=(Min=3.000000,Max=32.000000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'kf_fx_trip_t.Misc.smoke_animated'
TextureUSubdivisions=8
TextureVSubdivisions=8
LifetimeRange=(Min=1.000000,Max=1.400000)
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.NitroTrail.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseCollision=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
UniformSize=True
Acceleration=(Z=-400.000000)
DampingFactorRange=(X=(Min=0.250000,Max=0.250000),Y=(Min=0.250000,Max=0.250000),Z=(Min=0.250000,Max=0.250000))
ColorScale(0)=(Color=(B=255,G=255,R=255,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=255,R=255,A=255))
Opacity=0.330000
FadeOutStartTime=1.080000
FadeInEndTime=0.120000
MaxParticles=40
SpinsPerSecondRange=(X=(Min=0.400000,Max=1.000000),Y=(Min=0.500000,Max=1.000000),Z=(Min=0.500000,Max=1.000000))
StartSpinRange=(X=(Max=1.000000),Y=(Max=1.000000),Z=(Max=1.000000))
StartSizeRange=(X=(Min=0.500000,Max=1.400000),Y=(Min=0.500000,Max=1.400000),Z=(Min=0.500000,Max=1.400000))
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.BulletHits.snowfinal2'
TextureUSubdivisions=2
TextureVSubdivisions=2
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-300.000000,Max=300.000000),Y=(Min=-300.000000,Max=300.000000),Z=(Min=-300.000000,Max=300.000000))
VelocityLossRange=(Y=(Max=5.000000),Z=(Max=5.000000))
End Object
Emitters(1)=SpriteEmitter'ScrnHTec.NitroTrail.SpriteEmitter1'
Physics=PHYS_Trailer
LifeSpan=2.900000
}

View file

@ -0,0 +1,70 @@
class NitroTrailB extends FreezeParticlesBase;
defaultproperties
{
Begin Object Class=SpriteEmitter Name=SpriteEmitter0
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
Acceleration=(Z=-30.000000)
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.100000)
ColorScale(0)=(Color=(B=255,G=240,R=190,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=240,R=190,A=255))
Opacity=0.330000
FadeOutStartTime=1.353000
FadeInEndTime=0.891000
StartLocationOffset=(Z=-10.000000)
SpinsPerSecondRange=(X=(Max=0.010000))
StartSpinRange=(X=(Min=-0.200000,Max=0.300000))
SizeScale(0)=(RelativeTime=0.750000,RelativeSize=0.750000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.800000)
StartSizeRange=(X=(Min=40.000000,Max=40.000000),Y=(Min=40.000000,Max=40.000000),Z=(Min=40.000000,Max=40.000000))
InitialParticlesPerSecond=5.000000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
LifetimeRange=(Min=3.300000,Max=3.300000)
StartVelocityRange=(X=(Min=-5.000000,Max=5.000000),Y=(Min=-5.000000,Max=5.000000),Z=(Min=-10.000000,Max=-10.000000))
StartVelocityRadialRange=(Min=-40.000000,Max=40.000000)
End Object
Emitters(0)=SpriteEmitter'ScrnHTec.NitroTrailB.SpriteEmitter0'
Begin Object Class=SpriteEmitter Name=SpriteEmitter1
UseColorScale=True
FadeOut=True
FadeIn=True
RespawnDeadParticles=False
SpinParticles=True
UseSizeScale=True
UseRegularSizeScale=False
UniformSize=True
ExtentMultiplier=(X=0.000000,Y=0.000000,Z=0.100000)
ColorScale(0)=(Color=(B=255,G=240,R=190,A=255))
ColorScale(1)=(RelativeTime=1.000000,Color=(B=255,G=240,R=190,A=255))
Opacity=0.330000
FadeOutStartTime=0.940000
FadeInEndTime=0.300000
MaxParticles=13
StartLocationOffset=(Z=-20.000000)
StartLocationRange=(X=(Min=-20.000000,Max=20.000000),Y=(Min=-20.000000,Max=20.000000))
SpinsPerSecondRange=(X=(Max=0.010000))
StartSpinRange=(X=(Min=-0.200000,Max=0.300000))
SizeScale(0)=(RelativeTime=0.500000,RelativeSize=0.750000)
SizeScale(1)=(RelativeTime=1.000000,RelativeSize=0.350000)
StartSizeRange=(X=(Min=45.000000,Max=45.000000),Y=(Min=45.000000,Max=45.000000),Z=(Min=45.000000,Max=45.000000))
InitialParticlesPerSecond=6.500000
DrawStyle=PTDS_AlphaBlend
Texture=Texture'Effects_Tex.explosions.DSmoke_2'
LifetimeRange=(Min=2.000000,Max=2.000000)
StartVelocityRange=(X=(Min=-50.000000,Max=50.000000),Y=(Min=-50.000000,Max=50.000000),Z=(Min=-60.000000,Max=-60.000000))
StartVelocityRadialRange=(Min=-40.000000,Max=40.000000)
End Object
Emitters(1)=SpriteEmitter'ScrnHTec.NitroTrailB.SpriteEmitter1'
Physics=PHYS_Trailer
LifeSpan=2.900000
}

View file

@ -0,0 +1,171 @@
class ScrnVetHTec extends ScrnVeterancyTypes
abstract;
static function int GetStatValueInt(ClientPerkRepLink StatOther, byte ReqNum)
{
return StatOther.GetCustomValueInt(Class'HTecProg');
}
static function AddCustomStats( ClientPerkRepLink Other )
{
super.AddCustomStats(Other); //init achievements
Other.AddCustomValue(Class'HTecProg');
}
static function float GetWeaponMovementSpeedBonus(KFPlayerReplicationInfo KFPRI, Weapon Weap)
{
local ScrnHumanPawn p;
// doesn't work on client side, unless pawn is locally controlled
if ( Controller(KFPRI.Owner) != none )
p = ScrnHumanPawn(Controller(KFPRI.Owner).Pawn);
if ( p != none )
return fmax(0.0, p.GetCurrentVestClass().default.SpeedModifier);
return 0.0;
}
static function float GetMagCapacityModStatic(KFPlayerReplicationInfo KFPRI, class<KFWeapon> Other)
{
if ( ClassIsChildOf(Other, class'HTecZEDGun') || ClassIsChildOf(Other, class'HTecZEDMKII')
|| ClassIsChildOf(Other, class'CryoThrower')
|| ClassIsInArray(default.PerkedWeapons, Other) //v3 - custom weapon support
)
{
return 1.2001 + 0.025 * GetClientVeteranSkillLevel(KFPRI);
}
return 1.0;
}
static function float GetAmmoPickupMod(KFPlayerReplicationInfo KFPRI, KFAmmunition Other)
{
return AddExtraAmmoFor(KFPRI, Other.class);
}
static function float AddExtraAmmoFor(KFPlayerReplicationInfo KFPRI, Class<Ammunition> AmmoType)
{
if ( AmmoType == class'FragAmmo' )
return 1.0 + 0.20 * GetClientVeteranSkillLevel(KFPRI)/2; // 1 extra nade per 2 levels
else if ( ClassIsChildOf(AmmoType, class'KVoltAmmo')
|| ClassIsChildOf(AmmoType, class'CryoThrowerAmmo')
|| ClassIsChildOf(AmmoType, class'FreezerAmmo')
|| ClassIsChildOf(AmmoType, class'FreezerDartAmmo')
|| ClassIsChildOf(AmmoType, class'ZEDGunAmmo')
|| ClassIsChildOf(AmmoType, class'ZEDMKIIAmmo' )
|| ClassIsInArray(default.PerkedAmmo, AmmoType) //v3 - custom weapon support
)
return 1.0 + 0.05 * GetClientVeteranSkillLevel(KFPRI);
return 1.0;
}
static function int AddDamage(KFPlayerReplicationInfo KFPRI, KFMonster Injured, KFPawn DamageTaker, int InDamage, class<DamageType> DmgType)
{
if ( DmgType == default.DefaultDamageTypeNoBonus )
return InDamage;
if ( ClassIsChildOf(DmgType, class'DamTypeFreezerBase')
|| ClassIsChildOf(DmgType, class'DamTypeZEDGun')
|| ClassIsChildOf(DmgType, class'DamTypeZEDGunMKII') )
{
// 30% base bonus + 5% per level
InDamage *= 1.30 + 0.05 * GetClientVeteranSkillLevel(KFPRI);
}
return InDamage;
}
static function int ReduceDamage(KFPlayerReplicationInfo KFPRI, KFPawn Injured, Pawn Instigator, int InDamage, class<DamageType> DmgType)
{
if ( InDamage == 0 )
return 0;
if ( Instigator == Injured && ClassIsChildOf(DmgType, class'DamTypeFreezerBase') )
return 0; // can't freeze himself
if ( (DmgType == class'DamTypeVomit' || DmgType == class'SirenScreamDamage')
&& Injured != none && Injured.ShieldStrength > 100 )
InDamage *= 0.4;
return max(1, InDamage); // at least 1 damage must be done
}
static function class<Grenade> GetNadeType(KFPlayerReplicationInfo KFPRI)
{
return class'CryoNade';
}
static function bool CanCookNade(KFPlayerReplicationInfo KFPRI, Weapon Weap)
{
return false;
}
static function float GetCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item)
{
// couldn't find any good place to put it...
class'ScrnHorzineVestPickup'.default.CorrespondingPerkIndex = default.PerkIndex;
if ( Item == class'FrozenDosh' ) {
return 3.0;
}
else if ( ClassIsChildOf(Item, class'ZEDGunPickup') || ClassIsChildOf(Item, class'ZEDMKIIPickup')
|| ClassIsChildOf(Item, class'KVoltPickup') || ClassIsChildOf(Item, class'CryoThrowerPickup')
|| ClassIsChildOf(Item, class'FreezerPickup')
|| ClassIsChildOf(Item, class'ScrnHorzineVestPickup')
|| ClassIsInArray(default.PerkedPickups, Item) )
{
// 30% base discount + 5% extra per level
return fmax(0.10, 0.70 - 0.05 * GetClientVeteranSkillLevel(KFPRI));
}
return 1.0;
}
static function float GetAmmoCostScaling(KFPlayerReplicationInfo KFPRI, class<Pickup> Item)
{
if ( ClassIsChildOf(Item, class'FragPickup') )
return 1.5; // more expensive cryo nades
return 1.0;
}
static function string GetCustomLevelInfo( byte Level )
{
local string S;
S = Default.CustomLevelInfo;
ReplaceText(S,"%L",string(Level));
ReplaceText(S,"%x",GetPercentStr(0.30 + 0.05*Level));
ReplaceText(S,"%m",GetPercentStr(0.20 + 0.025*Level));
ReplaceText(S,"%a",GetPercentStr(0.05*Level));
ReplaceText(S,"%g",string(Level/2));
ReplaceText(S,"%$",GetPercentStr(fmin(0.90, 0.30 + 0.05*Level)));
return S;
}
defaultproperties
{
progressArray0(0)=30
progressArray0(1)=75
progressArray0(2)=300
progressArray0(3)=1500
progressArray0(4)=4500
progressArray0(5)=10500
progressArray0(6)=16500
DefaultDamageType=Class'ScrnHTec.DamTypeFreezerDart'
DefaultDamageTypeNoBonus=Class'ScrnHTec.DamTypeFreezerNoDmgBonus'
OnHUDIcons(0)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Gray',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Gray',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(1)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Gold',StarIcon=Texture'KillingFloor2HUD.Perk_Icons.Hud_Perk_Star_Gold',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(2)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Green',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Green',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(3)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Blue',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blue',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(4)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Purple',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Purple',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(5)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Orange',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Orange',DrawColor=(B=255,G=255,R=255,A=255))
OnHUDIcons(6)=(PerkIcon=Texture'ScrnTex.Perks.HTec_Blood',StarIcon=Texture'ScrnTex.Perks.Hud_Perk_Star_Blood',DrawColor=(B=255,G=255,R=255,A=255))
SamePerkAch="OP_HTec"
SkillInfo="PERK SKILLS (HTec v4.00):|Cryo Grenades|Higher frozen dosh value|Armor does not slow you down|60% less damage from Bloat Bile and Siren Scream while Armor > 100"
CustomLevelInfo="PERK BONUSES (LEVEL %L):|%x more damage with ZED/Cryo Guns|%x faster freezing|%m larger ZED Gun clips|%a more ZED/Cryo Ammo|+%g extra Cryo grenades|%$ discount on HTec Inventory"
PerkIndex=11
OnHUDIcon=Texture'ScrnTex.Perks.HTec'
OnHUDGoldIcon=Texture'ScrnTex.Perks.HTec_Gold'
VeterancyName="Horzine Technician"
Requirements(0)="Freeze or zap %x ZEDs"
}

View file

@ -0,0 +1,65 @@
class SirenDart extends IceDart;
simulated function PostBeginPlay()
{
super.PostBeginPlay();
SetDrawScale(DrawScale * (0.5 + 3.0 * frand()));
}
simulated function ProcessTouch (Actor Other, vector HitLocation)
{
local vector X;
local Vector TempHitLocation, HitNormal;
local array<int> HitPoints;
// local KFPawn HitPawn;
if ( Other == none || Other == Instigator || Other.Base == Instigator || !Other.bBlockHitPointTraces )
return;
X = Vector(Rotation);
if( ROBulletWhipAttachment(Other) != none )
{
if(!Other.Base.bDeleteMe)
{
Other = Instigator.HitPointTrace(TempHitLocation, HitNormal, HitLocation + (200 * X), HitPoints, HitLocation,, 1);
if( Other == none || HitPoints.Length == 0 )
return;
// do not call to ProcessLocationalDamage() because it significantly lowers amout of damage we're dealing
Other.TakeDamage(Damage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
// HitPawn = KFPawn(Other);
// if ( HitPawn != none && !HitPawn.bDeleteMe)
// HitPawn.ProcessLocationalDamage(Damage, Instigator, TempHitLocation, MomentumTransfer * Normal(Velocity), MyDamageType,HitPoints);
}
}
else
{
if (Pawn(Other) != none && Pawn(Other).IsHeadShot(HitLocation, X, 1.0))
{
Pawn(Other).TakeDamage(Damage * HeadShotDamageMult, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
}
else
{
Other.TakeDamage(Damage, Instigator, HitLocation, MomentumTransfer * Normal(Velocity), MyDamageType);
}
}
if ( ImpactEffect != None && (Level.NetMode != NM_DedicatedServer) && !Level.bDropDetail && Level.DetailMode > DM_Low )
Spawn(ImpactEffect,,, Location, rotator(-HitNormal));
// no penetration
Destroy();
}
defaultproperties
{
Speed=1000.000000
MaxSpeed=3000.000000
Damage=8.000000
MyDamageType=Class'ScrnHTec.DamTypeSirenDart'
}

View file

@ -0,0 +1,214 @@
// Siren that is capable of shattering frozen zeds
// @author PooSH, 2015
class ZombieSirenCryo extends ZombieSiren
abstract;
var transient float LastScreamTime; // prevent scream canceling
var transient float NextFrozenCheckTime; // next time we'll need to check for frozen zeds
var FreezeRules FreezeRules; // this is set in FreezeRules.PostBeginPlay()
var class<Projectile> ShatterProjClass;
function TakeDamage(int Damage, Pawn InstigatedBy, Vector HitLocation, Vector Momentum, class<DamageType> DamType, optional int HitIndex)
{
if (InstigatedBy == none || class<KFWeaponDamageType>(DamType) == none)
Super(Monster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType); // skip NONE-reference error -- PooSH
else
Super(KFMonster).TakeDamage(Damage, instigatedBy, hitLocation, momentum, DamType);
}
// should Siren scream to shatter zeds between her and A
function bool ShouldDoShatterScream(Actor A)
{
local int i, FrozenCount, CanShatterCount;
local float ScreamRadiusSqr;
if ( FreezeRules == none || Level.TimeSeconds < NextFrozenCheckTime )
return false; // already checked
NextFrozenCheckTime = Level.TimeSeconds + 2.0;
if ( FreezeRules.Frozen.Length == 0 )
return false;
NextFrozenCheckTime = Level.TimeSeconds + 5;
ScreamRadiusSqr = ScreamRadius * ScreamRadius;
for ( i = 0; i < FreezeRules.Frozen.Length; ++i ) {
if ( FreezeRules.Frozen[i].M != none && FreezeRules.Frozen[i].bFrozen ) {
++FrozenCount;
if ( VSizeSquared(FreezeRules.Frozen[i].M.Location - Location) < ScreamRadiusSqr) {
++CanShatterCount;
}
}
}
if ( CanShatterCount > 0 && CanShatterCount > 5.0 * frand() ) {
NextFrozenCheckTime = Level.TimeSeconds + 5; // give cool down before next shattering
return true;
}
if ( CanShatterCount > 0 )
NextFrozenCheckTime = Level.TimeSeconds + 0.5;
else if ( FrozenCount > 0 )
NextFrozenCheckTime = Level.TimeSeconds + 1;
return false;
}
function RangedAttack(Actor A)
{
local int LastFireTime;
local float Dist;
if ( bShotAnim )
return;
Dist = VSize(A.Location - Location);
if ( Physics == PHYS_Swimming )
{
SetAnimAction('Claw');
bShotAnim = true;
LastFireTime = Level.TimeSeconds;
}
else if ( Dist < MeleeRange + CollisionRadius + A.CollisionRadius
&& (bDecapitated || bZapped || Level.TimeSeconds - LastScreamTime < 7) )
{
bShotAnim = true;
LastFireTime = Level.TimeSeconds;
SetAnimAction('Claw');
//PlaySound(sound'Claw2s', SLOT_Interact); KFTODO: Replace this
Controller.bPreparingMove = true;
Acceleration = vect(0,0,0);
}
else if( Dist <= ScreamRadius && !bDecapitated && !bZapped
|| (Level.TimeSeconds > NextFrozenCheckTime && ShouldDoShatterScream(A)) )
{
LastScreamTime = Level.TimeSeconds;
bShotAnim=true;
SetAnimAction('Siren_Scream');
// Only stop moving if we are close
if( Dist < ScreamRadius * 0.25 )
{
Controller.bPreparingMove = true;
Acceleration = vect(0,0,0);
}
else
{
Acceleration = AccelRate * Normal(A.Location - Location);
}
}
}
// overridden to shatter zeds
// fixed instigator in calling TakeDamage()
simulated function HurtRadius( float DamageAmount, float DamageRadius, class<DamageType> DamageType, float Momentum, vector HitLocation )
{
local actor Victims;
local KFMonster M;
local float damageScale, dist;
local vector dir;
local float UsedDamageAmount;
if( bHurtEntry )
return;
bHurtEntry = true;
foreach VisibleCollidingActors( class 'Actor', Victims, DamageRadius, HitLocation )
{
// don't let blast damage affect fluid - VisibleCollisingActors doesn't really work for them - jag
// Or Karma actors in this case. Self inflicted Death due to flying chairs is uncool for a zombie of your stature.
if( (Victims != self) && !Victims.IsA('FluidSurfaceInfo') && !Victims.IsA('ExtendedZCollision') )
{
Momentum = ScreamForce; // bugfix, when pull wasn't applied always -- PooSH
dir = Victims.Location - HitLocation;
dist = FMax(1,VSize(dir));
dir = dir/dist;
M = KFMonster(Victims);
if ( M != none ) {
UsedDamageAmount = 1; // just a little bit to pass it in NetDamage()
damageScale = 1;
if ( FreezeRules != none && FreezeRules.IsFrozen(M) ) {
ShatterFrozenZed(M, HitLocation, dist);
continue;
}
}
else {
damageScale = 1 - FMax(0,(dist - Victims.CollisionRadius)/DamageRadius);
if (!Victims.IsA('KFHumanPawn')) // If it aint human, don't pull the vortex crap on it.
Momentum = 0;
if (Victims.IsA('KFGlassMover'))
UsedDamageAmount = 100000; // Siren always shatters glass
else
UsedDamageAmount = DamageAmount;
}
Victims.TakeDamage(damageScale * UsedDamageAmount, self, Victims.Location - 0.5 * (Victims.CollisionHeight + Victims.CollisionRadius) * dir,(damageScale * Momentum * dir),DamageType);
if ( Vehicle(Victims) != None && Vehicle(Victims).Health > 0)
Vehicle(Victims).DriverRadiusDamage(UsedDamageAmount, DamageRadius, Controller, DamageType, Momentum, HitLocation);
}
}
bHurtEntry = false;
}
// turns frozen monster into deadly ice shards
function ShatterFrozenZed(KFMonster M, Vector HitLocation, float Distance)
{
local vector ProjLoc;
local float ColH, ColR;
local float DmgMult;
local int Count;
local Projectile proj;
local float DistancePct;
// save zed's data, because he'll be dead after shattering
HitLocation = M.Location; // calculate shard offset from the center of zed, not where it got hit
ColH = M.CollisionHeight;
ColR = M.CollisionRadius;
Count = M.Health / 50;
if ( !FreezeRules.ShatterZed(M, -1, Controller, ScreamDamageType) )
return; // unable to shatter zed
DistancePct = Distance/ScreamRadius;
if ( M != none )
M.SetCollision(false);
DmgMult = DifficultyDamageModifer();
if ( Count > 20 ) {
DmgMult += float(Count-20) / 20.0;
Count = 20;
}
ProjLoc = HitLocation; // first projectile always spawn in the center to fly a straight line
while ( Count > 0 ) {
--Count;
proj = Spawn(ShatterProjClass, self, '', ProjLoc, rotator(ProjLoc - Location));
if ( proj != none ) {
proj.Instigator = self;
proj.Damage *= DmgMult;
// if ( DistancePct > 0.5 ) {
// proj.Damage *= 1.5 - DistancePct;
// }
}
// pickup random location inside collision cylinder for the next projectile
ProjLoc = HitLocation;
ProjLoc.X += ColR * (0.70 - 1.4 * frand());
ProjLoc.Y += ColR * (0.70 - 1.4 * frand());
ProjLoc.Z += ColH * (0.50 - 1.0 * frand());
}
}
defaultproperties
{
ShatterProjClass=Class'ScrnHTec.SirenDart'
ScreamDamage=6
MenuName="Cryo Siren"
}

View file

@ -0,0 +1,25 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class ZombieSirenCryo_CIRCUS extends ZombieSirenCryo;
#exec OBJ LOAD FILE=KF_EnemiesFinalSnd_CIRCUS.uax
static simulated function PreCacheMaterials(LevelInfo myLevel)
{//should be derived and used.
myLevel.AddPrecacheMaterial(FinalBlend'KF_Specimens_Trip_T.siren_hair_fb');
myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_CIRCUS_T.Siren_Circus.siren_CIRCUS_CMB');
}
defaultproperties
{
MoanVoice=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.siren.Siren_Talk'
JumpSound=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.siren.Siren_Jump'
DetachedHeadClass=Class'KFChar.SeveredHeadSiren_CIRCUS'
HitSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.siren.Siren_Pain'
DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd_CIRCUS.siren.Siren_Death'
AmbientSound=Sound'KF_BaseSiren_CIRCUS.Siren_IdleLoop'
Mesh=SkeletalMesh'KF_Freaks_Trip_CIRCUS.Siren_Circus'
Skins(0)=FinalBlend'KF_Specimens_Trip_T.siren_hair_fb'
Skins(1)=Combiner'KF_Specimens_Trip_CIRCUS_T.Siren_Circus.siren_CIRCUS_CMB'
}

View file

@ -0,0 +1,20 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class ZombieSirenCryo_HALLOWEEN extends ZombieSirenCryo;
#exec OBJ LOAD FILE=KF_EnemiesFinalSnd_HALLOWEEN.uax
defaultproperties
{
MoanVoice=SoundGroup'KF_EnemiesFinalSnd_HALLOWEEN.siren.Siren_Talk'
JumpSound=SoundGroup'KF_EnemiesFinalSnd_HALLOWEEN.siren.Siren_Jump'
DetachedLegClass=Class'KFChar.SeveredLegSiren_HALLOWEEN'
DetachedHeadClass=Class'KFChar.SeveredHeadSiren_HALLOWEEN'
HitSound(0)=SoundGroup'KF_EnemiesFinalSnd_HALLOWEEN.siren.Siren_Pain'
DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd_HALLOWEEN.siren.Siren_Death'
AmbientSound=Sound'KF_BaseSiren_HALLOWEEN.Siren_IdleLoop'
Mesh=SkeletalMesh'KF_Freaks_Trip_HALLOWEEN.Siren_Halloween'
Skins(0)=Combiner'KF_Specimens_Trip_HALLOWEEN_T.siren.Siren_RedneckZombie_CMB'
Skins(1)=FinalBlend'KF_Specimens_Trip_HALLOWEEN_T.siren.Siren_RedneckZombie_Hair_FB'
}

View file

@ -0,0 +1,15 @@
class ZombieSirenCryo_STANDARD extends ZombieSirenCryo;
defaultproperties
{
MoanVoice=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Talk'
JumpSound=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Jump'
DetachedLegClass=Class'KFChar.SeveredLegSiren'
DetachedHeadClass=Class'KFChar.SeveredHeadSiren'
HitSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Pain'
DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Death'
AmbientSound=Sound'KF_BaseSiren.Siren_IdleLoop'
Mesh=SkeletalMesh'KF_Freaks_Trip.Siren_Freak'
Skins(0)=FinalBlend'KF_Specimens_Trip_T.siren_hair_fb'
Skins(1)=Combiner'KF_Specimens_Trip_T.siren_cmb'
}

View file

@ -0,0 +1,26 @@
//-----------------------------------------------------------
//
//-----------------------------------------------------------
class ZombieSirenCryo_XMas extends ZombieSirenCryo;
#exec OBJ LOAD FILE=KF_EnemiesFinalSnd_Xmas.uax
static simulated function PreCacheMaterials(LevelInfo myLevel)
{//should be derived and used.
myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_XMAS_T.caroler_cmb');
myLevel.AddPrecacheMaterial(Combiner'KF_Specimens_Trip_XMAS_T.caroler_env_cmb');
myLevel.AddPrecacheMaterial(Texture'KF_Specimens_Trip_XMAS_T.caroler_diffuse');
}
defaultproperties
{
MoanVoice=SoundGroup'KF_EnemiesFinalSnd.siren.Siren_Talk'
JumpSound=SoundGroup'KF_EnemiesFinalSnd_Xmas.siren.Siren_Jump'
DetachedHeadClass=Class'KFChar.SeveredHeadSiren_XMas'
HitSound(0)=SoundGroup'KF_EnemiesFinalSnd_Xmas.siren.Siren_Pain'
DeathSound(0)=SoundGroup'KF_EnemiesFinalSnd_Xmas.siren.Siren_Death'
AmbientSound=Sound'KF_BaseSiren.Siren_IdleLoop'
Mesh=SkeletalMesh'KF_Freaks_Trip_Xmas.Caroler'
Skins(0)=FinalBlend'KF_Specimens_Trip_T.siren_hair_fb'
Skins(1)=Shader'KF_Specimens_Trip_XMAS_T.Caroler.caroler_shdr'
}

View file

@ -0,0 +1,89 @@
<html>
<head><title>Index of /kf_sources/ScrnHTec/Classes/</title></head>
<body>
<h1>Index of /kf_sources/ScrnHTec/Classes/</h1><hr><pre><a href="../">../</a>
<a href="CryoNade.uc">CryoNade.uc</a> 01-Jul-2020 18:12 5800
<a href="CryoNadeCloud.uc">CryoNadeCloud.uc</a> 01-Jul-2020 18:12 2185
<a href="CryoThrower.uc">CryoThrower.uc</a> 01-Jul-2020 18:12 4743
<a href="CryoThrowerAltFire.uc">CryoThrowerAltFire.uc</a> 01-Jul-2020 18:12 4061
<a href="CryoThrowerAltProjectile.uc">CryoThrowerAltProjectile.uc</a> 01-Jul-2020 18:12 192
<a href="CryoThrowerAmmo.uc">CryoThrowerAmmo.uc</a> 01-Jul-2020 18:12 375
<a href="CryoThrowerAmmoPickup.uc">CryoThrowerAmmoPickup.uc</a> 01-Jul-2020 18:12 256
<a href="CryoThrowerAttachment.uc">CryoThrowerAttachment.uc</a> 01-Jul-2020 18:12 3121
<a href="CryoThrowerFire.uc">CryoThrowerFire.uc</a> 01-Jul-2020 18:12 462
<a href="CryoThrowerPickup.uc">CryoThrowerPickup.uc</a> 01-Jul-2020 18:12 839
<a href="CryoThrowerProjectile.uc">CryoThrowerProjectile.uc</a> 01-Jul-2020 18:12 209
<a href="DamTypeCryoNade.uc">DamTypeCryoNade.uc</a> 01-Jul-2020 18:12 175
<a href="DamTypeCryoThrower.uc">DamTypeCryoThrower.uc</a> 01-Jul-2020 18:12 223
<a href="DamTypeFreezerBase.uc">DamTypeFreezerBase.uc</a> 01-Jul-2020 18:12 1625
<a href="DamTypeFreezerDart.uc">DamTypeFreezerDart.uc</a> 01-Jul-2020 18:12 201
<a href="DamTypeFreezerNitro.uc">DamTypeFreezerNitro.uc</a> 01-Jul-2020 18:12 178
<a href="DamTypeFreezerNoDmgBonus.uc">DamTypeFreezerNoDmgBonus.uc</a> 01-Jul-2020 18:12 171
<a href="DamTypeHTecZEDGun.uc">DamTypeHTecZEDGun.uc</a> 01-Jul-2020 18:12 962
<a href="DamTypeHTecZEDGunMKII.uc">DamTypeHTecZEDGunMKII.uc</a> 01-Jul-2020 18:12 969
<a href="DamTypeKVolt.uc">DamTypeKVolt.uc</a> 01-Jul-2020 18:12 322
<a href="DamTypeSirenDart.uc">DamTypeSirenDart.uc</a> 01-Jul-2020 18:12 360
<a href="FreezeAch.uc">FreezeAch.uc</a> 01-Jul-2020 18:12 3022
<a href="FreezeAchHandler.uc">FreezeAchHandler.uc</a> 01-Jul-2020 18:12 1067
<a href="FreezeParticlesBase.uc">FreezeParticlesBase.uc</a> 01-Jul-2020 18:12 93
<a href="FreezeParticlesDirectional.uc">FreezeParticlesDirectional.uc</a> 01-Jul-2020 18:12 265
<a href="FreezeReplicationInfo.uc">FreezeReplicationInfo.uc</a> 01-Jul-2020 18:12 3316
<a href="FreezeRules.uc">FreezeRules.uc</a> 01-Jul-2020 18:12 18531
<a href="FreezerAltFire.uc">FreezerAltFire.uc</a> 01-Jul-2020 18:12 858
<a href="FreezerAmmo.uc">FreezerAmmo.uc</a> 01-Jul-2020 18:12 366
<a href="FreezerAmmoPickup.uc">FreezerAmmoPickup.uc</a> 01-Jul-2020 18:12 247
<a href="FreezerAttachment.uc">FreezerAttachment.uc</a> 01-Jul-2020 18:12 1964
<a href="FreezerDart.uc">FreezerDart.uc</a> 01-Jul-2020 18:12 117
<a href="FreezerDartAmmo.uc">FreezerDartAmmo.uc</a> 01-Jul-2020 18:12 368
<a href="FreezerDartAmmoPickup.uc">FreezerDartAmmoPickup.uc</a> 01-Jul-2020 18:12 183
<a href="FreezerFire.uc">FreezerFire.uc</a> 01-Jul-2020 18:12 1855
<a href="FreezerGun.uc">FreezerGun.uc</a> 01-Jul-2020 18:12 12789
<a href="FreezerNitroProjectile.uc">FreezerNitroProjectile.uc</a> 01-Jul-2020 18:12 82
<a href="FreezerPickup.uc">FreezerPickup.uc</a> 01-Jul-2020 18:12 230
<a href="FreezerPrimaryPickup.uc">FreezerPrimaryPickup.uc</a> 01-Jul-2020 18:12 1130
<a href="FrozenDosh.uc">FrozenDosh.uc</a> 01-Jul-2020 18:12 1848
<a href="HTecMut.uc">HTecMut.uc</a> 01-Jul-2020 18:12 593
<a href="HTecProg.uc">HTecProg.uc</a> 01-Jul-2020 18:12 112
<a href="HTecZEDGun.uc">HTecZEDGun.uc</a> 01-Jul-2020 18:12 321
<a href="HTecZEDGunAltFire.uc">HTecZEDGunAltFire.uc</a> 01-Jul-2020 18:12 75
<a href="HTecZEDGunFire.uc">HTecZEDGunFire.uc</a> 01-Jul-2020 18:12 128
<a href="HTecZEDGunPickup.uc">HTecZEDGunPickup.uc</a> 01-Jul-2020 18:12 204
<a href="HTecZEDGunProjectile.uc">HTecZEDGunProjectile.uc</a> 01-Jul-2020 18:12 168
<a href="HTecZEDMKII.uc">HTecZEDMKII.uc</a> 01-Jul-2020 18:12 288
<a href="HTecZEDMKIIAltFire.uc">HTecZEDMKIIAltFire.uc</a> 01-Jul-2020 18:12 150
<a href="HTecZEDMKIIFire.uc">HTecZEDMKIIFire.uc</a> 01-Jul-2020 18:12 138
<a href="HTecZEDMKIIPickup.uc">HTecZEDMKIIPickup.uc</a> 01-Jul-2020 18:12 229
<a href="HTecZEDMKIIPrimaryProjectile.uc">HTecZEDMKIIPrimaryProjectile.uc</a> 01-Jul-2020 18:12 154
<a href="HTecZEDMKIISecondaryProjectile.uc">HTecZEDMKIISecondaryProjectile.uc</a> 01-Jul-2020 18:12 105
<a href="IceChunkEmitter.uc">IceChunkEmitter.uc</a> 01-Jul-2020 18:12 16830
<a href="IceDart.uc">IceDart.uc</a> 01-Jul-2020 18:12 3649
<a href="IceDartHitEffect.uc">IceDartHitEffect.uc</a> 01-Jul-2020 18:12 3362
<a href="IceDartImpact.uc">IceDartImpact.uc</a> 01-Jul-2020 18:12 5199
<a href="IceDartMuzzleFlash.uc">IceDartMuzzleFlash.uc</a> 01-Jul-2020 18:12 15401
<a href="IceDartTracer.uc">IceDartTracer.uc</a> 01-Jul-2020 18:12 657
<a href="IceDartTrail.uc">IceDartTrail.uc</a> 01-Jul-2020 18:12 3676
<a href="KVolt.uc">KVolt.uc</a> 01-Jul-2020 18:12 3247
<a href="KVoltAmmo.uc">KVoltAmmo.uc</a> 01-Jul-2020 18:12 537
<a href="KVoltAmmoAmmoPickup.uc">KVoltAmmoAmmoPickup.uc</a> 01-Jul-2020 18:12 232
<a href="KVoltAttachment.uc">KVoltAttachment.uc</a> 01-Jul-2020 18:12 1271
<a href="KVoltDart.uc">KVoltDart.uc</a> 01-Jul-2020 18:12 183
<a href="KVoltFire.uc">KVoltFire.uc</a> 01-Jul-2020 18:12 1774
<a href="KVoltPickup.uc">KVoltPickup.uc</a> 01-Jul-2020 18:12 1127
<a href="NitroDecal.uc">NitroDecal.uc</a> 01-Jul-2020 18:12 379
<a href="NitroFire.uc">NitroFire.uc</a> 01-Jul-2020 18:12 5796
<a href="NitroGroundEffect.uc">NitroGroundEffect.uc</a> 01-Jul-2020 18:12 1583
<a href="NitroImpact.uc">NitroImpact.uc</a> 01-Jul-2020 18:12 3100
<a href="NitroMuzzleFlash.uc">NitroMuzzleFlash.uc</a> 01-Jul-2020 18:12 14092
<a href="NitroProjectile.uc">NitroProjectile.uc</a> 01-Jul-2020 18:12 7172
<a href="NitroSplash.uc">NitroSplash.uc</a> 01-Jul-2020 18:12 118
<a href="NitroTrail.uc">NitroTrail.uc</a> 01-Jul-2020 18:12 2547
<a href="NitroTrailB.uc">NitroTrailB.uc</a> 01-Jul-2020 18:12 3235
<a href="ScrnVetHTec.uc">ScrnVetHTec.uc</a> 01-Jul-2020 18:12 7131
<a href="SirenDart.uc">SirenDart.uc</a> 01-Jul-2020 18:12 2115
<a href="ZombieSirenCryo.uc">ZombieSirenCryo.uc</a> 01-Jul-2020 18:12 7411
<a href="ZombieSirenCryo_CIRCUS.uc">ZombieSirenCryo_CIRCUS.uc</a> 01-Jul-2020 18:12 1160
<a href="ZombieSirenCryo_HALLOWEEN.uc">ZombieSirenCryo_HALLOWEEN.uc</a> 01-Jul-2020 18:12 1008
<a href="ZombieSirenCryo_STANDARD.uc">ZombieSirenCryo_STANDARD.uc</a> 01-Jul-2020 18:12 677
<a href="ZombieSirenCryo_XMas.uc">ZombieSirenCryo_XMas.uc</a> 01-Jul-2020 18:12 1181
</pre><hr></body>
</html>