It can be useful for MH server because players must know damage of each shot for select best weapon. It especially actually if on map can be custom weapons.
Average necessary, because need know speed of damage, not always damage for one shot give this info. Now you can compare sniper and pulse gun.
Algorithm is far from the best. It is very simple - count damage in ring buffer, exclude last second and calc average. For MH this will be enough.
Usually can be at any place in mutator chain. But if you get problem - place it first.
in action:
Code: Select all
class DmgPerSecond extends Mutator;
const AVG_SECONDS = 5;
var int history[5];
var int curr;
var int pos;
var int last;
var PlayerPawn MyPlayer;
var bool Initialized;
var Font FirstFont;
function PostBeginPlay() {
if (Initialized) return;
Initialized = True;
Level.Game.RegisterDamageMutator( Self );
}
simulated function Tick(float DeltaTime) {
if ( !bHUDMutator && Level.NetMode != NM_DedicatedServer )
RegisterHUDMutator();
nextPos();
}
function nextPos() {
if (curr != Level.Second) {
curr = Level.Second;
pos = pos + 1;
if (pos >= AVG_SECONDS) pos = 0;
history[pos] = 0;
}
}
simulated function PostRender(canvas C) {
local int avg;
local int i;
if ( NextHUDMutator != None )
NextHUDMutator.PostRender(C);
MyPlayer = C.Viewport.Actor;
avg = 0;
for (i = 0; i < AVG_SECONDS; i++) {
if (i != pos) avg = avg + history[i];
}
avg = 1.0 * avg / (1.0 * AVG_SECONDS - 1);
C.SetPos( 0, C.ClipY/2 );
if (FirstFont == None) {
FirstFont = C.Font;
} else if (FirstFont != C.Font) {
C.Font = FirstFont;
}
C.DrawColor.R = 255;
C.DrawColor.G = 255;
C.DrawColor.B = 255;
C.DrawText("[Dmg] avg: " $ avg $ " last: " $ last);
}
function MutatorTakeDamage( out int ActualDamage, Pawn Victim, Pawn InstigatedBy, out Vector HitLocation,
out Vector Momentum, name DamageType) {
if ( NextDamageMutator != None )
NextDamageMutator.MutatorTakeDamage( ActualDamage, Victim, InstigatedBy, HitLocation, Momentum, DamageType );
if (MyPlayer == InstigatedBy && ActualDamage != 0) {
nextPos();
history[pos] = history[pos] + ActualDamage;
last = ActualDamage;
}
}