If you want to help us maintaining this wiki, check out our discord server: https://discord.gg/3u69jMa 

CTFFlag

From SWRC Wiki
Jump to navigation Jump to search
class CTFFlag extends GameObject
	forcename;

var bool						bWasHome;
var bool						bWasHeld;
var bool						bWasHidden;

// Flag
var AnimProp					myFlagProp;
var(CTFFlag) vector				FlagPropOffset;
var(CTFFlag) rotator			FlagPropRotation;
var(CTFFlag) class<AnimProp>	FlagProp[2];

// Max Emitter's is 5 per side. Just change myEmitterCount
var Emitter						myEmitter[5];
var(CTFFlag) int				myEmitterCount;
var(CTFFlag) vector				EffectOffset[5];
var(CTFFlag) rotator			EffectRotation[5];
var(CTFFlag) class<Emitter>		Effect[10];

// Flash. No Emitter because this is a live-once-and-delete effect
var(CTFFlag) vector				FlashOffset;
var(CTFFlag) rotator			FlashRotation;
var(CTFFlag) class<Emitter>		Flash[2];

var Emitter						myHeldEffect;
var(CTFFlag) vector				HeldEffectOffset;
var(CTFFlag) rotator			HeldEffectRotation;
var(CTFFlag) class<Emitter>		HeldEffect[2];

var Mesh						HudArmMesh[2];

//////////////////////////////////////////////////////////////
// CTF Flag Class

var Material FlagTexture[3];

simulated function PostNetBeginPlay()
{
	Super.PostNetBeginPlay();

	if ( !Level.IsDedicatedServer() )
	{
		CopyMaterialsToSkins();
		if ( TeamNum < 2 )
		{
			// Change the flag's color to match the team number
			Skins[0] = FlagTexture[TeamNum];

			// These don't move so we create them at the start
			CreateHomeHolograms();

			SetHologramState();

		}

		bWasHome = bHome;
		bWasHeld = bHeld;
	}
}

// Every tick check to see if the flag has changed status
simulated function PostNetworkReceive()
{	
	Super.PostNetworkReceive();

	UpdateHolograms();
}

simulated function UpdateHolograms()
{
	if ( ((bHome != bWasHome) || (bHeld != bWasHeld ) || (bHidden != bWasHidden )) && !Level.IsDedicatedServer() )
	{
		SetHologramState();

		// Reset local states
		bWasHome = bHome;
		bWasHeld = bHeld;
		bWasHidden = bHidden;
	}
}


// The Home holograms are designed to always be there
simulated function CreateHomeHolograms()
{
	local int i;

	myFlagProp = Spawn(FlagProp[TeamNum],,,HomeLocation+FlagPropOffset, self.Rotation+FlagPropRotation);
	myFlagProp.RemoteRole = ROLE_None;

	for (i=0;i<myEmitterCount;i++)
	{
		myEmitter[i] = Spawn(Effect[i*myEmitterCount+TeamNum],,,HomeLocation + EffectOffset[i],self.Rotation + EffectRotation[i]);
		myEmitter[i].RemoteRole = ROLE_None;
	}
}

// Parent function for setting hologram state
simulated function SetHologramState()
{
	// Flash Spawn
	if (bHome != bWasHome)
		Spawn(Flash[TeamNum],,,HomeLocation+FlashOffset, self.Rotation+FlashRotation);
	
	SetHomeHologramState( bHome && !bHidden );

	SetHeldHologramState( !bHome );
}

// Set Home hologram state
simulated function SetHomeHologramState(bool bActive)
{
	local int i;

	// Check to see if we have created everything.
	if ( myFlagProp == None )
		return;

	// If active then set bHidden to false
	myFlagProp.bHidden = !bActive;
	for (i=0;i<myEmitterCount;i++)
		myEmitter[i].bHidden = !bActive;
}

// set held hologram state
// in effect destory any current held effect
// and recreate it
simulated function SetHeldHologramState(bool bActive)
{
	// Always delete the current held effect. It's hopeless to try and keep it around
	if ( myHeldEffect != None )
		myHeldEffect.Destroy();

	// If we arn't active then simply exit now
	if ( !bActive )
		return;

	ShowHeldHologram(bHeld, Holder);
}

simulated function AttachEffectsToFlag( Actor theFlagAttachement )
{
	ShowHeldHologram(true, theFlagAttachement);
}

simulated function ShowHeldHologram(bool bIsHeld, Actor AttachBackup)
{
	local name BoneName;
	local int i;

	// Always delete the current held effect. It's hopeless to try and keep it around
	if ( myHeldEffect != None )
		myHeldEffect.Destroy();

	myHeldEffect = Spawn(HeldEffect[TeamNum]);	
	if ( bIsHeld && (Holder != None) )
	{		
		myHeldEffect.SetOwner(Holder);

		BoneName = Holder.GetWeaponBoneFor(Holder.Weapon);

		if (BoneName == '')
			myHeldEffect.SetBase(AttachBackup);
		else
			Holder.AttachToBone(myHeldEffect,BoneName);
	}
	else
	{
		myHeldEffect.SetBase(self);
		myHeldEffect.SetOwner(self);
	}
	
	for( i=0; i < myHeldEffect.Emitters.Length; i++ )
	{
		if( myHeldEffect.Emitters[i] != None )
			myHeldEffect.Emitters[i].SecondsBeforeInactive = 0;
	}

	myHeldEffect.SetRelativeLocation(vect(0,0,0));
	myHeldEffect.SetRelativeRotation(rot(0,0,0));
	myHeldEffect.AutoDestroy = false;
	myHeldEffect.bHidden = false;	
}

simulated function DettachEffectsFromFlag()
{
	SetHeldHologramState(true);
}

simulated function Destroyed()
{
	local int i;

	if ( myHeldEffect != None )
		myHeldEffect.Destroyed();

	myFlagProp.Destroyed();
	for (i=0;i<myEmitterCount;i++)	
		myEmitter[i].Destroyed();

	super.Destroyed();
}

simulated function ClearEffects()
{
	// Always delete the current held effect. It's hopeless to try and keep it around
	if ( myHeldEffect != None )
		myHeldEffect.Destroy();

	SetHologramState();
}

// Logging
function LogReturned()
{
	BroadcastLocalizedMessage( MessageClass, 3, None, None,  Level.Game.GameReplicationInfo.Teams[TeamNum] );
}

function LogDropped()
{	
	MPGame(Level.Game).GameEvent("flag_dropped",""$TeamNum, Holder.PlayerReplicationInfo);
	BroadcastLocalizedMessage( MessageClass, 2, Holder.PlayerReplicationInfo, None, Level.Game.GameReplicationInfo.Teams[TeamNum] );
}

function LogTaken(Controller c);

//////////////////////////////////////////////////////////////

// States
auto state home
{
    function LogTaken(Controller c)
    {        
		if ( MPGame(Level.Game) != None )
			MPGame(Level.Game).GameEvent("flag_taken",""$TeamNum,C.PlayerReplicationInfo);
		BroadcastLocalizedMessage( MessageClass, 6, C.PlayerReplicationInfo, None, Level.Game.GameReplicationInfo.Teams[TeamNum] );
    }
}

state Dropped
{
	function LogTaken(Controller c)
    {
		if ( MPGame(Level.Game) != None )
			MPGame(Level.Game).GameEvent("flag_pickup",""$TeamNum,C.PlayerReplicationInfo);		
        BroadcastLocalizedMessage( MessageClass, 4, C.PlayerReplicationInfo, None, Level.Game.GameReplicationInfo.Teams[TeamNum] );
    }

}


defaultproperties
{
     FlagPropOffset=(Z=130)
     FlagProp(0)=Class'AnimPropProperties.Flag_BlueProp'
     FlagProp(1)=Class'AnimPropProperties.Flag_RedProp'
     myEmitterCount=2
     EffectOffset(0)=(Z=-40)
     EffectOffset(1)=(Z=9)
     Effect(0)=Class'CTEffects.Holo_FlagStand_Blue'
     Effect(1)=Class'CTEffects.Holo_FlagStand_Red'
     Effect(2)=Class'CTEffects.Holo_Glow_V1'
     Effect(3)=Class'CTEffects.Holo_Glow_V1_Red'
     Flash(0)=Class'CTEffects.Holo_Flash'
     Flash(1)=Class'CTEffects.Holo_Flash_Red'
     HeldEffect(0)=Class'CTEffects.Holo_Flag_Blue_V2'
     HeldEffect(1)=Class'CTEffects.Holo_Flag_Red_V2'
     HudArmMesh(0)=SkeletalMesh'HudArms.HudArmsFlag'
     HudArmMesh(1)=SkeletalMesh'HudArms.tHudArmsFlag'
     FlagTexture(0)=Shader'Multiplayer_Textures.Flags.MP_BlueFlagBase_shader'
     FlagTexture(1)=Shader'Multiplayer_Textures.Flags.MP_RedFlagBase_shader'
     DrawType=DT_StaticMesh
     StaticMesh=StaticMesh'Multiplayer_GM.Flags.MP_BlueFlagDisc'
     bAlwaysRelevant=True
     bNetNotify=True
     MessageClass=Class'MPGame.CTFMessage'
}