class SchlonzRocketLauncher extends RocketLauncher; simulated event ClientStartFire(int Mode) { bTightSpread = false; Super.ClientStartFire(Mode); } function Tick(float dt) { local Pawn Other; local Vector StartTrace; local Rotator Aim; local float BestDist, BestAim; if (Instigator == None || Instigator.Weapon != self) return; if ( Role < ROLE_Authority ) return; if( !Instigator.IsHumanControlled() ) return; if( SeekTarget != None && SeekTarget.Health <= 0 ) { // target died bBreakLock = false; bLockedOn = false; SeekTarget = None; PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.SeekLost'); } if( Level.TimeSeconds > SeekCheckTime ) { if( bBreakLock ) { bBreakLock = false; bLockedOn = false; SeekTarget = None; } StartTrace = Instigator.Location + Instigator.EyePosition(); Aim = Instigator.GetViewRotation(); BestAim = LockAim; Other = Instigator.Controller.PickTarget(BestAim, BestDist, Vector(Aim), StartTrace, SeekRange); if( CanLockOnTo(Other) ) { if( Other == SeekTarget ) { LockTime += SeekCheckFreq; if( !bLockedOn && LockTime >= LockRequiredTime ) { bLockedOn = true; PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.LockOn'); } } else { if( bLockedOn ) { // now locked onto another target PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.LockOn'); } else { LockTime = 0.0; } SeekTarget = Other; } UnLockTime = 0.0; } else { if( SeekTarget != None ) { // 'unlock' if more than 90 degrees between target and view if( ((SeekTarget.Location - Instigator.Location) dot Vector(Aim) ) < 0 ) { SeekTarget = None; if (bLockedOn) { bLockedOn = false; PlayerController(Instigator.Controller).ClientPlaySound(Sound'WeaponSounds.SeekLost'); } } } else bLockedOn = false; } SeekCheckTime = Level.TimeSeconds + SeekCheckFreq; } } function ServerSetTightSpread() { bTightSpread = false; } function Projectile SpawnProjectile(Vector Start, Rotator Dir) { local SchlonzRocket Rocket; local SchlonzSeekingRocket SeekingRocket; local bot B; // decide if bot should be locked on B = Bot(Instigator.Controller); /* do not unlock after firing (except for bots, hehe :-) */ if( B != None ) { bBreakLock = true; } if ( (B != None) && (B.Target == B.Enemy) && (VSize(B.Pawn.Location - B.Enemy.Location) > 700 + 1300 * FRAND()) && (VSize(B.Pawn.Location - B.Enemy.Location) < 2000) && (Level.TimeSeconds - B.LastSeenTime < 0.4) ) { bLockedOn = true; SeekTarget = B.Enemy; } if (bLockedOn && SeekTarget != None) { SeekingRocket = Spawn(class'SchlonzUT.SchlonzSeekingRocket',,, Start, Dir); SeekingRocket.Seeking = SeekTarget; if ( B != None ) { //log("LOCKED"); bLockedOn = false; SeekTarget = None; } return SeekingRocket; } else { Rocket = Spawn(class'SchlonzUT.SchlonzRocket',,, Start, Dir); if (Rocket == None) log("failed spawning rocket!"@Start@" "@Dir); return Rocket; } } function Projectile SpawnGrenadeProjectile(Vector Start, Rotator Dir) { local Grenade Rocket; bBreakLock = true; Rocket = Spawn(class'SchlonzUT.SchlonzGrenade',,, Start, Dir); if (Rocket == None) log("failed spawning rocket!"@Start@" "@Dir); return Rocket; } defaultproperties { SeekCheckFreq=0.250000 SeekRange=12000.000000 LockRequiredTime=0.200000 FireModeClass(0)=Class'SchlonzUT.SchlonzRocketMultiFire' FireModeClass(1)=Class'SchlonzUT.SchlonzRocketMultiGrenade' PickupClass=Class'SchlonzUT.SchlonzRocketLauncherPickup' }