UE3:UT MDB GameRules (UT3)
From Unreal Wiki, The Unreal Engine Documentation Site
- Package:
- UT_GameDex
- Known custom subclasses:
- UT_MDB_GR_DamageConversion (UT3), UT_MDB_GR_Bloodlust (UT3), UT_MDB_GR_Replacer (UT3)
Code
//====================================================
// Class: UT_MDB_GameRules
// Creation date: 15/01/2009 07:02
// Last Updated: 18/04/2010 13:28
// Contributors: 00zX
//----------------------------------------------------
//Added CheckReplacement support to this, wrapped spawn like timers through Master Actor
//Rewrote LinkedReplicationInfo functionality, now uses forloop and checks for none (will work for all members of list)
//----------------------------------------------------
// Attribution-Noncommercial-Share Alike 3.0 Unported
// http://creativecommons.org/licenses/by-nc-sa/3.0/
//====================================================
class UT_MDB_GameRules extends UT_MDB
config(UT_MDB_GR);
var UT_GR_Info MasterGameRules;
var UT_MDB_GameRules NextGameRules;
var UT_MDB_EventNotifier EventNotifier;
var() array<UT_MDB_GameRules> GameRules; //Sub-GameRules, that means these could contain Subs and so on
var() array<Info.KeyValuePair> GameRulesInfo;
function GetServerDetails(out GameInfo.ServerResponseLine ServerState)
{
local Info.KeyValuePair tPair;
local int i;
foreach GameRulesInfo(tPair)
{
i = ServerState.ServerInfo.Length;
ServerState.ServerInfo.Length = i+1;
ServerState.ServerInfo[i].Key = tPair.Key;
ServerState.ServerInfo[i].Value = tPair.Value;
}
}
//Wormbo - it's a notification, so the various rules actors shouldn't be able to break the chain
// for (GR = GetBaseAddonRules(); GR != None; GR = GR.GetNextAddonRules())
// {
// GR.NotifyPlayerReleased(PRI, OldJail);
// }
//00zX - there are acouple instances where the chain needs to be broken in mine but I call back to super and snap it there
//i can actually jump the chain in some instances because its well, more of a flower shape then a chain :P
//Wormbo - if breaking the chain makes sense, I add a return value or out parameter for modifying the iteration behavior
// for (GR = GetBaseAddonRules(); GR != None; GR = GR.GetNextAddonRules())
// {
// bIsJailFightWeapon = byte(bDefaultJailFightWeapon);
// if (GR.OverrideJailFightWeapon(WeaponClass, Player, bIsJailFightWeapon))
// return bool(bIsJailFightWeapon);
// }
////
/** Initialize Gamerules - mainly for logging */
function Init()
{
`logd("Rules Object Initialized: "$self.name,,'GameRules');
Master = MasterGameRules.GameExp;
if(Master == None)
`logd("Master Mutator not found!",,'GameRules');//Send Object to GC
else
NextGameRules = UT_MDB_GameExp(Master).GetNextGameRules(self);
}
event PostBeginPlay();
function bool PickupQuery(UTPawn Other, class<Inventory> ItemClass, Actor Pickup)
{
return (NextGameRules != none) ? NextGameRules.PickupQuery(Other, ItemClass, Pickup) : false;
}
function int ModifyDamageTaken(UT_GR_Info.EnemyInfo Enemy, optional pawn injured)
{
if(NextGameRules != None)
return NextGameRules.ModifyDamageTaken(Enemy, injured);
/* else
return (Enemy.ModifiedDamage != 0 && Enemy.Damage != Enemy.ModifiedDamage) ? Enemy.ModifiedDamage : Enemy.Damage;*/
}
function int ModifySelfDamage(UT_GR_Info.EnemyInfo Enemy)
{
return (NextGameRules != none) ? NextGameRules.ModifySelfDamage(Enemy) : Enemy.Damage;
}
//Notifications
function NotifyDamageTaken(UT_GR_Info.EnemyInfo Enemy, optional pawn injured);
function NotifySelfDamage(UT_GR_Info.EnemyInfo Enemy);
function NotifyEnteredVehicle(Pawn P);
function NotifyExitedVehicle(Pawn P);
function NotifyController(Controller PC);
//----
//Some of these might need access to gameinfo/worldinfo
simulated function ModifyPawnInfo(UT_GR_Info.PawnInfo PInfo, optional bool bRemoveBonus=false, optional int GlobalMultiplier)
{
if(nextGameRules != none)
nextGameRules.ModifyPawnInfo(PInfo, bRemoveBonus, GlobalMultiplier);
switch (PInfo.Type)
{
case ET_Infantry: break;
case ET_Hero: break;
case ET_Vehicle: break;
case ET_Rook: break;
case ET_Knight: break;
case ET_Bishop: break;
case ET_Turret: break;
}
}
//Could do this in GameInfo, call once for all controllers (and for each logged in?)
simulated function ModifyController(Controller PC, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
//TODO: Obsolete? Depreciate!
//NOTE: This will only allow modification of defaults, might prove to be useful though being static
simulated function ModifyPawn(Pawn P, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
simulated function ModifyRook(UTHeroPawn R, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
simulated function ModifyVehicle(Vehicle V, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
simulated function ModifyWeapon(Weapon W, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
simulated function ModifyVehicleOnEnter(Vehicle V, optional bool bRemoveBonus=false, optional int GlobalMultiplier);
static function ScoreKill(Controller Killer, Controller Killed, bool bOwnedByKiller, optional int GlobalMultiplier);
////
//Replacement functions
function bool CheckReplacement(Actor Other)
{
return true;
}
////
/** Added to allow Gametype hook to UTLinkedReplicationInfo.
Similar to Info attachment method but instead links a replication info to the PRI.*/
//NOTE: Should be called from check replacement!
final function AddReplicationInfo(Actor Other, class<UTLinkedReplicationInfo> LRIC)
{
local UTLinkedReplicationInfo LRI;
local UTPlayerReplicationInfo PRI;
if(LRIC != None)
return;
PRI = UTPlayerReplicationInfo(Other);
for(LRI = PRI.CustomReplicationInfo; LRI == None; LRI = LRI.NextReplicationInfo)
{
if(LRI.Class == LRIC)
break;
//Spawn(LRIC, Other.Owner);
LRI = Master.Spawn(LRIC, Other.Owner);
`logd("PRI.CustomReplicationInfo: "$LRI,,'GameExp');
}
}