diff --git a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs index 8ae619e9f7..38d64383ad 100644 --- a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using Content.Server.GameObjects.Components.Atmos; using Content.Server.GameObjects.Components.Buckle; -using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Movement; +using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Pulling; using Content.Shared.GameObjects.EntitySystems; @@ -23,6 +23,20 @@ namespace Content.Server.GameObjects.Components.Mobs [ViewVariables] private readonly Dictionary _statusEffects = new Dictionary(); + protected override void Startup() + { + base.Startup(); + + EntitySystem.Get().AddStatus(this); + } + + public override void OnRemove() + { + EntitySystem.Get().RemoveStatus(this); + + base.OnRemove(); + } + public override ComponentState GetComponentState() { return new StatusEffectComponentState(_statusEffects); diff --git a/Content.Server/GameObjects/EntitySystems/GravitySystem.cs b/Content.Server/GameObjects/EntitySystems/GravitySystem.cs index 06d4be417d..501b0809fa 100644 --- a/Content.Server/GameObjects/EntitySystems/GravitySystem.cs +++ b/Content.Server/GameObjects/EntitySystems/GravitySystem.cs @@ -3,6 +3,7 @@ using System.Linq; using Content.Server.GameObjects.Components.Gravity; using Content.Server.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Gravity; +using Content.Shared.GameObjects.EntitySystemMessages.Gravity; using JetBrains.Annotations; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; @@ -41,7 +42,7 @@ namespace Content.Server.GameObjects.EntitySystems { generator.UpdateState(); } - + if (generator.Status == GravityGeneratorStatus.On) { gridsWithGravity.Add(generator.Owner.Transform.GridID); @@ -52,12 +53,11 @@ namespace Content.Server.GameObjects.EntitySystems { if (grid.HasGravity && !gridsWithGravity.Contains(grid.Index)) { - grid.HasGravity = false; - ScheduleGridToShake(grid.Index, ShakeTimes); - } else if (!grid.HasGravity && gridsWithGravity.Contains(grid.Index)) + DisableGravity(grid); + } + else if (!grid.HasGravity && gridsWithGravity.Contains(grid.Index)) { - grid.HasGravity = true; - ScheduleGridToShake(grid.Index, ShakeTimes); + EnableGravity(grid); } } @@ -68,6 +68,26 @@ namespace Content.Server.GameObjects.EntitySystems } } + private void EnableGravity(IMapGrid grid) + { + grid.HasGravity = true; + ScheduleGridToShake(grid.Index, ShakeTimes); + + var message = new GravityChangedMessage(grid); + + RaiseLocalEvent(message); + } + + private void DisableGravity(IMapGrid grid) + { + grid.HasGravity = false; + ScheduleGridToShake(grid.Index, ShakeTimes); + + var message = new GravityChangedMessage(grid); + + RaiseLocalEvent(message); + } + private void ScheduleGridToShake(GridId gridId, uint shakeTimes) { if (!_gridsToShake.Keys.Contains(gridId)) diff --git a/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs b/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs deleted file mode 100644 index 46cc8fb4b6..0000000000 --- a/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Content.Shared.GameObjects.Components.Mobs; -using Content.Shared.GameObjects.EntitySystemMessages; -using Robust.Shared.GameObjects.Systems; - -namespace Content.Shared.GameObjects.EntitySystems -{ - - public sealed class WeightlessStatusSystem : EntitySystem - { - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(HandleWeightlessChanged); - } - - private void HandleWeightlessChanged(WeightlessChangeMessage msg) - { - var ent = msg.Entity; - if (!ent.TryGetComponent(out SharedStatusEffectsComponent status)) - { - return; - } - - if(msg.Weightless) - { - status.ChangeStatusEffect(StatusEffect.Weightless,"/Textures/Interface/StatusEffects/Weightless/weightless.png",null); - } - else - { - status.RemoveStatusEffect(StatusEffect.Weightless); - } - } - } -} diff --git a/Content.Server/GameObjects/EntitySystems/WeightlessSystem.cs b/Content.Server/GameObjects/EntitySystems/WeightlessSystem.cs new file mode 100644 index 0000000000..885e373563 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/WeightlessSystem.cs @@ -0,0 +1,109 @@ +using System.Collections.Generic; +using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystemMessages.Gravity; +using Content.Shared.GameTicking; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Components.Map; +using Robust.Shared.GameObjects.EntitySystemMessages; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Map; +using Robust.Shared.Utility; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class WeightlessSystem : EntitySystem, IResettingEntitySystem + { + private readonly Dictionary> _statuses = new Dictionary>(); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(GravityChanged); + SubscribeLocalEvent(EntParentChanged); + } + + public void Reset() + { + _statuses.Clear(); + } + + public void AddStatus(ServerStatusEffectsComponent status) + { + var grid = status.Owner.Transform.GridID; + var statuses = _statuses.GetOrNew(grid); + + statuses.Add(status); + } + + public void RemoveStatus(ServerStatusEffectsComponent status) + { + var grid = status.Owner.Transform.GridID; + if (!_statuses.TryGetValue(grid, out var statuses)) + { + return; + } + + statuses.Remove(status); + } + + private void GravityChanged(GravityChangedMessage ev) + { + if (!_statuses.TryGetValue(ev.Grid.Index, out var statuses)) + { + return; + } + + if (ev.HasGravity) + { + foreach (var status in statuses) + { + RemoveWeightless(status); + } + } + else + { + foreach (var status in statuses) + { + AddWeightless(status); + } + } + } + + private void AddWeightless(ServerStatusEffectsComponent status) + { + status.ChangeStatusEffect(StatusEffect.Weightless, "/Textures/Interface/StatusEffects/Weightless/weightless.png", null); + } + + private void RemoveWeightless(ServerStatusEffectsComponent status) + { + status.RemoveStatusEffect(StatusEffect.Weightless); + } + + private void EntParentChanged(EntParentChangedMessage ev) + { + if (!ev.Entity.TryGetComponent(out ServerStatusEffectsComponent status)) + { + return; + } + + if (ev.OldParent != null && + ev.OldParent.TryGetComponent(out IMapGridComponent mapGrid)) + { + var oldGrid = mapGrid.GridIndex; + + if (_statuses.TryGetValue(oldGrid, out var oldStatuses)) + { + oldStatuses.Remove(status); + } + } + + var newGrid = ev.Entity.Transform.GridID; + var newStatuses = _statuses.GetOrNew(newGrid); + + newStatuses.Add(status); + } + } +} diff --git a/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs b/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs index dd87e11e52..c69a2d8bf3 100644 --- a/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs @@ -1,11 +1,8 @@ #nullable enable -using System; -using Content.Shared.GameObjects.Components.Mobs; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Physics; using Robust.Shared.IoC; -using Content.Shared.GameObjects.EntitySystemMessages; namespace Content.Shared.GameObjects.Components.Movement { @@ -21,10 +18,8 @@ namespace Content.Shared.GameObjects.Components.Movement { physicsManager ??= IoCManager.Resolve(); - var isWeightless = !entity.HasComponent() && + return !entity.HasComponent() && physicsManager.IsWeightless(entity.Transform.Coordinates); - entity.EntityManager.EventBus.RaiseEvent(EventSource.Local, new WeightlessChangeMessage(entity,isWeightless)); - return isWeightless; } } } diff --git a/Content.Shared/GameObjects/EntitySystemMessages/Gravity/GravityChangedMessage.cs b/Content.Shared/GameObjects/EntitySystemMessages/Gravity/GravityChangedMessage.cs new file mode 100644 index 0000000000..5b54d058fd --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystemMessages/Gravity/GravityChangedMessage.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.Map; + +namespace Content.Shared.GameObjects.EntitySystemMessages.Gravity +{ + public class GravityChangedMessage : EntitySystemMessage + { + public GravityChangedMessage(IMapGrid grid) + { + Grid = grid; + } + + public IMapGrid Grid { get; } + + public bool HasGravity => Grid.HasGravity; + } +} diff --git a/Content.Shared/GameObjects/EntitySystemMessages/WeightlessChangeMessage.cs b/Content.Shared/GameObjects/EntitySystemMessages/WeightlessChangeMessage.cs deleted file mode 100644 index a6ff6f45d6..0000000000 --- a/Content.Shared/GameObjects/EntitySystemMessages/WeightlessChangeMessage.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Serialization; - -namespace Content.Shared.GameObjects.EntitySystemMessages -{ - [Serializable, NetSerializable] - public sealed class WeightlessChangeMessage : EntitySystemMessage - { - public readonly IEntity Entity; - public readonly bool Weightless; - - public WeightlessChangeMessage(IEntity ent, bool isNowWeightless) - { - Entity = ent; - Weightless = isNowWeightless; - } - } - -}