From c4c204432657457d30656cf66c85e90ff67027b3 Mon Sep 17 00:00:00 2001 From: DocNITE Date: Tue, 16 May 2023 00:46:38 +0300 Subject: [PATCH] =?UTF-8?q?Small=20refactoring.=20=D0=A2=D0=B5=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D1=8C=20=D0=B2=D1=8B=D0=B3=D0=BB=D1=8F=D0=B4=D0=B8=D1=82?= =?UTF-8?q?=20=D0=BB=D1=83=D1=87=D1=88=D0=B5=20=D0=B8=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../White/Animations/EmoteAnimationSystem.cs | 234 ++++++++---------- .../White/Animations/EmoteAnimationSystem.cs | 59 ++--- .../Animations/EmoteAnimationComponent.cs | 20 +- .../Animations/SharedEmoteAnimationSystem.cs | 19 -- Resources/Prototypes/White/Actions/emotes.yml | 15 +- 5 files changed, 157 insertions(+), 190 deletions(-) delete mode 100644 Content.Shared/White/Animations/SharedEmoteAnimationSystem.cs diff --git a/Content.Client/White/Animations/EmoteAnimationSystem.cs b/Content.Client/White/Animations/EmoteAnimationSystem.cs index 37ed1b9e9b..6dbc3505fa 100644 --- a/Content.Client/White/Animations/EmoteAnimationSystem.cs +++ b/Content.Client/White/Animations/EmoteAnimationSystem.cs @@ -4,17 +4,121 @@ using Robust.Shared.Animations; using Robust.Shared.GameStates; using Robust.Client.GameObjects; using static Content.Shared.Animations.EmoteAnimationComponent; -using Content.Shared.Interaction; - namespace Content.Client.Animations; -public class EmoteAnimationSystem : SharedEmoteAnimationSystem +public class EmoteAnimationSystem : EntitySystem { - [Dependency] private readonly AnimationPlayerSystem AnimationSystem = default!; - + [Dependency] private readonly AnimationPlayerSystem _animationSystem = default!; + private readonly Dictionary> _emoteList = new(); + //OnVerbsResponse?.Invoke(msg); public override void Initialize() { SubscribeLocalEvent(OnHandleState); + + // EmoteFlip animation + _emoteList.Add("EmoteFlip", (EntityUid uid) => + { + var animationKey = "emoteAnimationKeyId"; + + if (_animationSystem.HasRunningAnimation(uid, animationKey)) + return; + + var baseAngle = Angle.Zero; + if (EntityManager.TryGetComponent(uid, out SpriteComponent? sprite)) + { + if (sprite != null) + baseAngle = sprite.Rotation; + } + + var animation = new Animation + { + Length = TimeSpan.FromMilliseconds(500), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Rotation), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees), 0f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees + 180), 0.25f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees + 360), 0.25f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees), 0f), + } + } + } + }; + + _animationSystem.Play(uid, animation, animationKey); + }); + // EmoteJump animation + _emoteList.Add("EmoteJump", (EntityUid uid) => + { + var animationKey = "emoteAnimationKeyId"; + + if (_animationSystem.HasRunningAnimation(uid, animationKey)) + return; + + var animation = new Animation + { + Length = TimeSpan.FromMilliseconds(250), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Offset), + InterpolationMode = AnimationInterpolationMode.Cubic, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0f), + new AnimationTrackProperty.KeyFrame(new Vector2(0, 1), 0.125f), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0.125f), + } + } + } + }; + + _animationSystem.Play(uid, animation, animationKey); + }); + // EmoteTurn animation + _emoteList.Add("EmoteTurn", (EntityUid uid) => + { + var animationKey = "emoteAnimationKeyId_rotate"; // it needs for only rotate anim + + if (_animationSystem.HasRunningAnimation(uid, animationKey)) + return; + + var animation = new Animation + { + Length = TimeSpan.FromMilliseconds(600), // Пока пусть на 0.6 секунд. В идеале бы до 0.9 на 3 поворота + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(TransformComponent), + Property = nameof(TransformComponent.LocalRotation), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(0), 0f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), + } + } + } + }; + + _animationSystem.Play(uid, animation, animationKey); + }); } private void OnHandleState(EntityUid uid, EmoteAnimationComponent component, ref ComponentHandleState args) @@ -23,124 +127,6 @@ public class EmoteAnimationSystem : SharedEmoteAnimationSystem return; component.AnimationId = state.AnimationId; - - switch(component.AnimationId) - { - case EmoteFlipActionPrototype: - PlayEmoteFlip(uid); - break; - case EmoteJumpActionPrototype: - PlayEmoteJump(uid); - break; - case EmoteTurnActionPrototype: - PlayEmoteTurn(uid); - break; - default: - break; - } - } - - public void PlayEmoteFlip(EntityUid uid) - { - var animationKey = "emoteAnimationKeyId"; - - if (AnimationSystem.HasRunningAnimation(uid, animationKey)) - return; - - var baseAngle = Angle.Zero; - if (EntityManager.TryGetComponent(uid, out SpriteComponent? sprite)) - { - if (sprite != null) - baseAngle = sprite.Rotation; - } - - var animation = new Animation - { - Length = TimeSpan.FromMilliseconds(500), - AnimationTracks = - { - new AnimationTrackComponentProperty - { - ComponentType = typeof(SpriteComponent), - Property = nameof(SpriteComponent.Rotation), - InterpolationMode = AnimationInterpolationMode.Linear, - KeyFrames = - { - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees), 0f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees + 180), 0.25f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees + 360), 0.25f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(baseAngle.Degrees), 0f), - } - } - } - }; - - AnimationSystem.Play(uid, animation, animationKey); - } - - public void PlayEmoteJump(EntityUid uid) - { - var animationKey = "emoteAnimationKeyId"; - - if (AnimationSystem.HasRunningAnimation(uid, animationKey)) - return; - - var animation = new Animation - { - Length = TimeSpan.FromMilliseconds(250), - AnimationTracks = - { - new AnimationTrackComponentProperty - { - ComponentType = typeof(SpriteComponent), - Property = nameof(SpriteComponent.Offset), - InterpolationMode = AnimationInterpolationMode.Cubic, - KeyFrames = - { - new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0f), - new AnimationTrackProperty.KeyFrame(new Vector2(0, 1), 0.125f), - new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0.125f), - } - } - } - }; - - AnimationSystem.Play(uid, animation, animationKey); - } - - public void PlayEmoteTurn(EntityUid uid) - { - var animationKey = "emoteAnimationKeyId_rotate"; // it needs for only rotate anim - - if (AnimationSystem.HasRunningAnimation(uid, animationKey)) - return; - - var animation = new Animation - { - Length = TimeSpan.FromMilliseconds(600), // Пока пусть на 0.6 секунд. В идеале бы до 0.9 на 3 поворота - AnimationTracks = - { - new AnimationTrackComponentProperty - { - ComponentType = typeof(TransformComponent), - Property = nameof(TransformComponent.LocalRotation), - InterpolationMode = AnimationInterpolationMode.Linear, - KeyFrames = - { - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(0), 0f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), - new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), - } - } - } - }; - - AnimationSystem.Play(uid, animation, animationKey); + _emoteList[component.AnimationId].Invoke(uid); } } diff --git a/Content.Server/White/Animations/EmoteAnimationSystem.cs b/Content.Server/White/Animations/EmoteAnimationSystem.cs index 9c4f71ea6d..99998cc065 100644 --- a/Content.Server/White/Animations/EmoteAnimationSystem.cs +++ b/Content.Server/White/Animations/EmoteAnimationSystem.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Content.Server.Actions; using Content.Shared.Actions.ActionTypes; using Content.Shared.Animations; @@ -8,18 +9,23 @@ using Content.Shared.Chat.Prototypes; namespace Content.Server.Animations; -public class EmoteAnimationSystem : SharedEmoteAnimationSystem +public class EmoteAnimationSystem : EntitySystem { [Dependency] private readonly ActionsSystem _action = default!; + [Dependency] public readonly IPrototypeManager _proto = default!; + + /// + /// We write 'EmoteAction' word before id name for instant action. + /// Example: EmoteActionJump, EmoteActionFlip and etc. + /// + private const string INSTANT_IDENTIFIER = "EmoteAction"; public override void Initialize() { SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnMapInint); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnEmote); - SubscribeLocalEvent(OnEmoteFlip); - SubscribeLocalEvent(OnEmoteJump); - SubscribeLocalEvent(OnEmoteTurn); + SubscribeLocalEvent(OnEmoteAction); } private void OnGetState(EntityUid uid, EmoteAnimationComponent component, ref ComponentGetState args) @@ -29,26 +35,29 @@ public class EmoteAnimationSystem : SharedEmoteAnimationSystem private void OnMapInint(EntityUid uid, EmoteAnimationComponent component, MapInitEvent args) { + foreach (var item in _proto.EnumeratePrototypes()) + { + InstantAction? action; + if (item.ID.Length > INSTANT_IDENTIFIER.Length && + item.ID[..INSTANT_IDENTIFIER.Length] == INSTANT_IDENTIFIER) + action = new InstantAction(item); + else + continue; - var actionFlip = new InstantAction(_proto.Index(EmoteFlipActionPrototype)); - var actionJump = new InstantAction(_proto.Index(EmoteJumpActionPrototype)); - var actionTurn = new InstantAction(_proto.Index(EmoteTurnActionPrototype)); - component.FlipAction = actionFlip; - component.JumpAction = actionJump; - component.TurnAction = actionTurn; - _action.AddAction(uid, actionFlip, null); - _action.AddAction(uid, actionJump, null); - _action.AddAction(uid, actionTurn, null); + if (action != null) + { + component.Actions.Add(action); + _action.AddAction(uid, action, null); + } + } } private void OnShutdown(EntityUid uid, EmoteAnimationComponent component, ComponentShutdown args) { - if (component.FlipAction != null) - _action.RemoveAction(uid, component.FlipAction); - if (component.JumpAction != null) - _action.RemoveAction(uid, component.JumpAction); - if (component.TurnAction != null) - _action.RemoveAction(uid, component.TurnAction); + foreach (var item in component.Actions) + { + _action.RemoveAction(uid, item); + } } private void OnEmote(EntityUid uid, EmoteAnimationComponent component, ref EmoteEvent args) @@ -59,17 +68,9 @@ public class EmoteAnimationSystem : SharedEmoteAnimationSystem PlayEmoteAnimation(uid, component, args.Emote.ID); } - private void OnEmoteFlip(EntityUid uid, EmoteAnimationComponent component, EmoteFlipActionEvent args) + private void OnEmoteAction(EntityUid uid, EmoteAnimationComponent component, EmoteActionEvent args) { - PlayEmoteAnimation(uid, component, EmoteFlipActionPrototype); - } - private void OnEmoteJump(EntityUid uid, EmoteAnimationComponent component, EmoteJumpActionEvent args) - { - PlayEmoteAnimation(uid, component, EmoteJumpActionPrototype); - } - private void OnEmoteTurn(EntityUid uid, EmoteAnimationComponent component, EmoteTurnActionEvent args) - { - PlayEmoteAnimation(uid, component, EmoteTurnActionPrototype); + PlayEmoteAnimation(uid, component, args.Emote); } public void PlayEmoteAnimation(EntityUid uid, EmoteAnimationComponent component, string emoteId) diff --git a/Content.Shared/White/Animations/EmoteAnimationComponent.cs b/Content.Shared/White/Animations/EmoteAnimationComponent.cs index 35a4ff2337..fde8fa8245 100644 --- a/Content.Shared/White/Animations/EmoteAnimationComponent.cs +++ b/Content.Shared/White/Animations/EmoteAnimationComponent.cs @@ -6,16 +6,14 @@ using Robust.Shared.Serialization; namespace Content.Shared.Animations; /// +/// Event for playing animations /// -public class EmoteFlipActionEvent : InstantActionEvent { }; - -/// -/// -public class EmoteJumpActionEvent : InstantActionEvent { }; - -/// -/// -public class EmoteTurnActionEvent : InstantActionEvent { }; +public class EmoteActionEvent : InstantActionEvent +{ + [ViewVariables] + [DataField("emote", readOnly: true, required: true)] + public string Emote = default!; +}; [RegisterComponent] [NetworkedComponent] @@ -24,9 +22,7 @@ public class EmoteAnimationComponent : Component [ViewVariables(VVAccess.ReadWrite)] public string AnimationId = "none"; - public InstantAction? FlipAction; - public InstantAction? JumpAction; - public InstantAction? TurnAction; + public readonly List Actions = new(); [Serializable, NetSerializable] public class EmoteAnimationComponentState : ComponentState diff --git a/Content.Shared/White/Animations/SharedEmoteAnimationSystem.cs b/Content.Shared/White/Animations/SharedEmoteAnimationSystem.cs deleted file mode 100644 index 78934d83dc..0000000000 --- a/Content.Shared/White/Animations/SharedEmoteAnimationSystem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Robust.Shared.GameStates; -using static Content.Shared.Animations.EmoteAnimationComponent; -using Robust.Shared.Prototypes; - -namespace Content.Shared.Animations; - -public class SharedEmoteAnimationSystem : EntitySystem -{ - public const string EmoteFlipActionPrototype = "EmoteFlip"; - public const string EmoteJumpActionPrototype = "EmoteJump"; - public const string EmoteTurnActionPrototype = "EmoteTurn"; - - [Dependency] public readonly SharedAppearanceSystem _appearance = default!; - [Dependency] public readonly IPrototypeManager _proto = default!; - - public override void Initialize() - { - } -} diff --git a/Resources/Prototypes/White/Actions/emotes.yml b/Resources/Prototypes/White/Actions/emotes.yml index 8099dda8ad..500bb7f94f 100644 --- a/Resources/Prototypes/White/Actions/emotes.yml +++ b/Resources/Prototypes/White/Actions/emotes.yml @@ -1,26 +1,29 @@ # flip animation - type: instantAction - id: EmoteFlip + id: EmoteActionFlip name: emote-flip-action-name description: emote-flip-action-description icon: Interface/Actions/blight.png - event: !type:EmoteFlipActionEvent + event: !type:EmoteActionEvent + emote: EmoteFlip # jump animation - type: instantAction - id: EmoteJump + id: EmoteActionJump name: emote-jump-action-name description: emote-jump-action-description icon: Interface/Actions/blight.png - event: !type:EmoteJumpActionEvent + event: !type:EmoteActionEvent + emote: EmoteJump # turn around in 4 directions animation - type: instantAction - id: EmoteTurn + id: EmoteActionTurn name: emote-turn-action-name description: emote-turn-action-description icon: Interface/Actions/blight.png - event: !type:EmoteTurnActionEvent + event: !type:EmoteActionEvent + emote: EmoteTurn # Using EmoteAnimation from IC action chat