Listeners
A listener, as its name suggests, allows to listen for changes.
There's different kinds of listeners, for example a ScriptStatsListener allows to listen for changes on stats, namely BaseStats in the code. The game contains numerous stats, let's look at an example.
Detoxifier (a.k.a ToxinCleanser) grants the following stats:
gamedataStatType.PoisonImmunitygamedataStatType.HasPoisonImmunity
Note: gamedataStatType is used in TweakDB with BaseStats, this can be observed in RPGManager in the sources.
Another example from the sources with gamedataStatType.AutoReveal:
Redscript
public class AutoRevealStatListener extends ScriptStatsListener {
public let m_owner: wref<GameObject>;
public func OnStatChanged(ownerID: StatsObjectID, statType: gamedataStatType, diff: Float, total: Float) -> Void {
let updateRequest: ref<UpdateAutoRevealStatEvent>;
if Equals(statType, gamedataStatType.AutoReveal) && IsDefined(this.m_owner as PlayerPuppet) {
updateRequest = new UpdateAutoRevealStatEvent();
updateRequest.hasAutoReveal = total > 0.00;
this.m_owner.QueueEvent(updateRequest);
};
}
}
public class UpdateAutoRevealStatEvent extends Event {
public let hasAutoReveal: Bool;
}
public class PlayerPuppet extends ScriptedPuppet {
protected cb func OnUpdateAutoRevealStatEvent(evt: ref<UpdateAutoRevealStatEvent>) -> Bool {
// do something ...
}
protected final func RegisterStatListeners(self: ref<PlayerPuppet>) -> Void {
let statsSystem: ref<StatsSystem> = GameInstance.GetStatsSystem(this.GetGame());
let statPoolsSystem: ref<StatPoolsSystem> = GameInstance.GetStatPoolsSystem(this.GetGame());
let entityID: EntityID = this.GetEntityID();
this.m_autoRevealListener = new AutoRevealStatListener();
this.m_autoRevealListener.SetStatType(gamedataStatType.AutoReveal);
this.m_autoRevealListener.m_owner = self;
statsSystem.RegisterListener(Cast<StatsObjectID>(entityID), this.m_autoRevealListener);
}
protected final func UnregisterStatListeners(self: ref<PlayerPuppet>) -> Void {
let statsSystem: ref<StatsSystem> = GameInstance.GetStatsSystem(this.GetGame());
let statPoolsSystem: ref<StatPoolsSystem> = GameInstance.GetStatPoolsSystem(this.GetGame());
let entityID: EntityID = this.GetEntityID();
statsSystem.UnregisterListener(Cast<StatsObjectID>(entityID), this.m_autoRevealListener);
this.m_autoRevealListener = null;
}
}
There are different kinds of listeners:
ScriptStatsListener➡️BaseStatsScriptStatPoolsListener➡️BaseStatPools- ...