173 lines
4.8 KiB
Ucode
173 lines
4.8 KiB
Ucode
/**
|
|
* Laser beam effect for a third person laser site
|
|
* Implemented another color mode: Green laser
|
|
* @author PooSH, 2012
|
|
*/
|
|
|
|
class ScrnLaserBeamEffect extends LaserBeamEffect
|
|
dependson(ScrnLaserDot)
|
|
config(user);
|
|
|
|
#exec OBJ LOAD FILE=ScrnTex.utx
|
|
|
|
var class<LaserDot> LaserDotClass;
|
|
|
|
var ScrnLaserDot.ELaserColor LaserColor;
|
|
var protected transient ScrnLaserDot.ELaserColor CurrentLaserColor;
|
|
|
|
|
|
var KFWeaponAttachment MyAttachment; // where to attach myself?
|
|
var name MyAttachmentBone; // bone name of MyAttachment to attach myself
|
|
|
|
replication
|
|
{
|
|
reliable if ( bNetInitial && !bNetOwner && Role == ROLE_Authority )
|
|
MyAttachment, MyAttachmentBone;
|
|
|
|
reliable if ( !bNetOwner && Role == ROLE_Authority )
|
|
LaserColor;
|
|
}
|
|
|
|
simulated function PostNetReceive()
|
|
{
|
|
if ( Role < ROLE_Authority && LaserColor != CurrentLaserColor ) {
|
|
if ( LaserColor == LASER_Destroyed ) {
|
|
if ( Spot != none )
|
|
Spot.Destroy();
|
|
Destroy();
|
|
return;
|
|
}
|
|
|
|
if ( ScrnPlayerController(Level.GetLocalPlayerController()) != none
|
|
&& ScrnPlayerController(Level.GetLocalPlayerController()).bOtherPlayerLasersBlue ) {
|
|
SetLaserColor(LASER_Blue);
|
|
}
|
|
else {
|
|
SetLaserColor(LaserColor);
|
|
}
|
|
}
|
|
super.PostNetReceive();
|
|
}
|
|
|
|
// replicate to clients and destroy
|
|
function DelayedDestroy()
|
|
{
|
|
if ( Spot != none )
|
|
Spot.Destroy();
|
|
SetLaserColor(LASER_Destroyed);
|
|
bHidden = true; // just in case
|
|
NetUpdateTime = Level.TimeSeconds - 1;
|
|
SetTimer(1.0, false);
|
|
}
|
|
|
|
function Timer()
|
|
{
|
|
Destroy();
|
|
}
|
|
|
|
simulated function SpawnDot()
|
|
{
|
|
//spawn this dot only for 3-rd person actor
|
|
if (!Instigator.IsLocallyControlled()) {
|
|
if (Spot == None)
|
|
Spot = Spawn(LaserDotClass, self);
|
|
ScrnLaserDot(Spot).SetLaserColor(LaserColor);
|
|
}
|
|
}
|
|
|
|
//no need to simulate, because beam is seen only for others
|
|
simulated function SetLaserColor(ScrnLaserDot.ELaserColor NewLaserColor)
|
|
{
|
|
local bool bActivate;
|
|
|
|
LaserColor = NewLaserColor;
|
|
CurrentLaserColor = NewLaserColor;
|
|
|
|
bActivate = true;
|
|
switch (NewLaserColor) {
|
|
case LASER_Red:
|
|
Skins[0]=Texture'ScrnTex.Laser.Laser_Red';
|
|
break;
|
|
case LASER_Green:
|
|
Skins[0]=Texture'ScrnTex.Laser.Laser_Green';
|
|
break;
|
|
case LASER_Blue:
|
|
Skins[0]=Texture'ScrnTex.Laser.Laser_Blue';
|
|
break;
|
|
case LASER_Orange:
|
|
Skins[0]=Texture'ScrnTex.Laser.Laser_Orange';
|
|
break;
|
|
default:
|
|
bActivate = false;
|
|
}
|
|
SetActive(bActivate);
|
|
|
|
if (Spot != None)
|
|
ScrnLaserDot(Spot).SetLaserColor(NewLaserColor);
|
|
}
|
|
|
|
// copy-pasted with add off SpawnDot()
|
|
simulated function Tick(float dt)
|
|
{
|
|
local Vector BeamDir;
|
|
local rotator NewRotation;
|
|
local float LaserDist;
|
|
|
|
if ( LaserColor == LASER_Destroyed )
|
|
return;
|
|
|
|
if (Role == ROLE_Authority && (Instigator == None || Instigator.Controller == None || Instigator.Weapon != Owner) )
|
|
{
|
|
DelayedDestroy();
|
|
return;
|
|
}
|
|
|
|
// set beam start location
|
|
if ( Instigator == None || (Instigator.Weapon != none && Instigator.IsFirstPerson())
|
|
|| MyAttachment == none || (Level.TimeSeconds - MyAttachment.LastRenderTime) > 1 )
|
|
{
|
|
// hide beam, if Instigator or 3rd person weapon attachment are not replecated yet or irrelevant
|
|
bHidden = true;
|
|
}
|
|
else {
|
|
bHidden=!bLaserActive;
|
|
if( bLaserActive && Spot == none && Level.NetMode != NM_DedicatedServer )
|
|
SpawnDot(); //spawn dot of LaserDotClass
|
|
|
|
LaserDist = VSize(EndBeamEffect - StartEffect);
|
|
if( LaserDist > 100 )
|
|
LaserDist = 100;
|
|
else
|
|
LaserDist *= 0.5;
|
|
|
|
StartEffect= MyAttachment.GetTipLocation();
|
|
NewRotation = Rotator(-MyAttachment.GetBoneCoords(MyAttachmentBone).XAxis);
|
|
SetLocation( StartEffect + MyAttachment.GetBoneCoords(MyAttachmentBone).XAxis * LaserDist );
|
|
}
|
|
|
|
BeamDir = Normal(StartEffect - Location);
|
|
SetRotation(NewRotation);
|
|
|
|
mSpawnVecA = StartEffect;
|
|
|
|
|
|
if (Spot != None) {
|
|
Spot.bHidden = bHidden;
|
|
|
|
if ( !bHidden ) {
|
|
Spot.SetLocation(EndBeamEffect + BeamDir * SpotProjectorPullback);
|
|
if( EffectHitNormal == vect(0,0,0) )
|
|
Spot.SetRotation(Rotator(-BeamDir));
|
|
else
|
|
Spot.SetRotation(Rotator(-EffectHitNormal));
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultproperties
|
|
{
|
|
LaserDotClass=Class'ScrnBalanceSrv.ScrnLaserDot'
|
|
MyAttachmentBone="tip"
|
|
Skins(0)=Texture'ScrnTex.Laser.Laser_Blue'
|
|
}
|