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

135 lines
4.0 KiB
Ucode

class TehSpawnsMut extends Mutator;
var bool interactionAdded;
function Mutate(string mutateString, PlayerController player)
{
local SpawnManager manager;
if (mutateString ~= "pathinfo") {
ShowMeInfo(player);
}
if (mutateString ~= "doit")
{
manager = Spawn(class'SpawnManager');
manager.Initialize();
}
if (mutateString ~= "predoit") {
DoIt(player, false);
}
if (mutateString ~= "predoit2") {
DoIt(player, true);
}
if (mutateString ~= "check") {
CheckSin(player);
}
if (nextMutator != none) {
nextMutator.Mutate(mutateString, player);
}
}
function ShowMeInfo(PlayerController player)
{
local int nodeCount, volumeCount;
local ZombieVolume nextVolume;
local NavigationPoint nextNode;
StopWatch(false);
foreach AllActors(class'NavigationPoint', nextNode) {
nodeCount += 1;
}
StopWatch(true);
StopWatch(false);
foreach AllActors(class'ZombieVolume', nextVolume) {
volumeCount += 1;
}
StopWatch(true);
player.ClientMessage("Path nodes count:" @ nodeCount);
player.ClientMessage("`ZomvieVolume`s count:" @ volumeCount);
}
function CheckSin(PlayerController player)
{
local int i;
StopWatch(false);
for (i = 0; i < 1000; i += 1) {
sin(float(i));
}
StopWatch(true);
}
function doit(PlayerController player, bool nav)
{
local int iter;
local int totalZV, fullZV;
local float perc;
local float distance, maxDistance;
local NavigationPoint nextPoint, furthestPoint, selectedPoint;
local ZombieVolume nextVolume, isolatedVolume;
maxDistance = -1;
StopWatch(false);
foreach AllActors(class'ZombieVolume', nextVolume)
{
distance = 1000000;
selectedPoint = none;
foreach AllActors(class'NavigationPoint', nextPoint)
{
iter += 1;
if (VSize(nextPoint.location - nextVolume.location) < distance)
{
if (!FastTrace(nextPoint.location, nextVolume.location)) {
continue;
}
distance = VSize(nextPoint.location - nextVolume.location);
selectedPoint = nextPoint;
}
}
totalZV += 1;
if (selectedPoint != none && nextVolume.Encompasses(selectedPoint)) {
fullZV += 1;
}
//Log("Min distance:" @ distance);
if (maxDistance < distance && selectedPoint != none)
{
maxDistance = distance;
isolatedVolume = nextVolume;
furthestPoint = selectedPoint;
}
}
StopWatch(true);
perc = (float(fullZV) / float(totalZV)) * 100;
player.ClientMessage("Max ditance is:" @ maxDistance);
player.ClientMessage("Iterations done:" @ iter);
player.ClientMessage("Full volume percentage:" @ perc);
if (nav) {
player.SetLocation(furthestPoint.location);
}
else {
player.SetLocation(isolatedVolume.location);
}
}
simulated function Tick(float delta)
{
local ReportInteraction myInteraction;
local Player localPlayer;
if (role == Role_AUTHORITY) return;
if (interactionAdded) return;
localPlayer = level.GetLocalPlayerController().player;
if (localPlayer == none) return;
myInteraction = ReportInteraction(localPlayer.interactionMaster
.AddInteraction("TehSpawns.ReportInteraction", localPlayer));
if (myInteraction != none) {
interactionAdded = true;
}
}
defaultproperties
{
// Mutator description
GroupName = "Test mutators"
FriendlyName = "Zed spawner mutator"
Description = "Mutator that provides clients with information about how many zeds (and their spawn rate) are present on the map."
bAddToServerPackages = true
bAlwaysRelevant = true
RemoteRole = ROLE_SimulatedProxy
}