Anton Tarasenko
3 years ago
commit
c8613dc519
2 changed files with 139 additions and 0 deletions
@ -0,0 +1,101 @@ |
|||||||
|
/** |
||||||
|
* Mutator that replicates and diplayes on clients information about how many |
||||||
|
* zeds are spawned and with what recent spawn rate. |
||||||
|
*/ |
||||||
|
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<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 |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
class ReportInteraction extends Interaction; |
||||||
|
|
||||||
|
var KFZedsReportMut reportMutator; |
||||||
|
|
||||||
|
event NotifyLevelChange() |
||||||
|
{ |
||||||
|
if (master != none) { |
||||||
|
master.RemoveInteraction(self); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function PostRender(Canvas canvas) |
||||||
|
{ |
||||||
|
local float textWidth, textHeight; |
||||||
|
local string maxZedsReport, spawnRateReport; |
||||||
|
local string tagWhite, tagGreen; |
||||||
|
if (canvas == none) return; |
||||||
|
if (reportMutator == none) return; |
||||||
|
|
||||||
|
tagWhite = Chr(27) $ Chr(250) $ Chr(250) $ Chr(250); |
||||||
|
tagGreen = Chr(27) $ Chr(1) $ Chr(200) $ Chr(1); |
||||||
|
maxZedsReport = tagWhite $ "Current total zeds" |
||||||
|
@ tagGreen $ reportMutator.repCurrentTotalZeds |
||||||
|
@ tagWhite $ "out of server's total" |
||||||
|
@ tagGreen $ reportMutator.repGameInfo_MaxMonsters; |
||||||
|
spawnRateReport = tagWhite $ "Current spawn rate is" |
||||||
|
@ tagGreen $ reportMutator.repCurrentSpawnRate; |
||||||
|
canvas.TextSize(maxZedsReport, textWidth, textHeight); |
||||||
|
canvas.SetPos(0, 0); |
||||||
|
canvas.DrawText(maxZedsReport); |
||||||
|
canvas.SetPos(0, textHeight + 10); |
||||||
|
canvas.DrawText(spawnRateReport); |
||||||
|
} |
||||||
|
|
||||||
|
defaultproperties |
||||||
|
{ |
||||||
|
bVisible = true |
||||||
|
} |
Loading…
Reference in new issue