diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index b37d0c3d2c..239931435b 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -100,7 +100,7 @@ namespace Content.Server.GameObjects.Components.Gravity public bool WelderAct(WelderActEventArgs eventArgs) { - var welder = (WelderComponent)eventArgs.ToolComponent; + var welder = eventArgs.WelderComponent; if (!welder.TryWeld(5.0f)) return false; // Repair generator var damageable = Owner.GetComponent(); diff --git a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs index 43f2fd9db1..66f2fb7ca9 100644 --- a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs @@ -2,6 +2,8 @@ // ReSharper disable once RedundantUsingDirective using System; +using System.Linq; +using System.Reflection.Metadata.Ecma335; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.EntitySystems; using Content.Shared.Audio; @@ -30,7 +32,7 @@ using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Interactable { [RegisterComponent] - public class ToolComponent : SharedToolComponent, IExamine, IAfterAttack, IUse, IAttack + public class ToolComponent : SharedToolComponent, IAfterAttack { #pragma warning disable 649 [Dependency] private IEntitySystemManager _entitySystemManager; @@ -114,7 +116,17 @@ namespace Content.Server.GameObjects.Components.Interactable /// /// Status modifier which determines whether or not we can act as a tool at this time /// - public virtual bool CanUse() + public virtual bool CanUse(float resource) + { + return true; + } + + /// + /// Method which will try to use the current tool and consume resources/power if applicable. + /// + /// The amount of resource + /// Whether the tool could be used or not. + public virtual bool TryUse(float resource = 0f) { return true; } @@ -142,6 +154,9 @@ namespace Content.Server.GameObjects.Components.Interactable public void AfterAttack(AfterAttackEventArgs eventArgs) { + if (eventArgs.Attacked != null && RaiseToolAct(eventArgs)) + return; + if (Behavior != Tool.Crowbar) return; @@ -166,17 +181,100 @@ namespace Content.Server.GameObjects.Components.Interactable tileItem.Transform.WorldPosition += (0.2f, 0.2f); } - public virtual bool UseEntity(UseEntityEventArgs eventArgs) + private bool RaiseToolAct(AfterAttackEventArgs eventArgs) { + var attacked = eventArgs.Attacked; + var clickLocation = eventArgs.ClickLocation; + var user = eventArgs.User; + + switch (Behavior) + { + case Tool.Wrench: + var wrenchList = attacked.GetAllComponents().ToList(); + var wrenchAttackBy = new WrenchActEventArgs() + { User = user, ClickLocation = clickLocation, AttackWith = Owner }; + + foreach (var comp in wrenchList) + { + if (comp.WrenchAct(wrenchAttackBy)) + return true; + } + + break; + + case Tool.Crowbar: + var crowbarList = attacked.GetAllComponents().ToList(); + var crowbarAttackBy = new CrowbarActEventArgs() + { User = user, ClickLocation = clickLocation, AttackWith = Owner }; + + foreach (var comp in crowbarList) + { + if (comp.CrowbarAct(crowbarAttackBy)) + return true; + } + + break; + + case Tool.Screwdriver: + var screwdriverList = attacked.GetAllComponents().ToList(); + var screwdriverAttackBy = new ScrewdriverActEventArgs() + { User = user, ClickLocation = clickLocation, AttackWith = Owner }; + + foreach (var comp in screwdriverList) + { + if (comp.ScrewdriverAct(screwdriverAttackBy)) + return true; + } + + break; + + case Tool.Wirecutter: + var wirecutterList = attacked.GetAllComponents().ToList(); + var wirecutterAttackBy = new WirecutterActEventArgs() + { User = user, ClickLocation = clickLocation, AttackWith = Owner }; + + foreach (var comp in wirecutterList) + { + if (comp.WirecutterAct(wirecutterAttackBy)) + return true; + } + break; + + case Tool.Welder: + var welderList = attacked.GetAllComponents().ToList(); + var welder = (WelderComponent) this; + var welderAttackBy = new WelderActEventArgs() + { + User = user, ClickLocation = clickLocation, AttackWith = Owner, + Fuel = welder.Fuel, FuelCapacity = welder.FuelCapacity + }; + + foreach (var comp in welderList) + { + if (comp.WelderAct(welderAttackBy)) + return true; + } + + break; + + case Tool.Multitool: + var multitoolList = attacked.GetAllComponents().ToList(); + var multitoolAttackBy = new MultitoolActEventArgs() + { User = user, ClickLocation = clickLocation, AttackWith = Owner }; + + foreach (var comp in multitoolList) + { + if (comp.MultitoolAct(multitoolAttackBy)) + return true; + } + + break; + + default: + throw new ArgumentOutOfRangeException(); + } + return false; } - - public virtual void Examine(FormattedMessage message) - { - } - - public virtual void Attack(AttackEventArgs eventArgs) - { - } } } diff --git a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs index d0b2cdbf35..fa3e4c56b9 100644 --- a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs @@ -17,7 +17,7 @@ namespace Content.Server.GameObjects.Components.Interactable { [RegisterComponent] [ComponentReference(typeof(ToolComponent))] - public class WelderComponent : ToolComponent + public class WelderComponent : ToolComponent, IExamine, IUse { #pragma warning disable 649 [Dependency] private IEntitySystemManager _entitySystemManager; @@ -80,14 +80,16 @@ namespace Content.Server.GameObjects.Components.Interactable return new WelderComponentState(FuelCapacity, Fuel, WelderLit); } - /// - /// Status modifier which determines whether or not we can act as a tool at this time - /// - public override bool CanUse() + public bool CanUse() { return CanWeld(DefaultFuelCost); } + public bool TryUse() + { + return TryWeld(DefaultFuelCost); + } + public bool TryWeld(float value) { if (!WelderLit || !CanWeld(value) || _solutionComponent == null) @@ -133,12 +135,12 @@ namespace Content.Server.GameObjects.Components.Interactable return true; } - public override bool UseEntity(UseEntityEventArgs eventArgs) + public bool UseEntity(UseEntityEventArgs eventArgs) { return ToggleWelderStatus(); } - public override void Examine(FormattedMessage message) + public void Examine(FormattedMessage message) { if (WelderLit) { diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs index 640a32271a..0669575a74 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs @@ -135,6 +135,7 @@ namespace Content.Server.GameObjects.EntitySystems public class WelderActEventArgs : ToolActEventArgs { public override Tool Behavior => Tool.Welder; + public WelderComponent WelderComponent => (WelderComponent)ToolComponent; public bool Lit { get; set; } public float Fuel { get; set; } public float FuelCapacity { get; set; } @@ -680,97 +681,6 @@ namespace Content.Server.GameObjects.EntitySystems return; } - // We handle specific tools AttackBy here. - if (weapon.TryGetComponent(out var tool)) - { - switch (tool.Behavior) - { - case Tool.Wrench: - var wrenchList = attacked.GetAllComponents().ToList(); - var wrenchAttackBy = new WrenchActEventArgs() - { User = user, ClickLocation = clickLocation, AttackWith = weapon }; - - foreach (var comp in wrenchList) - { - if (comp.WrenchAct(wrenchAttackBy)) - return; - } - - break; - - case Tool.Crowbar: - var crowbarList = attacked.GetAllComponents().ToList(); - var crowbarAttackBy = new CrowbarActEventArgs() - { User = user, ClickLocation = clickLocation, AttackWith = weapon }; - - foreach (var comp in crowbarList) - { - if (comp.CrowbarAct(crowbarAttackBy)) - return; - } - - break; - - case Tool.Screwdriver: - var screwdriverList = attacked.GetAllComponents().ToList(); - var screwdriverAttackBy = new ScrewdriverActEventArgs() - { User = user, ClickLocation = clickLocation, AttackWith = weapon }; - - foreach (var comp in screwdriverList) - { - if (comp.ScrewdriverAct(screwdriverAttackBy)) - return; - } - - break; - - case Tool.Wirecutter: - var wirecutterList = attacked.GetAllComponents().ToList(); - var wirecutterAttackBy = new WirecutterActEventArgs() - { User = user, ClickLocation = clickLocation, AttackWith = weapon }; - - foreach (var comp in wirecutterList) - { - if (comp.WirecutterAct(wirecutterAttackBy)) - return; - } - break; - - case Tool.Welder: - var welderList = attacked.GetAllComponents().ToList(); - var welder = (WelderComponent) tool; - var welderAttackBy = new WelderActEventArgs() - { - User = user, ClickLocation = clickLocation, AttackWith = weapon, - Fuel = welder.Fuel, FuelCapacity = welder.FuelCapacity - }; - - foreach (var comp in welderList) - { - if (comp.WelderAct(welderAttackBy)) - return; - } - - break; - - case Tool.Multitool: - var multitoolList = attacked.GetAllComponents().ToList(); - var multitoolAttackBy = new MultitoolActEventArgs() - { User = user, ClickLocation = clickLocation, AttackWith = weapon }; - - foreach (var comp in multitoolList) - { - if (comp.MultitoolAct(multitoolAttackBy)) - return; - } - - break; - - default: - throw new ArgumentOutOfRangeException(); - } - } - var afterAtkMsg = new AfterAttackMessage(user, weapon, attacked, clickLocation); RaiseLocalEvent(afterAtkMsg); if (afterAtkMsg.Handled)