From 2f45e5e04417d84696e6e318f41e8927f53f6aa1 Mon Sep 17 00:00:00 2001 From: AJCM-git <60196617+AJCM-git@users.noreply.github.com> Date: Fri, 26 Feb 2021 22:56:32 -0400 Subject: [PATCH] Repairable Component (#3418) * Adds a repairable component * Ignores RepairableComponent in the client * fix localization * fix localization --- Content.Client/IgnoredComponents.cs | 1 + .../Gravity/GravityGeneratorComponent.cs | 30 +--------- .../Components/RepairableComponent.cs | 57 +++++++++++++++++++ .../en-US/components/repairable-component.ftl | 10 ++++ .../Specific/gravity_generator.yml | 4 +- .../Entities/Constructible/Walls/windows.yml | 6 +- 6 files changed, 76 insertions(+), 32 deletions(-) create mode 100644 Content.Server/GameObjects/Components/RepairableComponent.cs create mode 100644 Resources/Locale/en-US/components/repairable-component.ftl diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index d29104fcad..abfaadcbe5 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -238,6 +238,7 @@ namespace Content.Client "SecretStash", "Toilet", "ClusterFlash", + "Repairable", "GasGenerator", "SolutionTransfer", "Shovel", diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index 95e356f1c2..52b0bdb63a 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -1,25 +1,19 @@ #nullable enable -using System.Threading.Tasks; -using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.Utility; -using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Gravity; -using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.GameObjects.EntitySystems; -using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.GameObjects; -using Robust.Shared.Localization; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Gravity { [RegisterComponent] - public class GravityGeneratorComponent : SharedGravityGeneratorComponent, IInteractUsing, IBreakAct, IInteractHand + public class GravityGeneratorComponent : SharedGravityGeneratorComponent, IBreakAct, IInteractHand { [ComponentDependency] private readonly AppearanceComponent? _appearance = default!; @@ -96,28 +90,6 @@ namespace Content.Server.GameObjects.Components.Gravity return true; } - async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) - { - if (!eventArgs.Using.TryGetComponent(out WelderComponent? tool)) - return false; - - if (!await tool.UseTool(eventArgs.User, Owner, 2f, ToolQuality.Welding, 5f)) - return false; - - // Repair generator - if (Owner.TryGetComponent(out IDamageableComponent? damageable)) - { - damageable.Heal(); - } - - _intact = true; - - Owner.PopupMessage(eventArgs.User, - Loc.GetString("You repair {0:theName} with {1:theName}", Owner, eventArgs.Using)); - - return true; - } - public void OnBreak(BreakageEventArgs eventArgs) { _intact = false; diff --git a/Content.Server/GameObjects/Components/RepairableComponent.cs b/Content.Server/GameObjects/Components/RepairableComponent.cs new file mode 100644 index 0000000000..c7ff53097d --- /dev/null +++ b/Content.Server/GameObjects/Components/RepairableComponent.cs @@ -0,0 +1,57 @@ +#nullable enable +using System.Threading.Tasks; +using Content.Shared.Interfaces; +using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Interfaces.GameObjects.Components; +using Content.Server.GameObjects.Components.Interactable; +using Robust.Shared.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components +{ + [RegisterComponent] + public class RepairableComponent : Component, IInteractUsing + { + public override string Name => "Repairable"; + + [ViewVariables(VVAccess.ReadWrite)] + private int _fuelCost; + + [ViewVariables(VVAccess.ReadWrite)] + private int _doAfterDelay; + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _fuelCost, "fuelCost", 5); + serializer.DataField(ref _doAfterDelay, "doAfterDelay", 1); + } + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + { + // Only repair if you are using a lit welder + if (!eventArgs.Using.TryGetComponent(out WelderComponent? welder) || !welder.WelderLit) + return false; + + if (Owner.TryGetComponent(out IDamageableComponent? damageable)) + { + // Repair the target if it is damaged, oherwise do nothing + if (damageable.TotalDamage > 0) + { + if (!await welder.UseTool(eventArgs.User, Owner, _doAfterDelay, ToolQuality.Welding, _fuelCost)) + return false; + damageable.Heal(); + + Owner.PopupMessage(eventArgs.User, + Loc.GetString("comp-repairable-repair", + ("target", Owner), + ("welder", eventArgs.Using))); + } + } + return true; + } + } +} diff --git a/Resources/Locale/en-US/components/repairable-component.ftl b/Resources/Locale/en-US/components/repairable-component.ftl new file mode 100644 index 0000000000..0341364f48 --- /dev/null +++ b/Resources/Locale/en-US/components/repairable-component.ftl @@ -0,0 +1,10 @@ +### Interaction Messages + +# Shown when repairing something +comp-repairable-repair = You repair {PROPER($target) -> + [true] {""} + *[false] the{" "} +}{$target} with {PROPER($welder) -> + [true] {""} + *[false] the{" "} +}{$welder} diff --git a/Resources/Prototypes/Entities/Constructible/Specific/gravity_generator.yml b/Resources/Prototypes/Entities/Constructible/Specific/gravity_generator.yml index 44f726e72e..ab834372f2 100644 --- a/Resources/Prototypes/Entities/Constructible/Specific/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Constructible/Specific/gravity_generator.yml @@ -13,7 +13,6 @@ state: activated shader: unshaded map: ["enum.GravityGeneratorVisualLayers.Core"] - - type: SnapGrid offset: Center - type: PowerReceiver @@ -31,6 +30,9 @@ - type: InteractionOutline - type: Damageable resistances: metallicResistances + - type: Repairable + fuelCost: 10 + doAfterDelay: 5 - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Constructible/Walls/windows.yml b/Resources/Prototypes/Entities/Constructible/Walls/windows.yml index f762ebd521..3df6bbd30f 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/windows.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/windows.yml @@ -28,6 +28,7 @@ - SmallImpassable - type: Damageable resistances: metallicResistances + - type: Repairable - type: Destructible thresholds: - trigger: @@ -65,8 +66,9 @@ sprite: Constructible/Structures/Windows/reinforced_window.rsi - type: Icon sprite: Constructible/Structures/Windows/reinforced_window.rsi - - type: Damageable - resistances: metallicResistances + - type: Repairable + fuelCost: 10 + doAfterDelay: 2 - type: Destructible thresholds: - trigger: