/** * Mutator that replicates and diplayes on clients information about how many * zeds are spawned and with what recent spawn rate. * * Author: dkanus * Home repo: https://insultplayers.ru/git/dkanus/KFZedsReport */ class KFZedsReportMut extends Mutator; // How often should we update our information? var config float updateInterval; // Over what interval do we count average spawn rate? var config float smoothingInterval; var bool interactionAdded; var array zedSpawnTimes; var int repCurrentTotalZeds, repGameInfo_MaxMonsters; var float repCurrentSpawnRate; replication { reliable if (role == ROLE_Authority) repCurrentTotalZeds, repGameInfo_MaxMonsters, repCurrentSpawnRate; } function PostBeginPlay() { if (updateInterval <= 0) { updateInterval = 0.25; } if (smoothingInterval <= 0) { smoothingInterval = 10.0; } SetTimer(updateInterval, true); } function bool CheckReplacement(Actor other, out byte bSuperRelevant) { if (Monster(other) != none) { zedSpawnTimes[zedSpawnTimes.length] = level.timeSeconds; } return true; } 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("KFZedsReport.ReportInteraction", localPlayer)); if (myInteraction != none) { myInteraction.reportMutator = self; interactionAdded = true; } } function Timer() { local int i; local float cutOffTime; local Monster nextMonster; cutOffTime = level.timeSeconds - smoothingInterval; while (i < zedSpawnTimes.length) { if (zedSpawnTimes[i] < cutOffTime) { zedSpawnTimes.Remove(i, 1); } else { i += 1; } } // Update replicated values repGameInfo_MaxMonsters = KFGameType(level.game).maxMonsters; repCurrentSpawnRate = zedSpawnTimes.length / smoothingInterval; repCurrentTotalZeds = 0; foreach level.DynamicActors(class'Monster', nextMonster) { if (nextMonster.health > 0) { repCurrentTotalZeds += 1; } } } defaultproperties { // Mutator description GroupName = "Test mutatros" FriendlyName = "Zed report 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 // Default config values updateInterval = 0.25 smoothingInterval = 10.0 }