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

128 lines
2.9 KiB
Ucode

class Deco_AirShip extends Decoration;
#exec OBJ LOAD FILE=Pier_anim.ukx
var KFEventListener PlayLandEvent;
var KFEventListener PlayTakeOffEvent;
var name ClientAnim;
var() name LandEventName, TakeOffEventName;
struct AnimRepInfo
{
var name AnimName; // The name of the animation to play
var float StartTime; // The in game time that the animation first began playing
};
var AnimRepInfo AnimInfo;
replication
{
reliable if( Role == ROLE_Authority )
AnimInfo;
}
simulated function PostBeginPlay()
{
// Starts the airship in the sky
PlayAnim( 'Land', 1.0f );
StopAnimating();
SetUpListeners();
}
// Create actors to tell us when an event is called
function SetUpListeners()
{
PlayLandEvent = Spawn( class 'KFEventListener' );
PlayTakeOffEvent = Spawn( class 'KFEventListener' );
PlayLandEvent.SetEventListenerInfo( self, LandEventName );
PlayTakeOffEvent.SetEventListenerInfo( self, TakeOffEventName );
}
// Called when an event listener's tag is called on the server
function ReceivedEvent( name EventName )
{
local AnimRepInfo TempRepInfo;
local KFGameType KFGame;
if ( EventName == LandEventName )
{
TempRepInfo.AnimName = 'Land';
}
else if ( EventName == TakeOffEventName )
{
TempRepInfo.AnimName = 'TakeOff';
}
KFGame = KFGameType(Level.Game);
if ( KFGame != none )
{
// Get the elapsed time that the airship animation began playing
TempRepInfo.StartTime = float( KFGame.ElapsedTime );
}
AnimInfo = TempRepInfo; // Replicates AnimInfo To the client
// Play animations if offline
if ( Level.NetMode != NM_DedicatedServer )
{
ClientPlayAnim( AnimInfo.AnimName, 0 );
}
}
simulated function PostNetReceive()
{
local float CurrentAnimTime;
local PlayerController PC;
local GameReplicationInfo GRI;
if ( ClientAnim != AnimInfo.AnimName )
{
ClientAnim = AnimInfo.AnimName;
PC = Level.GetLocalPlayerController();
if ( PC != none )
{
GRI = PC.GameReplicationInfo;
if ( GRI != none )
{
// Get the time elapsed upon receiving the newest animation
//( This is done to play an animation part in synch with everyone else, if a player joins late )
CurrentAnimTime = float( GRI.ElapsedTime ) - AnimInfo.StartTime;
}
}
ClientPlayAnim( AnimInfo.AnimName, CurrentAnimTime );
}
}
simulated function ClientPlayAnim( name AnimName, float CurrentAnimTime )
{
local float CurrentAnimProgress; // Value from 0.0-1.0
CurrentAnimProgress = CurrentAnimTime / GetAnimDuration( AnimName, 1.0f );
PlayAnim( AnimName, 1.0f );
SetAnimFrame( CurrentAnimProgress );
}
defaultproperties
{
LandEventName=AirshipLandEvent
TakeOffEventName=AirshipTakeOffEvent
RemoteRole=ROLE_SimulatedProxy
bNetNotify=true
bStatic=False
bStasis=False
Mesh=SkeletalMesh'Pier_anim.AirShip_Main'
bNoDelete=true
bAlwaysRelevant=true
NetUpdateFrequency=1
}