// ScrN copy class NiceCryoNade extends Nade; #exec OBJ LOAD FILE=KF_GrenadeSnd.uax #exec OBJ LOAD FILE=Inf_WeaponsTwo.uax #exec OBJ LOAD FILE=KF_LAWSnd.uax // How many times do freezing var int totalFreezes; // How often to do freezeing var float freezeRate; // The next time that this nade will freeze var float nextFreezeTime; // The sound of nade's explosion var sound explosionSound; // Whether or not effects have been played yet var bool bNeedToPlayEffects; 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'NiceCryoNadeCloud',,, hitLocation, rotator(vect(0,0,1))); Spawn(explosionDecal, self,, hitLocation, rotator(-hitNormal)); if(level.detailMode >= DM_High) Spawn(class'NiceNitroGroundEffect', 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, float Momentum, vector HitLocation){ local NiceMonster niceZed; if(bHurtEntry) return; bHurtEntry = true; nextFreezeTime = level.timeSeconds + freezeRate; foreach CollidingActors(class 'NiceMonster', niceZed, damageRadius, hitLocation){ if(niceZed.Health <= 0) continue; if(instigator == none || instigator.controller == none) niceZed.SetDelayedDamageInstigatorController(instigatorController); niceZed.TakeDamage( damageAmount, instigator, niceZed.location, vect(0,0,0), damageType); } bHurtEntry = false; } function TakeDamage(int Damage, Pawn InstigatedBy, Vector hitlocation, Vector momentum, class 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 player; 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(trail != none) trail.mRegen = false; return; } 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) return; if( (level.TimeSeconds - lastSparkTime > 0.5) && EffectIsRelevant(location, false)){ player = level.GetLocalPlayerController(); if( player.viewTarget != none && VSize(player.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=100 freezeRate=0.030000 ExplosionSound=SoundGroup'KF_GrenadeSnd.NadeBase.MedicNade_Explode' Damage=0.000000 DamageRadius=175.000000 MyDamageType=class'NiceDamTypeCryoNade' ExplosionDecal=class'NiceNitroDecal' 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 }