// Written by Marco Class SpectatorTracker extends Actor NotPlaceable; var PlayerController OwnerController; var color SpectatorColor; var SpectatorFlame Flame; var SpectatorUFO UFO; var vector FlameOffset; var transient SpecInteraction Interaction; var Actor ViewingTarget; var byte DisplayType; var transient float NextFireTimer; var float NeqFireTime,RefireRate; var bool bClientVisible,bSetVisible,bIsVisible,bServerInit,bAllowFireLaser; replication { // Variables the server should send to the client. reliable if( Role==ROLE_Authority ) SpectatorColor,bIsVisible,FlameOffset,bAllowFireLaser,DisplayType; reliable if( Role==ROLE_Authority && !bNetOwner ) ViewingTarget; // Functions client can call. unreliable if( Role0 && Pawn(ViewingTarget)!=None && Monster(ViewingTarget)==None ) Spawn(Class'HealProj').HealTarget = Pawn(ViewingTarget); else Spawn(Class'ShockProj',,,Location,OwnerController.Rotation); } } simulated final function FireLaser() { ServerFireLaser(); } defaultproperties { bAllowFireLaser=True DrawType=DT_None bHidden=True bSkipActorPropertyReplication=True bUpdateSimulatedPosition=True Physics=PHYS_Projectile RemoteRole=ROLE_SimulatedProxy NetUpdateFrequency=0.500000 bCollideWorld=True bNetNotify=True bBounce=True }