Mostly Harmless

UE3:UT MDB GameRules (UT3)

From Unreal Wiki, The Unreal Engine Documentation Site
Jump to: navigation, search
UT3 Object >> UT_MDB >> UT_MDB_GameRules (custom)


Known custom subclasses:
UT_MDB_GR_DamageConversion (UT3), UT_MDB_GR_Bloodlust (UT3), UT_MDB_GR_Replacer (UT3)


//	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
class UT_MDB_GameRules extends UT_MDB
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: "$,,'GameRules');
	Master = MasterGameRules.GameExp;
	if(Master == None)
		`logd("Master Mutator not found!",,'GameRules');//Send Object to GC
		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;
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)
	PRI = UTPlayerReplicationInfo(Other);
	for(LRI = PRI.CustomReplicationInfo; LRI == None; LRI = LRI.NextReplicationInfo)
		if(LRI.Class == LRIC)
		//Spawn(LRIC, Other.Owner);
		LRI = Master.Spawn(LRIC, Other.Owner);
		`logd("PRI.CustomReplicationInfo: "$LRI,,'GameExp');