|
|
|
/**
|
|
|
|
* 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
|
|
|
|
config(KFZedsReport);
|
|
|
|
|
|
|
|
// 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<float> 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
|
|
|
|
}
|