rott/kf_sources/HideMut/Classes.backup/a_MapOptimizer.uc
2026-07-14 20:27:09 +07:00

161 lines
4.7 KiB
Ucode

class a_MapOptimizer extends Actor
config(HideMut);
struct MyZone
{
var int ZoneKey; //zone key
var string ZoneName; //Zone name
var array<Vector> VectorsCoord; //Coordinates of zone borders. Drawing from 0 to 1, 1 to 2 and etc.
var float MinX, MinY, MaxX, MaxY; //Minimal coords for setting zoned actors
var array<int> PortalActorsRefs; //Actors that are visible through "portal" aka hole between neighbouring zones. Neighbouring zones may have same set of this
var array<int> DecorativeActorsRefs; //Decorative stuff between zones
var bool IgnoreXAxis; //Ignore this axis when setting active zone
var bool IgnoreYAxis;
var bool IgnoreZAxis;
var bool HideDecorativeActors;
var bool HidePortalActors;
};
var config array<MyZone> MyZones;
struct MyZonedMap
{
//Struct for map zoning
var string MapName;
var array<int> MyZoneRef; //reference to my zone structure
};
var config array<MyZonedMap> ZonedMaps;
struct ZonedStaticMeshes
{
var int ZoneRef;
var array<StaticMeshActor> SMA;
};
var array<ZonedStaticMeshes> ZonedSMA;
var PlayerController PC;
var int ActiveZonedMap;
var int ActiveZone, PrevActiveZone;
var int i, k;
simulated function StartMapOptimizer()
{
local StaticMeshActor SMA;
PC = Level.GetLocalPlayerController();
if(ZonedMaps.length == 0 || MyZones.length == 0 || PC == none || PC.Pawn == none)
return;
ActiveZonedMap = -1;
for(i=0; i<ZonedMaps.length;i++) //Let's find map profile
{
if(PC.Level.GetURLMap() ~= ZonedMaps[i].MapName);
ActiveZonedMap = i; //and save it
}
if(ActiveZonedMap == -1) //no profiles for this map
return;
for(i=0;i<ZonedMaps[ActiveZonedMap].MyZoneRef.length;i++) //Let's cache static meshes
{
ZonedSMA.length = ZonedSMA.length + 1;
ZonedSMA[ZonedSMA.length-1].ZoneRef = ZonedMaps[ActiveZonedMap].MyZoneRef[i];
ForEach PC.AllActors(class'StaticMeshActor', SMA)
{
if(Sma.bHidden)
continue;
if((SMA.Location.X <= MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MaxX && SMA.Location.Y <= MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MaxY)
&& (SMA.Location.X >= MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MinX && SMA.Location.Y >= MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MinY))
{
ZonedSMA[ZonedSMA.length-1].SMA.length = ZonedSMA[ZonedSMA.length-1].SMA.length + 1;
ZonedSMA[ZonedSMA.length-1].SMA[ZonedSMA[ZonedSMA.length-1].SMA.length-1] = SMA;
SMA.bHidden = True;
SMA.ResetStaticFilterState();
}
}
}
Enable('Tick');
}
simulated function StopMapOptimizer()
{
Disable('Tick');
for(i=0; i<ZonedSMA.length; i++)
{
for(k=0;k<ZonedSMA[i].SMA.length;k++) //show our hided static meshes
{
ZonedSMA[i].SMA[k].bHidden=False;
ZonedSMA[i].SMA[k].ResetStaticFilterState();
}
}
ZonedSMA.length = 0;
}
function Timer(){}
simulated function Tick(float Delta)
{
if(PC.Pawn == none) //No pawn no optimizer
StopMapOptimizer();
ActiveZone = -1;
for(i=0;i<ZonedMaps[ActiveZonedMap].MyZoneRef.length;i++) //Let's find our active zone == where are we now?
{
if(PC.Pawn.Location.X > MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MinX && PC.Pawn.Location.Y > MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MinY)
{
if(PC.Pawn.Location.X < MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MaxX && PC.Pawn.Location.Y < MyZones[ZonedMaps[ActiveZonedMap].MyZoneRef[i]].MaxY)
{
ActiveZone = ZonedMaps[ActiveZonedMap].MyZoneRef[i];
break;
}
}
}
if(ActiveZone == -1 || ZonedSMA.length == 0) //No active zones - seems like we are out of rectangle borders
return;
for(i=0; i<ZonedSMA.length; i++)
{
if(ZonedSMA[i].ZoneRef == ActiveZone) //Let's show our static meshes that situated in our active zone
{
if(ZonedSMA[i].SMA[0]!=none && !ZonedSMA[i].SMA[0].bHidden)
continue;
For(k=0;k<ZonedSMA[i].SMA.length;k++)
{
if(ZonedSMA[i].SMA[k] != none)
{
ZonedSMA[i].SMA[k].bHidden=False;
ZonedSMA[i].SMA[k].ResetStaticFilterState();
}
else
{
ZonedSMA[i].SMA.Remove(k,1);
}
}
}
else //hide statics that was in previous active zone
{
if(!ZonedSMA[i].SMA[0].bHidden)
{
For(k=0;k<ZonedSMA[i].SMA.length;k++)
{
ZonedSMA[i].SMA[k].bHidden=True;
ZonedSMA[i].SMA[k].ResetStaticFilterState();
}
}
}
}
}
simulated event Destroyed()
{
super.Destroyed();
}
defaultproperties
{
bHidden=True
bUnlit=True
}