If you want to help us maintaining this wiki, check out our discord server: https://discord.gg/3u69jMa
CTFFlag
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'
}