class DecalEraser extends Mutator;
var array<ProjectedDecal> PendingDecals;
var float UpdateDecalsTime;
struct DecalsStruct
{
var ProjectedDecal Decal;
var float DestroyTime;
// var bDeleteMe
};
var array<DecalsStruct> Decals;
var int NumDecals;
var float FirstDecalSpawnTime;
function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
local ProjectedDecal ProjectedDecal;
if ( Level.NetMode != NM_Standalone )
{
// This isnt called on NM_Client at all, but we dont need replication also on Single Game
ProjectedDecal = ProjectedDecal(Other);
if ( ProjectedDecal != none )
{
PendingDecals[PendingDecals.Length] = ProjectedDecal;
UpdateDecalsTime = Level.TimeSeconds + 0.01;
}
}
return Super.CheckReplacement(Other,bSuperRelevant);
}
simulated function Tick(float DT)
{
local ProjectedDecal Decal;
local float NextUpdateTime;
local int i,n;
Super.Tick(DT);
if ( Level.NetMode != NM_DedicatedServer && UpdateDecalsTime < Level.TimeSeconds )
{
n = Decals.Length;
foreach DynamicActors(class'ProjectedDecal',Decal)
{
for(i=0; i<n; i++)
if ( Decals[i].Decal == none )
{
Decals.Remove(i,1);
i--;
n--;
}
else if ( Decals[i].Decal == Decal ) break;
if ( i >= n )
{
if ( NumDecals++ <= 0 )
{
FirstDecalSpawnTime = Level.TimeSeconds;
NumDecals++;
}
Decals.Insert(n,1);
Decals[n].Decal = Decal;
Decals[n].DestroyTime = Level.TimeSeconds + Decal.default.LifeSpan;
n++;
}
}
for(i=0; i<n; i++)
{
if ( Decals[i].DestroyTime <= Level.TimeSeconds ) /*&& Decals[i].bDeleteMe )*/
{
Decals[i].Decal.Destroy();
Decals.Remove(i,1);
i--;
n--;
}
}
NextUpdateTime = Level.TimeSeconds + (FMax((Level.TimeSeconds-FirstDecalSpawnTime),1)/FMax(NumDecals,1))*RandRange(0.75,1);
if ( ( Level.NetMode == NM_DedicatedServer || Level.NetMode == NM_ListenServer ) && PendingDecals.Length > 0 )
{
while ( PendingDecals.Length > 0 )
{
PendingDecals[0].bTearOff = true;
PendingDecals.Remove(0,1);
}
}
}
}
defaultproperties
{
bAlwaysRelevant=true
RemoteRole=ROLE_SimulatedProxy
bAddToServerPackages=true
GroupName="KF-DecalEraser"
FriendlyName="DecalEraser"
Description="Erases decals."
}