Mostly Harmless
UE2:KarmaThing
KarmaThing[edit]
Coded by unknown author. We got the script from a mapper who said that the creator allowed to freely distribute this script, so I put it in my tool set to make it easy available for everyone. Originally published in the package 'KarmaOnline'.
- Known custom subclass:
- Crusha/UltimateMappingTools/UltimateDestructibleEnvironment
Usually KActors don't work properly in netplay. Their collision is replicated by the server, but they don't change their visual location on the clients. This is a fixed version of the KActor that works in online games.
Variables[edit]
Except for one variable there is nothing new to the level designer in compare to a KActor. Here you can learn how to set up a KActor properly to achieve what you want.
Property group 'KarmaThing'[edit]
MaxNetUpdateInterval[edit]
Type: float
How frequently the location and rotation of the KActor gets updated for the client. The lower this value the more frequent gets it updated.
Default value: 0.5
Script Code[edit]
This is the original code, if someone is interested.
//----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- class KarmaThing extends KActor placeable; var() float MaxNetUpdateInterval; var float NextNetUpdateTime; var KRigidBodyState KState, KRepState; var bool bNewKState; var int StateCount, LastStateCount; replication { unreliable if(Role == ROLE_Authority) KRepState, StateCount; } function Tick(float Delta) { PackState(); } //Pack current state to be replicated function PackState() { local bool bChanged; if(!KIsAwake()) return; KGetRigidBodyState(KState); bChanged = Level.TimeSeconds > NextNetUpdateTime; bChanged = bChanged || VSize(KRBVecToVector(KState.Position) - KRBVecToVector(KRepState.Position)) > 5; bChanged = bChanged || VSize(KRBVecToVector(KState.LinVel) - KRBVecToVector(KRepState.LinVel)) > 1; bChanged = bChanged || VSize(KRBVecToVector(KState.AngVel) - KRBVecToVector(KRepState.AngVel)) > 1; if(bChanged) { NextNetUpdateTime = Level.TimeSeconds + MaxNetUpdateInterval; KRepState = KState; StateCount++; } else return; } //New state recieved. simulated event PostNetReceive() { if(StateCount == LastStateCount) return; } //Apply new state. simulated event bool KUpdateState(out KRigidBodyState newState) { //This should never get called on the server - but just in case! if(Role == ROLE_Authority || StateCount == LastStateCount) return false; //Apply received data as new position of actor. newState = KRepState; StateCount = LastStateCount; return true; } DefaultProperties { MaxNetUpdateInterval=0.5 }