rott/kf_sources/KFMod/Classes/ChopperProp.uc
2026-07-14 20:27:09 +07:00

151 lines
3.2 KiB
Ucode

// I'd like this to be a sort of multi-purpose actor for the chopper.
// It can be set up to use any combination of pre-made take-off / landing anims.
class ChopperProp extends Decoration;
var() enum NameEn
{
Land_London,
Leave_London,
Leave_Manor,
Crash_Manor,
StrafingRun_Land,
Do_Nothing
} ChopperAnim,ChopperTriggeredAnim;
var bool bTriggered,bClientTriggered; // Only Trigger Once.
// shadow variables
var Projector Shadow;
var ShadowProjector PlayerShadow;
var globalconfig bool bBlobShadow;
var Effect_ShadowController RealtimeShadow;
replication
{
// Variables the server should send to the client.
reliable if( bNetDirty && (Role==ROLE_Authority) )
bTriggered;
}
simulated function PostBeginPlay()
{
if( Level.NetMode==NM_DedicatedServer )
Return;
// decide which type of shadow to spawn
if( !Class'KFPawn'.Default.bRealtimeShadows )
{
PlayerShadow = Spawn(class'ShadowProjector',Self,'',Location);
PlayerShadow.ShadowActor = self;
PlayerShadow.bBlobShadow = bBlobShadow;
PlayerShadow.LightDirection = Normal(vect(1,1,3));
PlayerShadow.LightDistance = 320;
PlayerShadow.MaxTraceDistance = 350;
PlayerShadow.InitShadow();
}
else
{
RealtimeShadow = Spawn(class'Effect_ShadowController',self,'',Location);
RealtimeShadow.Initialize();
}
}
simulated function PostNetBeginPlay()
{
if( bTriggered )
PlayChopperAnim(ChopperTriggeredAnim);
else PlayChopperAnim(ChopperAnim);
bClientTriggered = bTriggered;
bNetNotify = True;
}
simulated function PostNetReceive()
{
if( bClientTriggered==bTriggered )
Return;
if( bTriggered )
PlayChopperAnim(ChopperTriggeredAnim);
else PlayChopperAnim(ChopperAnim);
bClientTriggered = bTriggered;
}
simulated function PlayChopperAnim( NameEn ChAnim )
{
if( Level.NetMode==NM_DedicatedServer )
Return;
// Starting Anim.
Switch( ChAnim )
{
Case Land_London:
PlayAnim('Land_London');
Break;
Case Leave_London:
PlayAnim('Leave_London');
Break;
Case Crash_Manor:
PlayAnim('Crash_Manor');
Break;
Case StrafingRun_Land:
PlayAnim('StrafingRun_Land');
Break;
}
}
function FireRockets() // And the point of this function is (it isnt even in sync with the mesh)?
{
local vector Start;
local rotator Dir;
local Projectile P;
Start = Location;
Dir = Rotation;
P = Spawn(class'KFMod.LawProj',,, Start, Dir);
}
function RemoveChopper()
{
bHidden = true;
}
// Triggered / Secondary Anim
function Trigger( actor Other, pawn EventInstigator )
{
if (bTriggered)
return;
NetUpdateTime = Level.TimeSeconds - 1;
PlayChopperAnim(ChopperTriggeredAnim);
bTriggered = true;
}
simulated function Destroyed()
{
if( PlayerShadow != None )
PlayerShadow.Destroy();
if(RealtimeShadow !=none)
RealtimeShadow.Destroy();
Super.Destroyed();
}
function Reset()
{
bTriggered = False;
NetUpdateTime = Level.TimeSeconds - 1;
PlayChopperAnim(ChopperAnim);
}
defaultproperties
{
bStatic=False
bStasis=False
Mesh=SkeletalMesh'Chopper'
DrawScale=2.500000
RemoteRole=ROLE_SimulatedProxy
bNoDelete=True
NetUpdateFrequency=0.5
bSkipActorPropertyReplication=True
bAlwaysRelevant=True
}