diff --git a/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs b/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs new file mode 100644 index 0000000000..46cc8fb4b6 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/WeightlessStatusSystem.cs @@ -0,0 +1,35 @@ +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.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs index 8ffb4da6ed..68c6b41d2e 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs @@ -68,6 +68,7 @@ namespace Content.Shared.GameObjects.Components.Mobs Buckled, Piloting, Pulling, - Pulled + Pulled, + Weightless } } diff --git a/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs b/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs index c69a2d8bf3..dd87e11e52 100644 --- a/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/MovementIgnoreGravityComponent.cs @@ -1,8 +1,11 @@ #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 { @@ -18,8 +21,10 @@ namespace Content.Shared.GameObjects.Components.Movement { physicsManager ??= IoCManager.Resolve(); - return !entity.HasComponent() && + var isWeightless = !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/WeightlessChangeMessage.cs b/Content.Shared/GameObjects/EntitySystemMessages/WeightlessChangeMessage.cs new file mode 100644 index 0000000000..a6ff6f45d6 --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystemMessages/WeightlessChangeMessage.cs @@ -0,0 +1,21 @@ +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; + } + } + +} diff --git a/Resources/Textures/Interface/StatusEffects/Weightless/weightless.png b/Resources/Textures/Interface/StatusEffects/Weightless/weightless.png new file mode 100644 index 0000000000..7ee4f01083 Binary files /dev/null and b/Resources/Textures/Interface/StatusEffects/Weightless/weightless.png differ