diff --git a/Content.Client/_CorvaxNext/Overlays/ListenUpOverlay.cs b/Content.Client/_CorvaxNext/Overlays/ListenUpOverlay.cs new file mode 100644 index 00000000000..d19bd87876c --- /dev/null +++ b/Content.Client/_CorvaxNext/Overlays/ListenUpOverlay.cs @@ -0,0 +1,96 @@ +using System.Numerics; +using Robust.Client.Graphics; +using Robust.Client.GameObjects; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Map; +using Robust.Shared.Utility; +using Robust.Shared.Timing; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs; + + +namespace Content.Client._CorvaxNext.Overlays; + +public sealed class ListenUpOverlay : Overlay +{ + [Dependency] private readonly IEntityManager _entity = default!; + [Dependency] private readonly IPlayerManager _players = default!; + + private readonly EntityLookupSystem _entityLookup; + private readonly TransformSystem _transformSystem; + private readonly IGameTiming _gameTiming; + private readonly SpriteSystem _spriteSystem; + + private Texture _texture; + + protected float Radius; + protected SpriteSpecifier Sprite; + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpace; + + public ListenUpOverlay(float radius, SpriteSpecifier.Rsi sprite) + { + IoCManager.InjectDependencies(this); + + _transformSystem = _entity.System(); + _spriteSystem = _entity.System(); + _entityLookup = _entity.System(); + _gameTiming = IoCManager.Resolve(); + + Radius = radius; + Sprite = sprite; + + _texture = _spriteSystem.GetFrame(Sprite, _gameTiming.CurTime); + + + ZIndex = -1; + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture == null + || _players.LocalEntity == null + || (!_entity.TryGetComponent(_players.LocalEntity, out var playerTransform))) + return; + + _texture = _spriteSystem.GetFrame(Sprite, _gameTiming.CurTime); + + var handle = args.WorldHandle; + var eye = args.Viewport.Eye; + var eyeRot = eye?.Rotation ?? default; + + var entities = _entityLookup.GetEntitiesInRange(playerTransform.Coordinates, Radius); + + foreach (var (uid, stateComp) in entities) + { + + if (!_entity.TryGetComponent(uid, out var sprite) + || !sprite.Visible + || !_entity.TryGetComponent(uid, out var xform) + || (!_entity.TryGetComponent(uid, out var mobstateComp)) + || (mobstateComp.CurrentState != MobState.Alive)) + continue; + + Render((uid, sprite, xform), eye?.Position.MapId, handle, eyeRot); + } + handle.SetTransform(Matrix3x2.Identity); + } + + private void Render(Entity ent, + MapId? map, DrawingHandleWorld handle, Angle eyeRot) + { + var (uid, sprite, xform) = ent; + + if (uid == _players.LocalEntity + || xform.MapID != map) + return; + + var position = _transformSystem.GetWorldPosition(xform); + var rotation = Angle.Zero; + + handle.SetTransform(position, rotation); + handle.DrawTexture(_texture, new System.Numerics.Vector2(-0.5f)); + } +} diff --git a/Content.Client/_CorvaxNext/Overlays/ListenUpSystem.cs b/Content.Client/_CorvaxNext/Overlays/ListenUpSystem.cs new file mode 100644 index 00000000000..e3950cfb300 --- /dev/null +++ b/Content.Client/_CorvaxNext/Overlays/ListenUpSystem.cs @@ -0,0 +1,75 @@ +using Robust.Client.Graphics; +using Robust.Client.Player; +using Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; +using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Robust.Shared.Utility; +using Robust.Shared.Player; +using Content.Shared.GameTicking; + +namespace Content.Client._CorvaxNext.Overlays; + +public sealed class ListenUpSystem : SharedListenUpSkillSystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IOverlayManager _overlayMan = default!; + + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + + private Entity action; + + private ListenUpOverlay _listenUpOverlay = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnListenStartup); + SubscribeLocalEvent(OnListenUpShutdown); + + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + } + private void OnListenStartup(Entity ent, ref ComponentStartup args) + { + SwithOverlay(ent, true); + } + + private void OnListenUpShutdown(Entity ent, ref ComponentShutdown args) + { + SwithOverlay(ent, false); + } + + private void OnPlayerAttached(Entity ent, ref LocalPlayerAttachedEvent args) + { + SwithOverlay(ent, true); + } + + private void OnPlayerDetached(Entity ent, ref LocalPlayerDetachedEvent args) + { + SwithOverlay(ent, false); + } + private void UpdateOverlay(bool active, Overlay overlay) + { + if (_player.LocalEntity == null) + { + _overlayMan.RemoveOverlay(overlay); + return; + } + + if (active) + _overlayMan.AddOverlay(overlay); + else + _overlayMan.RemoveOverlay(overlay); + } + + private void SwithOverlay(Entity ent, bool active) + { + Overlay overlay = ListenUp(ent.Comp.radius, ent.Comp.Sprite); + UpdateOverlay(active, overlay); + } + + private Overlay ListenUp(float radius, SpriteSpecifier.Rsi sprite) + { + return _listenUpOverlay = new ListenUpOverlay(radius, sprite); + } +} diff --git a/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSkillSystem.cs b/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSkillSystem.cs index 1539e786f21..e50dd36e23a 100644 --- a/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSkillSystem.cs +++ b/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSkillSystem.cs @@ -1,15 +1,3 @@ -using Content.Shared.Actions; -using Content.Shared.Alert; -using Content.Shared.Maps; -using Robust.Shared.Containers; -using Robust.Shared.Map; -using Robust.Shared.Timing; -using Content.Shared._CorvaxNext.Resomi; -using Content.Shared.Movement.Components; -using Content.Shared.Movement.Systems; -using Content.Shared._CorvaxNext.Resomi.Abilities; -using Content.Shared.Damage.Components; -using Robust.Shared.Physics; using Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; namespace Content.Server._CorvaxNext.Resomi.Abilities; @@ -20,11 +8,10 @@ public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); - SubscribeLocalEvent(SwitchAgility); - SubscribeLocalEvent(OnRefreshMovespeed); } private void OnComponentInit(Entity ent, ref ComponentInit args) { - _actionsSystem.AddAction(ent.Owner, ref ent.Comp.SwitchAgilityActionEntity, ent.Comp.SwitchAgilityAction, ent.Owner); + _actionsSystem.AddAction(ent.Owner, ref ent.Comp.SwitchListenUpActionEntity, ent.Comp.SwitchListenUpAction, ent.Owner); + } } diff --git a/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSystem.cs b/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSystem.cs new file mode 100644 index 00000000000..186030b411e --- /dev/null +++ b/Content.Server/_CorvaxNext/Resomi/Abilities/ListenUpSystem.cs @@ -0,0 +1,22 @@ +using Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; +using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Content.Shared.Movement.Events; +using Content.Shared.Popups; +using Content.Shared.IdentityManagement; + +namespace Content.Server._CorvaxNext.Resomi.Abilities; + +public sealed class ListenUpSystem : EntitySystem +{ + [Dependency] protected readonly SharedPopupSystem _popup = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnListenStartup); + } + private void OnListenStartup(Entity ent, ref ComponentStartup args) + { + _popup.PopupEntity(Loc.GetString("listen-up-activated-massage", ("name", Identity.Entity(ent.Owner, EntityManager))), ent.Owner); + } +} diff --git a/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpComponent.cs b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpComponent.cs new file mode 100644 index 00000000000..5b78cf102ff --- /dev/null +++ b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Utility; + +namespace Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; + +[RegisterComponent] +public sealed partial class ListenUpComponent : Component +{ + [DataField] + public float radius = 8f; + + [DataField] + public SpriteSpecifier.Rsi Sprite = new SpriteSpecifier.Rsi(new("/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi"), "noise"); +} diff --git a/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpSkillComponent.cs b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpSkillComponent.cs index e12708ef8ef..c271675753d 100644 --- a/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpSkillComponent.cs +++ b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/ListenUpSkillComponent.cs @@ -4,9 +4,19 @@ namespace Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; -[RegisterComponent, NetworkedComponent] -[AutoGenerateComponentState] +[RegisterComponent] public sealed partial class ListenUpSkillComponent : Component { + [DataField("switchListenUpAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? SwitchListenUpAction = "SwitchListenUpAction"; + + [DataField] + public EntityUid? SwitchListenUpActionEntity; + + [DataField] + public bool toggled = false; + + [DataField] + public float prepareTime = 3f; } diff --git a/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/SharedListenUpSkillSystem.cs b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/SharedListenUpSkillSystem.cs index 06aa45ff591..42498179fe7 100644 --- a/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/SharedListenUpSkillSystem.cs +++ b/Content.Shared/_CorvaxNext/Resomi/Abilities/Hearing/SharedListenUpSkillSystem.cs @@ -1,20 +1,52 @@ -using Robust.Shared.Timing; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Physics; -using Content.Shared.Physics; -using Content.Shared.Popups; -using Robust.Shared.Physics.Events; -using Robust.Shared.Log; -using Content.Shared.Climbing.Systems; -using Content.Shared.Damage.Systems; using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Content.Shared.Movement.Events; +using Content.Shared.Popups; namespace Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; public abstract class SharedListenUpSkillSystem : EntitySystem { + [Dependency] protected readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] protected readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] protected readonly SharedPopupSystem _popup = default!; public override void Initialize() { + SubscribeLocalEvent(OnActivateListenUp); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnMoveInput); + } + private void OnActivateListenUp(Entity ent, ref ListenUpActionEvent args) + { + + var doAfterArgs = new DoAfterArgs(EntityManager, ent.Owner, ent.Comp.prepareTime, new ListenUpDoAfterEvent(), ent.Owner, null, null) + { + NeedHand = true, + BreakOnDamage = true, + BreakOnMove = true, + MovementThreshold = 0.01f + }; + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } + private void OnDoAfter(Entity ent, ref ListenUpDoAfterEvent args) + { + if (ent.Comp.toggled) + return; + + AddComp(ent.Owner); + + _actionsSystem.SetToggled(ent.Comp.SwitchListenUpActionEntity, true); + ent.Comp.toggled = !ent.Comp.toggled; + } + + private void OnMoveInput(Entity ent, ref MoveInputEvent args) + { + if (!ent.Comp.toggled) + return; + + RemComp(ent.Owner); + _actionsSystem.SetToggled(ent.Comp.SwitchListenUpActionEntity, false); + ent.Comp.toggled = !ent.Comp.toggled; } } diff --git a/Content.Shared/_CorvaxNext/Resomi/SharedResomi.cs b/Content.Shared/_CorvaxNext/Resomi/SharedResomi.cs index 039b72ef2bd..6bccd97285a 100644 --- a/Content.Shared/_CorvaxNext/Resomi/SharedResomi.cs +++ b/Content.Shared/_CorvaxNext/Resomi/SharedResomi.cs @@ -1,6 +1,7 @@ using Content.Shared.Actions; using Content.Shared.DoAfter; using Robust.Shared.Serialization; +using Content.Shared._CorvaxNext.Resomi.Abilities.Hearing; namespace Content.Shared._CorvaxNext.Resomi; @@ -8,6 +9,9 @@ public sealed partial class SwitchAgillityActionEvent : InstantActionEvent; public sealed partial class ListenUpActionEvent : InstantActionEvent; +[Serializable, NetSerializable] +public sealed partial class ListenUpDoAfterEvent : SimpleDoAfterEvent; + /// /// Rises when the action state changes /// diff --git a/Resources/Locale/ru-RU/_corvaxNext/abilitties/listen-up.ftl b/Resources/Locale/ru-RU/_corvaxNext/abilitties/listen-up.ftl new file mode 100644 index 00000000000..72849bf61b5 --- /dev/null +++ b/Resources/Locale/ru-RU/_corvaxNext/abilitties/listen-up.ftl @@ -0,0 +1,3 @@ +listen-up-activated-massage = {$name} Замирает, прислушиваясь. + + diff --git a/Resources/Prototypes/_CorvaxNext/Actions/resomi.yml b/Resources/Prototypes/_CorvaxNext/Actions/resomi.yml index 04414faff56..6f3e3044dd0 100644 --- a/Resources/Prototypes/_CorvaxNext/Actions/resomi.yml +++ b/Resources/Prototypes/_CorvaxNext/Actions/resomi.yml @@ -4,15 +4,16 @@ description: Switching agility components: - type: InstantAction - icon: _CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOff.png - iconOn: _CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOn.png + icon: _CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOff.png + iconOn: _CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOn.png event: !type:SwitchAgillityActionEvent - type: entity - id: ListenUpAction + id: SwitchListenUpAction name: Listen up description: Listen up components: - type: InstantAction - icon: _CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOff.png + icon: _CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsDown.png + iconOn: _CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsUp.png event: !type:ListenUpActionEvent diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml b/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml index e8d0cfc172b..b967332d098 100644 --- a/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml +++ b/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml @@ -7,10 +7,15 @@ components: - type: WeaponsUseInability - type: AgillitySkill + - type: ListenUpSkill - type: ChatModifier whisperListeningRange: 4 + - type: FlashModifier + modifier: 2 - type: ResomiAccent - type: FootprintVisualizer + leftBarePrint: "footprint-left-bare-lizard" + rightBarePrint: "footprint-right-bare-lizard" - type: DamageVisuals thresholds: [ 10, 30, 50, 70] targetLayers: @@ -91,8 +96,13 @@ Male: MaleResomi Female: FemaleResomi Unsexed: MaleResomi - - type: FlashModifier - modifier: 2 + #- type: Respirator + # damage: + # types: + # Asphyxiation: 1.0 + damageRecovery: + types: + Asphyxiation: -1.0 - type: Hands handDisplacement: sizeMaps: diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOff.png b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOff.png similarity index 100% rename from Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOff.png rename to Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOff.png diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOn.png b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOn.png similarity index 100% rename from Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/AgilityOn.png rename to Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/AgilityOn.png diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/meta.json b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/meta.json similarity index 100% rename from Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/meta.json rename to Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/Agility/meta.json diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsDown.png b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsDown.png new file mode 100644 index 00000000000..3e97777fb57 Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsDown.png differ diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsUp.png b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsUp.png new file mode 100644 index 00000000000..b734157263b Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/EarsUp.png differ diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/meta.json b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/meta.json new file mode 100644 index 00000000000..5e81eb7fd1d --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/ListenUp/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by Pofitlo and Xenon", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "ears_down" + }, + { + "name": "ears_up" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/meta.json b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/meta.json new file mode 100644 index 00000000000..856635d48d2 --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/meta.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Pofitlo", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "noise", + "delays": [ + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/noise.png b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/noise.png new file mode 100644 index 00000000000..453ea9a2f65 Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Mobs/Species/Resomi/Abilities/noise_effect.rsi/noise.png differ