Fix SetMobStateThreshold and MobThresholdsComponent networking (#16840)

This commit is contained in:
Nemanja
2023-05-26 23:50:33 -04:00
committed by GitHub
parent 30a7045a2d
commit 273e101477
2 changed files with 61 additions and 4 deletions

View File

@@ -1,6 +1,7 @@
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Systems;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Mobs.Components; namespace Content.Shared.Mobs.Components;
@@ -8,18 +9,38 @@ namespace Content.Shared.Mobs.Components;
[Access(typeof(MobThresholdSystem))] [Access(typeof(MobThresholdSystem))]
public sealed class MobThresholdsComponent : Component public sealed class MobThresholdsComponent : Component
{ {
[DataField("thresholds", required:true), AutoNetworkedField(true)] [DataField("thresholds", required:true)]
public SortedDictionary<FixedPoint2, MobState> Thresholds = new(); public SortedDictionary<FixedPoint2, MobState> Thresholds = new();
[DataField("triggersAlerts"), AutoNetworkedField] [DataField("triggersAlerts")]
public bool TriggersAlerts = true; public bool TriggersAlerts = true;
[DataField("currentThresholdState"), AutoNetworkedField] [DataField("currentThresholdState")]
public MobState CurrentThresholdState; public MobState CurrentThresholdState;
/// <summary> /// <summary>
/// Whether or not this entity can be revived out of a dead state. /// Whether or not this entity can be revived out of a dead state.
/// </summary> /// </summary>
[DataField("allowRevives"), AutoNetworkedField] [DataField("allowRevives")]
public bool AllowRevives; public bool AllowRevives;
} }
[Serializable, NetSerializable]
public sealed class MobThresholdsComponentState : ComponentState
{
public Dictionary<FixedPoint2, MobState> UnsortedThresholds;
public bool TriggersAlerts;
public MobState CurrentThresholdState;
public bool AllowRevives;
public MobThresholdsComponentState(Dictionary<FixedPoint2, MobState> unsortedThresholds, bool triggersAlerts, MobState currentThresholdState, bool allowRevives)
{
UnsortedThresholds = unsortedThresholds;
TriggersAlerts = triggersAlerts;
CurrentThresholdState = currentThresholdState;
AllowRevives = allowRevives;
}
}

View File

@@ -4,6 +4,7 @@ using Content.Shared.Alert;
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Components;
using Robust.Shared.GameStates;
namespace Content.Shared.Mobs.Systems; namespace Content.Shared.Mobs.Systems;
@@ -14,12 +15,38 @@ public sealed class MobThresholdSystem : EntitySystem
public override void Initialize() public override void Initialize()
{ {
SubscribeLocalEvent<MobThresholdsComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<MobThresholdsComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<MobThresholdsComponent, ComponentShutdown>(MobThresholdShutdown); SubscribeLocalEvent<MobThresholdsComponent, ComponentShutdown>(MobThresholdShutdown);
SubscribeLocalEvent<MobThresholdsComponent, ComponentStartup>(MobThresholdStartup); SubscribeLocalEvent<MobThresholdsComponent, ComponentStartup>(MobThresholdStartup);
SubscribeLocalEvent<MobThresholdsComponent, DamageChangedEvent>(OnDamaged); SubscribeLocalEvent<MobThresholdsComponent, DamageChangedEvent>(OnDamaged);
SubscribeLocalEvent<MobThresholdsComponent, UpdateMobStateEvent>(OnUpdateMobState); SubscribeLocalEvent<MobThresholdsComponent, UpdateMobStateEvent>(OnUpdateMobState);
} }
private void OnGetState(EntityUid uid, MobThresholdsComponent component, ref ComponentGetState args)
{
var thresholds = new Dictionary<FixedPoint2, MobState>();
foreach (var (key, value) in component.Thresholds)
{
thresholds.Add(key, value);
}
args.State = new MobThresholdsComponentState(thresholds,
component.TriggersAlerts,
component.CurrentThresholdState,
component.AllowRevives);
}
private void OnHandleState(EntityUid uid, MobThresholdsComponent component, ref ComponentHandleState args)
{
if (args.Current is not MobThresholdsComponentState state)
return;
component.Thresholds = new SortedDictionary<FixedPoint2, MobState>(state.UnsortedThresholds);
component.TriggersAlerts = state.TriggersAlerts;
component.CurrentThresholdState = state.CurrentThresholdState;
component.AllowRevives = state.AllowRevives;
}
#region Public API #region Public API
/// <summary> /// <summary>
@@ -222,7 +249,16 @@ public sealed class MobThresholdSystem : EntitySystem
if (!Resolve(target, ref threshold)) if (!Resolve(target, ref threshold))
return; return;
// create a duplicate dictionary so we don't modify while enumerating.
var thresholds = new Dictionary<FixedPoint2, MobState>(threshold.Thresholds);
foreach (var (damageThreshold, state) in thresholds)
{
if (state != mobState)
continue;
threshold.Thresholds.Remove(damageThreshold);
}
threshold.Thresholds[damage] = mobState; threshold.Thresholds[damage] = mobState;
Dirty(threshold);
VerifyThresholds(target, threshold); VerifyThresholds(target, threshold);
} }