Any object which has Stats should implement IHaveStats. Doing so will also implement IUseGameModules and IHaveGameId.
Actors which inherit GameModulesActor or GameModulesInventoryActor have these methods already built in!
Below is some sample code for the required methods, which you may choose to use or modify for your purposes. Unless you are adding Stats that are not actors, you would not need to do any of the following, so long as you inherit GameModulesActor :)
// TryGetGameStat()
public override bool TryGetGameStat(Stat stat, out GameStat gameStat)
=> TryGetGameStat(stat.Uid(), out gameStat);
public override bool TryGetGameStat(string uid, out GameStat gameStat)
gameStat = stats.Get(uid, false);
return gameStat != null;
// GetOtherLevels()
public virtual List<ModificationLevel> GetOtherLevels(bool cache = false)
if (_modificationLevels != null && !cache)
return _modificationLevels;
var otherModificationLevels = new List<ModificationLevel>();
// You would add the "Modification Levels" from other Game Module
// objects used on this object or actor.
// This example is from DemoActor.cs in the Party Based RPG demo game
if (!string.IsNullOrWhiteSpace(ActorRace.objectName))
if (!string.IsNullOrWhiteSpace(ActorClass.objectName))
_modificationLevels = otherModificationLevels;
return otherModificationLevels;
// SetStatsDirty()
public virtual void SetStatsDirty(List<Stat> statList)
ResetOtherLevels(false); // Set this to cache next time it is required
foreach (var stat in statList)
if (!TryGetGameStat(stat, out var gameStat)) continue;
// GetStat()
public virtual GameStat GetStat(Stat stat, bool addIfNull = true)
=> GetStat(stat.Uid(), addIfNull);
public virtual GameStat GetStat(string uid, bool addIfNull = true)
=> stats.Get(uid, addIfNull);
Last modified 8mo ago