You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.8 KiB
97 lines
2.8 KiB
/** |
|
* 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 |
|
} |