184 lines
4.7 KiB
Ucode
184 lines
4.7 KiB
Ucode
//=============================================================================
|
|
// Laser beam effect for a third person laser site.
|
|
// This class is pretty placeholder right now and needs to be cleaned up
|
|
//=============================================================================
|
|
class LaserBeamEffect extends xEmitter;
|
|
|
|
#exec OBJ LOAD FILE=kf_fx_trip_t.utx
|
|
|
|
var Vector StartEffect, EndBeamEffect;
|
|
var() vector EffectOffset;
|
|
var vector EffectHitNormal;
|
|
var LaserDot Spot;
|
|
var() float SpotProjectorPullback;
|
|
|
|
var bool bLaserActive;
|
|
var bool bCurrentLaserActive;
|
|
|
|
replication
|
|
{
|
|
reliable if (Role == ROLE_Authority)
|
|
StartEffect, EndBeamEffect, EffectHitNormal, bLaserActive;
|
|
}
|
|
|
|
simulated event PostNetReceive()
|
|
{
|
|
if( bLaserActive != bCurrentLaserActive )
|
|
{
|
|
bCurrentLaserActive = bLaserActive;
|
|
|
|
if( !bLaserActive )
|
|
{
|
|
bHidden = true;
|
|
Spot.Destroy();
|
|
}
|
|
else
|
|
{
|
|
bHidden = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
simulated function SetActive(bool bNewActive)
|
|
{
|
|
bLaserActive = bNewActive;
|
|
bCurrentLaserActive = bLaserActive;
|
|
|
|
if( !bLaserActive )
|
|
{
|
|
bHidden = true;
|
|
if (Spot != None)
|
|
Spot.Destroy();
|
|
|
|
NetUpdateFrequency=5;
|
|
}
|
|
else
|
|
{
|
|
bHidden = false;
|
|
NetUpdateFrequency=100;
|
|
}
|
|
}
|
|
|
|
simulated function Destroyed()
|
|
{
|
|
if (Spot != None)
|
|
Spot.Destroy();
|
|
|
|
Super.Destroyed();
|
|
}
|
|
|
|
simulated function Tick(float dt)
|
|
{
|
|
local Vector BeamDir;
|
|
local BaseKFWeaponAttachment Attachment;
|
|
local rotator NewRotation;
|
|
local float LaserDist;
|
|
|
|
if (Role == ROLE_Authority && (Instigator == None || Instigator.Controller == None))
|
|
{
|
|
Destroy();
|
|
return;
|
|
}
|
|
|
|
// set beam start location
|
|
if ( Instigator == None )
|
|
{
|
|
// do nothing
|
|
}
|
|
else
|
|
{
|
|
if ( Instigator.IsFirstPerson() && Instigator.Weapon != None )
|
|
{
|
|
bHidden=True;
|
|
if (Spot != None)
|
|
{
|
|
Spot.Destroy();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bHidden=!bLaserActive;
|
|
if( Level.NetMode != NM_DedicatedServer && Spot == none && bLaserActive)
|
|
{
|
|
Spot = Spawn(class'LaserDot', self);
|
|
}
|
|
|
|
LaserDist = VSize(EndBeamEffect - StartEffect);
|
|
if( LaserDist > 100 )
|
|
{
|
|
LaserDist = 100;
|
|
}
|
|
else
|
|
{
|
|
LaserDist *= 0.5;
|
|
}
|
|
|
|
Attachment = BaseKFWeaponAttachment(xPawn(Instigator).WeaponAttachment);
|
|
if (Attachment != None && (Level.TimeSeconds - Attachment.LastRenderTime) < 1)
|
|
{
|
|
StartEffect= Attachment.GetTipLocation();
|
|
NewRotation = Rotator(-Attachment.GetBoneCoords('tip').XAxis);
|
|
SetLocation( StartEffect + Attachment.GetBoneCoords('tip').XAxis * LaserDist );
|
|
}
|
|
else
|
|
{
|
|
StartEffect = Instigator.Location + Instigator.EyeHeight*Vect(0,0,1) + Normal(EndBeamEffect - Instigator.Location) * 25.0;
|
|
SetLocation( StartEffect + Normal(EndBeamEffect - StartEffect) * LaserDist );
|
|
NewRotation = Rotator(Normal(StartEffect - Location));
|
|
}
|
|
}
|
|
}
|
|
|
|
BeamDir = Normal(StartEffect - Location);
|
|
SetRotation(NewRotation);
|
|
|
|
mSpawnVecA = StartEffect;
|
|
|
|
|
|
if (Spot != None)
|
|
{
|
|
Spot.SetLocation(EndBeamEffect + BeamDir * SpotProjectorPullback);
|
|
|
|
if( EffectHitNormal == vect(0,0,0) )
|
|
{
|
|
Spot.SetRotation(Rotator(-BeamDir));
|
|
}
|
|
else
|
|
{
|
|
Spot.SetRotation(Rotator(-EffectHitNormal));
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
RemoteRole=ROLE_SimulatedProxy
|
|
bNetTemporary=false
|
|
bReplicateInstigator=true
|
|
|
|
mParticleType=PT_Beam
|
|
mStartParticles=1
|
|
mAttenuate=false
|
|
mSizeRange(0)=4.0 // width
|
|
mSizeRange(1)=5.0 // width
|
|
mRegenDist=100.0 // section length
|
|
mMaxParticles=3 // planes
|
|
mColorRange(0)=(R=100,B=100,G=100)
|
|
mColorRange(1)=(R=100,B=100,G=100)
|
|
mSpinRange(0)=0 // spin
|
|
mAttenKa=1.0
|
|
|
|
Skins(0)=Texture'kf_fx_trip_t.Red_Laser'
|
|
Style=STY_Additive
|
|
bUnlit=true
|
|
|
|
SoundVolume=45
|
|
SoundRadius=120
|
|
LifeSpan=99999999
|
|
SpotProjectorPullback=1.0
|
|
bNetNotify=true
|
|
bHidden=true
|
|
bAlwaysRelevant=true
|
|
NetUpdateFrequency=5 // This is always relevant so poeple will see the dot even if the player using the weapon isn't relevant, so keep the net update rate low when its not in use
|
|
}
|