User:Wormbo/ClientMaterialTrigger
![]() |
Object >> Actor >> Triggers >> MaterialTrigger >> ClientMaterialTrigger (custom) |
The ClientMaterialTrigger class triggers Materials just like a MaterialTrigger. The important difference is: The ClientMaterialTrigger also works on network clients. (See Replication.)
Note: If you're working with Jailbreak 2004 you should use the identical JBMaterialTrigger class from the JBToolbox package instead.
Properties
Property group 'MaterialTrigger'
MaterialsToTrigger
Inherited from MaterialTrigger. A list of materials that should be triggered or reset.
TriggerAction
Type: ETriggerAction
What to do with the materials when the ClientMaterialTrigger is triggered.
UntriggerAction
Type: EUntriggerAction
What to do with the materials when the ClientMaterialTrigger is untriggered.
Enums
ETriggerAction
- TriggerTriggers
- Triggering the ClientMaterialTrigger triggers the materials. (default)
- TriggerResets
- Triggering the ClientMaterialTrigger resets the materials.
- TriggerDoesNothing
- Triggering the ClientMaterialTrigger has no effect.
EUntriggerAction
- UntriggerDoesNothing
- Untriggering the ClientMaterialTrigger has no effect. (default)
- UntriggerTriggers
- Untriggering the ClientMaterialTrigger triggers the materials.
- UntriggerResets
- Untriggering the ClientMaterialTrigger resets the materials.
Code
This custom class actually consists of two classes, ClientMaterialTrigger and MaterialTriggerReplicationInfo. Both are required for compiling.
ClientMaterialTrigger
Create a subclass of MaterialTrigger in the package MyLevel and name it ClientMaterialTrigger
. Paste the following code replacing the lines UnrealEd automatically added to the class:
//=============================================================================
// ClientMaterialTrigger
// Copyright 2003 by Wormbo
//
// A MaterialTrigger that works in network games.
//=============================================================================
class ClientMaterialTrigger extends MaterialTrigger;
//=============================================================================
// Variables
//=============================================================================
// whether triggering resets or triggers the materials
var(MaterialTrigger) enum ETriggerAction {
TriggerTriggers,
TriggerResets,
TriggerDoesNothing
} TriggerAction;
// whether untriggering resets or triggers the materials
var(MaterialTrigger) enum EUnriggerAction {
UntriggerDoesNothing,
UntriggerTriggers,
UntriggerResets
} UntriggerAction;
// array holding the ReplicationInfos for clientside triggering
var array<MaterialTriggerReplicationInfo> ReplicatedMaterialTriggers;
//=============================================================================
// PostBeginPlay
//
// Spawns a MaterialTriggerReplicationInfo for each triggered material.
//=============================================================================
function PostBeginPlay()
{
local int i;
ReplicatedMaterialTriggers.Length = MaterialsToTrigger.Length;
for (i = 0; i < MaterialsToTrigger.Length; i++) {
ReplicatedMaterialTriggers[i] = Spawn(class'MaterialTriggerReplicationInfo', Self);
ReplicatedMaterialTriggers[i].SetMaterialToTrigger(string(MaterialsToTrigger[i]));
}
}
//=============================================================================
// Trigger
//
// Tells the MTRIs about the Instigators and triggering actors and tells them
// to trigger the material.
//=============================================================================
function Trigger(Actor Other, Pawn EventInstigator)
{
local int i;
if ( Other == None )
Other = Self;
if ( TriggerAction == TriggerTriggers ) {
for (i = 0; i < ReplicatedMaterialTriggers.Length; i++)
if ( ReplicatedMaterialTriggers[i] != None )
ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
}
else if ( TriggerAction == TriggerResets ) {
for (i = 0; i < ReplicatedMaterialTriggers.Length; i++)
if ( ReplicatedMaterialTriggers[i] != None )
ReplicatedMaterialTriggers[i].ResetMaterial();
}
}
//=============================================================================
// Untrigger
//
// Triggers or resets the materials depending on the UntriggerAction property.
//=============================================================================
function Untrigger(Actor Other, Pawn EventInstigator)
{
local int i;
if ( Other == None )
Other = Self;
if ( UntriggerAction == UntriggerTriggers ) {
for (i = 0; i < ReplicatedMaterialTriggers.Length; i++)
if ( ReplicatedMaterialTriggers[i] != None )
ReplicatedMaterialTriggers[i].TriggerMaterial(Other, EventInstigator);
}
else if ( UntriggerAction == UntriggerResets ) {
for (i = 0; i < ReplicatedMaterialTriggers.Length; i++)
if ( ReplicatedMaterialTriggers[i] != None )
ReplicatedMaterialTriggers[i].ResetMaterial();
}
}
MaterialTriggerReplicationInfo
![]() |
Object >> Actor >> Info >> ReplicationInfo >> MaterialTriggerReplicationInfo (custom) |
The MaterialTriggerReplicationInfo is a non-placeable helper class to replicate trigger events to network clients. It will be spawned by the ClientMaterialTrigger at runtime.
Create a subclass of ReplicationInfo in MyLevel and name it MaterialTriggerReplicationInfo
. (You need to uncheck the "Placeable classes Only" checkbox to see ReplicationInfo in the Actor Classes Browser.) Paste the following code replacing the lines UnrealEd automatically added to the class:
//=============================================================================
// MaterialTriggerReplicationInfo
// Copyright 2003 by Wormbo
//
// Used by ClientMaterialTrigger to replicate material trigger events to
// network clients.
//=============================================================================
class MaterialTriggerReplicationInfo extends ReplicationInfo;
//=============================================================================
// Variables
//=============================================================================
var Material MaterialToTrigger;
var string MaterialName;
var int ClientTriggerCount;
var int ClientUnTriggerCount;
var int TriggerCount;
var struct TTriggerData {
var Actor Triggerer;
var Pawn EventInstigator;
var byte TriggerAction; // 0 = nothing/idle, 1 = trigger, 2 = reset
} LastTriggerings[10];
//=============================================================================
// Replication
//=============================================================================
replication
{
reliable if ( Role == ROLE_Authority )
TriggerCount, LastTriggerings, MaterialName;
}
simulated function PostBeginPlay()
{
SetTimer(0.1, True);
}
function SetMaterialToTrigger(string newMaterial)
{
MaterialName = newMaterial;
}
function TriggerMaterial(Actor Other, Pawn EventInstigator)
{
TriggerCount++;
LastTriggerings[TriggerCount % 10].Triggerer = Other;
LastTriggerings[TriggerCount % 10].EventInstigator = EventInstigator;
LastTriggerings[TriggerCount % 10].TriggerAction = 1;
}
function ResetMaterial()
{
TriggerCount++;
LastTriggerings[TriggerCount % 10].TriggerAction = 2;
}
simulated function Timer()
{
if ( MaterialName != "" && MaterialToTrigger == None ) {
MaterialToTrigger = Material(DynamicLoadObject(MaterialName, class'Material'));
if ( MaterialToTrigger != None )
MaterialToTrigger.Reset();
}
if ( MaterialToTrigger != None && TriggerCount > ClientTriggerCount
&& LastTriggerings[(ClientTriggerCount + 1) % 10].TriggerAction != 0 ) {
ClientTriggerCount++;
if ( LastTriggerings[ClientTriggerCount % 10].TriggerAction == 2 )
MaterialToTrigger.Reset();
else
MaterialToTrigger.Trigger(LastTriggerings[ClientTriggerCount % 10].Triggerer,
LastTriggerings[ClientTriggerCount % 10].EventInstigator);
}
}