using System.Collections.Generic; using Content.Shared.Interaction; using Content.Shared.Sound; using Content.Shared.Tool; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Player; using Robust.Shared.Players; using Robust.Shared.Serialization.Manager.Attributes; namespace Content.Server.Tools.Components { /// /// Not to be confused with Multitool (power) /// [RegisterComponent] [NetworkedComponent()] public class MultiToolComponent : Component, IUse { [DataDefinition] public class ToolEntry { [DataField("behavior")] public ToolQuality Behavior { get; private set; } = ToolQuality.None; [DataField("state")] public string State { get; } = string.Empty; [DataField("texture")] public string Texture { get; } = string.Empty; [DataField("sprite")] public string Sprite { get; } = string.Empty; [DataField("useSound", required: true)] public SoundSpecifier Sound { get; } = default!; [DataField("changeSound", required: true)] public SoundSpecifier ChangeSound { get; } = default!; } public override string Name => "MultiTool"; [DataField("tools")] private List _tools = new(); private int _currentTool = 0; private ToolComponent? _tool; private SpriteComponent? _sprite; protected override void Initialize() { base.Initialize(); Owner.TryGetComponent(out _tool); Owner.TryGetComponent(out _sprite); SetTool(); } public void Cycle() { _currentTool = (_currentTool + 1) % _tools.Count; SetTool(); var current = _tools[_currentTool]; SoundSystem.Play(Filter.Pvs(Owner), current.ChangeSound.GetSound(), Owner); } private void SetTool() { if (_tool == null) return; var current = _tools[_currentTool]; _tool.UseSound = current.Sound; _tool.Qualities = current.Behavior; if (_sprite == null) return; if (string.IsNullOrEmpty(current.Texture)) if (!string.IsNullOrEmpty(current.Sprite)) _sprite.LayerSetState(0, current.State, current.Sprite); else _sprite.LayerSetState(0, current.State); else _sprite.LayerSetTexture(0, current.Texture); Dirty(); } bool IUse.UseEntity(UseEntityEventArgs eventArgs) { Cycle(); return true; } public override ComponentState GetComponentState(ICommonSession player) { return new MultiToolComponentState(_tool?.Qualities ?? ToolQuality.None); } } }