From 602dac393e4d0002d4b2f2f6a76e6864c58a4406 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Thu, 25 Jun 2020 15:52:24 +0200 Subject: [PATCH] Add Buckling (#1155) * Create BuckleableComponent.cs * Add strap component and keybind to buckle targeted entity * Remove buckle keybind, turn it into a verb * Add moving and attaching the buckled entity to the strap * Fix reality collapsing when clicking on a buckled entity * Add strap position to buckle a mob in the standing or down position * Add new default strap position that makes no change to the mob's standing state * Add Strap component to office chairs and stools * Add Strap component to the pilot chair * Add buckled status effect icon * Add status effect click behaviour * Add buckling and unbuckling sounds * Change Buckle verb to only appear when an entity can be currently buckled * Rotate buckled entity in the direction of the seat * Disable entity rotation when buckled * Fix buckle rotation on beds * Buckling now finds the closest strap to the buckleable entity * Fix rotation when unbuckling an entity * Move buckle verb to StrapComponent * Added buckled entity unbuckle verb, range and interaction checks * Add checks for currently occupied straps * Add unbuckling entity if its respective strap component is removed * Add Clickable, InteractionOutline and Collidable components to bed * Add rotation property to strap component * Rename Buckleable to Buckle * Add Buckle and Strap sizes to buckle multiple entities in the same strap * Remove out of range popup message from strap verb GetData * Move BuckledTo setter logic to its methods * Fix Strap BuckledEntities being public * Fix not updating status when Buckle component is removed * Change BuckleComponent.BuckledTo to be of type StrapComponent * Fix NRE when unbuckling * Add buckle perspective messages * Fix not equals comparison in strap verb * Add added check to Strap TryAdd * Change buckle.ogg and unbuckle.ogg from stereo to mono * Remove -2f volume on buckle and unbuckle sounds * Add summary to Strap TryAdd and Remove methods * Make buckled entities unable to fall * Fix default strap position not rotating the buckled entity * Add downing after unbuckling an entity if it is knocked down * Prevent an entity from buckling onto itself Fixes stack overflow error * Disable recursive buckling * Add buckling onto straps by clicking them with an empty hand * Add recursive buckle check to the trybuckle method as well * Fix being able to click on a different strap to unbuckle from the current one * Merge TryUnbuckle and ForceUnbuckle with a force argument * Remove explicit unimplemented status effect clicking cases * Add documentation to EffectBlockerSystem and ActionBlockerSystem --- Content.Client/EntryPoint.cs | 2 + .../Components/Mobs/BuckleVisualizer2D.cs | 28 ++ .../Mobs/ClientStatusEffectsComponent.cs | 31 +- .../Components/Mobs/SpeciesVisualizer2D.cs | 2 +- .../Components/Mobs/StatusControl.cs | 25 ++ .../Components/Mobs/BuckleComponent.cs | 321 ++++++++++++++++++ .../Mobs/ServerStatusEffectsComponent.cs | 41 +++ .../Components/Mobs/StunnableComponent.cs | 2 + .../Components/Strap/StrapComponent.cs | 215 ++++++++++++ .../EntitySystems/EffectBlockerSystem.cs | 32 ++ .../GameObjects/EntitySystems/HandsSystem.cs | 2 - Content.Server/Mobs/StandingStateHelper.cs | 25 +- .../Components/Mobs/SharedBuckleComponent.cs | 17 + .../Components/Mobs/SharedSpeciesComponent.cs | 1 - .../Mobs/SharedStatusEffectsComponent.cs | 16 + .../Components/Strap/SharedStrapComponent.cs | 37 ++ .../EntitySystems/ActionBlockerSystem.cs | 10 +- Resources/Audio/effects/buckle.ogg | Bin 0 -> 18686 bytes Resources/Audio/effects/unbuckle.ogg | Bin 0 -> 29541 bytes .../Entities/Buildings/furniture.yml | 14 + .../Prototypes/Entities/Buildings/shuttle.yml | 7 +- Resources/Prototypes/Entities/Mobs/human.yml | 4 +- Resources/Textures/Mob/UI/Buckle/buckled.png | Bin 0 -> 2726 bytes .../Textures/Mob/UI/Buckle/unbuckled.png | Bin 0 -> 97 bytes 24 files changed, 798 insertions(+), 34 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs create mode 100644 Content.Client/GameObjects/Components/Mobs/StatusControl.cs create mode 100644 Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs create mode 100644 Content.Server/GameObjects/Components/Strap/StrapComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/EffectBlockerSystem.cs create mode 100644 Content.Shared/GameObjects/Components/Mobs/SharedBuckleComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs create mode 100644 Resources/Audio/effects/buckle.ogg create mode 100644 Resources/Audio/effects/unbuckle.ogg create mode 100644 Resources/Textures/Mob/UI/Buckle/buckled.png create mode 100644 Resources/Textures/Mob/UI/Buckle/unbuckled.png diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 627238f6e3..14b0c608fb 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -174,6 +174,8 @@ namespace Content.Client "Utensil", "UnarmedCombat", "TimedSpawner", + "Buckle", + "Strap" }; foreach (var ignoreName in registerIgnore) diff --git a/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs b/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs new file mode 100644 index 0000000000..3dfe3d10a4 --- /dev/null +++ b/Content.Client/GameObjects/Components/Mobs/BuckleVisualizer2D.cs @@ -0,0 +1,28 @@ +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Strap; +using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Shared.Maths; + +namespace Content.Client.GameObjects.Components.Mobs +{ + [UsedImplicitly] + public class BuckleVisualizer2D : SpeciesVisualizer2D + { + public override void OnChangeData(AppearanceComponent component) + { + if (!component.TryGetData(SharedBuckleComponent.BuckleVisuals.Buckled, out var buckled) || + !buckled) + { + return; + } + + if (!component.TryGetData(SharedStrapComponent.StrapVisuals.RotationAngle, out var angle)) + { + return; + } + + SetRotation(component, Angle.FromDegrees(angle)); + } + } +} diff --git a/Content.Client/GameObjects/Components/Mobs/ClientStatusEffectsComponent.cs b/Content.Client/GameObjects/Components/Mobs/ClientStatusEffectsComponent.cs index 632c3a4377..fde442a473 100644 --- a/Content.Client/GameObjects/Components/Mobs/ClientStatusEffectsComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/ClientStatusEffectsComponent.cs @@ -3,6 +3,7 @@ using System.Linq; using Content.Client.UserInterface; using Content.Client.Utility; using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.Input; using Robust.Client.GameObjects; using Robust.Client.Interfaces.ResourceManagement; using Robust.Client.Interfaces.UserInterface; @@ -10,6 +11,7 @@ using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.GameObjects; +using Robust.Shared.Input; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Timing; @@ -94,31 +96,34 @@ namespace Content.Client.GameObjects.Components.Mobs _cooldown.Clear(); _ui.VBox.DisposeAllChildren(); - foreach (var (key, statusEffect) in _status.OrderBy(x => (int) x.Key)) + foreach (var (key, effect) in _status.OrderBy(x => (int) x.Key)) { - var status = new Control() - { - Children = - { - new TextureRect - { - TextureScale = (2, 2), - Texture = _resourceCache.GetTexture(statusEffect.Icon) - }, - } - }; + var texture = _resourceCache.GetTexture(effect.Icon); + var status = new StatusControl(key, texture); - if (statusEffect.Cooldown.HasValue) + if (effect.Cooldown.HasValue) { var cooldown = new CooldownGraphic(); status.Children.Add(cooldown); _cooldown[key] = cooldown; } + status.OnPressed += args => StatusPressed(args, status); + _ui.VBox.AddChild(status); } } + private void StatusPressed(BaseButton.ButtonEventArgs args, StatusControl status) + { + if (args.Event.Function != EngineKeyFunctions.UIClick) + { + return; + } + + SendNetworkMessage(new ClickStatusMessage(status.Effect)); + } + public void RemoveStatusEffect(StatusEffect name) { _status.Remove(name); diff --git a/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer2D.cs b/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer2D.cs index cfd7e09596..160b4cdf8e 100644 --- a/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer2D.cs +++ b/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer2D.cs @@ -29,7 +29,7 @@ namespace Content.Client.GameObjects.Components.Mobs } } - private void SetRotation(AppearanceComponent component, Angle rotation) + protected void SetRotation(AppearanceComponent component, Angle rotation) { var sprite = component.Owner.GetComponent(); diff --git a/Content.Client/GameObjects/Components/Mobs/StatusControl.cs b/Content.Client/GameObjects/Components/Mobs/StatusControl.cs new file mode 100644 index 0000000000..591bf9e1c9 --- /dev/null +++ b/Content.Client/GameObjects/Components/Mobs/StatusControl.cs @@ -0,0 +1,25 @@ +using Content.Shared.GameObjects.Components.Mobs; +using JetBrains.Annotations; +using Robust.Client.Graphics; +using Robust.Client.UserInterface.Controls; + +namespace Content.Client.GameObjects.Components.Mobs +{ + public class StatusControl : BaseButton + { + public readonly StatusEffect Effect; + + public StatusControl(StatusEffect effect, [CanBeNull] Texture texture) + { + Effect = effect; + + var item = new TextureRect + { + TextureScale = (2, 2), + Texture = texture + }; + + Children.Add(item); + } + } +} diff --git a/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs b/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs new file mode 100644 index 0000000000..59a33a2132 --- /dev/null +++ b/Content.Server/GameObjects/Components/Mobs/BuckleComponent.cs @@ -0,0 +1,321 @@ +using Content.Server.GameObjects.Components.Strap; +using Content.Server.GameObjects.EntitySystems; +using Content.Server.Interfaces; +using Content.Server.Mobs; +using Content.Server.Utility; +using Content.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Strap; +using Content.Shared.GameObjects.EntitySystems; +using JetBrains.Annotations; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Mobs +{ + [RegisterComponent] + public class BuckleComponent : SharedBuckleComponent, IActionBlocker, IInteractHand, IEffectBlocker + { +#pragma warning disable 649 + [Dependency] private readonly IEntitySystemManager _entitySystem; + [Dependency] private readonly IServerNotifyManager _notifyManager; +#pragma warning restore 649 + + private int _size; + + [ViewVariables, CanBeNull] + public StrapComponent BuckledTo { get; private set; } + + [ViewVariables] + public int Size => _size; + + private void BuckleStatus() + { + if (Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + { + status.ChangeStatusEffectIcon(StatusEffect.Buckled, + BuckledTo == null + ? "/Textures/Mob/UI/Buckle/unbuckled.png" + : "/Textures/Mob/UI/Buckle/buckled.png"); + } + } + + private bool TryBuckle(IEntity user, IEntity to) + { + if (user == null || user == to) + { + return false; + } + + if (!ActionBlockerSystem.CanInteract(user)) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("You can't do that!")); + return false; + } + + var strapPosition = Owner.Transform.MapPosition; + var range = SharedInteractionSystem.InteractionRange / 2; + + if (!InteractionChecks.InRangeUnobstructed(user, strapPosition, range)) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("You can't reach there!")); + return false; + } + + if (!user.TryGetComponent(out HandsComponent hands)) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("You don't have hands!")); + return false; + } + + if (hands.GetActiveHand != null) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("Your hand isn't free!")); + return false; + } + + if (BuckledTo != null) + { + _notifyManager.PopupMessage(Owner, user, + Loc.GetString(Owner == user + ? "You are already buckled in!" + : "{0:They} are already buckled in!", Owner)); + return false; + } + + if (!to.TryGetComponent(out StrapComponent strap)) + { + _notifyManager.PopupMessage(Owner, user, + Loc.GetString(Owner == user + ? "You can't buckle yourself there!" + : "You can't buckle {0:them} there!", Owner)); + return false; + } + + var parent = to.Transform.Parent; + while (parent != null) + { + if (parent == user.Transform) + { + _notifyManager.PopupMessage(Owner, user, + Loc.GetString(Owner == user + ? "You can't buckle yourself there!" + : "You can't buckle {0:them} there!", Owner)); + return false; + } + + parent = parent.Parent; + } + + if (!strap.HasSpace(this)) + { + _notifyManager.PopupMessage(Owner, user, + Loc.GetString(Owner == user + ? "You can't fit there!" + : "{0:They} can't fit there!", Owner)); + return false; + } + + _entitySystem.GetEntitySystem() + .PlayFromEntity(strap.BuckleSound, Owner); + + if (!strap.TryAdd(this)) + { + _notifyManager.PopupMessage(Owner, user, + Loc.GetString(Owner == user + ? "You can't buckle yourself there!" + : "You can't buckle {0:them} there!", Owner)); + return false; + } + + BuckledTo = strap; + + if (Owner.TryGetComponent(out AppearanceComponent appearance)) + { + appearance.SetData(BuckleVisuals.Buckled, true); + } + + var ownTransform = Owner.Transform; + var strapTransform = strap.Owner.Transform; + + ownTransform.GridPosition = strapTransform.GridPosition; + ownTransform.AttachParent(strapTransform); + + switch (strap.Position) + { + case StrapPosition.None: + ownTransform.WorldRotation = strapTransform.WorldRotation; + break; + case StrapPosition.Stand: + StandingStateHelper.Standing(Owner); + ownTransform.WorldRotation = strapTransform.WorldRotation; + break; + case StrapPosition.Down: + StandingStateHelper.Down(Owner); + ownTransform.WorldRotation = Angle.South; + break; + } + + BuckleStatus(); + + return true; + } + + public bool TryUnbuckle(IEntity user, bool force = false) + { + if (BuckledTo == null) + { + return false; + } + + if (!force) + { + if (!ActionBlockerSystem.CanInteract(user)) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("You can't do that!")); + return false; + } + + var strapPosition = Owner.Transform.MapPosition; + var range = SharedInteractionSystem.InteractionRange / 2; + + if (!InteractionChecks.InRangeUnobstructed(user, strapPosition, range)) + { + _notifyManager.PopupMessage(user, user, + Loc.GetString("You can't reach there!")); + return false; + } + } + + if (BuckledTo.Owner.TryGetComponent(out StrapComponent strap)) + { + strap.Remove(this); + _entitySystem.GetEntitySystem() + .PlayFromEntity(strap.UnbuckleSound, Owner); + } + + Owner.Transform.DetachParent(); + Owner.Transform.WorldRotation = BuckledTo.Owner.Transform.WorldRotation; + BuckledTo = null; + + if (Owner.TryGetComponent(out AppearanceComponent appearance)) + { + appearance.SetData(BuckleVisuals.Buckled, false); + } + + if (Owner.TryGetComponent(out StunnableComponent stunnable) && stunnable.KnockedDown) + { + StandingStateHelper.Down(Owner); + } + else + { + StandingStateHelper.Standing(Owner); + } + + if (Owner.TryGetComponent(out SpeciesComponent species)) + { + species.CurrentDamageState.EnterState(Owner); + } + + BuckleStatus(); + + return true; + } + + public bool ToggleBuckle(IEntity user, IEntity to) + { + if (BuckledTo == null) + { + return TryBuckle(user, to); + } + else if (BuckledTo.Owner == to) + { + return TryUnbuckle(user); + } + else + { + return false; + } + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _size, "size", 100); + } + + protected override void Startup() + { + base.Startup(); + BuckleStatus(); + } + + public override void OnRemove() + { + base.OnRemove(); + + if (BuckledTo != null && BuckledTo.Owner.TryGetComponent(out StrapComponent strap)) + { + strap.Remove(this); + } + + BuckledTo = null; + BuckleStatus(); + } + + bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs) + { + return TryUnbuckle(eventArgs.User); + } + + bool IActionBlocker.CanMove() + { + return BuckledTo == null; + } + + bool IActionBlocker.CanChangeDirection() + { + return BuckledTo == null; + } + + bool IEffectBlocker.CanFall() + { + return BuckledTo == null; + } + + [Verb] + private sealed class BuckleVerb : Verb + { + protected override void GetData(IEntity user, BuckleComponent component, VerbData data) + { + if (!ActionBlockerSystem.CanInteract(user) || + component.BuckledTo == null) + { + data.Visibility = VerbVisibility.Invisible; + return; + } + + data.Text = Loc.GetString("Unbuckle"); + } + + protected override void Activate(IEntity user, BuckleComponent component) + { + component.TryUnbuckle(user); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs index df70f1fee4..15acc85c78 100644 --- a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; using Content.Shared.GameObjects.Components.Mobs; +using JetBrains.Annotations; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Players; namespace Content.Server.GameObjects.Components.Mobs { @@ -59,6 +62,44 @@ namespace Content.Server.GameObjects.Components.Mobs Dirty(); } + + public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession session = null) + { + base.HandleNetworkMessage(message, netChannel, session); + + if (session == null) + { + throw new ArgumentNullException(nameof(session)); + } + + switch (message) + { + case ClickStatusMessage msg: + { + var player = session.AttachedEntity; + + if (player != Owner) + { + break; + } + + // TODO: Implement clicking other status effects in the HUD + switch (msg.Effect) + { + case StatusEffect.Buckled: + if (!player.TryGetComponent(out BuckleComponent buckle)) + { + break; + } + + buckle.TryUnbuckle(player); + break; + } + + break; + } + } + } } } diff --git a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs index e9930546ef..3098310a57 100644 --- a/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/StunnableComponent.cs @@ -100,7 +100,9 @@ namespace Content.Server.GameObjects.Components.Mobs seconds = MathF.Min(_knockdownTimer + (seconds * KnockdownTimeModifier), _knockdownCap); if (seconds <= 0f) + { return; + } StandingStateHelper.Down(Owner); diff --git a/Content.Server/GameObjects/Components/Strap/StrapComponent.cs b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs new file mode 100644 index 0000000000..0391154cfd --- /dev/null +++ b/Content.Server/GameObjects/Components/Strap/StrapComponent.cs @@ -0,0 +1,215 @@ +using System.Collections.Generic; +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Strap; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Server.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Strap +{ + [RegisterComponent] + public class StrapComponent : SharedStrapComponent, IInteractHand + { + private StrapPosition _position; + private string _buckleSound; + private string _unbuckleSound; + private int _rotation; + private int _size; + + /// + /// The entity that is currently buckled here, synced from + /// + private HashSet BuckledEntities { get; set; } + + /// + /// The change in position to the strapped mob + /// + public override StrapPosition Position + { + get => _position; + set + { + _position = value; + Dirty(); + } + } + + /// + /// The sound to be played when a mob is buckled + /// + [ViewVariables] + public string BuckleSound => _buckleSound; + + /// + /// The sound to be played when a mob is unbuckled + /// + [ViewVariables] + public string UnbuckleSound => _unbuckleSound; + + /// + /// The angle in degrees to rotate the player by when they get strapped + /// + [ViewVariables] + public int Rotation => _rotation; + + /// + /// The size of the strap which is compared against when buckling entities + /// + [ViewVariables] + public int Size => _size; + + /// + /// The sum of the sizes of all the buckled entities in this strap + /// + [ViewVariables] + public int OccupiedSize { get; private set; } + + public bool HasSpace(BuckleComponent buckle) + { + return OccupiedSize + buckle.Size <= _size; + } + + /// + /// Adds a buckled entity. Called from + /// + /// The component to add + /// Whether or not to check if the strap has enough space + /// True if added, false otherwise + public bool TryAdd(BuckleComponent buckle, bool force = false) + { + if (!force && !HasSpace(buckle)) + { + return false; + } + + if (!BuckledEntities.Add(buckle.Owner)) + { + return false; + } + + OccupiedSize += buckle.Size; + + if (buckle.Owner.TryGetComponent(out AppearanceComponent appearance)) + { + appearance.SetData(StrapVisuals.RotationAngle, _rotation); + } + + return true; + } + + /// + /// Removes a buckled entity. Called from + /// + /// The component to remove + public void Remove(BuckleComponent buckle) + { + if (BuckledEntities.Remove(buckle.Owner)) + { + OccupiedSize -= buckle.Size; + } + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _position, "position", StrapPosition.None); + serializer.DataField(ref _buckleSound, "buckleSound", "/Audio/effects/buckle.ogg"); + serializer.DataField(ref _unbuckleSound, "unbuckleSound", "/Audio/effects/unbuckle.ogg"); + serializer.DataField(ref _rotation, "rotation", 0); + + var defaultSize = 100; + + serializer.DataField(ref _size, "size", defaultSize); + BuckledEntities = new HashSet(_size / defaultSize); + + OccupiedSize = 0; + } + + public override void OnRemove() + { + base.OnRemove(); + + foreach (var entity in BuckledEntities) + { + if (entity.TryGetComponent(out BuckleComponent buckle)) + { + buckle.TryUnbuckle(entity, true); + } + } + + BuckledEntities.Clear(); + OccupiedSize = 0; + } + + [Verb] + private sealed class StrapVerb : Verb + { + protected override void GetData(IEntity user, StrapComponent component, VerbData data) + { + data.Visibility = VerbVisibility.Invisible; + + if (!ActionBlockerSystem.CanInteract(component.Owner) || + !user.TryGetComponent(out BuckleComponent buckle) || + buckle.BuckledTo != null && buckle.BuckledTo != component || + user == component.Owner) + { + return; + } + + var parent = component.Owner.Transform.Parent; + while (parent != null) + { + if (parent == user.Transform) + { + return; + } + + parent = parent.Parent; + } + + var userPosition = user.Transform.MapPosition; + var strapPosition = component.Owner.Transform.MapPosition; + var range = SharedInteractionSystem.InteractionRange / 2; + var inRange = EntitySystem.Get() + .InRangeUnobstructed(userPosition, strapPosition, range, + predicate: entity => entity == user || entity == component.Owner); + + if (!inRange) + { + return; + } + + data.Visibility = VerbVisibility.Visible; + data.Text = buckle.BuckledTo == null ? Loc.GetString("Buckle") : Loc.GetString("Unbuckle"); + } + + protected override void Activate(IEntity user, StrapComponent component) + { + if (!user.TryGetComponent(out BuckleComponent buckle)) + { + return; + } + + buckle.ToggleBuckle(user, component.Owner); + } + } + + bool IInteractHand.InteractHand(InteractHandEventArgs eventArgs) + { + if (!eventArgs.User.TryGetComponent(out BuckleComponent buckle)) + { + return false; + } + + return buckle.ToggleBuckle(eventArgs.User, Owner); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/EffectBlockerSystem.cs b/Content.Server/GameObjects/EntitySystems/EffectBlockerSystem.cs new file mode 100644 index 0000000000..9468d2ddfb --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/EffectBlockerSystem.cs @@ -0,0 +1,32 @@ +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.GameObjects.EntitySystems +{ + /// + /// This interface gives components the ability to block certain effects + /// from affecting the owning entity. For actions see + /// + public interface IEffectBlocker + { + bool CanFall() => true; + } + + /// + /// Utility methods to check if an effect is allowed to affect a specific entity. + /// For actions see + /// + public class EffectBlockerSystem : EntitySystem + { + public static bool CanFall(IEntity entity) + { + var canFall = true; + foreach (var blocker in entity.GetAllComponents()) + { + canFall &= blocker.CanFall(); // Sets var to false if false + } + + return canFall; + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs index 0c4cc5d9d7..a78c90043a 100644 --- a/Content.Server/GameObjects/EntitySystems/HandsSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/HandsSystem.cs @@ -7,13 +7,11 @@ using Content.Shared.GameObjects.Components.Inventory; using Content.Shared.Input; using JetBrains.Annotations; using Robust.Server.GameObjects.EntitySystemMessages; -using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Input; using Robust.Shared.Input.Binding; -using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Localization; diff --git a/Content.Server/Mobs/StandingStateHelper.cs b/Content.Server/Mobs/StandingStateHelper.cs index b386990308..985dd1e448 100644 --- a/Content.Server/Mobs/StandingStateHelper.cs +++ b/Content.Server/Mobs/StandingStateHelper.cs @@ -1,14 +1,11 @@ +using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Mobs; using Robust.Server.GameObjects; using Robust.Server.GameObjects.EntitySystems; -using Robust.Shared.Audio; using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; namespace Content.Server.Mobs { @@ -23,22 +20,30 @@ namespace Content.Server.Mobs /// False if the mob was already downed or couldn't set the state public static bool Down(IEntity entity, bool playSound = true, bool dropItems = true) { - if (!entity.TryGetComponent(out AppearanceComponent appearance)) return false; + if (!EffectBlockerSystem.CanFall(entity) || + !entity.TryGetComponent(out AppearanceComponent appearance)) + { + return false; + } + var newState = SharedSpeciesComponent.MobState.Down; appearance.TryGetData(SharedSpeciesComponent.MobVisuals.RotationState, out var oldState); - var newState = SharedSpeciesComponent.MobState.Down; - if (newState == oldState) - return false; - - appearance.SetData(SharedSpeciesComponent.MobVisuals.RotationState, newState); + if (newState != oldState) + { + appearance.SetData(SharedSpeciesComponent.MobVisuals.RotationState, newState); + } if (playSound) + { IoCManager.Resolve().GetEntitySystem() .PlayFromEntity(AudioHelpers.GetRandomFileFromSoundCollection("bodyfall"), entity, AudioHelpers.WithVariation(0.25f)); + } if(dropItems) + { DropAllItemsInHands(entity, false); + } return true; } diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedBuckleComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedBuckleComponent.cs new file mode 100644 index 0000000000..93ea7481b1 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Mobs/SharedBuckleComponent.cs @@ -0,0 +1,17 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Mobs +{ + public class SharedBuckleComponent : Component + { + public sealed override string Name => "Buckle"; + + [Serializable, NetSerializable] + public enum BuckleVisuals + { + Buckled + } + } +} diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs index eed7165fbb..0f23bbda31 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs @@ -27,6 +27,5 @@ namespace Content.Shared.GameObjects.Components.Mobs /// Down, } - } } diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs index 3fd9e677fd..6991ac8060 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs @@ -26,6 +26,21 @@ namespace Content.Shared.GameObjects.Components.Mobs } } + /// + /// A message that calls the click interaction on a status effect + /// + [Serializable, NetSerializable] + public class ClickStatusMessage : ComponentMessage + { + public readonly StatusEffect Effect; + + public ClickStatusMessage(StatusEffect effect) + { + Directed = true; + Effect = effect; + } + } + [Serializable, NetSerializable] public struct StatusEffectStatus { @@ -40,5 +55,6 @@ namespace Content.Shared.GameObjects.Components.Mobs Hunger, Thirst, Stun, + Buckled, } } diff --git a/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs b/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs new file mode 100644 index 0000000000..febdbbb3e8 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Strap/SharedStrapComponent.cs @@ -0,0 +1,37 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Strap +{ + public enum StrapPosition + { + /// + /// (Default) Makes no change to the buckled mob + /// + None = 0, + + /// + /// Makes the mob stand up + /// + Stand, + + /// + /// Makes the mob lie down + /// + Down + } + + public abstract class SharedStrapComponent : Component + { + public sealed override string Name => "Strap"; + + public virtual StrapPosition Position { get; set; } + + [Serializable, NetSerializable] + public enum StrapVisuals + { + RotationAngle + } + } +} diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs index d22f5ebace..b5e1b50281 100644 --- a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs @@ -3,6 +3,10 @@ using Robust.Shared.Interfaces.GameObjects; namespace Content.Shared.GameObjects.EntitySystems { + /// + /// This interface gives components the ability to block certain actions from + /// being done by the owning entity. For effects see + /// public interface IActionBlocker { bool CanMove() => true; @@ -27,6 +31,10 @@ namespace Content.Shared.GameObjects.EntitySystems bool CanChangeDirection() => true; } + /// + /// Utility methods to check if a specific entity is allowed to perform an action. + /// For effects see + /// public class ActionBlockerSystem : EntitySystem { public static bool CanMove(IEntity entity) @@ -34,7 +42,7 @@ namespace Content.Shared.GameObjects.EntitySystems bool canmove = true; foreach(var actionblockercomponents in entity.GetAllComponents()) { - canmove &= actionblockercomponents.CanMove(); //sets var to false if false + canmove &= actionblockercomponents.CanMove(); // Sets var to false if false } return canmove; } diff --git a/Resources/Audio/effects/buckle.ogg b/Resources/Audio/effects/buckle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bb7dbe664b10f61fae37e05210abae797d533b76 GIT binary patch literal 18686 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
bV(G*1;_$A>h~jB62YY`hT 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mob/UI/Buckle/unbuckled.png b/Resources/Textures/Mob/UI/Buckle/unbuckled.png new file mode 100644 index 0000000000000000000000000000000000000000..6879bd394fd6dc3f84de4bc3b3403d4a5612aa4e GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tn`*LkmkKF1;}MA3GxeO qaCmkj4ani~ba4#fn3