135 lines
4.0 KiB
Ucode
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
|
|
} |