//============================================================================= // RevengeMod // // This mutator awards a player for killing someone who has killed them. // // ToDo: Make configurable, serverside. // // Contact : bob.chatman@gmail.com // Website : www.gneu.org // License : Content is available under Creative Commons Attribution-ShareAlike // 3.0 License. //============================================================================= Class UTGameRules_RevengeMod extends GameRules Config( RevengeMod ); struct RevengeData { var Controller Killer; var int ConsecutiveKills; structdefaultproperties { ConsecutiveKills = 1 } }; struct RevengePlayers { var Controller Killed; var array Statistics; }; // Player array var array Players; // How long to apply bonus var config int BonusTime; function ScoreKill(Controller Killer, Controller Killed) { local int index, ndx; local RevengePlayers RP; local PlayerController PC; local RevengeData RD; local Inventory Bonus; local class WeaponClass; Bonus = None; // If the killer is in our killed array... index = Players.Find('Killed', Killer); if (index > -1) { // Check the killers statistics array for the killed ndx = Players[index].Statistics.Find('Killer', Killed); if (ndx > -1) { // If the killer is here, that means they have been killed by this killed person. Check their consecutive kills switch (Players[index].Statistics[ndx].ConsecutiveKills) { case 0: break; case 1: Bonus = spawn(class'UTInvisibility'); UTTimedPowerup(Bonus).TimeRemaining = BonusTime; break; case 2: Bonus = spawn(class'UTUDamage'); UTTimedPowerup(Bonus).TimeRemaining = BonusTime; break; case 3: Bonus = spawn(class'UTBerserk'); UTTimedPowerup(Bonus).TimeRemaining = BonusTime; break; case 4: WeaponClass = class(DynamicLoadObject("UTGameContent.UTWeap_Redeemer_Content", class'Class')); if( Weapon(Players[index].Killed.Pawn.FindInventoryType(WeaponClass)) == None ) Players[index].Killed.Pawn.CreateInventory( WeaponClass ); break; default: Bonus = spawn(class'UTInvulnerability'); UTTimedPowerup(Bonus).TimeRemaining = BonusTime; } if (Bonus != None) if (UTTimedPowerup(Bonus) != None) { Bonus.GiveTo(Players[index].Killed.Pawn); } PrintDBG(); Players[index].Statistics.Remove(ndx, 1); } } // If the killed is in our killed array... index = Players.Find('Killed', Killed); if (index > -1) { // Check the killers statistics array for the killer ndx = Players[index].Statistics.Find('Killer', Killer); if (ndx > -1) // increment the counter Players[index].Statistics[ndx].ConsecutiveKills++; else // Create a new entry in our stats array { // increment the counter RD.Killer = Killer; Players[index].Statistics.AddItem(RD); } } else // Create New Entry in stats array { RP.Killed = Killed; RD.Killer = Killer; RP.Statistics.AddItem(RD); Players.AddItem(RP); } // PrintDBG(); if ( NextGameRules != None ) NextGameRules.ScoreKill(Killer,Killed); } function PreBeginPlay() { local RevengePlayers RP; // Clear out old data foreach Players(RP) { RP.Statistics.Remove( 0, RP.Statistics.length); } Players.Remove(0, Players.length); } function PrintDBG() { local RevengePlayers RP; local RevengeData RD; foreach Players(RP) { `log("" $ RP.Killed,,'UTGameRules_RevengeMod DBG'); foreach RP.Statistics(RD) { `log("" $ RD.Killer @ RD.ConsecutiveKills,,'UTGameRules_RevengeMod DBG'); } } } exec function UpdateSpeed(int speed) { `log("Updating Game Speed to :" @ speed,, 'SpeedMod'); WorldInfo.Game.SetGameSpeed(speed / 100.0f); } defaultproperties { BonusTime=15 }