From c0ce5fba2a03dfb1ada8600008ab7b8846dcf828 Mon Sep 17 00:00:00 2001 From: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Date: Sat, 27 Apr 2024 14:50:57 +0100 Subject: [PATCH] Rodents can be Faxecuted (executed via Fax machine) (#21461) * Rodents can be Faxecuted (executed via Fax machine) * use brute instead of new group. * fax visuals now use tags for mouse and hamster instead of comps * fix for ubuntu, damn ubuntu bane of my life * cant copy hamlet, can now faxecute mothroaches. * fix * fix * fixes * removed ifs now using switch, removed hastag now using string. * fixes and no more switch * cleanup * more cleanup * fix * cleanup * moved damage out of faxmachine and into own system and component. * changes * fixes and done i think. * tidy * Fixes --------- Co-authored-by: metalgearsloth --- Content.Client/Fax/System/FaxVisualsSystem.cs | 48 +++++++++++++++ .../TransformableContainerSystem.cs | 2 +- Content.Server/Fax/AdminUI/AdminFaxEui.cs | 1 + Content.Server/Fax/FaxSystem.cs | 24 ++++++-- Content.Server/Nuke/NukeCodePaperSystem.cs | 1 + .../Fax/Components}/FaxMachineComponent.cs | 42 +++++++------ .../Fax/Components/FaxableObjectComponent.cs | 16 +++++ .../Fax/Components/FaxecuteComponent.cs | 19 ++++++ Content.Shared/Fax/DamageOnFaxecuteEvent.cs | 9 +++ Content.Shared/Fax/Systems/FaxecuteSystem.cs | 34 +++++++++++ Resources/Locale/en-US/fax/fax.ftl | 2 + .../Prototypes/Entities/Mobs/NPCs/animals.yml | 6 ++ .../Entities/Objects/Misc/paper.yml | 1 + .../Structures/Machines/fax_machine.yml | 16 +++-- .../fax_machine.rsi/inserting_hamster.png | Bin 0 -> 23368 bytes .../fax_machine.rsi/inserting_mothroach.png | Bin 0 -> 23838 bytes .../fax_machine.rsi/inserting_mouse.png | Bin 0 -> 23808 bytes .../Machines/fax_machine.rsi/meta.json | 57 ++++++++++++++++++ 18 files changed, 250 insertions(+), 28 deletions(-) create mode 100644 Content.Client/Fax/System/FaxVisualsSystem.cs rename {Content.Server/Fax => Content.Shared/Fax/Components}/FaxMachineComponent.cs (84%) create mode 100644 Content.Shared/Fax/Components/FaxableObjectComponent.cs create mode 100644 Content.Shared/Fax/Components/FaxecuteComponent.cs create mode 100644 Content.Shared/Fax/DamageOnFaxecuteEvent.cs create mode 100644 Content.Shared/Fax/Systems/FaxecuteSystem.cs create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_hamster.png create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mothroach.png create mode 100644 Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mouse.png diff --git a/Content.Client/Fax/System/FaxVisualsSystem.cs b/Content.Client/Fax/System/FaxVisualsSystem.cs new file mode 100644 index 0000000000..892aec1d95 --- /dev/null +++ b/Content.Client/Fax/System/FaxVisualsSystem.cs @@ -0,0 +1,48 @@ +using Robust.Client.GameObjects; +using Content.Shared.Fax.Components; +using Content.Shared.Fax; +using Robust.Client.Animations; + +namespace Content.Client.Fax.System; + +/// +/// Visualizer for the fax machine which displays the correct sprite based on the inserted entity. +/// +public sealed class FaxVisualsSystem : EntitySystem +{ + [Dependency] private readonly AnimationPlayerSystem _player = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChanged); + } + + private void OnAppearanceChanged(EntityUid uid, FaxMachineComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (_appearance.TryGetData(uid, FaxMachineVisuals.VisualState, out FaxMachineVisualState visuals) && visuals == FaxMachineVisualState.Inserting) + { + _player.Play(uid, new Animation() + { + Length = TimeSpan.FromSeconds(2.4), + AnimationTracks = + { + new AnimationTrackSpriteFlick() + { + LayerKey = FaxMachineVisuals.VisualState, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(component.InsertingState, 0f), + new AnimationTrackSpriteFlick.KeyFrame("icon", 2.4f), + } + } + } + }, "faxecute"); + } + } +} diff --git a/Content.Server/Chemistry/EntitySystems/TransformableContainerSystem.cs b/Content.Server/Chemistry/EntitySystems/TransformableContainerSystem.cs index 94a3fe2186..c375d97b8c 100644 --- a/Content.Server/Chemistry/EntitySystems/TransformableContainerSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/TransformableContainerSystem.cs @@ -20,7 +20,7 @@ public sealed class TransformableContainerSystem : EntitySystem SubscribeLocalEvent(OnSolutionChange); } - private void OnMapInit(Entity entity, ref MapInitEvent args) + private void OnMapInit(Entity entity, ref MapInitEvent args) { var meta = MetaData(entity.Owner); if (string.IsNullOrEmpty(entity.Comp.InitialName)) diff --git a/Content.Server/Fax/AdminUI/AdminFaxEui.cs b/Content.Server/Fax/AdminUI/AdminFaxEui.cs index c8be6618e4..5153e62195 100644 --- a/Content.Server/Fax/AdminUI/AdminFaxEui.cs +++ b/Content.Server/Fax/AdminUI/AdminFaxEui.cs @@ -1,6 +1,7 @@ using Content.Server.DeviceNetwork.Components; using Content.Server.EUI; using Content.Shared.Eui; +using Content.Shared.Fax.Components; using Content.Shared.Fax; using Content.Shared.Follower; using Content.Shared.Ghost; diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index f492595444..c21e0db20c 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -16,7 +16,10 @@ using Content.Shared.DeviceNetwork; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; using Content.Shared.Fax; +using Content.Shared.Fax.Systems; +using Content.Shared.Fax.Components; using Content.Shared.Interaction; +using Content.Shared.Mobs.Components; using Content.Shared.Paper; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -42,6 +45,7 @@ public sealed class FaxSystem : EntitySystem [Dependency] private readonly UserInterfaceSystem _userInterface = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly FaxecuteSystem _faxecute = default!; private const string PaperSlotId = "Paper"; @@ -313,12 +317,18 @@ public sealed class FaxSystem : EntitySystem private void OnCopyButtonPressed(EntityUid uid, FaxMachineComponent component, FaxCopyMessage args) { - Copy(uid, component, args); + if (HasComp(component.PaperSlot.Item)) + _faxecute.Faxecute(uid, component); /// when button pressed it will hurt the mob. + else + Copy(uid, component, args); } private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, FaxSendMessage args) { - Send(uid, component, args.Actor); + if (HasComp(component.PaperSlot.Item)) + _faxecute.Faxecute(uid, component); /// when button pressed it will hurt the mob. + else + Send(uid, component, args.Actor); } private void OnRefreshButtonPressed(EntityUid uid, FaxMachineComponent component, FaxRefreshMessage args) @@ -336,14 +346,20 @@ public sealed class FaxSystem : EntitySystem if (!Resolve(uid, ref component)) return; + if (TryComp(component.PaperSlot.Item, out var faxable)) + component.InsertingState = faxable.InsertingState; + + if (component.InsertingTimeRemaining > 0) + { _appearanceSystem.SetData(uid, FaxMachineVisuals.VisualState, FaxMachineVisualState.Inserting); + Dirty(uid, component); + } else if (component.PrintingTimeRemaining > 0) _appearanceSystem.SetData(uid, FaxMachineVisuals.VisualState, FaxMachineVisualState.Printing); else _appearanceSystem.SetData(uid, FaxMachineVisuals.VisualState, FaxMachineVisualState.Normal); } - private void UpdateUserInterface(EntityUid uid, FaxMachineComponent? component = null) { if (!Resolve(uid, ref component)) @@ -477,7 +493,7 @@ public sealed class FaxSystem : EntitySystem return; if (!TryComp(sendEntity, out var metadata) || - !TryComp(sendEntity, out var paper)) + !TryComp(sendEntity, out var paper)) return; var payload = new NetworkPayload() diff --git a/Content.Server/Nuke/NukeCodePaperSystem.cs b/Content.Server/Nuke/NukeCodePaperSystem.cs index 8df25feebf..c1725536e7 100644 --- a/Content.Server/Nuke/NukeCodePaperSystem.cs +++ b/Content.Server/Nuke/NukeCodePaperSystem.cs @@ -1,6 +1,7 @@ using System.Diagnostics.CodeAnalysis; using Content.Server.Chat.Systems; using Content.Server.Fax; +using Content.Shared.Fax.Components; using Content.Server.Paper; using Content.Server.Station.Components; using Content.Server.Station.Systems; diff --git a/Content.Server/Fax/FaxMachineComponent.cs b/Content.Shared/Fax/Components/FaxMachineComponent.cs similarity index 84% rename from Content.Server/Fax/FaxMachineComponent.cs rename to Content.Shared/Fax/Components/FaxMachineComponent.cs index d1f269dd37..ee9459f508 100644 --- a/Content.Server/Fax/FaxMachineComponent.cs +++ b/Content.Shared/Fax/Components/FaxMachineComponent.cs @@ -1,12 +1,13 @@ using Content.Shared.Containers.ItemSlots; using Content.Shared.Paper; using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Fax; +namespace Content.Shared.Fax.Components; -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class FaxMachineComponent : Component { /// @@ -16,6 +17,13 @@ public sealed partial class FaxMachineComponent : Component [DataField("name")] public string FaxName { get; set; } = "Unknown"; + /// + /// Sprite to use when inserting an object. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] + public string InsertingState = "inserting"; + /// /// Device address of fax in network to which data will be send /// @@ -26,7 +34,7 @@ public sealed partial class FaxMachineComponent : Component /// /// Contains the item to be sent, assumes it's paper... /// - [DataField("paperSlot", required: true)] + [DataField(required: true)] public ItemSlot PaperSlot = new(); /// @@ -34,39 +42,39 @@ public sealed partial class FaxMachineComponent : Component /// This will make it visible to others on the network /// [ViewVariables(VVAccess.ReadWrite)] - [DataField("responsePings")] + [DataField] public bool ResponsePings { get; set; } = true; /// /// Should admins be notified on message receive /// [ViewVariables(VVAccess.ReadWrite)] - [DataField("notifyAdmins")] + [DataField] public bool NotifyAdmins { get; set; } = false; /// /// Should that fax receive nuke codes send by admins. Probably should be captain fax only /// [ViewVariables(VVAccess.ReadWrite)] - [DataField("receiveNukeCodes")] + [DataField] public bool ReceiveNukeCodes { get; set; } = false; /// /// Sound to play when fax has been emagged /// - [DataField("emagSound")] + [DataField] public SoundSpecifier EmagSound = new SoundCollectionSpecifier("sparks"); /// /// Sound to play when fax printing new message /// - [DataField("printSound")] + [DataField] public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/printer.ogg"); /// /// Sound to play when fax successfully send message /// - [DataField("sendSound")] + [DataField] public SoundSpecifier SendSound = new SoundPathSpecifier("/Audio/Machines/high_tech_confirm.ogg"); /// @@ -79,27 +87,27 @@ public sealed partial class FaxMachineComponent : Component /// Print queue of the incoming message /// [ViewVariables] - [DataField("printingQueue")] + [DataField] public Queue PrintingQueue { get; private set; } = new(); /// /// Message sending timeout /// [ViewVariables] - [DataField("sendTimeoutRemaining")] + [DataField] public float SendTimeoutRemaining; /// /// Message sending timeout /// [ViewVariables] - [DataField("sendTimeout")] + [DataField] public float SendTimeout = 5f; /// /// Remaining time of inserting animation /// - [DataField("insertingTimeRemaining")] + [DataField] public float InsertingTimeRemaining; /// @@ -111,7 +119,7 @@ public sealed partial class FaxMachineComponent : Component /// /// Remaining time of printing animation /// - [DataField("printingTimeRemaining")] + [DataField] public float PrintingTimeRemaining; /// @@ -124,13 +132,13 @@ public sealed partial class FaxMachineComponent : Component [DataDefinition] public sealed partial class FaxPrintout { - [DataField("name", required: true)] + [DataField(required: true)] public string Name { get; private set; } = default!; - [DataField("content", required: true)] + [DataField(required: true)] public string Content { get; private set; } = default!; - [DataField("prototypeId", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] + [DataField(customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] public string PrototypeId { get; private set; } = default!; [DataField("stampState")] diff --git a/Content.Shared/Fax/Components/FaxableObjectComponent.cs b/Content.Shared/Fax/Components/FaxableObjectComponent.cs new file mode 100644 index 0000000000..57b6e610a3 --- /dev/null +++ b/Content.Shared/Fax/Components/FaxableObjectComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Fax.Components; +/// +/// Entity with this component can be faxed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FaxableObjectComponent : Component +{ + /// + /// Sprite to use when inserting an object. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField, AutoNetworkedField] + public string InsertingState = "inserting"; +} diff --git a/Content.Shared/Fax/Components/FaxecuteComponent.cs b/Content.Shared/Fax/Components/FaxecuteComponent.cs new file mode 100644 index 0000000000..9c9bd03020 --- /dev/null +++ b/Content.Shared/Fax/Components/FaxecuteComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; + +namespace Content.Shared.Fax.Components; + +/// +/// A fax component which stores a damage specifier for attempting to fax a mob. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FaxecuteComponent : Component +{ + + /// + /// Type of damage dealt when entity is faxecuted. + /// + [DataField(required: true), AutoNetworkedField] + public DamageSpecifier Damage = new(); +} + diff --git a/Content.Shared/Fax/DamageOnFaxecuteEvent.cs b/Content.Shared/Fax/DamageOnFaxecuteEvent.cs new file mode 100644 index 0000000000..b36f55ab5d --- /dev/null +++ b/Content.Shared/Fax/DamageOnFaxecuteEvent.cs @@ -0,0 +1,9 @@ + +namespace Content.Shared.Fax.Components; + +/// +/// Event for killing any mob within the fax machine. +/// +/// System for handling execution of a mob within fax when copy or send attempt is made. +/// +public sealed class FaxecuteSystem : EntitySystem +{ + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + } + + public void Faxecute(EntityUid uid, FaxMachineComponent component, DamageOnFaxecuteEvent? args = null) + { + var sendEntity = component.PaperSlot.Item; + if (sendEntity == null) + return; + + if (!TryComp(uid, out var faxecute)) + return; + + var damageSpec = faxecute.Damage; + _damageable.TryChangeDamage(sendEntity, damageSpec); + _popupSystem.PopupEntity(Loc.GetString("fax-machine-popup-error", ("target", uid)), uid, PopupType.LargeCaution); + return; + + } +} diff --git a/Resources/Locale/en-US/fax/fax.ftl b/Resources/Locale/en-US/fax/fax.ftl index 1f1881a05d..412f3d7f43 100644 --- a/Resources/Locale/en-US/fax/fax.ftl +++ b/Resources/Locale/en-US/fax/fax.ftl @@ -3,6 +3,8 @@ fax-machine-popup-received = Received correspondence from { $from }. fax-machine-popup-name-long = Fax name is too long fax-machine-popup-name-exist = Fax with same name already exist in network fax-machine-popup-name-set = Fax name has been updated +fax-machine-popup-error = ERROR - jam in paper feed +fax-machine-popup-copy-error = ERROR - unable to copy! fax-machine-dialog-rename = Rename fax-machine-dialog-field-name = Name diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index ad5b51d998..1cf56c29c6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -432,6 +432,8 @@ - type: Speech speechVerb: Moth speechSounds: Squeak + - type: FaxableObject + insertingState: inserting_mothroach - type: MothAccent - type: Sprite sprite: Mobs/Animals/mothroach.rsi @@ -1535,6 +1537,8 @@ rootTask: task: MouseCompound - type: Physics + - type: FaxableObject + insertingState: inserting_mouse - type: Fixtures fixtures: fix1: @@ -3049,6 +3053,8 @@ - type: Item size: Tiny - type: Physics + - type: FaxableObject + insertingState: inserting_hamster - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 08e5e3caaf..0c87459164 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -32,6 +32,7 @@ - Trash - Paper - type: Appearance + - type: FaxableObject - type: PaperVisuals - type: Flammable fireSpread: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index 583b5e3548..36be6451d2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity parent: BaseMachinePowered id: FaxMachineBase name: long range fax machine @@ -9,7 +9,7 @@ drawdepth: SmallObjects layers: - state: icon - map: ["base"] + map: [ "enum.FaxMachineVisuals.VisualState" ] - type: Icon sprite: Structures/Machines/fax_machine.rsi state: icon @@ -36,23 +36,27 @@ type: FaxBoundUi - type: ApcPowerReceiver powerLoad: 250 + - type: Faxecute + damage: + types: + Blunt: 100 - type: FaxMachine paperSlot: insertSound: /Audio/Machines/scanning.ogg ejectSound: /Audio/Machines/tray_eject.ogg whitelist: components: - - Paper + - FaxableObject #used to be PaperComponent - brainfood1183 - type: GenericVisualizer visuals: enum.PowerDeviceVisuals.Powered: - base: + enum.FaxMachineVisuals.VisualState: True: { state: idle } False: { state: icon } enum.FaxMachineVisuals.VisualState: - base: - Inserting: { state: inserting } + enum.FaxMachineVisuals.VisualState: Printing: { state: printing } + Normal: {state: idle} - type: ItemSlots - type: ContainerContainer containers: diff --git a/Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_hamster.png b/Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_hamster.png new file mode 100644 index 0000000000000000000000000000000000000000..5f14e3013fe27a556cf939324a970734cb697eda GIT binary patch literal 23368 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 J*@hl#{s)EQ{v7}S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mothroach.png b/Resources/Textures/Structures/Machines/fax_machine.rsi/inserting_mothroach.png new file mode 100644 index 0000000000000000000000000000000000000000..d034322697ed03497fc66f815351a1c3966b4087 GIT binary patch literal 23838 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/fax_machine.rsi/meta.json b/Resources/Textures/Structures/Machines/fax_machine.rsi/meta.json index 1a8856301d..00681ca6da 100644 --- a/Resources/Textures/Structures/Machines/fax_machine.rsi/meta.json +++ b/Resources/Textures/Structures/Machines/fax_machine.rsi/meta.json @@ -40,6 +40,63 @@ ] ] }, + { + "name": "inserting_hamster", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "inserting_mothroach", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "inserting_mouse", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, { "name": "printing", "delays": [