Fix SetMobStateThreshold and MobThresholdsComponent networking (#16840)
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user