diff --git a/Content.Client/_CM14/Attachable/AttachableHolderVisualsSystem.cs b/Content.Client/_CM14/Attachable/AttachableHolderVisualsSystem.cs new file mode 100644 index 0000000000000..dd3512b771ed6 --- /dev/null +++ b/Content.Client/_CM14/Attachable/AttachableHolderVisualsSystem.cs @@ -0,0 +1,88 @@ +using Content.Client._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Robust.Client.GameObjects; +namespace Content.Client._CM14.Attachable; +public sealed class AttachableHolderVisualsSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAttachablesAltered); + } + private void OnAttachablesAltered(Entity holder, + ref AttachableHolderAttachablesAlteredEvent args) + { + if (!TryComp(args.Attachable, out AttachableVisualsComponent? attachableComponent)) + return; + var attachable = new Entity(args.Attachable, attachableComponent); + switch (args.Alteration) + { + case AttachableAlteredType.Attached: + SetAttachableOverlay(holder, attachable, args.SlotId); + break; + case AttachableAlteredType.Detached: + RemoveAttachableOverlay(holder, args.SlotId); + break; + case AttachableAlteredType.Activated: + if (!attachableComponent.ShowActive) + break; + SetAttachableOverlay(holder, attachable, args.SlotId, "-on"); + break; + case AttachableAlteredType.Deactivated: + if (!attachableComponent.ShowActive) + break; + SetAttachableOverlay(holder, attachable, args.SlotId); + break; + } + } + private void RemoveAttachableOverlay(Entity holder, string slotId) + { + if (!holder.Comp.Offsets.ContainsKey(slotId) || !TryComp(holder, out SpriteComponent? spriteComponent)) + return; + if (!spriteComponent.LayerMapTryGet(slotId, out var index)) + return; + spriteComponent.LayerMapRemove(slotId); + spriteComponent.RemoveLayer(index); + } + private void SetAttachableOverlay(Entity holder, + Entity attachable, + string slotId, + string suffix = "") + { + if (!holder.Comp.Offsets.ContainsKey(slotId) || + !TryComp(holder, out SpriteComponent? holderSprite)) + { + return; + } + if (!TryComp(attachable, out SpriteComponent? attachableSprite)) + return; + var rsi = attachableSprite.LayerGetActualRSI(attachable.Comp.Layer)?.Path; + var state = attachableSprite.LayerGetState(attachable.Comp.Layer).ToString(); + if (attachable.Comp.Rsi is { } rsiPath) + { + rsi = rsiPath; + if (attachable.Comp.Prefix == null) + state = slotId; + } + if (!string.IsNullOrWhiteSpace(attachable.Comp.Prefix)) + state = attachable.Comp.Prefix + state; + if (attachable.Comp.IncludeSlotName) + state += slotId; + if (!string.IsNullOrWhiteSpace(attachable.Comp.Suffix)) + state += attachable.Comp.Suffix; + state += suffix; + var layerData = new PrototypeLayerData() + { + RsiPath = rsi.ToString(), + State = state, + Offset = holder.Comp.Offsets[slotId] + attachable.Comp.Offset, + Visible = true, + }; + if (holderSprite.LayerMapTryGet(slotId, out var index)) + { + holderSprite.LayerSetData(index, layerData); + return; + } + holderSprite.LayerMapSet(slotId, holderSprite.AddLayer(layerData)); + } +} diff --git a/Content.Client/_CM14/Attachable/Components/AttachableHolderVisualsComponent.cs b/Content.Client/_CM14/Attachable/Components/AttachableHolderVisualsComponent.cs new file mode 100644 index 0000000000000..823a1a5403d59 --- /dev/null +++ b/Content.Client/_CM14/Attachable/Components/AttachableHolderVisualsComponent.cs @@ -0,0 +1,14 @@ +using System.Numerics; +namespace Content.Client._CM14.Attachable.Components; +[RegisterComponent, AutoGenerateComponentState] +[Access(typeof(AttachableHolderVisualsSystem))] +public sealed partial class AttachableHolderVisualsComponent : Component +{ + /// + /// This dictionary contains a list of offsets for every slot that should display the attachable placed into it. + /// If a slot is not in this dictionary, the attachable inside will not be displayed. + /// The list of valid slot names can be found in AttachableHolderComponent.cs + /// + [DataField(required: true), AutoNetworkedField] + public Dictionary Offsets = new(); +} diff --git a/Content.Client/_CM14/Attachable/Components/AttachableVisualsComponent.cs b/Content.Client/_CM14/Attachable/Components/AttachableVisualsComponent.cs new file mode 100644 index 0000000000000..442d0b0ba08ae --- /dev/null +++ b/Content.Client/_CM14/Attachable/Components/AttachableVisualsComponent.cs @@ -0,0 +1,22 @@ +using System.Numerics; +using Robust.Shared.Utility; +namespace Content.Client._CM14.Attachable.Components; +[RegisterComponent, AutoGenerateComponentState] +[Access(typeof(AttachableHolderVisualsSystem))] +public sealed partial class AttachableVisualsComponent : Component +{ + [DataField, AutoNetworkedField] + public ResPath? Rsi; + [DataField, AutoNetworkedField] + public string? Prefix; + [DataField, AutoNetworkedField] + public string? Suffix = "_a"; + [DataField, AutoNetworkedField] + public bool IncludeSlotName; + [DataField, AutoNetworkedField] + public bool ShowActive; + [DataField, AutoNetworkedField] + public int Layer; + [DataField, AutoNetworkedField] + public Vector2 Offset; +} diff --git a/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml b/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml new file mode 100644 index 0000000000000..93cfa3f9ec47a --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml @@ -0,0 +1,9 @@ + + + diff --git a/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml.cs b/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml.cs new file mode 100644 index 0000000000000..4133c45e1ff9e --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachableHolderChooseSlotMenu.xaml.cs @@ -0,0 +1,49 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared._CM14.Attachable; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +namespace Content.Client._CM14.Attachable.Ui; +[GenerateTypedNameReferences] +public sealed partial class AttachableHolderChooseSlotMenu : FancyWindow +{ + private readonly AttachmentChooseSlotBui _boundUI; + private readonly Dictionary _attachableSlotControls; + public AttachableHolderChooseSlotMenu(AttachmentChooseSlotBui boundUI) + { + RobustXamlLoader.Load(this); + _boundUI = boundUI; + _attachableSlotControls = new Dictionary(); + OnClose += boundUI.Close; + } + public void UpdateMenu(List attachableSlots) + { + foreach (var slotId in attachableSlots) + { + if (!_attachableSlotControls.ContainsKey(slotId)) + AddSlotControl(slotId); + } + } + private void AddSlotControl(string slotId) + { + var slotControl = new AttachableSlotControl(this, _boundUI, slotId); + SlotsContainer.AddChild(slotControl); + _attachableSlotControls.Add(slotId, slotControl); + } + private sealed class AttachableSlotControl : Control + { + public AttachableSlotControl(AttachableHolderChooseSlotMenu slotMenu, + AttachmentChooseSlotBui boundUI, + string slotId) + { + var button = new Button { Text = Loc.GetString(slotId) }; + button.OnPressed += _ => + { + boundUI.SendMessage(new AttachableHolderAttachToSlotMessage(slotId)); + slotMenu.Close(); + }; + AddChild(button); + } + } +} diff --git a/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml b/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml new file mode 100644 index 0000000000000..21de429a673cd --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml @@ -0,0 +1,9 @@ + + + diff --git a/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml.cs b/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml.cs new file mode 100644 index 0000000000000..2fca42a39e8c2 --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachableHolderStripMenu.xaml.cs @@ -0,0 +1,81 @@ +using System.Numerics; +using Content.Client.Stylesheets; +using Content.Client.UserInterface.Controls; +using Content.Shared._CM14.Attachable; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using static Robust.Client.UserInterface.Controls.BoxContainer; +namespace Content.Client._CM14.Attachable.Ui; +[GenerateTypedNameReferences] +public sealed partial class AttachableHolderStripMenu : FancyWindow +{ + private readonly AttachmentStripBui _boundUI; + private readonly Dictionary _attachableSlotControls; + public AttachableHolderStripMenu(AttachmentStripBui boundUI) + { + RobustXamlLoader.Load(this); + _boundUI = boundUI; + _attachableSlotControls = new Dictionary(); + OnClose += boundUI.Close; + } + public void UpdateMenu(Dictionary attachableSlots) + { + foreach (var slotId in attachableSlots.Keys) + { + if (!_attachableSlotControls.ContainsKey(slotId)) + AddSlotControl(slotId); + _attachableSlotControls[slotId].Update(attachableSlots[slotId]); + } + } + private void AddSlotControl(string slotId, string? attachableName = null) + { + var slotControl = new AttachableSlotControl(_boundUI, slotId); + AttachablesContainer.AddChild(slotControl); + _attachableSlotControls.Add(slotId, slotControl); + } + private sealed class AttachableSlotControl : Control + { + private readonly Button AttachableButton; + public AttachableSlotControl(AttachmentStripBui boundUI, string slotId) + { + var slotLabel = new Label + { + Text = Loc.GetString(slotId) + ':', + HorizontalAlignment = HAlignment.Left + }; + AttachableButton = new Button + { + Text = Loc.GetString("cm-attachable-holder-strip-ui-empty-slot"), + HorizontalExpand = true, + HorizontalAlignment = HAlignment.Right, + StyleClasses = { StyleClass.ButtonOpenRight } + }; + var hBox = new BoxContainer + { + Orientation = LayoutOrientation.Horizontal, + Children = + { + new Control { MinSize = new Vector2(5, 0) }, + slotLabel, + new Control { MinSize = new Vector2(5, 0) }, + AttachableButton, + }, + }; + AttachableButton.OnPressed += _ => boundUI.SendMessage(new AttachableHolderDetachMessage(slotId)); + AddChild(hBox); + } + public void Update(string? attachableName) + { + if (attachableName == null) + { + AttachableButton.Text = Loc.GetString("cm-attachable-holder-strip-ui-empty-slot"); + AttachableButton.Disabled = true; + return; + } + AttachableButton.Text = attachableName; + AttachableButton.Disabled = false; + } + } +} diff --git a/Content.Client/_CM14/Attachable/Ui/AttachmentChooseSlotBui.cs b/Content.Client/_CM14/Attachable/Ui/AttachmentChooseSlotBui.cs new file mode 100644 index 0000000000000..edeb315e13631 --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachmentChooseSlotBui.cs @@ -0,0 +1,33 @@ +using Content.Shared._CM14.Attachable; +namespace Content.Client._CM14.Attachable.Ui; +public sealed class AttachmentChooseSlotBui : BoundUserInterface +{ + [ViewVariables] + private AttachableHolderChooseSlotMenu? _menu; + public AttachmentChooseSlotBui(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + protected override void Open() + { + base.Open(); + _menu = new AttachableHolderChooseSlotMenu(this); + var metaQuery = EntMan.GetEntityQuery(); + if (metaQuery.TryGetComponent(Owner, out var metadata)) + _menu.Title = metadata.EntityName; + _menu.OpenCentered(); + } + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (state is not AttachableHolderChooseSlotUserInterfaceState msg) + return; + if (_menu == null) + return; + _menu.UpdateMenu(msg.AttachableSlots); + } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + _menu?.Dispose(); + } +} diff --git a/Content.Client/_CM14/Attachable/Ui/AttachmentStripBui.cs b/Content.Client/_CM14/Attachable/Ui/AttachmentStripBui.cs new file mode 100644 index 0000000000000..936797e960f22 --- /dev/null +++ b/Content.Client/_CM14/Attachable/Ui/AttachmentStripBui.cs @@ -0,0 +1,32 @@ +using Content.Shared._CM14.Attachable; +namespace Content.Client._CM14.Attachable.Ui; +public sealed class AttachmentStripBui : BoundUserInterface +{ + private AttachableHolderStripMenu? _menu; + public AttachmentStripBui(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + protected override void Open() + { + base.Open(); + _menu = new AttachableHolderStripMenu(this); + var metaQuery = EntMan.GetEntityQuery(); + if (metaQuery.TryGetComponent(Owner, out var metadata)) + _menu.Title = metadata.EntityName; + _menu.OpenCentered(); + } + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + if (state is not AttachableHolderStripUserInterfaceState msg) + return; + if (_menu == null) + return; + _menu.UpdateMenu(msg.AttachableSlots); + } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + _menu?.Dispose(); + } +} diff --git a/Content.Server/DeadSpace/Attachable/AttachableComponentProviderSystem.cs b/Content.Server/DeadSpace/Attachable/AttachableComponentProviderSystem.cs new file mode 100644 index 0000000000000..f3261bd9fa9f5 --- /dev/null +++ b/Content.Server/DeadSpace/Attachable/AttachableComponentProviderSystem.cs @@ -0,0 +1,112 @@ +// Мёртвый Космос, Licensed under custom terms with restrictions on public hosting and commercial use, full text: https://raw.githubusercontent.com/dead-space-server/space-station-14-fobos/master/LICENSE.TXT + +using Content.Shared._CM14.Attachable; +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared.DeadSpace.Attachable; +using System.Linq; + +namespace Content.Server.DeadSpace.Attachable; + +/// +/// Maintains components provided to holders by installed attachments. +/// Components originally present on a holder are never overwritten or removed. +/// +public sealed class AttachableComponentProviderSystem : EntitySystem +{ + [Dependency] private readonly AttachableHolderSystem _holderSystem = default!; + + private readonly Dictionary<(EntityUid Holder, Type Type), EntityUid> _provided = new(); + + public override void Initialize() + { + SubscribeLocalEvent(OnAttachableAltered); + SubscribeLocalEvent(OnHolderTerminating); + } + + private void OnAttachableAltered(Entity ent, + ref AttachableAlteredEvent args) + { + if (args.Alteration is not (AttachableAlteredType.Attached or AttachableAlteredType.Detached)) + return; + + if (!TryComp(args.Holder, out AttachableHolderComponent? holder)) + return; + + RefreshProvidedComponents((args.Holder, holder)); + } + + private void RefreshProvidedComponents(Entity holder) + { + var desired = new Dictionary(); + + foreach (var slot in holder.Comp.Slots.Keys) + { + if (!_holderSystem.TryGetAttachable(holder, slot, out var attachable) || + !TryComp(attachable, out AttachableComponentProviderComponent? provider)) + { + continue; + } + + foreach (var componentName in provider.Components) + { + if (!EntityManager.ComponentFactory.TryGetRegistration(componentName, out var registration) || + registration.Type == typeof(TransformComponent) || + registration.Type == typeof(MetaDataComponent) || + !EntityManager.TryGetComponent(attachable, registration.Type, out _)) + { + continue; + } + + desired.TryAdd(registration.Type, attachable); + } + } + + foreach (var (type, source) in desired) + { + var key = (holder.Owner, type); + if (!_provided.TryGetValue(key, out var previousSource)) + { + // Preserve components that belong to the holder's own prototype or another system. + if (EntityManager.HasComponent(holder, EntityManager.ComponentFactory.GetRegistration(type))) + continue; + + CopyComponent(source, holder, type); + _provided[key] = source; + continue; + } + + if (previousSource == source) + continue; + + CopyComponent(source, holder, type); + _provided[key] = source; + } + + var obsolete = _provided.Keys + .Where(key => key.Holder == holder.Owner && !desired.ContainsKey(key.Type)) + .ToList(); + + foreach (var key in obsolete) + { + RemComp(holder, key.Type); + _provided.Remove(key); + } + } + + private void CopyComponent(EntityUid source, EntityUid holder, Type type) + { + if (!EntityManager.TryGetComponent(source, type, out var component)) + return; + + CopyComp(source, holder, component); + } + + private void OnHolderTerminating(Entity holder, ref EntityTerminatingEvent args) + { + foreach (var key in _provided.Keys.Where(key => key.Holder == holder.Owner).ToList()) + { + _provided.Remove(key); + } + } +} diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index e4e947b5487f3..27657bf3321e5 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Actions; using Content.Server.Popups; +using Content.Shared._CM14.Attachable.Components; using Content.Shared.Actions; using Content.Shared.Interaction; using Content.Shared.Light; @@ -67,6 +68,10 @@ private void OnEntRemoved(Entity ent, ref EntRemovedFrom private void OnGetActions(EntityUid uid, HandheldLightComponent component, GetItemActionsEvent args) { + if (TryComp(uid, out AttachableToggleableComponent? attachable) && + attachable.AttachedOnly && !attachable.Attached) + return; + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } @@ -75,6 +80,13 @@ private void OnToggleAction(Entity ent, ref ToggleAction if (args.Handled) return; + if (TryComp(ent.Owner, out AttachableToggleableComponent? attachable) && + attachable.AttachedOnly && !attachable.Attached) + { + args.Handled = true; + return; + } + if (ent.Comp.Activated) TurnOff(ent); else @@ -127,6 +139,13 @@ private void OnActivate(Entity ent, ref ActivateInWorldE if (args.Handled || !args.Complex || !ent.Comp.ToggleOnInteract) return; + if (TryComp(ent.Owner, out AttachableToggleableComponent? attachable) && + attachable.AttachedOnly && !attachable.Attached) + { + args.Handled = true; + return; + } + if (ToggleStatus(args.User, ent)) args.Handled = true; } diff --git a/Content.Server/_CM14/Scoping/ScopeSystem.cs b/Content.Server/_CM14/Scoping/ScopeSystem.cs new file mode 100644 index 0000000000000..6209335baf7c8 --- /dev/null +++ b/Content.Server/_CM14/Scoping/ScopeSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared._CM14.Scoping; +namespace Content.Server._CM14.Scoping; +public sealed class ScopeSystem : SharedScopeSystem +{ + protected override void StartScoping(Entity scope, EntityUid user) + { + } + protected override void Unscope(Entity scope) + { + } +} \ No newline at end of file diff --git a/Content.Shared/Actions/Events/AttachableToggleActionEvent.cs b/Content.Shared/Actions/Events/AttachableToggleActionEvent.cs new file mode 100644 index 0000000000000..7b108cf0a0fc3 --- /dev/null +++ b/Content.Shared/Actions/Events/AttachableToggleActionEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Shared.Actions.Events; + +public sealed partial class AttachableToggleActionEvent : InstantActionEvent; diff --git a/Content.Shared/DeadSpace/Attachable/AttachableComponentProviderComponent.cs b/Content.Shared/DeadSpace/Attachable/AttachableComponentProviderComponent.cs new file mode 100644 index 0000000000000..d80b1e46a6120 --- /dev/null +++ b/Content.Shared/DeadSpace/Attachable/AttachableComponentProviderComponent.cs @@ -0,0 +1,14 @@ +// Мёртвый Космос, Licensed under custom terms with restrictions on public hosting and commercial use, full text: https://raw.githubusercontent.com/dead-space-server/space-station-14-fobos/master/LICENSE.TXT + +namespace Content.Shared.DeadSpace.Attachable; + +/// +/// Copies selected components from an installed attachment to its holder. +/// Component names use their YAML registration names. +/// +[RegisterComponent] +public sealed partial class AttachableComponentProviderComponent : Component +{ + [DataField(required: true)] + public HashSet Components = new(); +} diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index bb2fcf5cfea6a..378c3a10d9d5a 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -23,6 +23,8 @@ using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; +using Content.Shared._CM14.Attachable; +using Content.Shared._CM14.Attachable.Components; using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -43,6 +45,7 @@ namespace Content.Shared.Weapons.Ranged.Systems; public abstract partial class SharedGunSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly AttachableHolderSystem _attachableHolder = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly ItemSlotsSystem _slots = default!; @@ -156,8 +159,15 @@ private void OnShootRequest(RequestShootEvent msg, EntitySessionEventArgs args) return; } - if (gun.Owner != GetEntity(msg.Gun)) - return; + var msgGun = GetEntity(msg.Gun); + if (gun.Owner != msgGun) + { + if (!TryComp(msgGun, out var holderComp) || + holderComp.SupercedingAttachable != gun.Owner) + { + return; + } + } gun.Comp.ShootCoordinates = GetCoordinates(msg.Coordinates); gun.Comp.Target = GetEntity(msg.Target); @@ -178,7 +188,13 @@ private void OnStopShootRequest(RequestStopShootEvent ev, EntitySessionEventArgs } if (userGun != (gunUid, gun)) - return; + { + if (!TryComp(gunUid, out var holderComp) || + holderComp.SupercedingAttachable != userGun.Owner) + { + return; + } + } StopShooting(userGun); } @@ -201,6 +217,12 @@ public bool TryGetGun(EntityUid entity, out Entity gun) { gun = default; + if (_attachableHolder.TryGetInhandSupercedingGun(entity, out var supercedingUid, out var supercedingGun)) + { + gun = (supercedingUid, supercedingGun); + return true; + } + if (_hands.GetActiveItem(entity) is { } held && TryComp(held, out GunComponent? gunComp)) { diff --git a/Content.Shared/_CM14/Attachable/AttachableHolderSystem.cs b/Content.Shared/_CM14/Attachable/AttachableHolderSystem.cs new file mode 100644 index 0000000000000..633a80211f258 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableHolderSystem.cs @@ -0,0 +1,704 @@ +using System.Diagnostics.CodeAnalysis; +using System.Numerics; +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared._CM14.Input; +using Content.Shared._CM14.Weapons.Common; +using Content.Shared._CM14.Weapons.Ranged; +using Content.Shared.ActionBlocker; +using Content.Shared.Containers; +using Content.Shared.DoAfter; +using Content.Shared.Hands; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Verbs; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Weapons.Ranged.Systems; +using Content.Shared.Whitelist; +using Content.Shared.Wieldable; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Random; + +namespace Content.Shared._CM14.Attachable; + +public sealed class AttachableHolderSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedGunSystem _gun = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + [Dependency] private readonly SharedVerbSystem _verbSystem = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnAttachDoAfter); + SubscribeLocalEvent(OnDetachDoAfter); + SubscribeLocalEvent(OnAttachableHolderAttachToSlotMessage); + SubscribeLocalEvent(OnAttachableHolderDetachMessage); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(OnAttachableHolderUiOpened); + SubscribeLocalEvent(OnAttached); + SubscribeLocalEvent(OnHolderMapInit); + SubscribeLocalEvent>(OnAttachableHolderGetVerbs); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(OnAttachableHolderBeforeRangedInteract); + SubscribeLocalEvent(OnAttachableHolderInteractUsing); + SubscribeLocalEvent(OnAttachableHolderAfterInteract); + SubscribeLocalEvent(OnAttachableHolderInteractInWorld); + SubscribeLocalEvent(OnHolderWielded); + SubscribeLocalEvent(OnHolderUnwielded); + SubscribeLocalEvent(OnAttachableHolderUniqueAction); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(RelayEvent); + SubscribeLocalEvent(RelayEvent); + + CommandBinds.Builder + .Bind(CMKeyFunctions.CMActivateAttachableBarrel, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } userUid) + ToggleAttachable(userUid, "cm-aslot-barrel"); + }, + handle: false)) + .Bind(CMKeyFunctions.CMActivateAttachableRail, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } userUid) + ToggleAttachable(userUid, "cm-aslot-rail"); + }, + handle: false)) + .Bind(CMKeyFunctions.CMActivateAttachableStock, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } userUid) + ToggleAttachable(userUid, "cm-aslot-stock"); + }, + handle: false)) + .Bind(CMKeyFunctions.CMActivateAttachableUnderbarrel, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } userUid) + ToggleAttachable(userUid, "cm-aslot-underbarrel"); + }, + handle: false)) + .Register(); + } + + public override void Shutdown() + { + CommandBinds.Unregister(); + } + + private void OnHolderMapInit(Entity holder, ref MapInitEvent args) + { + EnsureSlots(holder); + Dirty(holder); + } + + private void OnAttachableHolderBeforeRangedInteract(Entity holder, ref BeforeRangedInteractEvent args) + { + if (args.Handled) + return; + + if (holder.Comp.SupercedingAttachable is not { } attachable) + return; + + var afterInteractEvent = new BeforeRangedInteractEvent(args.User, + attachable, + args.Target, + args.ClickLocation, + args.CanReach); + RaiseLocalEvent(attachable, afterInteractEvent); + + if (afterInteractEvent.Handled) + args.Handled = true; + } + + private void OnAttachableHolderInteractUsing(Entity holder, ref InteractUsingEvent args) + { + if (CanAttach(holder, args.Used)) + { + StartAttach(holder, args.Used, args.User); + args.Handled = true; + } + + if (holder.Comp.SupercedingAttachable == null) + return; + + var interactUsingEvent = new InteractUsingEvent(args.User, + args.Used, + holder.Comp.SupercedingAttachable.Value, + args.ClickLocation); + RaiseLocalEvent(holder.Comp.SupercedingAttachable.Value, interactUsingEvent); + + if (interactUsingEvent.Handled) + { + args.Handled = true; + return; + } + + var afterInteractEvent = new AfterInteractEvent(args.User, + args.Used, + holder.Comp.SupercedingAttachable.Value, + args.ClickLocation, + true); + RaiseLocalEvent(args.Used, afterInteractEvent); + + if (afterInteractEvent.Handled) + args.Handled = true; + } + + private void OnAttachableHolderAfterInteract(Entity holder, ref AfterInteractEvent args) + { + if (args.Handled) + return; + + if (holder.Comp.SupercedingAttachable is not { } attachable) + return; + + var afterInteractEvent = new AfterInteractEvent(args.User, + attachable, + args.Target, + args.ClickLocation, + args.CanReach); + RaiseLocalEvent(attachable, afterInteractEvent); + + if (afterInteractEvent.Handled) + args.Handled = true; + } + + private void OnAttachableHolderInteractInWorld(Entity holder, ref ActivateInWorldEvent args) + { + if (args.Handled || holder.Comp.SupercedingAttachable == null) + return; + + var activateInWorldEvent = new ActivateInWorldEvent(args.User, holder.Comp.SupercedingAttachable.Value, args.Complex); + RaiseLocalEvent(holder.Comp.SupercedingAttachable.Value, activateInWorldEvent); + + args.Handled = activateInWorldEvent.Handled; + } + + private void OnAttachableHolderUniqueAction(Entity holder, ref UniqueActionEvent args) + { + if (holder.Comp.SupercedingAttachable == null || args.Handled) + return; + + RaiseLocalEvent(holder.Comp.SupercedingAttachable.Value, new UniqueActionEvent(args.UserUid)); + args.Handled = true; + } + + private void OnHolderWielded(Entity holder, ref ItemWieldedEvent args) + { + AlterAllAttachables(holder, AttachableAlteredType.Wielded); + } + + private void OnHolderUnwielded(Entity holder, ref ItemUnwieldedEvent args) + { + AlterAllAttachables(holder, AttachableAlteredType.Unwielded); + } + + private void OnAttachableHolderDetachMessage(EntityUid holderUid, + AttachableHolderComponent holderComponent, + AttachableHolderDetachMessage args) + { + StartDetach((holderUid, holderComponent), args.Slot, args.Actor); + } + + private void OnAttachableHolderGetVerbs(Entity holder, ref GetVerbsEvent args) + { + EnsureSlots(holder); + var userUid = args.User; + + foreach (var slotId in holder.Comp.Slots.Keys) + { + if (_container.TryGetContainer(holder.Owner, slotId, out var container)) + { + foreach (var contained in container.ContainedEntities) + { + if (!TryComp(contained, out AttachableToggleableComponent? toggleableComponent)) + continue; + + var verb = new EquipmentVerb() + { + Text = toggleableComponent.ActionName, + IconEntity = GetNetEntity(contained), + Act = () => + { + var ev = new AttachableToggleStartedEvent((holder.Owner, holder.Comp), userUid, slotId); + RaiseLocalEvent(contained, ref ev); + } + }; + + args.Verbs.Add(verb); + } + } + } + } + + private void OnAttachableHolderAttachToSlotMessage(EntityUid holderUid, + AttachableHolderComponent holderComponent, + AttachableHolderAttachToSlotMessage args) + { + TryComp(args.Actor, out var handsComponent); + + if (handsComponent == null) + return; + + _hands.TryGetActiveItem((args.Actor, handsComponent), out var attachableUid); + + if (attachableUid == null) + return; + + StartAttach((holderUid, holderComponent), attachableUid.Value, args.Actor, args.Slot); + } + + private void OnAttachableHolderUiOpened(EntityUid holderUid, + AttachableHolderComponent holderComponent, + BoundUIOpenedEvent args) + { + UpdateStripUi(holderUid); + } + + public void StartAttach(Entity holder, + EntityUid attachableUid, + EntityUid userUid, + string slotId = "") + { + var validSlots = GetValidSlots(holder, attachableUid); + + if (validSlots.Count == 0) + return; + + if (string.IsNullOrEmpty(slotId)) + { + if (validSlots.Count > 1) + { + TryComp(holder.Owner, + out var userInterfaceComponent); + _ui.OpenUi((holder.Owner, userInterfaceComponent), AttachmentUI.ChooseSlotKey, userUid); + + var state = + new AttachableHolderChooseSlotUserInterfaceState(validSlots); + _ui.SetUiState(holder.Owner, AttachmentUI.ChooseSlotKey, state); + return; + } + + slotId = validSlots[0]; + } + + _doAfter.TryStartDoAfter(new DoAfterArgs( + EntityManager, + userUid, + Comp(attachableUid).AttachDoAfter, + new AttachableAttachDoAfterEvent(slotId), + holder, + target: holder.Owner, + used: attachableUid) + { + NeedHand = true, + BreakOnMove = true, + }); + } + + private void OnAttachDoAfter(EntityUid uid, AttachableHolderComponent component, AttachableAttachDoAfterEvent args) + { + if (args.Cancelled || args.Handled) + return; + + if (args.Target is not { } target || args.Used is not { } used) + return; + + if (!TryComp(args.Target, out AttachableHolderComponent? holder) || + !HasComp(args.Used)) + return; + + if (Attach((target, holder), used, args.User, args.SlotId)) + args.Handled = true; + } + + public bool Attach(Entity holder, + EntityUid attachableUid, + EntityUid userUid, + string slotId = "") + { + if (!CanAttach(holder, attachableUid, ref slotId)) + return false; + + var container = _container.EnsureContainer(holder, slotId); + container.OccludesLight = false; + + if (container.Count > 0 && !Detach(holder, container.ContainedEntities[0], userUid, slotId)) + return false; + + if (!_container.Insert(attachableUid, container)) + return false; + + if (_hands.IsHolding(userUid, holder.Owner)) + { + var addEv = new GrantAttachableActionsEvent(userUid); + RaiseLocalEvent(attachableUid, ref addEv); + } + + Dirty(holder); + + _audio.PlayPredicted(Comp(attachableUid).AttachSound, + holder, + userUid); + + return true; + } + + private void OnAttached(Entity holder, ref EntInsertedIntoContainerMessage args) + { + if (!TryComp(args.Entity, out AttachableComponent? attachableComponent) || !holder.Comp.Slots.ContainsKey(args.Container.ID)) + return; + + UpdateStripUi(holder.Owner, holder.Comp); + + var ev = new AttachableAlteredEvent(holder.Owner, AttachableAlteredType.Attached); + RaiseLocalEvent(args.Entity, ref ev); + + var holderEv = new AttachableHolderAttachablesAlteredEvent(args.Entity, args.Container.ID, AttachableAlteredType.Attached); + RaiseLocalEvent(holder, ref holderEv); + } + + public void StartDetach(Entity holder, string slotId, EntityUid userUid) + { + if (TryGetAttachable(holder, slotId, out var attachable) && holder.Comp.Slots.ContainsKey(slotId)) + StartDetach(holder, attachable.Owner, userUid); + } + + public void StartDetach(Entity holder, EntityUid attachableUid, EntityUid userUid) + { + var delay = Comp(attachableUid).AttachDoAfter; + var args = new DoAfterArgs( + EntityManager, + userUid, + delay, + new AttachableDetachDoAfterEvent(), + holder, + holder.Owner, + attachableUid) + { + NeedHand = true, + BreakOnMove = true, + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnDetachDoAfter(EntityUid uid, AttachableHolderComponent component, AttachableDetachDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Target == null || args.Used == null) + return; + + if (!TryComp(args.Target, out AttachableHolderComponent? holderComponent) || !HasComp(args.Used)) + return; + + if (!Detach((args.Target.Value, holderComponent), args.Used.Value, args.User)) + return; + + args.Handled = true; + } + + public bool Detach(Entity holder, + EntityUid attachableUid, + EntityUid userUid, + string? slotId = null) + { + if (TerminatingOrDeleted(holder) || !holder.Comp.Running) + return false; + + if (string.IsNullOrEmpty(slotId) && !TryGetSlotId(holder.Owner, attachableUid, out slotId)) + return false; + + if (!_container.TryGetContainer(holder, slotId, out var container) || container.Count <= 0) + return false; + + if (!TryGetAttachable(holder, slotId, out var attachable)) + return false; + + if (!_container.Remove(attachable.Owner, container, force: true)) + return false; + + UpdateStripUi(holder.Owner, holder.Comp); + + var ev = new AttachableAlteredEvent(holder.Owner, AttachableAlteredType.Detached, userUid); + RaiseLocalEvent(attachableUid, ref ev); + + var holderEv = new AttachableHolderAttachablesAlteredEvent(attachableUid, slotId, AttachableAlteredType.Detached); + RaiseLocalEvent(holder.Owner, ref holderEv); + + var removeEv = new RemoveAttachableActionsEvent(userUid); + RaiseLocalEvent(attachableUid, ref removeEv); + + _audio.PlayPredicted(Comp(attachableUid).DetachSound, + holder, + userUid); + + Dirty(holder); + _hands.TryPickupAnyHand(userUid, attachable); + return true; + } + + private bool CanAttach(Entity holder, EntityUid attachableUid) + { + var slotId = ""; + return CanAttach(holder, attachableUid, ref slotId); + } + + private bool CanAttach(Entity holder, EntityUid attachableUid, ref string slotId) + { + if (!HasComp(attachableUid)) + return false; + + if (!string.IsNullOrWhiteSpace(slotId)) + return _whitelist.IsWhitelistPass(holder.Comp.Slots[slotId], attachableUid); + + foreach (var key in holder.Comp.Slots.Keys) + { + if (_whitelist.IsWhitelistPass(holder.Comp.Slots[key], attachableUid)) + { + slotId = key; + return true; + } + } + + return false; + } + + private Dictionary GetSlotsForStripUi(Entity holder) + { + var result = new Dictionary(); + var metaQuery = GetEntityQuery(); + + foreach (var slotId in holder.Comp.Slots.Keys) + { + if (TryGetAttachable(holder, slotId, out var attachable) && + metaQuery.TryGetComponent(attachable.Owner, out var metadata)) + { + result.Add(slotId, metadata.EntityName); + } + else + { + result.Add(slotId, null); + } + } + + return result; + } + + public bool TryGetAttachable(Entity holder, + string slotId, + out Entity attachable) + { + attachable = default; + + if (!_container.TryGetContainer(holder, slotId, out var container) || container.Count <= 0) + return false; + + var ent = container.ContainedEntities[0]; + if (!TryComp(ent, out AttachableComponent? attachableComp)) + return false; + + attachable = (ent, attachableComp); + return true; + } + + private void UpdateStripUi(EntityUid holderUid, AttachableHolderComponent? holderComponent = null) + { + if (!Resolve(holderUid, ref holderComponent)) + return; + + var state = + new AttachableHolderStripUserInterfaceState(GetSlotsForStripUi((holderUid, holderComponent))); + _ui.SetUiState(holderUid, AttachmentUI.StripKey, state); + } + + private void EnsureSlots(Entity holder) + { + foreach (var slotId in holder.Comp.Slots.Keys) + { + var container = _container.EnsureContainer(holder, slotId); + container.OccludesLight = false; + } + } + + private List GetValidSlots(Entity holder, EntityUid attachableUid, bool ignoreLock = false) + { + var list = new List(); + + if (!HasComp(attachableUid)) + return list; + + foreach (var slotId in holder.Comp.Slots.Keys) + { + if (_whitelist.IsWhitelistPass(holder.Comp.Slots[slotId], attachableUid)) + list.Add(slotId); + } + + return list; + } + + private void ToggleAttachable(EntityUid userUid, string slotId) + { + if (_hands.GetActiveItem(userUid) is not { } active || + !TryComp(active, out var holderComponent)) + { + return; + } + + if (!holderComponent.Running || !_actionBlocker.CanInteract(userUid, active)) + return; + + if (!_container.TryGetContainer(active, slotId, out var container) || container.Count <= 0) + return; + + var attachableUid = container.ContainedEntities[0]; + + if (!HasComp(attachableUid)) + return; + + var ev = new AttachableToggleStartedEvent((active, holderComponent), userUid, slotId); + RaiseLocalEvent(attachableUid, ref ev); + } + + public void SetSupercedingAttachable(Entity holder, EntityUid? supercedingAttachable) + { + holder.Comp.SupercedingAttachable = supercedingAttachable; + Dirty(holder); + } + + public bool TryGetInhandSupercedingGun(EntityUid user, out EntityUid attachable, [NotNullWhen(true)] out GunComponent? gunComp) + { + attachable = default; + + if (_hands.GetActiveItem(user) is not { } active || + !TryComp(active, out AttachableHolderComponent? holderComp) || + holderComp.SupercedingAttachable == null) + { + gunComp = null; + return false; + } + + if (!TryComp(holderComp.SupercedingAttachable, out gunComp)) + return false; + + attachable = holderComp.SupercedingAttachable.Value; + return true; + } + + public bool TryGetSlotId(EntityUid holderUid, EntityUid attachableUid, [NotNullWhen(true)] out string? slotId) + { + slotId = null; + + if (!TryComp(holderUid, out var holderComponent) || + !TryComp(attachableUid, out _)) + { + return false; + } + + foreach (var id in holderComponent.Slots.Keys) + { + if (!_container.TryGetContainer(holderUid, id, out var container) || container.Count <= 0) + continue; + + if (container.ContainedEntities[0] != attachableUid) + continue; + + slotId = id; + return true; + } + + return false; + } + + public bool HasSlot(Entity holder, string slotId) + { + if (holder.Comp == null) + { + if (!TryComp(holder.Owner, out AttachableHolderComponent? holderComponent)) + return false; + + holder.Comp = holderComponent; + } + + return holder.Comp.Slots.ContainsKey(slotId); + } + + public bool TryGetHolder(EntityUid attachable, [NotNullWhen(true)] out EntityUid? holderUid) + { + if (!TryComp(attachable, out TransformComponent? transformComponent) || + !transformComponent.ParentUid.Valid || + !HasComp(transformComponent.ParentUid)) + { + holderUid = null; + return false; + } + + holderUid = transformComponent.ParentUid; + return true; + } + + public bool TryGetUser(EntityUid attachable, [NotNullWhen(true)] out EntityUid? userUid) + { + userUid = null; + + if (!TryGetHolder(attachable, out var holderUid)) + return false; + + if (!TryComp(holderUid, out TransformComponent? transformComponent) || !transformComponent.ParentUid.Valid) + return false; + + userUid = transformComponent.ParentUid; + return true; + } + + public void RelayEvent(Entity holder, ref T args) where T : notnull + { + // DS14-start + var ev = new AttachableRelayedEvent(args, holder.Owner); + + foreach (var slot in holder.Comp.Slots.Keys) + { + if (_container.TryGetContainer(holder, slot, out var container)) + { + foreach (var contained in container.ContainedEntities) + { + RaiseLocalEvent(contained, ev); + } + } + } + + args = ev.Args; + // DS14-end + } + + private void AlterAllAttachables(Entity holder, AttachableAlteredType alteration) + { + foreach (var slotId in holder.Comp.Slots.Keys) + { + if (!_container.TryGetContainer(holder, slotId, out var container) || container.Count <= 0) + continue; + + var ev = new AttachableAlteredEvent(holder.Owner, alteration); + RaiseLocalEvent(container.ContainedEntities[0], ref ev); + } + } +} diff --git a/Content.Shared/_CM14/Attachable/AttachableIFFSystem.cs b/Content.Shared/_CM14/Attachable/AttachableIFFSystem.cs new file mode 100644 index 0000000000000..07a78968df713 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableIFFSystem.cs @@ -0,0 +1,47 @@ +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared._CM14.Weapons.Ranged.IFF; +using Content.Shared.Weapons.Ranged.Events; +namespace Content.Shared._CM14.Attachable; +public sealed class AttachableIFFSystem : EntitySystem +{ + [Dependency] private readonly AttachableHolderSystem _holder = default!; + [Dependency] private readonly GunIFFSystem _gunIFF = default!; + public override void Initialize() + { + SubscribeLocalEvent(OnAttachableIFFAltered); + SubscribeLocalEvent(OnAttachableIFFGrant); + SubscribeLocalEvent(OnGunAttachableIFFAmmoShot); + } + private void OnAttachableIFFAltered(Entity ent, ref AttachableAlteredEvent args) + { + switch (args.Alteration) + { + case AttachableAlteredType.Attached: + UpdateGunIFF(args.Holder); + break; + case AttachableAlteredType.Detached: + UpdateGunIFF(args.Holder); + break; + } + } + private void OnAttachableIFFGrant(Entity ent, ref AttachableGrantIFFEvent args) + { + args.Grants = true; + } + private void OnGunAttachableIFFAmmoShot(Entity ent, ref AmmoShotEvent args) + { + _gunIFF.GiveAmmoIFF(ent, ref args); + } + private void UpdateGunIFF(EntityUid gun) + { + if (!TryComp(gun, out AttachableHolderComponent? holder)) + return; + var ev = new AttachableGrantIFFEvent(); + _holder.RelayEvent((gun, holder), ref ev); + if (ev.Grants) + EnsureComp(gun); + else + RemCompDeferred(gun); + } +} diff --git a/Content.Shared/_CM14/Attachable/AttachableSilencerSystem.cs b/Content.Shared/_CM14/Attachable/AttachableSilencerSystem.cs new file mode 100644 index 0000000000000..498e5af26058b --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableSilencerSystem.cs @@ -0,0 +1,24 @@ +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared.Weapons.Ranged.Events; +namespace Content.Shared._CM14.Attachable; +public sealed class AttachableSilencerSystem : EntitySystem +{ + public override void Initialize() + { + // DS14-start + SubscribeLocalEvent>(OnSilencerRefreshModifiers); + SubscribeLocalEvent>(OnSilencerMuzzleFlash); + // DS14-end + } + // DS14-start + private void OnSilencerRefreshModifiers(Entity ent, ref AttachableRelayedEvent args) + { + args.Args.SoundGunshot = ent.Comp.Sound; + } + private void OnSilencerMuzzleFlash(Entity ent, ref AttachableRelayedEvent args) + { + args.Args.Cancelled = true; + } + // DS14-end +} diff --git a/Content.Shared/_CM14/Attachable/AttachableSizeModifierSystem.cs b/Content.Shared/_CM14/Attachable/AttachableSizeModifierSystem.cs new file mode 100644 index 0000000000000..edd880743fcc5 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableSizeModifierSystem.cs @@ -0,0 +1,133 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared.Item; +using Robust.Shared.Prototypes; +namespace Content.Shared._CM14.Attachable; +public sealed class AttachableSizeModifierSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedItemSystem _itemSystem = default!; + private readonly List _sortedSizes = new(); + public override void Initialize() + { + SubscribeLocalEvent(OnPrototypesReloaded); + SubscribeLocalEvent(OnAttachableAltered); + SubscribeLocalEvent(OnAttachableAltered); + InitItemSizes(); + } + private void OnAttachableAltered(Entity attachable, + ref AttachableAlteredEvent args) + { + if (attachable.Comp.SizeModifier == 0) + return; + if (!TryComp(args.Holder, out ItemComponent? itemComponent)) + return; + switch (args.Alteration) + { + case AttachableAlteredType.Attached: + IncrementSize(args.Holder, + itemComponent, + attachable.Comp.SizeModifier, + out attachable.Comp.ResetIncrement); + return; + case AttachableAlteredType.Detached: + ResetSize(args.Holder, itemComponent, attachable.Comp.ResetIncrement); + return; + } + } + private void OnAttachableAltered(Entity attachable, + ref AttachableAlteredEvent args) + { + if (attachable.Comp.ActiveSizeModifier == 0 && attachable.Comp.InactiveSizeModifier == 0) + return; + if (!TryComp(args.Holder, out ItemComponent? itemComponent)) + return; + if (!TryComp(attachable.Owner, out AttachableToggleableComponent? toggleableComponent)) + return; + switch (args.Alteration) + { + case AttachableAlteredType.Attached: + if (toggleableComponent.Active) + { + IncrementSize(args.Holder, + itemComponent, + attachable.Comp.ActiveSizeModifier, + out attachable.Comp.ResetIncrement); + return; + } + IncrementSize(args.Holder, + itemComponent, + attachable.Comp.InactiveSizeModifier, + out attachable.Comp.ResetIncrement); + return; + case AttachableAlteredType.Detached: + ResetSize(args.Holder, itemComponent, attachable.Comp.ResetIncrement); + return; + case AttachableAlteredType.Activated: + ResetSize(args.Holder, itemComponent, attachable.Comp.ResetIncrement); + IncrementSize(args.Holder, + itemComponent, + attachable.Comp.ActiveSizeModifier, + out attachable.Comp.ResetIncrement); + return; + case AttachableAlteredType.Deactivated: + ResetSize(args.Holder, itemComponent, attachable.Comp.ResetIncrement); + IncrementSize(args.Holder, + itemComponent, + attachable.Comp.InactiveSizeModifier, + out attachable.Comp.ResetIncrement); + return; + } + } + private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) + { + if (!args.ByType.ContainsKey(typeof(ItemSizePrototype)) && + args.Removed?.ContainsKey(typeof(ItemSizePrototype)) != true) + { + return; + } + InitItemSizes(); + } + private void InitItemSizes() + { + _sortedSizes.Clear(); + _sortedSizes.AddRange(_prototypeManager.EnumeratePrototypes()); + _sortedSizes.Sort(); + } + private void IncrementSize(EntityUid holder, ItemComponent itemComponent, int sizeIncrement, out int resetIncrement) + { + if (TryGetIncrementedSize(itemComponent.Size, sizeIncrement, out var newSize, out resetIncrement)) + _itemSystem.SetSize(holder, newSize.Value, itemComponent); + } + private void ResetSize(EntityUid holder, ItemComponent itemComponent, int resetIncrement) + { + if (TryGetIncrementedSize(itemComponent.Size, resetIncrement, out var newSize, out _)) + _itemSystem.SetSize(holder, newSize.Value, itemComponent); + } + private bool TryGetIncrementedSize(ProtoId size, + int increment, + [NotNullWhen(true)] out ProtoId? newSize, + out int resetIncrement) + { + var sizeIndex = -1; + for (var index = 0; index < _sortedSizes.Count; index++) + { + if (size.ToString().Equals(_sortedSizes[index].ID)) + { + sizeIndex = index; + break; + } + } + if (sizeIndex == -1) + { + resetIncrement = 0; + newSize = null; + return false; + } + var newSizeIndex = MathHelper.Clamp(sizeIndex + increment, 0, _sortedSizes.Count - 1); + resetIncrement = sizeIndex - newSizeIndex; + newSize = _sortedSizes[newSizeIndex]; + return true; + } +} diff --git a/Content.Shared/_CM14/Attachable/AttachableToggleableSystem.cs b/Content.Shared/_CM14/Attachable/AttachableToggleableSystem.cs new file mode 100644 index 0000000000000..ca89dc7d45a58 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableToggleableSystem.cs @@ -0,0 +1,267 @@ +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared._CM14.Weapons.Common; +using Content.Shared.Actions; +using Content.Shared.Actions.Components; +using Content.Shared.Actions.Events; +using Content.Shared.DoAfter; +using Content.Shared.Hands; +using Content.Shared.Interaction; +using Content.Shared.Light; +using Content.Shared.Light.Components; +using Content.Shared.Toggleable; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio.Systems; +namespace Content.Shared._CM14.Attachable; +public sealed class AttachableToggleableSystem : EntitySystem +{ + [Dependency] private readonly ActionContainerSystem _actionContainerSystem = default!; + [Dependency] private readonly MetaDataSystem _metaDataSystem = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly AttachableHolderSystem _attachableHolderSystem = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + // DS14-start + [Dependency] private readonly SharedHandheldLightSystem _handheldLightSystem = default!; + // DS14-end + public override void Initialize() + { + SubscribeLocalEvent(OnActivateInWorld); + SubscribeLocalEvent(OnAttachableAltered, + after: new[] { typeof(AttachableWeaponRangedModsSystem) }); + SubscribeLocalEvent(OnAttachableToggleAction); + SubscribeLocalEvent( + OnAttachableToggleDoAfter); + SubscribeLocalEvent(OnAttachableToggleStarted); + SubscribeLocalEvent(OnAttemptShoot); + SubscribeLocalEvent(OnToggleAction); + SubscribeLocalEvent(OnUniqueAction); + SubscribeLocalEvent(OnAddAttachableActions); + SubscribeLocalEvent(OnRemoveAttachableActions); + SubscribeLocalEvent(OnGotEquippedHand); + SubscribeLocalEvent(OnGotUnequippedHand); + SubscribeLocalEvent(OnAttachableAltered, + after: new[] { typeof(AttachableWeaponRangedModsSystem) }); + } + private void OnAttachableAltered(Entity attachable, ref AttachableAlteredEvent args) + { + switch (args.Alteration) + { + case AttachableAlteredType.Detached: + if (attachable.Comp.SupercedeHolder && + TryComp(args.Holder, out AttachableHolderComponent? holderComponent) && + holderComponent.SupercedingAttachable == attachable.Owner) + { + _attachableHolderSystem.SetSupercedingAttachable((args.Holder, holderComponent), null); + } + if (attachable.Comp.Active) + { + var ev = args with { Alteration = AttachableAlteredType.DetachedDeactivated }; + RaiseLocalEvent(attachable.Owner, ref ev); + } + attachable.Comp.Attached = false; + attachable.Comp.Active = false; + Dirty(attachable); + break; + case AttachableAlteredType.Attached: + attachable.Comp.Attached = true; + Dirty(attachable); + break; + } + if (attachable.Comp.Action == null || + !TryComp(attachable.Comp.Action, out InstantActionComponent? actionComponent)) + { + return; + } + _actionsSystem.SetToggled(attachable.Comp.Action, attachable.Comp.Active); + _actionsSystem.SetEnabled(attachable.Comp.Action, attachable.Comp.Attached); + } + private void OnActivateInWorld(Entity attachable, ref ActivateInWorldEvent args) + { + if (attachable.Comp.AttachedOnly && !attachable.Comp.Attached) + args.Handled = true; + } + private void OnAttemptShoot(Entity attachable, ref AttemptShootEvent args) + { + if (attachable.Comp.AttachedOnly && !attachable.Comp.Attached) + args.Cancelled = true; + } + private void OnUniqueAction(Entity attachable, ref UniqueActionEvent args) + { + if (attachable.Comp.AttachedOnly && !attachable.Comp.Attached) + args.Handled = true; + } + private void OnAttachableToggleStarted(Entity attachable, + ref AttachableToggleStartedEvent args) + { + _doAfterSystem.TryStartDoAfter(new DoAfterArgs( + EntityManager, + args.User, + attachable.Comp.DoAfter, + new AttachableToggleDoAfterEvent(args.SlotId), + attachable, + target: attachable.Owner, + used: args.Holder) + { + NeedHand = attachable.Comp.NeedHand, + BreakOnMove = attachable.Comp.BreakOnMove + }); + Dirty(attachable); + } + private void OnAttachableToggleDoAfter(Entity attachable, + ref AttachableToggleDoAfterEvent args) + { + if (args.Cancelled || args.Handled) + return; + if (args.Target is not { } target || args.Used is not { } used) + return; + if (!HasComp(target)) + return; + if (!TryComp(args.Used, out AttachableHolderComponent? holderComponent)) + return; + FinishToggle(attachable, (used, holderComponent), args.SlotId, args.User); + _audioSystem.PlayPredicted( + attachable.Comp.Active ? attachable.Comp.ActivateSound : attachable.Comp.DeactivateSound, + attachable, + args.User); + args.Handled = true; + } + private void FinishToggle(Entity attachable, + Entity holder, + string slotId, + EntityUid? userUid) + { + attachable.Comp.Active = !attachable.Comp.Active; + Dirty(attachable); + var mode = attachable.Comp.Active ? AttachableAlteredType.Activated : AttachableAlteredType.Deactivated; + var ev = new AttachableAlteredEvent(holder.Owner, mode, userUid); + RaiseLocalEvent(attachable.Owner, ref ev); + var holderEv = new AttachableHolderAttachablesAlteredEvent(attachable.Owner, slotId, mode); + RaiseLocalEvent(holder.Owner, ref holderEv); + if (!attachable.Comp.Active) + { + if (attachable.Comp.SupercedeHolder && holder.Comp.SupercedingAttachable == attachable.Owner) + _attachableHolderSystem.SetSupercedingAttachable(holder, null); + return; + } + if (!attachable.Comp.SupercedeHolder) + return; + if (holder.Comp.SupercedingAttachable != null && + TryComp(holder.Comp.SupercedingAttachable, out AttachableToggleableComponent? toggleableComponent)) + { + toggleableComponent.Active = false; + ev = new AttachableAlteredEvent(holder.Owner, AttachableAlteredType.Deactivated); + RaiseLocalEvent(holder.Comp.SupercedingAttachable.Value, ref ev); + if (_attachableHolderSystem.TryGetSlotId(holder.Owner, attachable.Owner, out var deactivatedSlot)) + { + holderEv = new AttachableHolderAttachablesAlteredEvent(holder.Comp.SupercedingAttachable.Value, + deactivatedSlot, + AttachableAlteredType.Deactivated); + RaiseLocalEvent(holder.Owner, ref holderEv); + } + } + _attachableHolderSystem.SetSupercedingAttachable(holder, attachable.Owner); + } + private void OnAddAttachableActions(Entity ent, ref GrantAttachableActionsEvent args) + { + var exists = ent.Comp.Action != null && Exists(ent.Comp.Action.Value); + if (!_actionContainerSystem.EnsureAction(ent, ref ent.Comp.Action, ent.Comp.ActionId)) + { + if (ent.Comp.Action is { } existingAction && Exists(existingAction)) + _actionsSystem.GrantContainedAction(args.User, ent.Owner, existingAction); + return; + } + if (ent.Comp.Action is not { } actionId) + return; + _actionsSystem.GrantContainedAction(args.User, ent.Owner, actionId); + if (exists) + return; + _metaDataSystem.SetEntityName(actionId, ent.Comp.ActionName); + _metaDataSystem.SetEntityDescription(actionId, ent.Comp.ActionDesc); + if (_actionsSystem.GetAction(actionId) is { } action) + { + _actionsSystem.SetIcon(action.AsNullable(), ent.Comp.Icon); + _actionsSystem.SetIconOn(action.AsNullable(), ent.Comp.IconActive); + _actionsSystem.SetEnabled(action.AsNullable(), ent.Comp.Attached); + } + } + private void OnRemoveAttachableActions(Entity ent, ref RemoveAttachableActionsEvent args) + { + if (ent.Comp.Action is not { } action) + return; + _actionsSystem.RemoveProvidedAction(args.User, ent, action); + } + private void OnGotEquippedHand(Entity ent, ref GotEquippedHandEvent args) + { + if (ent.Comp.Action == null) + return; + var ev = new GrantAttachableActionsEvent(args.User); + RaiseLocalEvent(ent.Owner, ref ev); + } + private void OnGotUnequippedHand(Entity ent, ref GotUnequippedHandEvent args) + { + if (ent.Comp.Action is not { } action) + return; + _actionsSystem.RemoveProvidedAction(args.User, ent, action); + } + private void OnAttachableToggleAction(Entity attachable, + ref AttachableToggleActionEvent args) + { + args.Handled = true; + if (!attachable.Comp.Attached) + return; + if (!TryComp(attachable.Owner, out TransformComponent? transformComponent) || + !transformComponent.ParentUid.Valid || + !TryComp(transformComponent.ParentUid, out AttachableHolderComponent? holderComponent) || + !_attachableHolderSystem.TryGetSlotId(transformComponent.ParentUid, attachable.Owner, out var slotId)) + { + return; + } + var ev = new AttachableToggleStartedEvent((transformComponent.ParentUid, holderComponent), + args.Performer, + slotId); + RaiseLocalEvent(attachable.Owner, ref ev); + } + private void OnToggleAction(Entity attachable, ref ToggleActionEvent args) + { + if (attachable.Comp.AttachedOnly && !attachable.Comp.Attached) + args.Handled = true; + } + private void OnAttachableAltered(Entity attachable, + ref AttachableAlteredEvent args) + { + if (args.User == null) + return; + + // DS14-start + if (TryComp(attachable.Owner, out HandheldLightComponent? light)) + { + switch (args.Alteration) + { + case AttachableAlteredType.Activated: + _handheldLightSystem.TurnOn(args.User.Value, (attachable.Owner, light)); + break; + case AttachableAlteredType.Deactivated: + case AttachableAlteredType.DetachedDeactivated: + _handheldLightSystem.TurnOff((attachable.Owner, light)); + break; + } + + return; + } + // DS14-end + + switch (args.Alteration) + { + case AttachableAlteredType.Activated: + RaiseLocalEvent(attachable.Owner, new ActivateInWorldEvent(args.User.Value, args.Holder, true)); + break; + case AttachableAlteredType.Deactivated: + RaiseLocalEvent(attachable.Owner, new ActivateInWorldEvent(args.User.Value, args.Holder, true)); + break; + case AttachableAlteredType.DetachedDeactivated: + RaiseLocalEvent(attachable.Owner, new ActivateInWorldEvent(args.User.Value, args.Holder, true)); + break; + } + } +} diff --git a/Content.Shared/_CM14/Attachable/AttachableUI.cs b/Content.Shared/_CM14/Attachable/AttachableUI.cs new file mode 100644 index 0000000000000..3930a31138131 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableUI.cs @@ -0,0 +1,56 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization; +namespace Content.Shared._CM14.Attachable; +[Serializable, NetSerializable] +public sealed class AttachableHolderStripUserInterfaceState(Dictionary attachableSlots) + : BoundUserInterfaceState +{ + public Dictionary AttachableSlots = attachableSlots; +} +[Serializable, NetSerializable] +public sealed class AttachableHolderChooseSlotUserInterfaceState(List attachableSlots) : BoundUserInterfaceState +{ + public List AttachableSlots = attachableSlots; +} +[Serializable, NetSerializable] +public sealed class AttachableHolderDetachMessage(string slot) : BoundUserInterfaceMessage +{ + public readonly string Slot = slot; +} +[Serializable, NetSerializable] +public sealed class AttachableHolderAttachToSlotMessage(string slot) : BoundUserInterfaceMessage +{ + public readonly string Slot = slot; +} +[Serializable, NetSerializable, DataDefinition] +public sealed partial class AttachableWeaponMeleeModifierSet; +[Serializable, NetSerializable, DataDefinition] +public sealed partial class AttachableWeaponRangedModifierSet +{ + [DataField] + public int ShotsPerBurst; + [DataField] + public FixedPoint2 DamageFlat = FixedPoint2.Zero; + [DataField] + public float RecoilFlat; + [DataField] + public double AngleIncrease = 1.0; + [DataField] + public double AngleDecay = 1.0; + [DataField] + public double MaxAngle = 1.0; + [DataField] + public double MinAngle = 1.0; + [DataField] + public float FireRate = 1.0f; + [DataField] + public float ProjectileSpeedFlat = 0; + [DataField] + public float ProjectileSpeedMultiplier = 1.0f; +} +[Serializable, NetSerializable] +public enum AttachmentUI : byte +{ + StripKey, + ChooseSlotKey, +} diff --git a/Content.Shared/_CM14/Attachable/AttachableWeaponRangedModsSystem.cs b/Content.Shared/_CM14/Attachable/AttachableWeaponRangedModsSystem.cs new file mode 100644 index 0000000000000..02b194c5c6f22 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/AttachableWeaponRangedModsSystem.cs @@ -0,0 +1,109 @@ +using Content.Shared._CM14.Attachable.Components; +using Content.Shared._CM14.Attachable.Events; +using Content.Shared._CM14.Weapons.Ranged; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Weapons.Ranged.Systems; +using Content.Shared.Wieldable.Components; +namespace Content.Shared._CM14.Attachable; +public sealed class AttachableWeaponRangedModsSystem : EntitySystem +{ + [Dependency] private readonly CMGunSystem _cmGunSystem = default!; + // DS14-start + [Dependency] private readonly SharedGunSystem _gunSystem = default!; + // DS14-end + public override void Initialize() + { + // DS14-start + SubscribeLocalEvent>(OnRangedModsRefreshModifiers); + SubscribeLocalEvent(OnRangedModsAltered); + SubscribeLocalEvent>(OnRangedModsGetGunDamage); + SubscribeLocalEvent>(OnWieldedRangedModsRefreshModifiers); + SubscribeLocalEvent(OnWieldedRangedModsAttachableAltered); + SubscribeLocalEvent>(OnWieldedRangedModsGetGunDamage); + SubscribeLocalEvent(OnWeaponModifiersAltered); + SubscribeLocalEvent>(OnToggleableRangedModsRefreshModifiers); + SubscribeLocalEvent>(OnToggleableRangedModsGetGunDamage); + // DS14-end + } + // DS14-start + private void OnRangedModsRefreshModifiers(Entity ent, ref AttachableRelayedEvent args) + { + ApplyModifiers(ent.Comp.Modifiers, ref args.Args); + } + private void OnRangedModsAltered(Entity attachable, + ref AttachableAlteredEvent args) + { + _cmGunSystem.RefreshGunDamageMultiplier(args.Holder); + _gunSystem.RefreshModifiers(args.Holder); + } + private void OnRangedModsGetGunDamage(Entity ent, ref AttachableRelayedEvent args) + { + args.Args.Multiplier += ent.Comp.Modifiers.DamageFlat; + } + private void OnWieldedRangedModsRefreshModifiers(Entity ent, ref AttachableRelayedEvent args) + { + var set = TryComp(args.Holder, out WieldableComponent? wieldable) && wieldable.Wielded + ? ent.Comp.Wielded + : ent.Comp.Unwielded; + ApplyModifiers(set, ref args.Args); + } + private void OnWieldedRangedModsAttachableAltered(Entity ent, ref AttachableAlteredEvent args) + { + _cmGunSystem.RefreshGunDamageMultiplier(args.Holder); + _gunSystem.RefreshModifiers(args.Holder); + } + private void OnWieldedRangedModsGetGunDamage(Entity ent, ref AttachableRelayedEvent args) + { + var set = TryComp(args.Holder, out WieldableComponent? wieldable) && wieldable.Wielded + ? ent.Comp.Wielded + : ent.Comp.Unwielded; + args.Args.Multiplier += set.DamageFlat; + } + private void OnWeaponModifiersAltered(Entity attachable, ref AttachableAlteredEvent args) + { + _cmGunSystem.RefreshGunDamageMultiplier(args.Holder); + _gunSystem.RefreshModifiers(args.Holder); + } + + private void OnToggleableRangedModsRefreshModifiers(Entity ent, + ref AttachableRelayedEvent args) + { + var set = GetToggleableModifiers(ent, args.Holder); + ApplyModifiers(set, ref args.Args); + } + + private void OnToggleableRangedModsGetGunDamage(Entity ent, + ref AttachableRelayedEvent args) + { + args.Args.Multiplier += GetToggleableModifiers(ent, args.Holder).DamageFlat; + } + + private AttachableWeaponRangedModifierSet GetToggleableModifiers( + Entity ent, + EntityUid holder) + { + var active = TryComp(ent, out AttachableToggleableComponent? toggleable) && toggleable.Active; + var wielded = TryComp(holder, out WieldableComponent? wieldable) && wieldable.Wielded; + + return (active, wielded) switch + { + (true, true) => ent.Comp.ActiveWielded, + (true, false) => ent.Comp.ActiveUnwielded, + (false, true) => ent.Comp.InactiveWielded, + _ => ent.Comp.InactiveUnwielded, + }; + } + + private static void ApplyModifiers(AttachableWeaponRangedModifierSet set, ref GunRefreshModifiersEvent args) + { + args.ShotsPerBurst = Math.Max(args.ShotsPerBurst + set.ShotsPerBurst, 1); + args.CameraRecoilScalar = Math.Max(args.CameraRecoilScalar + set.RecoilFlat, 0); + args.AngleIncrease = new Angle(Math.Max(args.AngleIncrease.Theta * set.AngleIncrease, 0.0)); + args.AngleDecay = new Angle(Math.Max(args.AngleDecay.Theta * set.AngleDecay, 0.0)); + args.MinAngle = new Angle(Math.Max(args.MinAngle.Theta * set.MinAngle, 0.0)); + args.MaxAngle = new Angle(Math.Max(args.MaxAngle.Theta * set.MaxAngle, args.MinAngle.Theta)); + args.FireRate = Math.Max(args.FireRate * set.FireRate, 0); + args.ProjectileSpeed = Math.Max((args.ProjectileSpeed + set.ProjectileSpeedFlat) * set.ProjectileSpeedMultiplier, 0); + } + // DS14-end +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableComponent.cs new file mode 100644 index 0000000000000..cebb07da3cf1a --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableHolderSystem))] +public sealed partial class AttachableComponent : Component +{ + [DataField, AutoNetworkedField] + public float AttachDoAfter = 1.5f; + [DataField, AutoNetworkedField] + public SoundSpecifier? AttachSound = new SoundPathSpecifier("/Audio/_CM14/Attachable/attachment_add.ogg"); + [DataField, AutoNetworkedField] + public SoundSpecifier? DetachSound = new SoundPathSpecifier("/Audio/_CM14/Attachable/attachment_remove.ogg"); +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableHolderComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableHolderComponent.cs new file mode 100644 index 0000000000000..abf20b009a9ef --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableHolderComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Whitelist; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableHolderSystem))] +public sealed partial class AttachableHolderComponent : Component +{ + [DataField, AutoNetworkedField] + public EntityUid? SupercedingAttachable; + /// + /// The key is one of the slot IDs at the bottom of this file. + /// Each key is followed by a listing of all the attachables that fit into that slot. + /// + [DataField, AutoNetworkedField] + public Dictionary Slots = new(); +} +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Slot IDs should be named as follows: cm-aslot-SLOTNAME, for example: cm-aslot-barrel. * + * Each slot ID must have a name attached to it in \Resources\Locale\en-US\_CM14\attachable\attachable.ftl * + * The slot list is below. If you add more, list them here so others can use the comment for reference. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * GUN SLOTS: + * cm-aslot-barrel + * cm-aslot-rail + * cm-aslot-stock + * cm-aslot-underbarrel + */ diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableIFFComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableIFFComponent.cs new file mode 100644 index 0000000000000..edba646ccb2ae --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableIFFComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent] +[Access(typeof(AttachableIFFSystem))] +public sealed partial class AttachableIFFComponent : Component; diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableSilencerComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableSilencerComponent.cs new file mode 100644 index 0000000000000..4caa055ea01f5 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableSilencerComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableSilencerSystem))] +public sealed partial class AttachableSilencerComponent : Component +{ + [DataField, AutoNetworkedField] + public SoundSpecifier Sound = new SoundCollectionSpecifier("CMSilencedShoot"); +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableSizeModifierComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableSizeModifierComponent.cs new file mode 100644 index 0000000000000..f8f7420b549c2 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableSizeModifierComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableSizeModifierSystem))] +public sealed partial class AttachableSizeModifierComponent : Component +{ + [DataField(required: true), AutoNetworkedField] + public int SizeModifier = 0; + public int ResetIncrement = 0; +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableToggleableComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableComponent.cs new file mode 100644 index 0000000000000..7d227d7500145 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Utility; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableToggleableSystem))] +public sealed partial class AttachableToggleableComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Active = false; + [DataField, AutoNetworkedField] + public float DoAfter; + [DataField, AutoNetworkedField] + public bool NeedHand = true; + [DataField, AutoNetworkedField] + public bool BreakOnMove = true; + [DataField, AutoNetworkedField] + public bool SupercedeHolder = false; + [DataField, AutoNetworkedField] + public bool AttachedOnly = false; + [DataField, AutoNetworkedField] + public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/_CM14/Attachable/attachment_activate.ogg"); + [DataField, AutoNetworkedField] + public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/_CM14/Attachable/attachment_deactivate.ogg"); + [DataField, AutoNetworkedField] + public EntityUid? Action; + [DataField, AutoNetworkedField] + public string ActionId = "CMActionToggleAttachable"; + [DataField, AutoNetworkedField] + public string ActionName = "Toggle Attachable"; + [DataField, AutoNetworkedField] + public string ActionDesc = "Toggle an attachable. If you're seeing this, someone forgot to set the description properly."; + [DataField, AutoNetworkedField] + public SpriteSpecifier Icon = new SpriteSpecifier.Rsi(new ResPath("_CM14/Objects/Weapons/Guns/Attachments/rail.rsi"), "flashlight"); + [DataField, AutoNetworkedField] + public SpriteSpecifier? IconActive; + [DataField, AutoNetworkedField] + public bool Attached = false; +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSimpleActivateComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSimpleActivateComponent.cs new file mode 100644 index 0000000000000..fde827d10c509 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSimpleActivateComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent] +[Access(typeof(AttachableToggleableSystem))] +public sealed partial class AttachableToggleableSimpleActivateComponent : Component; diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSizeModifierComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSizeModifierComponent.cs new file mode 100644 index 0000000000000..bc1e4756e60c5 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableToggleableSizeModifierComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableSizeModifierSystem))] +public sealed partial class AttachableToggleableSizeModifierComponent : Component +{ + [DataField, AutoNetworkedField] + public int ActiveSizeModifier = 0; + [DataField, AutoNetworkedField] + public int InactiveSizeModifier = 0; + public int ResetIncrement = 0; +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsComponent.cs new file mode 100644 index 0000000000000..4b0fcdd67f1d6 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableWeaponRangedModsSystem))] +public sealed partial class AttachableWeaponRangedModsComponent : Component +{ + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet Modifiers = new(); +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsToggleableComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsToggleableComponent.cs new file mode 100644 index 0000000000000..c9eeaa30d7717 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponRangedModsToggleableComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableWeaponRangedModsSystem))] +public sealed partial class AttachableWeaponRangedModsToggleableComponent : Component +{ + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet InactiveUnwielded = new(); + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet InactiveWielded = new(); + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet ActiveUnwielded = new(); + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet ActiveWielded = new(); +} diff --git a/Content.Shared/_CM14/Attachable/Components/AttachableWeaponWieldedRangedModsComponent.cs b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponWieldedRangedModsComponent.cs new file mode 100644 index 0000000000000..30b730eac46a8 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/AttachableWeaponWieldedRangedModsComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(AttachableWeaponRangedModsSystem))] +public sealed partial class AttachableWeaponWieldedRangedModsComponent : Component +{ + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet Unwielded = new(); + [DataField, AutoNetworkedField] + public AttachableWeaponRangedModifierSet Wielded = new(); +} diff --git a/Content.Shared/_CM14/Attachable/Components/GunAttachableIFFComponent.cs b/Content.Shared/_CM14/Attachable/Components/GunAttachableIFFComponent.cs new file mode 100644 index 0000000000000..97a3a8301fae3 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Components/GunAttachableIFFComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Attachable.Components; +[RegisterComponent, NetworkedComponent] +[Access(typeof(AttachableIFFSystem))] +public sealed partial class GunAttachableIFFComponent : Component; diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableAlteredEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableAlteredEvent.cs new file mode 100644 index 0000000000000..ab4dc314a1336 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableAlteredEvent.cs @@ -0,0 +1,17 @@ +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public readonly record struct AttachableAlteredEvent( + EntityUid Holder, + AttachableAlteredType Alteration, + EntityUid? User = null +); +public enum AttachableAlteredType : byte +{ + Attached = 1 << 0, + Detached = 1 << 1, + Wielded = 1 << 2, + Unwielded = 1 << 3, + Activated = 1 << 4, + Deactivated = 1 << 5, + DetachedDeactivated = Detached | Deactivated, +} diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableAttachDoAfterEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableAttachDoAfterEvent.cs new file mode 100644 index 0000000000000..e602720ff39e0 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableAttachDoAfterEvent.cs @@ -0,0 +1,12 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; +namespace Content.Shared._CM14.Attachable.Events; +[Serializable, NetSerializable] +public sealed partial class AttachableAttachDoAfterEvent : SimpleDoAfterEvent +{ + public readonly string SlotId; + public AttachableAttachDoAfterEvent(string slotId) + { + SlotId = slotId; + } +} diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableDetachDoAfterEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableDetachDoAfterEvent.cs new file mode 100644 index 0000000000000..45bb09e4a995c --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableDetachDoAfterEvent.cs @@ -0,0 +1,5 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; +namespace Content.Shared._CM14.Attachable.Events; +[Serializable, NetSerializable] +public sealed partial class AttachableDetachDoAfterEvent : SimpleDoAfterEvent; diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableGrantIFFEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableGrantIFFEvent.cs new file mode 100644 index 0000000000000..3d58d2bcf9dea --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableGrantIFFEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public record struct AttachableGrantIFFEvent(bool Grants); diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableHolderAttachablesAlteredEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableHolderAttachablesAlteredEvent.cs new file mode 100644 index 0000000000000..e977e2c20d115 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableHolderAttachablesAlteredEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public readonly record struct AttachableHolderAttachablesAlteredEvent( + EntityUid Attachable, + string SlotId, + AttachableAlteredType Alteration +); diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableRelayedEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableRelayedEvent.cs new file mode 100644 index 0000000000000..4d76aa7e98ac7 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableRelayedEvent.cs @@ -0,0 +1,19 @@ +namespace Content.Shared._CM14.Attachable.Events; + +/// +/// Wraps an event relayed from a holder so attachment changes can be copied +/// back to the original by-ref event. +/// +// DS14-start +public sealed class AttachableRelayedEvent : EntityEventArgs +{ + public TEvent Args; + public EntityUid Holder; + + public AttachableRelayedEvent(TEvent args, EntityUid holder) + { + Args = args; + Holder = holder; + } +} +// DS14-end diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableToggleDoAfterEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableToggleDoAfterEvent.cs new file mode 100644 index 0000000000000..ceea620933eb0 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableToggleDoAfterEvent.cs @@ -0,0 +1,12 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; +namespace Content.Shared._CM14.Attachable.Events; +[Serializable, NetSerializable] +public sealed partial class AttachableToggleDoAfterEvent : SimpleDoAfterEvent +{ + public readonly string SlotId; + public AttachableToggleDoAfterEvent(string slotId) + { + SlotId = slotId; + } +} diff --git a/Content.Shared/_CM14/Attachable/Events/AttachableToggleStartedEvent.cs b/Content.Shared/_CM14/Attachable/Events/AttachableToggleStartedEvent.cs new file mode 100644 index 0000000000000..fdc41c590d3e4 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/AttachableToggleStartedEvent.cs @@ -0,0 +1,8 @@ +using Content.Shared._CM14.Attachable.Components; +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public readonly record struct AttachableToggleStartedEvent( + Entity Holder, + EntityUid User, + string SlotId +); diff --git a/Content.Shared/_CM14/Attachable/Events/GrantAttachableActionsEvent.cs b/Content.Shared/_CM14/Attachable/Events/GrantAttachableActionsEvent.cs new file mode 100644 index 0000000000000..8d38113e64eb3 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/GrantAttachableActionsEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public readonly record struct GrantAttachableActionsEvent(EntityUid User); diff --git a/Content.Shared/_CM14/Attachable/Events/RemoveAttachableActionsEvent.cs b/Content.Shared/_CM14/Attachable/Events/RemoveAttachableActionsEvent.cs new file mode 100644 index 0000000000000..233f5dae45ed9 --- /dev/null +++ b/Content.Shared/_CM14/Attachable/Events/RemoveAttachableActionsEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Shared._CM14.Attachable.Events; +[ByRefEvent] +public readonly record struct RemoveAttachableActionsEvent(EntityUid User); diff --git a/Content.Shared/_CM14/Input/CMKeyFunctions.cs b/Content.Shared/_CM14/Input/CMKeyFunctions.cs new file mode 100644 index 0000000000000..7c52f37ed7114 --- /dev/null +++ b/Content.Shared/_CM14/Input/CMKeyFunctions.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Input; +namespace Content.Shared._CM14.Input; +[KeyFunctions] +public static class CMKeyFunctions +{ + public static readonly BoundKeyFunction CMActivateAttachableBarrel = "CMActivateAttachableBarrel"; + public static readonly BoundKeyFunction CMActivateAttachableRail = "CMActivateAttachableRail"; + public static readonly BoundKeyFunction CMActivateAttachableStock = "CMActivateAttachableStock"; + public static readonly BoundKeyFunction CMActivateAttachableUnderbarrel = "CMActivateAttachableUnderbarrel"; + public static readonly BoundKeyFunction CMUniqueAction = "CMUniqueAction"; + public static readonly BoundKeyFunction CMHolsterPrimary = "CMHolsterPrimary"; + public static readonly BoundKeyFunction CMHolsterSecondary = "CMHolsterSecondary"; +} diff --git a/Content.Shared/_CM14/Scoping/GunScopingComponent.cs b/Content.Shared/_CM14/Scoping/GunScopingComponent.cs new file mode 100644 index 0000000000000..39abd3a576d15 --- /dev/null +++ b/Content.Shared/_CM14/Scoping/GunScopingComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Scoping; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedScopeSystem))] +public sealed partial class GunScopingComponent : Component +{ + [DataField, AutoNetworkedField] + public EntityUid? Scope; +} \ No newline at end of file diff --git a/Content.Shared/_CM14/Scoping/ScopeComponent.cs b/Content.Shared/_CM14/Scoping/ScopeComponent.cs new file mode 100644 index 0000000000000..4e184b0853152 --- /dev/null +++ b/Content.Shared/_CM14/Scoping/ScopeComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +namespace Content.Shared._CM14.Scoping; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedScopeSystem))] +public sealed partial class ScopeComponent : Component +{ + [DataField, AutoNetworkedField] + public float Zoom = 1f; + [DataField, AutoNetworkedField] + public float Offset = 15; + [DataField, AutoNetworkedField] + public EntProtoId ScopingToggleAction = "CMActionToggleScope"; + [DataField, AutoNetworkedField] + public EntityUid? RelayEntity; + [DataField, AutoNetworkedField] + public bool Attachment; + [DataField, AutoNetworkedField] + public bool RequireWielding; + [DataField, AutoNetworkedField] + public EntityUid? ScopingToggleActionEntity; + [DataField, AutoNetworkedField] + public EntityUid? User; + [DataField, AutoNetworkedField] + public Direction? ScopingDirection; +} \ No newline at end of file diff --git a/Content.Shared/_CM14/Scoping/ScopeDoAfterEvent.cs b/Content.Shared/_CM14/Scoping/ScopeDoAfterEvent.cs new file mode 100644 index 0000000000000..a33953e50352f --- /dev/null +++ b/Content.Shared/_CM14/Scoping/ScopeDoAfterEvent.cs @@ -0,0 +1,5 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; +namespace Content.Shared._CM14.Scoping; +[Serializable, NetSerializable] +public sealed partial class ScopeDoAfterEvent : SimpleDoAfterEvent; \ No newline at end of file diff --git a/Content.Shared/_CM14/Scoping/ScopingComponent.cs b/Content.Shared/_CM14/Scoping/ScopingComponent.cs new file mode 100644 index 0000000000000..dd1f1e9cc63e4 --- /dev/null +++ b/Content.Shared/_CM14/Scoping/ScopingComponent.cs @@ -0,0 +1,11 @@ +using System.Numerics; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Scoping; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ScopingComponent : Component +{ + [DataField, AutoNetworkedField] + public EntityUid? Scope; + [DataField, AutoNetworkedField] + public Vector2 EyeOffset; +} \ No newline at end of file diff --git a/Content.Shared/_CM14/Scoping/SharedScopeSystem.User.cs b/Content.Shared/_CM14/Scoping/SharedScopeSystem.User.cs new file mode 100644 index 0000000000000..e24a540056d8e --- /dev/null +++ b/Content.Shared/_CM14/Scoping/SharedScopeSystem.User.cs @@ -0,0 +1,4 @@ +namespace Content.Shared._CM14.Scoping; +public abstract partial class SharedScopeSystem : EntitySystem +{ +} \ No newline at end of file diff --git a/Content.Shared/_CM14/Scoping/SharedScopeSystem.cs b/Content.Shared/_CM14/Scoping/SharedScopeSystem.cs new file mode 100644 index 0000000000000..5a66a9df8fba5 --- /dev/null +++ b/Content.Shared/_CM14/Scoping/SharedScopeSystem.cs @@ -0,0 +1,112 @@ +using System.Numerics; +using Content.Shared._CM14.Scoping; +using Content.Shared.Actions; +using Robust.Shared.Containers; +using Content.Shared.DoAfter; +using Content.Shared.Eye; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Movement.Systems; +using Content.Shared.Popups; +using Content.Shared.Toggleable; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Content.Shared.Wieldable; +using Content.Shared.Wieldable.Components; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Map; +namespace Content.Shared._CM14.Scoping; +public abstract partial class SharedScopeSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedEyeSystem _contentEye = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + private const float SmallestViewpointSize = 15; + public override void Initialize() + { + InitializeUser(); + SubscribeLocalEvent(OnToggleAction); + SubscribeLocalEvent(OnGunShot); + SubscribeLocalEvent(OnScopeDoAfter); + SubscribeLocalEvent(OnGunUnequip); + SubscribeLocalEvent(OnGunDeselectHand); + SubscribeLocalEvent(OnGunUnwielded); + SubscribeLocalEvent(OnGunGunShot); + } + protected virtual void InitializeUser() { } + private void OnToggleAction(Entity scope, ref ToggleActionEvent args) + { + ToggleScoping(scope, args.Performer); + } + private void OnGunShot(Entity scope, ref GunShotEvent args) + { + if (scope.Comp.User is { } user) + Unscope(scope); + } + private void OnScopeDoAfter(Entity scope, ref ScopeDoAfterEvent args) + { + } + private void OnGunUnequip(Entity ent, ref GotUnequippedHandEvent args) + { + UnscopeGun(ent); + } + private void OnGunDeselectHand(Entity ent, ref HandDeselectedEvent args) + { + UnscopeGun(ent); + } + private void OnGunUnwielded(Entity ent, ref ItemUnwieldedEvent args) + { + UnscopeGun(ent); + } + private void OnGunGunShot(Entity ent, ref GunShotEvent args) + { + UnscopeGun(ent); + } + private void UnscopeGun(Entity gun) + { + if (TryComp(gun.Comp.Scope, out ScopeComponent? scope)) + Unscope((gun.Comp.Scope.Value, scope)); + } + private void ToggleScoping(Entity scope, EntityUid user) + { + if (HasComp(user)) + Unscope(scope); + else + StartScoping(scope, user); + } + protected virtual void StartScoping(Entity scope, EntityUid user) + { + } + protected virtual void Unscope(Entity scope) + { + } + protected Vector2 GetScopeOffset(Entity scope, Direction direction) + { + return direction.ToVec() * ((scope.Comp.Offset * scope.Comp.Zoom - 1) / 2); + } + protected virtual void DeleteRelay(Entity scope, EntityUid? user) + { + } + private bool TryGetActiveEntity(Entity scope, out EntityUid active) + { + if (!scope.Comp.Attachment) + { + active = scope; + return true; + } + if (!_container.TryGetContainingContainer((scope, null), out var container) || + !HasComp(container.Owner)) + { + active = default; + return false; + } + active = container.Owner; + return true; + } +} \ No newline at end of file diff --git a/Content.Shared/_CM14/Weapons/Common/UniqueActionComponent.cs b/Content.Shared/_CM14/Weapons/Common/UniqueActionComponent.cs new file mode 100644 index 0000000000000..d4ec9fb7303d1 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Common/UniqueActionComponent.cs @@ -0,0 +1,5 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Common; +[RegisterComponent, NetworkedComponent] +[Access(typeof(UniqueActionSystem))] +public sealed partial class UniqueActionComponent : Component; diff --git a/Content.Shared/_CM14/Weapons/Common/UniqueActionEvent.cs b/Content.Shared/_CM14/Weapons/Common/UniqueActionEvent.cs new file mode 100644 index 0000000000000..bbf2dfd90df52 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Common/UniqueActionEvent.cs @@ -0,0 +1,5 @@ +namespace Content.Shared._CM14.Weapons.Common; +public sealed class UniqueActionEvent(EntityUid userUid) : HandledEntityEventArgs +{ + public readonly EntityUid UserUid = userUid; +} diff --git a/Content.Shared/_CM14/Weapons/Common/UniqueActionSystem.cs b/Content.Shared/_CM14/Weapons/Common/UniqueActionSystem.cs new file mode 100644 index 0000000000000..c9731eac5dcc6 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Common/UniqueActionSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared._CM14.Input; +using Content.Shared.ActionBlocker; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Verbs; +using Robust.Shared.Input.Binding; +namespace Content.Shared._CM14.Weapons.Common; +public sealed class UniqueActionSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + public override void Initialize() + { + SubscribeLocalEvent>(OnGetVerbs); + CommandBinds.Builder + .Bind(CMKeyFunctions.CMUniqueAction, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } userUid) + TryUniqueAction(userUid); + }, + handle: false)) + .Register(); + } + public override void Shutdown() + { + CommandBinds.Unregister(); + } + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + if (!_actionBlockerSystem.CanInteract(args.User, args.Target)) + return; + var user = args.User; + args.Verbs.Add(new InteractionVerb + { + Act = () => TryUniqueAction(user, ent.Owner), + Text = "Unique action", + }); + } + private void TryUniqueAction(EntityUid userUid) + { + var activeItem = _hands.GetActiveItem(userUid); + if (activeItem == null || + !_entityManager.TryGetComponent(activeItem.Value, out UniqueActionComponent? uniqueActionComponent)) + return; + if (!uniqueActionComponent.Running) + return; + TryUniqueAction(userUid, activeItem.Value); + } + private void TryUniqueAction(EntityUid userUid, EntityUid targetUid) + { + if (!_actionBlockerSystem.CanInteract(userUid, targetUid)) + return; + RaiseLocalEvent(targetUid, new UniqueActionEvent(userUid)); + } +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/CMGunSystem.cs b/Content.Shared/_CM14/Weapons/Ranged/CMGunSystem.cs new file mode 100644 index 0000000000000..b0f776dbfb1e5 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/CMGunSystem.cs @@ -0,0 +1,53 @@ +using Content.Shared._CM14.Weapons.Ranged; +using Content.Shared.FixedPoint; +using Content.Shared.Projectiles; +using Content.Shared.Weapons.Ranged.Events; +using Robust.Shared.Timing; +namespace Content.Shared._CM14.Weapons.Ranged; +public sealed class CMGunSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + private EntityQuery _projectileQuery; + public override void Initialize() + { + base.Initialize(); + _projectileQuery = GetEntityQuery(); + // DS14-start + // DS14: The base multiplier seeds the relayed modifier event and must not modify itself again. + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnAmmoShot); + // DS14-end + } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + RefreshGunDamageMultiplier(ent.AsNullable()); + } + // DS14-start + private void OnAmmoShot(Entity ent, ref AmmoShotEvent args) + { + foreach (var projectile in args.FiredProjectiles) + { + if (!_projectileQuery.TryGetComponent(projectile, out var component)) + continue; + + component.Damage *= ent.Comp.ModifiedMultiplier; + Dirty(projectile, component); + } + } + // DS14-end + public void RefreshGunDamageMultiplier(Entity gun) + { + gun.Comp = EnsureComp(gun); + var ev = new GetGunDamageModifierEvent(gun.Comp.Multiplier); + RaiseLocalEvent(gun, ref ev); + gun.Comp.ModifiedMultiplier = ev.Multiplier; + } + public void RefreshGunDamageMultiplier(EntityUid gun) + { + RefreshGunDamageMultiplier((gun, null)); + } + public override void Update(float frameTime) + { + var time = _timing.CurTime; + } +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/GetGunDamageModifierEvent.cs b/Content.Shared/_CM14/Weapons/Ranged/GetGunDamageModifierEvent.cs new file mode 100644 index 0000000000000..fa53b1d69a5aa --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/GetGunDamageModifierEvent.cs @@ -0,0 +1,4 @@ +using Content.Shared.FixedPoint; +namespace Content.Shared._CM14.Weapons.Ranged; +[ByRefEvent] +public record struct GetGunDamageModifierEvent(FixedPoint2 Multiplier); diff --git a/Content.Shared/_CM14/Weapons/Ranged/GunDamageModifierComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/GunDamageModifierComponent.cs new file mode 100644 index 0000000000000..ae840ada01bc6 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/GunDamageModifierComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GunDamageModifierComponent : Component +{ + [DataField, AutoNetworkedField] + public FixedPoint2 Multiplier = 1.0; + [DataField, AutoNetworkedField] + public FixedPoint2 ModifiedMultiplier = 1.0; +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/GetIFFFactionEvent.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/GetIFFFactionEvent.cs new file mode 100644 index 0000000000000..aba3e29e81077 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/GetIFFFactionEvent.cs @@ -0,0 +1,6 @@ +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +[ByRefEvent] +public record struct GetIFFFactionEvent +{ + public string? Faction; +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFComponent.cs new file mode 100644 index 0000000000000..f897d909b96f4 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFComponent.cs @@ -0,0 +1,4 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +[RegisterComponent, NetworkedComponent] +public sealed partial class GunIFFComponent : Component; diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFSystem.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFSystem.cs new file mode 100644 index 0000000000000..aaa1599c57533 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/GunIFFSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared._CM14.Weapons.Ranged.IFF; +using Content.Shared.Weapons.Ranged.Events; +using Robust.Shared.Containers; +using Robust.Shared.Physics.Events; +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +public sealed class GunIFFSystem : EntitySystem +{ + [Dependency] private readonly SharedContainerSystem _container = default!; + private EntityQuery _userIFFQuery; + public override void Initialize() + { + base.Initialize(); + _userIFFQuery = GetEntityQuery(); + SubscribeLocalEvent(OnGunIFFAmmoShot); + SubscribeLocalEvent(OnProjectileIFFPreventCollide); + } + private void OnGunIFFAmmoShot(Entity ent, ref AmmoShotEvent args) + { + GiveAmmoIFF(ent, ref args); + } + private void OnProjectileIFFPreventCollide(Entity ent, ref PreventCollideEvent args) + { + if (ent.Comp.Faction is not { } faction) + return; + if (!TryComp(args.OtherEntity, out IFFFactionComponent? other)) + return; + if (other.Faction != faction) + return; + args.Cancelled = true; + } + public void GiveAmmoIFF(EntityUid gun, ref AmmoShotEvent args) + { + if (!_container.TryGetContainingContainer((gun, null), out var container) || + !_userIFFQuery.HasComp(container.Owner)) + { + return; + } + var ev = new GetIFFFactionEvent(); + RaiseLocalEvent(container.Owner, ref ev); + if (ev.Faction is not { } id) + return; + foreach (var projectile in args.FiredProjectiles) + { + var iff = EnsureComp(projectile); + iff.Faction = id; + Dirty(projectile, iff); + } + } +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/IFFFactionComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/IFFFactionComponent.cs new file mode 100644 index 0000000000000..fa33e47debec2 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/IFFFactionComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class IFFFactionComponent : Component +{ + [DataField, AutoNetworkedField] + public string? Faction; +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/ProjectileIFFComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/ProjectileIFFComponent.cs new file mode 100644 index 0000000000000..7da05fd46eaa6 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/ProjectileIFFComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ProjectileIFFComponent : Component +{ + [DataField, AutoNetworkedField] + public string? Faction; +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/IFF/UserIFFComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/IFF/UserIFFComponent.cs new file mode 100644 index 0000000000000..33aeba75fedf6 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/IFF/UserIFFComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged.IFF; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class UserIFFComponent : Component +{ + [DataField, AutoNetworkedField] + public string? Faction; +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/PumpActionComponent.cs b/Content.Shared/_CM14/Weapons/Ranged/PumpActionComponent.cs new file mode 100644 index 0000000000000..72d5d23a71449 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/PumpActionComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +namespace Content.Shared._CM14.Weapons.Ranged; +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class PumpActionComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Pumped = false; + [DataField, AutoNetworkedField] + public SoundSpecifier? Sound = new SoundPathSpecifier("/Audio/Weapons/Guns/Misc/slap.ogg"); +} diff --git a/Content.Shared/_CM14/Weapons/Ranged/SharedPumpActionSystem.cs b/Content.Shared/_CM14/Weapons/Ranged/SharedPumpActionSystem.cs new file mode 100644 index 0000000000000..d940068056c14 --- /dev/null +++ b/Content.Shared/_CM14/Weapons/Ranged/SharedPumpActionSystem.cs @@ -0,0 +1,122 @@ +using Content.Shared._CM14.Input; +using Content.Shared._CM14.Weapons.Common; +using Content.Shared.ActionBlocker; +using Content.Shared.Examine; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Popups; +using Content.Shared.Verbs; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Input.Binding; + +namespace Content.Shared._CM14.Weapons.Ranged; + +public abstract class SharedPumpActionSystem : EntitySystem +{ + [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnExamined, before: [typeof(SharedGunSystem)]); + SubscribeLocalEvent>(OnGetVerbs); + SubscribeLocalEvent(OnAttemptShoot); + SubscribeLocalEvent(OnGunShot); + SubscribeLocalEvent(OnUniqueAction); + CommandBinds.Builder + .Bind(CMKeyFunctions.CMUniqueAction, + InputCmdHandler.FromDelegate(session => + { + if (session?.AttachedEntity is { } entity) + TryPump(entity); + }, handle: false)) + .Register(); + } + public override void Shutdown() + { + CommandBinds.Unregister(); + } + + protected virtual void OnExamined(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("cm-gun-pump-examine"), 1); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + var user = args.User; + if (!_actionBlocker.CanInteract(user, args.Target)) + return; + args.Verbs.Add(new InteractionVerb + { + Act = () => TryPump(user, ent), + Text = "Pump" + }); + } + protected virtual void OnAttemptShoot(Entity ent, ref AttemptShootEvent args) + { + if (!ent.Comp.Running || ent.Comp.Pumped) + args.Cancelled = true; + } + + private void OnGunShot(Entity ent, ref GunShotEvent args) + { + var activeItem = _hands.GetActiveItem(args.User); + if (activeItem != null && + TryComp(activeItem.Value, out PumpActionComponent? pump)) + { + var ammo = new GetAmmoCountEvent(); + RaiseLocalEvent(activeItem.Value, ref ammo); + if (ammo.Count <= 0) + { + _popup.PopupClient(Loc.GetString("cm-gun-no-ammo-message"), args.User, args.User); + return; + } + } + + TryPump(args.User, (ent.Owner, ent.Comp)); + } + + private void OnUniqueAction(Entity ent, ref UniqueActionEvent args) + { + var activeItem = _hands.GetActiveItem(args.UserUid); + if (activeItem != null && + TryComp(activeItem.Value, out PumpActionComponent? pump)) + { + var ammo = new GetAmmoCountEvent(); + RaiseLocalEvent(activeItem.Value, ref ammo); + if (ammo.Count <= 0) + { + _popup.PopupClient(Loc.GetString("cm-gun-no-ammo-message"), args.UserUid, args.UserUid); + return; + } + TryPump(args.UserUid, (activeItem.Value, pump)); + } + } + + private void TryPump(EntityUid user) + { + var activeItem = _hands.GetActiveItem(user); + if (activeItem != null && + TryComp(activeItem.Value, out PumpActionComponent? pump)) + { + TryPump(user, (activeItem.Value, pump)); + } + } + + private void TryPump(EntityUid user, Entity ent) + { + if (!ent.Comp.Running || ent.Comp.Pumped) + return; + + ent.Comp.Pumped = true; + Dirty(ent); + + _audio.PlayPredicted(ent.Comp.Sound, ent, user); + } +} diff --git a/Resources/Audio/_CM14/Attachable/attachment_activate.ogg b/Resources/Audio/_CM14/Attachable/attachment_activate.ogg new file mode 100644 index 0000000000000..3b7d1ff2abab7 Binary files /dev/null and b/Resources/Audio/_CM14/Attachable/attachment_activate.ogg differ diff --git a/Resources/Audio/_CM14/Attachable/attachment_add.ogg b/Resources/Audio/_CM14/Attachable/attachment_add.ogg new file mode 100644 index 0000000000000..75ce0fabe2217 Binary files /dev/null and b/Resources/Audio/_CM14/Attachable/attachment_add.ogg differ diff --git a/Resources/Audio/_CM14/Attachable/attachment_deactivate.ogg b/Resources/Audio/_CM14/Attachable/attachment_deactivate.ogg new file mode 100644 index 0000000000000..9047e9b845763 Binary files /dev/null and b/Resources/Audio/_CM14/Attachable/attachment_deactivate.ogg differ diff --git a/Resources/Audio/_CM14/Attachable/attachment_remove.ogg b/Resources/Audio/_CM14/Attachable/attachment_remove.ogg new file mode 100644 index 0000000000000..593cc6ab66661 Binary files /dev/null and b/Resources/Audio/_CM14/Attachable/attachment_remove.ogg differ diff --git a/Resources/Audio/_CM14/Attachable/gun_u7_activate.ogg b/Resources/Audio/_CM14/Attachable/gun_u7_activate.ogg new file mode 100644 index 0000000000000..ac1c8a85aa1a0 Binary files /dev/null and b/Resources/Audio/_CM14/Attachable/gun_u7_activate.ogg differ diff --git a/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_shotgun_u7.ogg b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_shotgun_u7.ogg new file mode 100644 index 0000000000000..4d1eea8361ce5 Binary files /dev/null and b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_shotgun_u7.ogg differ diff --git a/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot1.ogg b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot1.ogg new file mode 100644 index 0000000000000..a78d57f602e63 Binary files /dev/null and b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot1.ogg differ diff --git a/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot2.ogg b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot2.ogg new file mode 100644 index 0000000000000..a5e92e7c35f2d Binary files /dev/null and b/Resources/Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot2.ogg differ diff --git a/Resources/Audio/_CM14/Weapons/Guns/Reload/gun_sg_reload.ogg b/Resources/Audio/_CM14/Weapons/Guns/Reload/gun_sg_reload.ogg new file mode 100644 index 0000000000000..1027043df398d Binary files /dev/null and b/Resources/Audio/_CM14/Weapons/Guns/Reload/gun_sg_reload.ogg differ diff --git a/Resources/Locale/en-US/_CM14/actions/scoping.ftl b/Resources/Locale/en-US/_CM14/actions/scoping.ftl new file mode 100644 index 0000000000000..dfc28323a15e3 --- /dev/null +++ b/Resources/Locale/en-US/_CM14/actions/scoping.ftl @@ -0,0 +1,7 @@ +cm-action-popup-scoping-user = You move {THE($scope)} closer to your eyes. +cm-action-popup-scoping-stopping-user = You move {THE($scope)} away from your eyes. +cm-action-popup-scoping-user-must-hold = You must hold {$scope} in your active hand to see through it. +cm-action-popup-scoping-user-must-not-pulled = You can't use optics of {$scope} while being pulled! +cm-action-popup-scoping-user-must-not-contained = You can't use optics of {$scope} while being in a container! +cm-action-popup-scoping-user-must-wield = You must hold {THE($scope)} with two hands to use the scope. +cm-action-popup-scoping-must-attach = {CAPITALIZE(THE($scope))} must be attached to a gun in order to function! \ No newline at end of file diff --git a/Resources/Locale/en-US/_CM14/attachable/attachable.ftl b/Resources/Locale/en-US/_CM14/attachable/attachable.ftl new file mode 100644 index 0000000000000..a90b926615120 --- /dev/null +++ b/Resources/Locale/en-US/_CM14/attachable/attachable.ftl @@ -0,0 +1,10 @@ +cm-attachable-holder-strip-ui-title = strip attachables +cm-attachable-holder-strip-ui-empty-slot = nothing +cm-verb-strip-attachables = Strip Attachables +cm-aslot-barrel = Barrel +cm-aslot-rail = Rail +cm-aslot-stock = Stock +cm-aslot-underbarrel = Underbarrel + +cm-gun-pump-examine = [color=yellow]Pump action.[/color] +cm-gun-no-ammo-message = No ammo! \ No newline at end of file diff --git a/Resources/Locale/en-US/_CM14/escape-menu/options-menu.ftl b/Resources/Locale/en-US/_CM14/escape-menu/options-menu.ftl new file mode 100644 index 0000000000000..a34869cf0a8ca --- /dev/null +++ b/Resources/Locale/en-US/_CM14/escape-menu/options-menu.ftl @@ -0,0 +1,8 @@ +ui-options-header-cm = Colonial Marines 14 +ui-options-function-cm-activate-attachable-barrel = Activate barrel attachment +ui-options-function-cm-activate-attachable-rail = Activate rail attachment +ui-options-function-cm-activate-attachable-stock = Activate stock attachment +ui-options-function-cm-activate-attachable-underbarrel = Activate underbarrel attachment +ui-options-function-cm-unique-action = Unique action +ui-options-function-cm-holster-primary = Unholster +ui-options-function-cm-holster-secondary = Unholster secondary \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CM14/attachable/attachable.ftl b/Resources/Locale/ru-RU/_CM14/attachable/attachable.ftl new file mode 100644 index 0000000000000..de9b1628b0824 --- /dev/null +++ b/Resources/Locale/ru-RU/_CM14/attachable/attachable.ftl @@ -0,0 +1,11 @@ +cm-attachable-holder-strip-ui-title = отстёгивание креплений +cm-attachable-holder-strip-ui-empty-slot = пусто +cm-verb-strip-attachables = Отстегнуть крепления + +cm-aslot-barrel = Ствол +cm-aslot-rail = Планка +cm-aslot-stock = Приклад +cm-aslot-underbarrel = Подствольник + +cm-gun-pump-examine = [color=yellow]Помповый механизм.[/color] +cm-gun-no-ammo-message = Нет патронов! diff --git a/Resources/Prototypes/_CM14/Actions/Marines/marine_action_items.yml b/Resources/Prototypes/_CM14/Actions/Marines/marine_action_items.yml new file mode 100644 index 0000000000000..58a967cace6fb --- /dev/null +++ b/Resources/Prototypes/_CM14/Actions/Marines/marine_action_items.yml @@ -0,0 +1,11 @@ +- type: entity + id: CMActionToggleAttachable + name: Toggle Attachable + description: Toggle an attachable. If you're seeing this, someone forgot to set the description properly. + components: + - type: Action + icon: + sprite: _CM14/Actions/scope_actions.rsi + state: sniperscope + - type: InstantAction + event: !type:AttachableToggleActionEvent \ No newline at end of file diff --git a/Resources/Prototypes/_CM14/Audio/gun_sound_collections.yml b/Resources/Prototypes/_CM14/Audio/gun_sound_collections.yml new file mode 100644 index 0000000000000..c65b9c5991609 --- /dev/null +++ b/Resources/Prototypes/_CM14/Audio/gun_sound_collections.yml @@ -0,0 +1,5 @@ +- type: soundCollection + id: CMSilencedShoot + files: + - /Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot1.ogg + - /Audio/_CM14/Weapons/Guns/Gunshots/gun_silenced_shot2.ogg \ No newline at end of file diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Ammunition/cm_ammo.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Ammunition/cm_ammo.yml new file mode 100644 index 0000000000000..4661e42678bc7 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Ammunition/cm_ammo.yml @@ -0,0 +1,9 @@ +- type: entity + parent: MagazineCaselessRifle + id: CMMagazineCaseless10x24 + name: "M41A magazine (10x24mm caseless)" + description: A 30-round magazine for the M41A Pulse Rifle. Filled with 10x24mm caseless rounds. + components: + - type: Tag + tags: + - CMMagazineCaseless10x24 diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/barrel_attachments.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/barrel_attachments.yml new file mode 100644 index 0000000000000..8b72f0a110cb7 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/barrel_attachments.yml @@ -0,0 +1,72 @@ +- type: entity + abstract: true + id: CMBarrelAttachmentBase + parent: CMBaseAttachable + components: + - type: Sprite + sprite: _CM14/Objects/Weapons/Guns/Attachments/barrel.rsi + - type: Tag + tags: + - CMAttachableBarrel + +- type: entity + parent: CMBarrelAttachmentBase + id: CMAttachmentExtendedBarrel + name: extended barrel + description: The lengthened barrel speeds up and stabilizes the bullet, increasing velocity. + components: + - type: Sprite + state: ebarrel + - type: Tag + tags: + - CMAttachableBarrel + - CMAttachableExtendedBarrel + - type: AttachableVisuals + - type: AttachableWeaponRangedMods + modifiers: + projectileSpeedFlat: 10 + +- type: entity + parent: CMBarrelAttachmentBase + id: CMAttachmentRecoilCompensator + name: recoil compensator + description: "A muzzle attachment that reduces recoil by diverting expelled gasses upwards. + Reduces recoil, at the cost of a small amount of weapon damage." + components: + - type: Sprite + state: comp + - type: Tag + tags: + - CMAttachableBarrel + - CMAttachableCompensator + - type: AttachableVisuals + offset: -0.04, 0 + - type: AttachableWeaponRangedMods + modifiers: + damageFlat: -0.1 + recoilFlat: -1 + +- type: entity + parent: CMBarrelAttachmentBase + id: CMAttachmentSuppressor + name: suppressor + description: A suppressor reduces the noise and muzzle flash of a weapon. + components: + - type: Sprite + state: suppressor + - type: Tag + tags: + - CMAttachableBarrel + - CMAttachableSuppressor + - type: AttachableVisuals + offset: -0.03, 0.035 + - type: AttachableSilencer + +- type: Tag + id: CMAttachableBarrel +- type: Tag + id: CMAttachableExtendedBarrel +- type: Tag + id: CMAttachableCompensator +- type: Tag + id: CMAttachableSuppressor diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/base_attachment.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/base_attachment.yml new file mode 100644 index 0000000000000..fd65175eb14f3 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/base_attachment.yml @@ -0,0 +1,7 @@ +- type: entity + abstract: true + id: CMBaseAttachable + components: + - type: Item + size: Small + - type: Attachable \ No newline at end of file diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/cm_base_attachable_holder.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/cm_base_attachable_holder.yml new file mode 100644 index 0000000000000..8e7a0dbfb1e8c --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/cm_base_attachable_holder.yml @@ -0,0 +1,16 @@ +- type: entity + abstract: true + id: CMBaseAttachableHolder + components: + - type: AttachableHolder + - type: ActivatableUI + verbText: cm-verb-strip-attachables + verbOnly: true + key: + enum.AttachmentUI.StripKey + - type: UserInterface + interfaces: + enum.AttachmentUI.StripKey: + type: AttachmentStripBui + enum.AttachmentUI.ChooseSlotKey: + type: AttachmentChooseSlotBui \ No newline at end of file diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/rail_attachments.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/rail_attachments.yml new file mode 100644 index 0000000000000..3b2a54cedc70f --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/rail_attachments.yml @@ -0,0 +1,141 @@ +- type: entity + abstract: true + id: CMRailAttachmentBase + parent: CMBaseAttachable + components: + - type: Sprite + sprite: _CM14/Objects/Weapons/Guns/Attachments/rail.rsi + - type: Tag + tags: + - CMAttachableRail + +- type: entity + parent: CMRailAttachmentBase + id: CMAttachmentRailFlashlight + name: rail flashlight + description: A flashlight, for rails, on guns. Can be toggled on and off. A better light source than standard M3 pattern armor lights. + components: + - type: ToggleableLightVisuals + spriteLayer: light + - type: PointLight + enabled: false + radius: 8 + - type: HandheldLight + addPrefix: false + wattage: 0.5 + - type: LightBehaviour + behaviours: + - !type:FadeBehaviour + id: radiating + interpolate: Linear + maxDuration: 2.0 + startValue: 3.0 + endValue: 2.0 + isLooped: true + property: Radius + enabled: false + reverseWhenFinished: true + - !type:PulseBehaviour + id: blinking + interpolate: Nearest + maxDuration: 1.0 + minValue: 0.1 + maxValue: 2.0 + isLooped: true + property: Radius + enabled: false + - type: Battery + maxCharge: 10 + startingCharge: 10 + - type: BatterySelfRecharger + autoRecharge: true + autoRechargeRate: 3 + - type: ItemTogglePointLight + - type: Sprite + layers: + - state: flashlight + - state: flashlight-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: _CM14/Objects/Weapons/Guns/Attachments/rail.rsi + - type: Appearance + - type: AttachableToggleable + attachedOnly: true + icon: + sprite: _CM14/Objects/Weapons/Guns/Attachments/rail.rsi + state: flashlight + iconActive: + sprite: _CM14/Objects/Weapons/Guns/Attachments/rail.rsi + state: flashlight-on + actionName: Activate Rail Flashlight + actionDesc: Can be toggled on and off. A better light source than standard M3 pattern armor lights. + - type: AttachableVisuals + showActive: true + - type: AttachableToggleableSimpleActivate + - type: Tag + tags: + - CMAttachableRail + - CMAttachableFlashlight + - Flashlight + +- type: entity + parent: CMRailAttachmentBase + id: CMAttachmentB8SmartScope + name: B8 smart-scope + description: An experimental B8 Smart-Scope. Based on the technologies used in the Smart Gun by ARMAT, this sight has integrated IFF systems. + components: + - type: Sprite + state: iffbarrel + - type: Tag + tags: + - CMAttachableRail + - CMAttachableSmartScope + - type: AttachableToggleable + attachedOnly: true + icon: + sprite: _CM14/Objects/Weapons/Guns/Attachments/rail.rsi + state: iffbarrel + actionName: Toggle B8 Smart-Scope + actionDesc: Lets you see further and shoot through your fellow marines without harming them. + - type: AttachableVisuals + offset: 0.29, -0.045 + - type: Scope + zoom: 1 + offset: 12 + requireWielding: true + attachment: true + - type: AttachableIFF + +- type: entity + parent: CMRailAttachmentBase + id: CMSniperScopeAttachment + name: sniper scope + description: A long-range sniper scope. + components: + - type: Sprite + state: sniperscope + - type: Tag + tags: + - CMAttachableRail + - CMAttachableScope + - type: CursorOffsetRequiresWield + - type: EyeCursorOffset + maxOffset: 4 + pvsIncrease: 0.3 + # DS14-start + - type: AttachableComponentProvider + components: + - CursorOffsetRequiresWield + - EyeCursorOffset + # DS14-end + +- type: Tag + id: CMAttachableRail +- type: Tag + id: CMAttachableFlashlight +- type: Tag + id: CMAttachableSmartScope +- type: Tag + id: CMAttachableScope diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/stock_attachments.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/stock_attachments.yml new file mode 100644 index 0000000000000..16bcd44af1692 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/stock_attachments.yml @@ -0,0 +1,51 @@ +- type: entity + abstract: true + id: CMStockAttachmentBase + parent: CMBaseAttachable + components: + - type: Sprite + sprite: _CM14/Objects/Weapons/Guns/Attachments/stock.rsi + - type: Tag + tags: + - CMAttachableStock + +- type: entity + parent: CMStockAttachmentBase + id: CMAttachmentM39Stock + name: submachinegun stock + description: A rare ARMAT stock distributed in small numbers to USCM forces. Compatible with the M39, this stock reduces recoil and improves accuracy, but at a reduction to handling and agility. + components: + - type: Sprite + state: smgstock + +- type: entity + parent: CMStockAttachmentBase + id: CMAttachmentM39StockCollapsible + name: submachinegun folding stock + description: A Kirchner brand K2 M39 folding stock, standard issue in the USCM. This stock can collapse in, removing all positive and negative effects. + components: + - type: Sprite + state: smgstockcc + - type: Tag + tags: + - CMAttachableStock + - CMAttachableStockSMGCollapsible + - type: AttachableToggleable + - type: AttachableVisuals + showActive: true + - type: AttachableToggleableSizeModifier + activeSizeModifier: 1 + +- type: entity + parent: CMStockAttachmentBase + id: CMAttachmentM41ASolidStock + name: M41A solid stock + description: A solid stock for the M41A pulse rifle. + components: + - type: Sprite + state: 44stock + +- type: Tag + id: CMAttachableStock +- type: Tag + id: CMAttachableStockSMGCollapsible diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/under_attachments.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/under_attachments.yml new file mode 100644 index 0000000000000..43a03dacc1120 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/Attachments/under_attachments.yml @@ -0,0 +1,63 @@ +- type: entity + abstract: true + id: CMUnderAttachmentBase + parent: CMBaseAttachable + components: + - type: Sprite + sprite: _CM14/Objects/Weapons/Guns/Attachments/under.rsi + - type: Tag + tags: + - CMAttachmentUnderbarrel + +- type: entity + parent: CMUnderAttachmentBase + id: CMAttachmentU7UnderbarrelShotgun + name: U7 underbarrel shotgun + description: An underbarrel shotgun attachment. Allows the user to fire shotgun shells from the host weapon. + components: + - type: Sprite + state: masterkey + - type: Tag + tags: + - CMAttachmentUnderbarrel + - CMAttachmentU7UnderbarrelShotgun + - type: Gun + soundGunshot: + path: /Audio/_CM14/Weapons/Guns/Gunshots/gun_shotgun_u7.ogg + - type: ContainerContainer + containers: + ballistic-ammo: !type:Container + - type: BallisticAmmoProvider + cycleable: false + whitelist: + tags: + - ShellShotgun + capacity: 5 + proto: null + soundInsert: + path: /Audio/_CM14/Weapons/Guns/Reload/gun_sg_reload.ogg + - type: UniqueAction + - type: PumpAction + - type: UseDelayOnShoot + - type: UseDelay + delay: 2 + - type: AttachableToggleable + attachedOnly: true + supercedeHolder: true + activateSound: /Audio/_CM14/Attachable/gun_u7_activate.ogg + - type: AttachableVisuals + - type: AttachableToggleableSimpleActivate + +- type: entity + parent: CMUnderAttachmentBase + id: CMAttachmentVerticalGrip + name: vertical grip + description: A vertical grip for better handling. + components: + - type: Sprite + state: verticalgrip + +- type: Tag + id: CMAttachmentUnderbarrel +- type: Tag + id: CMAttachmentU7UnderbarrelShotgun diff --git a/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/rifles.yml b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/rifles.yml new file mode 100644 index 0000000000000..81e17f27c6232 --- /dev/null +++ b/Resources/Prototypes/_CM14/Entities/Objects/Weapons/Guns/rifles.yml @@ -0,0 +1,90 @@ +- type: entity + parent: [BaseWeaponRifle, CMBaseAttachableHolder] + id: CMWeaponRifleM41A + name: M41A Pulse Rifle + description: The M41A Pulse Rifle is the standard-issue assault rifle of the United States Colonial Marines. It features an integrated ammunition counter and accepts a variety of attachments. Uses 10x24mm caseless rounds. + components: + - type: Sprite + sprite: _DeadSpace/Objects/Weapons/Guns/Rifels/xc67.rsi + layers: + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-0 + map: ["enum.GunVisualLayers.Mag"] + - type: Clothing + sprite: _DeadSpace/Objects/Weapons/Guns/Rifels/xc67.rsi + quickEquip: false + slots: + - Back + - suitStorage + - type: GunRequiresWield + - type: AmmoCounter + - type: Gun + fireRate: 8 + selectedMode: FullAuto + availableModes: + - SemiAuto + - Burst + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/ltrifle.ogg + - type: ItemSlots + slots: + gun_magazine: + name: Magazine + startingItem: CMMagazineCaseless10x24 + insertSound: /Audio/Weapons/Guns/MagIn/ltrifle_magin.ogg + ejectSound: /Audio/Weapons/Guns/MagOut/ltrifle_magout.ogg + priority: 1 + insertOnInteract: true + whitelist: + tags: + - CMMagazineCaseless10x24 + whitelistFailPopup: gun-magazine-whitelist-fail + gun_chamber: + name: Chamber + priority: 2 + insertOnInteract: false + whitelist: + tags: + - CMCartridgeCaseless10x24 + - type: ContainerContainer + containers: + gun_magazine: !type:ContainerSlot + gun_chamber: !type:ContainerSlot + - type: MagazineVisuals + magState: mag + steps: 1 + zeroVisible: true + - type: Appearance + - type: AttachableHolderVisuals + offsets: + cm-aslot-barrel: 0.75, -0.03125 + cm-aslot-rail: -0.03125, 0.185 + cm-aslot-stock: -0.5625, -0.03125 + cm-aslot-underbarrel: 0.34375, -0.34375 + - type: AttachableHolder + slots: + cm-aslot-barrel: + tags: + - CMAttachableExtendedBarrel + - CMAttachableCompensator + - CMAttachableSuppressor + cm-aslot-rail: + tags: + - CMAttachableFlashlight + - CMAttachableSmartScope + - CMAttachableScope + cm-aslot-stock: + tags: + - CMAttachableStock + cm-aslot-underbarrel: + tags: + - CMAttachmentUnderbarrel + +- type: Tag + id: CMCartridgeCaseless10x24 +- type: Tag + id: CMMagazineCaseless10x24 +- type: Tag + id: CMShellShotgun diff --git a/Resources/Textures/_CM14/Actions/scope_actions.rsi/meta.json b/Resources/Textures/_CM14/Actions/scope_actions.rsi/meta.json new file mode 100644 index 0000000000000..13673645db978 --- /dev/null +++ b/Resources/Textures/_CM14/Actions/scope_actions.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/7cb618c69b75873f3ce893022fe08d1233b3152d/icons/obj/items/weapons/guns/attachments/rail.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "sniperscope" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CM14/Actions/scope_actions.rsi/sniperscope.png b/Resources/Textures/_CM14/Actions/scope_actions.rsi/sniperscope.png new file mode 100644 index 0000000000000..d408b671953a8 Binary files /dev/null and b/Resources/Textures/_CM14/Actions/scope_actions.rsi/sniperscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long.png new file mode 100644 index 0000000000000..10db0d33064ea Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long_a.png new file mode 100644 index 0000000000000..10db0d33064ea Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_long_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium.png new file mode 100644 index 0000000000000..e04520a6e01cd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium_a.png new file mode 100644 index 0000000000000..e04520a6e01cd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_medium_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short.png new file mode 100644 index 0000000000000..77690eaaf7a6b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short_a.png new file mode 100644 index 0000000000000..77690eaaf7a6b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/amateba_short_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_dmr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_dmr_barrel_a.png new file mode 100644 index 0000000000000..9ef7b3610d27c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_dmr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_mkey_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_mkey_barrel_a.png new file mode 100644 index 0000000000000..67b6c565b849c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/aug_mkey_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet.png new file mode 100644 index 0000000000000..a1198ae3d6fb0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet_a.png new file mode 100644 index 0000000000000..12d6973699d94 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/bayonet_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented.png new file mode 100644 index 0000000000000..1624cb84df68c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented_a.png new file mode 100644 index 0000000000000..3cd85fd75bdb0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_ebarrel_vented_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp.png new file mode 100644 index 0000000000000..9ecd64587a349 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_a.png new file mode 100644 index 0000000000000..6eace7892e1de Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike.png new file mode 100644 index 0000000000000..8eb32ccd29df9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike_a.png new file mode 100644 index 0000000000000..d79bd9d4a3c4a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m10_overcomp_spike_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel.png new file mode 100644 index 0000000000000..df1c29c753a09 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel_a.png new file mode 100644 index 0000000000000..df1c29c753a09 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel.png new file mode 100644 index 0000000000000..8368a234c0674 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel_a.png new file mode 100644 index 0000000000000..8368a234c0674 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/c_m4spr_custom_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke.png new file mode 100644 index 0000000000000..a1a34c937b2e3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke_a.png new file mode 100644 index 0000000000000..9602803841a36 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/choke_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet-f_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet-f_a.png new file mode 100644 index 0000000000000..4a7612eae9c2d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet-f_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet_a.png new file mode 100644 index 0000000000000..885516699bc1e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_bayonet_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife-f.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife-f.png new file mode 100644 index 0000000000000..e04f6bebe41c4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife-f.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife.png new file mode 100644 index 0000000000000..31bc8569189ec Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/co2_knife.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya.png new file mode 100644 index 0000000000000..42263ff4e75e2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya_a.png new file mode 100644 index 0000000000000..e8594dd358699 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilitya_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb.png new file mode 100644 index 0000000000000..91b438cd1eb02 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb_a.png new file mode 100644 index 0000000000000..ceb7065e3983d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/combatutilityb_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp.png new file mode 100644 index 0000000000000..c81fc9d7a8e8f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp_a.png new file mode 100644 index 0000000000000..ddb777e5bce07 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/comp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented.png new file mode 100644 index 0000000000000..d21bf5f7977d2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented_a.png new file mode 100644 index 0000000000000..c7951c3c5b75e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_ebarrel_vented_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp.png new file mode 100644 index 0000000000000..bd86fcecfb0c9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_a.png new file mode 100644 index 0000000000000..37e2a4c21e657 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike.png new file mode 100644 index 0000000000000..1b5b411baa82d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike_a.png new file mode 100644 index 0000000000000..2cf7d604efc5e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m10_overcomp_spike_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel.png new file mode 100644 index 0000000000000..407c0973bff22 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel_a.png new file mode 100644 index 0000000000000..407c0973bff22 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel.png new file mode 100644 index 0000000000000..e3aa354362355 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel_a.png new file mode 100644 index 0000000000000..e3aa354362355 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/d_m4spr_custom_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera.png new file mode 100644 index 0000000000000..0b82e583c5f93 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera_a.png new file mode 100644 index 0000000000000..874543ab3da09 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggera_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb.png new file mode 100644 index 0000000000000..dce5355b2a9f4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb_a.png new file mode 100644 index 0000000000000..16b3494beae12 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/daggerb_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel.png new file mode 100644 index 0000000000000..44bcdcaf7e0e3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_a.png new file mode 100644 index 0000000000000..a0ed555c67f40 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented.png new file mode 100644 index 0000000000000..3cbe4d2adf9b9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented_a.png new file mode 100644 index 0000000000000..0130df4134b0f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/ebarrel_vented_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel.png new file mode 100644 index 0000000000000..0af1c1e1619fa Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel_a.png new file mode 100644 index 0000000000000..afd8386e37d72 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/hbarrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp.png new file mode 100644 index 0000000000000..ee7372b8be511 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_a.png new file mode 100644 index 0000000000000..3c1aaebe14c73 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike.png new file mode 100644 index 0000000000000..d458a8a83b675 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike_a.png new file mode 100644 index 0000000000000..80ad38bee4c27 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m10_overcomp_spike_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor.png new file mode 100644 index 0000000000000..f41a4452bec34 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor_a.png new file mode 100644 index 0000000000000..f41a4452bec34 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m40sd_suppressor_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel.png new file mode 100644 index 0000000000000..45bcc29d23c30 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel_a.png new file mode 100644 index 0000000000000..45bcc29d23c30 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel.png new file mode 100644 index 0000000000000..94316e930a65b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel_a.png new file mode 100644 index 0000000000000..94316e930a65b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m4spr_custom_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56_barrel.png new file mode 100644 index 0000000000000..fe3bbabb5712f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56c_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56c_barrel.png new file mode 100644 index 0000000000000..c5a7f3c136377 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m56c_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel.png new file mode 100644 index 0000000000000..2561d4b0ef17e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel_a.png new file mode 100644 index 0000000000000..2561d4b0ef17e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m5spr2_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m60barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m60barrel.png new file mode 100644 index 0000000000000..de5c0c5e616aa Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/m60barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/magsg_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/magsg_barrel_a.png new file mode 100644 index 0000000000000..b55546c2286ba Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/magsg_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel.png new file mode 100644 index 0000000000000..2d7c378eaa974 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel_a.png new file mode 100644 index 0000000000000..2d7c378eaa974 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mar50barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long.png new file mode 100644 index 0000000000000..ccf6b3fcdb0d1 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long_a.png new file mode 100644 index 0000000000000..ccf6b3fcdb0d1 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_long_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium.png new file mode 100644 index 0000000000000..aa597e81775ab Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium_a.png new file mode 100644 index 0000000000000..aa597e81775ab Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_medium_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short.png new file mode 100644 index 0000000000000..e15f125fda98d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short_a.png new file mode 100644 index 0000000000000..e15f125fda98d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/mateba_short_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/meta.json b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/meta.json new file mode 100644 index 0000000000000..d8c5396c9e7db --- /dev/null +++ b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/meta.json @@ -0,0 +1,383 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/44751f0cc11332a5ba4f05ef91b2d72a0b08082b/icons/obj/items/weapons/guns/attachments/barrel.dmi, npz92_suppressor by github noctyrnal. Ebarrel, hbarrel and suppressor resprite by VictorJob, tanto, dagger and combat utility knife bayonets by august-sun (github). suppressed_sniper_barrel modified from sniperbarrel by N2H4", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "bayonet" + }, + { + "name": "spp_bayonet" + }, + { + "name": "co2_knife" + }, + { + "name": "co2_knife-f" + }, + { + "name": "hbarrel", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "comp" + }, + { + "name": "ebarrel" + }, + { + "name": "suppressor" + }, + { + "name": "suppressor_sleek" + }, + { + "name": "suppressed_sniper_barrel" + }, + { + "name": "bayonet_a" + }, + { + "name": "spp_bayonet_a" + }, + { + "name": "co2_bayonet_a" + }, + { + "name": "co2_bayonet-f_a" + }, + { + "name": "hbarrel_a", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "comp_a" + }, + { + "name": "ebarrel_a" + }, + { + "name": "suppressor_a" + }, + { + "name": "suppressor_sleek_a" + }, + { + "name": "suppressor2_a" + }, + { + "name": "m56_barrel" + }, + { + "name": "m56c_barrel" + }, + { + "name": "smartbarrel" + }, + { + "name": "slavicstock" + }, + { + "name": "slavicbarrel" + }, + { + "name": "sniperbarrel" + }, + { + "name": "m60barrel" + }, + { + "name": "mar50barrel" + }, + { + "name": "mar50barrel_a" + }, + { + "name": "mateba_short" + }, + { + "name": "mateba_short_a" + }, + { + "name": "amateba_short" + }, + { + "name": "amateba_short_a" + }, + { + "name": "mateba_medium" + }, + { + "name": "mateba_medium_a" + }, + { + "name": "amateba_medium" + }, + { + "name": "amateba_medium_a" + }, + { + "name": "mateba_long" + }, + { + "name": "mateba_long_a" + }, + { + "name": "amateba_long" + }, + { + "name": "amateba_long_a" + }, + { + "name": "m40sd_suppressor" + }, + { + "name": "m40sd_suppressor_a" + }, + { + "name": "m4spr_barrel" + }, + { + "name": "d_m4spr_barrel" + }, + { + "name": "c_m4spr_barrel" + }, + { + "name": "s_m4spr_barrel" + }, + { + "name": "u_m4spr_barrel" + }, + { + "name": "m4spr_custom_barrel" + }, + { + "name": "s_m4spr_custom_barrel" + }, + { + "name": "d_m4spr_custom_barrel" + }, + { + "name": "u_m4spr_custom_barrel" + }, + { + "name": "c_m4spr_custom_barrel" + }, + { + "name": "m4spr_barrel_a" + }, + { + "name": "d_m4spr_barrel_a" + }, + { + "name": "c_m4spr_barrel_a" + }, + { + "name": "s_m4spr_barrel_a" + }, + { + "name": "u_m4spr_barrel_a" + }, + { + "name": "m4spr_custom_barrel_a" + }, + { + "name": "s_m4spr_custom_barrel_a" + }, + { + "name": "d_m4spr_custom_barrel_a" + }, + { + "name": "u_m4spr_custom_barrel_a" + }, + { + "name": "c_m4spr_custom_barrel_a" + }, + { + "name": "m5spr2_barrel" + }, + { + "name": "m5spr2_barrel_a" + }, + { + "name": "uppmg_barrel" + }, + { + "name": "type73_suppressor" + }, + { + "name": "type88_barrel" + }, + { + "name": "aug_mkey_barrel_a" + }, + { + "name": "aug_dmr_barrel_a" + }, + { + "name": "magsg_barrel_a" + }, + { + "name": "vulture_barrel" + }, + { + "name": "pmc_sniperbarrel" + }, + { + "name": "npz92_suppressor" + }, + { + "name": "choke" + }, + { + "name": "choke_a" + }, + { + "name": "ebarrel_vented" + }, + { + "name": "c_ebarrel_vented" + }, + { + "name": "d_ebarrel_vented" + }, + { + "name": "u_ebarrel_vented" + }, + { + "name": "s_ebarrel_vented" + }, + { + "name": "m10_overcomp" + }, + { + "name": "m10_overcomp_spike" + }, + { + "name": "c_m10_overcomp" + }, + { + "name": "c_m10_overcomp_spike" + }, + { + "name": "d_m10_overcomp" + }, + { + "name": "d_m10_overcomp_spike" + }, + { + "name": "u_m10_overcomp" + }, + { + "name": "u_m10_overcomp_spike" + }, + { + "name": "s_m10_overcomp" + }, + { + "name": "s_m10_overcomp_spike" + }, + { + "name": "ebarrel_vented_a" + }, + { + "name": "c_ebarrel_vented_a" + }, + { + "name": "d_ebarrel_vented_a" + }, + { + "name": "u_ebarrel_vented_a" + }, + { + "name": "s_ebarrel_vented_a" + }, + { + "name": "m10_overcomp_a" + }, + { + "name": "m10_overcomp_spike_a" + }, + { + "name": "c_m10_overcomp_a" + }, + { + "name": "c_m10_overcomp_spike_a" + }, + { + "name": "d_m10_overcomp_a" + }, + { + "name": "d_m10_overcomp_spike_a" + }, + { + "name": "u_m10_overcomp_a" + }, + { + "name": "u_m10_overcomp_spike_a" + }, + { + "name": "s_m10_overcomp_a" + }, + { + "name": "s_m10_overcomp_spike_a" + }, + { + "name": "tantoa" + }, + { + "name": "tantoa_a" + }, + { + "name": "tantob" + }, + { + "name": "tantob_a" + }, + { + "name": "combatutilitya" + }, + { + "name": "combatutilitya_a" + }, + { + "name": "combatutilityb" + }, + { + "name": "combatutilityb_a" + }, + { + "name": "daggera" + }, + { + "name": "daggera_a" + }, + { + "name": "daggerb" + }, + { + "name": "daggerb_a" + } + ] +} diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/npz92_suppressor.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/npz92_suppressor.png new file mode 100644 index 0000000000000..e6d23c48f5898 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/npz92_suppressor.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/pmc_sniperbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/pmc_sniperbarrel.png new file mode 100644 index 0000000000000..7fb7fca6a10bc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/pmc_sniperbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented.png new file mode 100644 index 0000000000000..98c50be1497ab Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented_a.png new file mode 100644 index 0000000000000..f2573cccbbd66 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_ebarrel_vented_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp.png new file mode 100644 index 0000000000000..8e317cf37f534 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_a.png new file mode 100644 index 0000000000000..4345f884b4fab Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike.png new file mode 100644 index 0000000000000..5406b6c24989a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike_a.png new file mode 100644 index 0000000000000..5cf60f5200728 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m10_overcomp_spike_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel.png new file mode 100644 index 0000000000000..534710915f42f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel_a.png new file mode 100644 index 0000000000000..534710915f42f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel.png new file mode 100644 index 0000000000000..96b3d350ba759 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel_a.png new file mode 100644 index 0000000000000..96b3d350ba759 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/s_m4spr_custom_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicbarrel.png new file mode 100644 index 0000000000000..fac9cf58b8589 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicstock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicstock.png new file mode 100644 index 0000000000000..52bd97365bd54 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/slavicstock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/smartbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/smartbarrel.png new file mode 100644 index 0000000000000..874655f0caf09 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/smartbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/sniperbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/sniperbarrel.png new file mode 100644 index 0000000000000..697c7cb952fbe Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/sniperbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet.png new file mode 100644 index 0000000000000..4d338f0261e6d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet_a.png new file mode 100644 index 0000000000000..985b79ba3f0c3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/spp_bayonet_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressed_sniper_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressed_sniper_barrel.png new file mode 100644 index 0000000000000..e2231c1482e02 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressed_sniper_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor.png new file mode 100644 index 0000000000000..180d8bb5cd884 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor2_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor2_a.png new file mode 100644 index 0000000000000..db2278fcb02ec Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor2_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_a.png new file mode 100644 index 0000000000000..b2cfc61afd54c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek.png new file mode 100644 index 0000000000000..4bebd6b7d4715 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek_a.png new file mode 100644 index 0000000000000..e7f9affd77c60 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/suppressor_sleek_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa.png new file mode 100644 index 0000000000000..30336ab29590a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa_a.png new file mode 100644 index 0000000000000..c9ddb75193d80 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantoa_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob.png new file mode 100644 index 0000000000000..3e088031d413a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob_a.png new file mode 100644 index 0000000000000..791881ebae2db Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/tantob_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type73_suppressor.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type73_suppressor.png new file mode 100644 index 0000000000000..96719a38cc001 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type73_suppressor.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type88_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type88_barrel.png new file mode 100644 index 0000000000000..0f0ed0470fb69 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/type88_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented.png new file mode 100644 index 0000000000000..84e13f95ccadf Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented_a.png new file mode 100644 index 0000000000000..309655b2f61a4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_ebarrel_vented_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp.png new file mode 100644 index 0000000000000..46b2e0ba2990b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_a.png new file mode 100644 index 0000000000000..c5cceed99dd76 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike.png new file mode 100644 index 0000000000000..d93d5d6848429 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike_a.png new file mode 100644 index 0000000000000..df61cf3038fc2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m10_overcomp_spike_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel.png new file mode 100644 index 0000000000000..2245810251b85 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel_a.png new file mode 100644 index 0000000000000..2245810251b85 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel.png new file mode 100644 index 0000000000000..524f78b9e90eb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel_a.png new file mode 100644 index 0000000000000..524f78b9e90eb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/u_m4spr_custom_barrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/uppmg_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/uppmg_barrel.png new file mode 100644 index 0000000000000..61c86100fa818 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/uppmg_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/vulture_barrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/vulture_barrel.png new file mode 100644 index 0000000000000..263c2a9a0d53a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/barrel.rsi/vulture_barrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader.png new file mode 100644 index 0000000000000..7647efdbcb826 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader_a.png new file mode 100644 index 0000000000000..13b5a0e103b1f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/autoloader_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope.png new file mode 100644 index 0000000000000..1d8c00755dfc1 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope_a.png new file mode 100644 index 0000000000000..d874073237e11 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/boomslang-scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope.png new file mode 100644 index 0000000000000..09a8110f83d46 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope_a.png new file mode 100644 index 0000000000000..72ec9862d72bf Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_boomslang-scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_vulture_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_vulture_scope.png new file mode 100644 index 0000000000000..5a25ca6965760 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/c_vulture_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight.png new file mode 100644 index 0000000000000..be25389cbf455 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight_a.png new file mode 100644 index 0000000000000..800b989c3b4a7 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/collisight_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope.png new file mode 100644 index 0000000000000..bd3c292dee0ab Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope_a.png new file mode 100644 index 0000000000000..dfd70b9383a6e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_boomslang-scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_vulture_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_vulture_scope.png new file mode 100644 index 0000000000000..e0db2dbca15de Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/d_vulture_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight-on.png new file mode 100644 index 0000000000000..7ae4d22584122 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight.png new file mode 100644 index 0000000000000..672fa6f6f00ee Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a-on.png new file mode 100644 index 0000000000000..35cc757523318 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a.png new file mode 100644 index 0000000000000..ea2c2ce54cca6 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/flashlight_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope.png new file mode 100644 index 0000000000000..425d65a46a2c4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope_a.png new file mode 100644 index 0000000000000..425d65a46a2c4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/huntingscope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel.png new file mode 100644 index 0000000000000..ac8e5daeef39a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel_a.png new file mode 100644 index 0000000000000..1f52a85d7b2bd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/iffbarrel_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/m96s-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/m96s-scope.png new file mode 100644 index 0000000000000..340bd5766fbf1 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/m96s-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic.png new file mode 100644 index 0000000000000..5b02fd1ba6f3f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic_a.png new file mode 100644 index 0000000000000..768e768dd5133 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/magnetic_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/meta.json b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/meta.json new file mode 100644 index 0000000000000..8961ab2404b52 --- /dev/null +++ b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/meta.json @@ -0,0 +1,177 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/44751f0cc11332a5ba4f05ef91b2d72a0b08082b/icons/obj/items/weapons/guns/attachments/rail.dmi, edited iffbarrel & iffbarrel_a & type88_scope by SG6732, magnetic magnetic_a made by Sigma Draconis, XM43E1 scope by github noctyrnal, reddot and reflex by VictorJob", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "flashlight" + }, + { + "name": "flashlight-on" + }, + { + "name": "reddot" + }, + { + "name": "reddot_small" + }, + { + "name": "reflex" + }, + { + "name": "magnetic" + }, + { + "name": "iffbarrel", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "miniscope" + }, + { + "name": "sniperscope" + }, + { + "name": "miniscope-nsg23" + }, + { + "name": "rxfm5_eva_scope" + }, + { + "name": "flashlight_a" + }, + { + "name": "flashlight_a-on" + }, + { + "name": "reddot_a" + }, + { + "name": "reddot_small_a" + }, + { + "name": "reflex_a" + }, + { + "name": "magnetic_a" + }, + { + "name": "iffbarrel_a" + }, + { + "name": "miniscope_a" + }, + { + "name": "sniperscope_a" + }, + { + "name": "miniscope-nsg23_a" + }, + { + "name": "rxfm5_eva_scope_a" + }, + { + "name": "slavicscope" + }, + { + "name": "boomslang-scope" + }, + { + "name": "s_boomslang-scope" + }, + { + "name": "u_boomslang-scope" + }, + { + "name": "c_boomslang-scope" + }, + { + "name": "d_boomslang-scope" + }, + { + "name": "huntingscope" + }, + { + "name": "huntingscope_a" + }, + { + "name": "vulture_scope" + }, + { + "name": "d_vulture_scope" + }, + { + "name": "s_vulture_scope" + }, + { + "name": "c_vulture_scope" + }, + { + "name": "u_vulture_scope" + }, + { + "name": "miniscope_fp9000" + }, + { + "name": "miniscope_fp9000_a" + }, + { + "name": "scope" + }, + { + "name": "scope2" + }, + { + "name": "pmcscope" + }, + { + "name": "autoloader" + }, + { + "name": "autoloader_a" + }, + { + "name": "collisight" + }, + { + "name": "collisight_a" + }, + { + "name": "m96s-scope" + }, + { + "name": "u_boomslang-scope_a" + }, + { + "name": "s_boomslang-scope_a" + }, + { + "name": "d_boomslang-scope_a" + }, + { + "name": "c_boomslang-scope_a" + }, + { + "name": "boomslang-scope_a" + }, + { + "name": "xm43e1_scope" + }, + { + "name": "type88_scope" + } + ] +} diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23.png new file mode 100644 index 0000000000000..5e499a9f96d1c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23_a.png new file mode 100644 index 0000000000000..0649bd6abea52 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope-nsg23_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope.png new file mode 100644 index 0000000000000..b186d9d4da7db Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_a.png new file mode 100644 index 0000000000000..c073c4032079c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000.png new file mode 100644 index 0000000000000..9eadba2c164ac Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000_a.png new file mode 100644 index 0000000000000..7e6177f0ddee2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/miniscope_fp9000_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/pmcscope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/pmcscope.png new file mode 100644 index 0000000000000..b52db02f35c78 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/pmcscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot.png new file mode 100644 index 0000000000000..71809a6d001f9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_a.png new file mode 100644 index 0000000000000..1abc1a257c266 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small.png new file mode 100644 index 0000000000000..489aee91c1832 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small_a.png new file mode 100644 index 0000000000000..6b2e75eedc8ce Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reddot_small_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex.png new file mode 100644 index 0000000000000..89483d6ef7163 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex_a.png new file mode 100644 index 0000000000000..448a9d79c0c6b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/reflex_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope.png new file mode 100644 index 0000000000000..082080d569956 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope_a.png new file mode 100644 index 0000000000000..9883534e2d4fd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/rxfm5_eva_scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope.png new file mode 100644 index 0000000000000..a2a393c845c14 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope_a.png new file mode 100644 index 0000000000000..23e79d2dbdb59 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_boomslang-scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_vulture_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_vulture_scope.png new file mode 100644 index 0000000000000..da5e401f53594 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/s_vulture_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope.png new file mode 100644 index 0000000000000..07594762f1ae3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope2.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope2.png new file mode 100644 index 0000000000000..475792039821a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/scope2.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/slavicscope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/slavicscope.png new file mode 100644 index 0000000000000..8ceae645eea6d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/slavicscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope.png new file mode 100644 index 0000000000000..d408b671953a8 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope_a.png new file mode 100644 index 0000000000000..8cb230169b6a3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/sniperscope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/type88_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/type88_scope.png new file mode 100644 index 0000000000000..560f642cb62b5 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/type88_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope.png new file mode 100644 index 0000000000000..a76c3093d0acf Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope_a.png new file mode 100644 index 0000000000000..c69a403ed972a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_boomslang-scope_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_vulture_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_vulture_scope.png new file mode 100644 index 0000000000000..b14e685e6056b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/u_vulture_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/vulture_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/vulture_scope.png new file mode 100644 index 0000000000000..cbfd0e85e3272 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/vulture_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/xm43e1_scope.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/xm43e1_scope.png new file mode 100644 index 0000000000000..e8b35669ec584 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/rail.rsi/xm43e1_scope.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock-on.png new file mode 100644 index 0000000000000..6e1738fedda0b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock.png new file mode 100644 index 0000000000000..a65e0e22ed258 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock_old.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock_old.png new file mode 100644 index 0000000000000..f3e118439b8fa Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/44stock_old.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock.png new file mode 100644 index 0000000000000..3b94cdf79cb93 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_a.png new file mode 100644 index 0000000000000..f2ca266fb083d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac.png new file mode 100644 index 0000000000000..58373664e4085 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac_a.png new file mode 100644 index 0000000000000..534656fa4fc63 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/abr40stock_tac_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ar10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ar10_stock.png new file mode 100644 index 0000000000000..cdcfa8ffc1249 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ar10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/boomslang-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/boomslang-stock.png new file mode 100644 index 0000000000000..cc0feddeb3de8 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/boomslang-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_boomslang-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_boomslang-stock.png new file mode 100644 index 0000000000000..a490ba5940e80 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_boomslang-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock.png new file mode 100644 index 0000000000000..9372ff441d92c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock_a.png new file mode 100644 index 0000000000000..837f316e2fcfb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_m10_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_r4t-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_r4t-stock.png new file mode 100644 index 0000000000000..c65a740634884 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_r4t-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_stock.png new file mode 100644 index 0000000000000..86bdcb72253ce Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_vulture_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_vulture_stock.png new file mode 100644 index 0000000000000..92f8c24697ef9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_vulture_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_xm51_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_xm51_stock.png new file mode 100644 index 0000000000000..786638fa63281 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/c_xm51_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_boomslang-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_boomslang-stock.png new file mode 100644 index 0000000000000..ed661cd445f51 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_boomslang-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock.png new file mode 100644 index 0000000000000..75c55a49281ba Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock_a.png new file mode 100644 index 0000000000000..4155e2b4cda56 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_m10_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_r4t-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_r4t-stock.png new file mode 100644 index 0000000000000..fbb78501b4672 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_r4t-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_stock.png new file mode 100644 index 0000000000000..3072b37d0a53b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_vulture_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_vulture_stock.png new file mode 100644 index 0000000000000..0d3e43ce862f2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_vulture_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_xm51_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_xm51_stock.png new file mode 100644 index 0000000000000..7bc618af29013 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/d_xm51_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/db-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/db-stock.png new file mode 100644 index 0000000000000..d0de83e11c496 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/db-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hg3717_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hg3717_stock.png new file mode 100644 index 0000000000000..94bb159209ed5 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hg3717_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hjra_breech.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hjra_breech.png new file mode 100644 index 0000000000000..22c55b096ca8e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/hjra_breech.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/huntingstock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/huntingstock.png new file mode 100644 index 0000000000000..e7d56dadd680b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/huntingstock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock.png new file mode 100644 index 0000000000000..d54169a752fa4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock_a.png new file mode 100644 index 0000000000000..5f1cc64012d20 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/l42stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/lpo80-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/lpo80-stock.png new file mode 100644 index 0000000000000..5bf6c35eeda79 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/lpo80-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock.png new file mode 100644 index 0000000000000..8af5a1ff1256f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock_a.png new file mode 100644 index 0000000000000..d5be0a9402952 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m10_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding-on.png new file mode 100644 index 0000000000000..ff4ae967c386e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding.png new file mode 100644 index 0000000000000..e3d3733bf5094 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-folding.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-stock.png new file mode 100644 index 0000000000000..8687a85b8c941 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16a5-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16a5-stock.png new file mode 100644 index 0000000000000..83831cf982fde Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m16a5-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m44r_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m44r_stock.png new file mode 100644 index 0000000000000..869e417f7a232 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m44r_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding-on.png new file mode 100644 index 0000000000000..c31c7576480e7 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding.png new file mode 100644 index 0000000000000..62c33e447e3bc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a-on.png new file mode 100644 index 0000000000000..ebdc60b3f1b30 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a.png new file mode 100644 index 0000000000000..4e1dae81a7f61 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54-folding_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54markstock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54markstock.png new file mode 100644 index 0000000000000..85fb51a3018b3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m54markstock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m60_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m60_stock.png new file mode 100644 index 0000000000000..2743243792fae Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m60_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock.png new file mode 100644 index 0000000000000..21139e6ef3c43 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock_a.png new file mode 100644 index 0000000000000..21139e6ef3c43 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/m77_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/meta.json b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/meta.json new file mode 100644 index 0000000000000..2c830f1233425 --- /dev/null +++ b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/meta.json @@ -0,0 +1,284 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/7e38a6a747b200b3854888a3eacd18b47992d066/icons/obj/items/weapons/guns/attachments/stock.dmi, https://github.com/cmss13-devs/cmss13-pve/blob/f34d783a28859a36813c88778d57c38655076eb0/icons/obj/items/weapons/guns/attachments/stock.dmi, all m42a2 wooden stock camo types edited by SG6732, m16a5-stock modified from m16a5 taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/7e3da429d0abfe55f0d948bb689bd7b49f3f304f/icons/obj/items/weapons/guns/guns_by_faction/colony/assault_rifles.dmi. tactical_stock_221 and tactical_stock_221_guard created by @TadJohnson00 (GitHub).", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "smg-brace-on" + }, + { + "name": "smg-brace" + }, + { + "name": "smgstockcol" + }, + { + "name": "smgstockcol-on" + }, + { + "name": "smgstock" + }, + { + "name": "ou_stock" + }, + { + "name": "stock" + }, + { + "name": "s_stock" + }, + { + "name": "d_stock" + }, + { + "name": "c_stock" + }, + { + "name": "u_stock" + }, + { + "name": "abr40stock" + }, + { + "name": "abr40stock_tac" + }, + { + "name": "l42stock" + }, + { + "name": "nsg23_stock" + }, + { + "name": "m54-folding-on" + }, + { + "name": "m54-folding" + }, + { + "name": "riflestock" + }, + { + "name": "r4t-stock" + }, + { + "name": "s_r4t-stock" + }, + { + "name": "u_r4t-stock" + }, + { + "name": "d_r4t-stock" + }, + { + "name": "c_r4t-stock" + }, + { + "name": "smg-brace_a-on" + }, + { + "name": "smg-brace_a" + }, + { + "name": "smgstockcol_a" + }, + { + "name": "smgstockcol_a-on" + }, + { + "name": "smgstock_a" + }, + { + "name": "abr40stock_a" + }, + { + "name": "abr40stock_tac_a" + }, + { + "name": "l42stock_a" + }, + { + "name": "m54-folding_a-on" + }, + { + "name": "m54-folding_a" + }, + { + "name": "riflestock_a" + }, + { + "name": "44stock-on" + }, + { + "name": "44stock" + }, + { + "name": "ar10_stock" + }, + { + "name": "m16-stock" + }, + { + "name": "m16-folding-on" + }, + { + "name": "m16-folding" + }, + { + "name": "m16a5-stock" + }, + { + "name": "boomslang-stock" + }, + { + "name": "d_boomslang-stock" + }, + { + "name": "s_boomslang-stock" + }, + { + "name": "c_boomslang-stock" + }, + { + "name": "u_boomslang-stock" + }, + { + "name": "m54markstock" + }, + { + "name": "huntingstock" + }, + { + "name": "slavicstock" + }, + { + "name": "type23_stock" + }, + { + "name": "twobore_stock" + }, + { + "name": "model12_stock" + }, + { + "name": "hg3717_stock" + }, + { + "name": "db-stock" + }, + { + "name": "44stock_old" + }, + { + "name": "tactical_stock" + }, + { + "name": "tactical_stock_a" + }, + { + "name": "m44r_stock" + }, + { + "name": "m77_stock" + }, + { + "name": "m77_stock_a" + }, + { + "name": "vulture_stock" + }, + { + "name": "d_vulture_stock" + }, + { + "name": "s_vulture_stock" + }, + { + "name": "c_vulture_stock" + }, + { + "name": "u_vulture_stock" + }, + { + "name": "uppmg_stock" + }, + { + "name": "hjra_breech" + }, + { + "name": "type71_stock" + }, + { + "name": "m60_stock" + }, + { + "name": "xm51_stock" + }, + { + "name": "s_xm51_stock" + }, + { + "name": "d_xm51_stock" + }, + { + "name": "c_xm51_stock" + }, + { + "name": "u_xm51_stock" + }, + { + "name": "tactical_stock_221" + }, + { + "name": "tactical_stock_221_guard" + }, + { + "name": "mp5_stock" + }, + { + "name": "mp5_stock-on" + }, + { + "name": "mp5_stock_a" + }, + { + "name": "mp5_stock_a-on" + }, + { + "name": "c_m10_stock" + }, + { + "name": "m10_stock" + }, + { + "name": "d_m10_stock" + }, + { + "name": "u_m10_stock" + }, + { + "name": "s_m10_stock" + }, + { + "name": "m10_stock_a" + }, + { + "name": "d_m10_stock_a" + }, + { + "name": "u_m10_stock_a" + }, + { + "name": "s_m10_stock_a" + }, + { + "name": "c_m10_stock_a" + }, + { + "name": "lpo80-stock" + } + ] +} diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/model12_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/model12_stock.png new file mode 100644 index 0000000000000..9a8d8ce1b1f92 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/model12_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock-on.png new file mode 100644 index 0000000000000..0301579c4814b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock.png new file mode 100644 index 0000000000000..67099f3558b46 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a-on.png new file mode 100644 index 0000000000000..0301579c4814b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a.png new file mode 100644 index 0000000000000..67099f3558b46 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/mp5_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/nsg23_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/nsg23_stock.png new file mode 100644 index 0000000000000..f3c44facde4c0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/nsg23_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ou_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ou_stock.png new file mode 100644 index 0000000000000..a985533ddf5f1 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/ou_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/r4t-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/r4t-stock.png new file mode 100644 index 0000000000000..c65a740634884 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/r4t-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock.png new file mode 100644 index 0000000000000..5b5b2886863dc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock_a.png new file mode 100644 index 0000000000000..9b0ab782ce2eb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/riflestock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_boomslang-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_boomslang-stock.png new file mode 100644 index 0000000000000..6a90cdacf99ed Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_boomslang-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock.png new file mode 100644 index 0000000000000..89bf8f14e6e9e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock_a.png new file mode 100644 index 0000000000000..38e7719484b17 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_m10_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_r4t-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_r4t-stock.png new file mode 100644 index 0000000000000..f08a1d64daa8d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_r4t-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_stock.png new file mode 100644 index 0000000000000..88b767a243d05 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_vulture_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_vulture_stock.png new file mode 100644 index 0000000000000..a0bc1a036dbec Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_vulture_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_xm51_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_xm51_stock.png new file mode 100644 index 0000000000000..68e1997ca2d24 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/s_xm51_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/slavicstock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/slavicstock.png new file mode 100644 index 0000000000000..52bd97365bd54 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/slavicstock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace-on.png new file mode 100644 index 0000000000000..aa472709ce073 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace.png new file mode 100644 index 0000000000000..68b10ebdbc6cd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a-on.png new file mode 100644 index 0000000000000..e42ce0661c2c8 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a.png new file mode 100644 index 0000000000000..9ad5d98298853 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smg-brace_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock.png new file mode 100644 index 0000000000000..7072aa991c50c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock_a.png new file mode 100644 index 0000000000000..2c3a16d9fd441 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol-on.png new file mode 100644 index 0000000000000..3a479971b46f0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol.png new file mode 100644 index 0000000000000..3aac94df5f387 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a-on.png new file mode 100644 index 0000000000000..037734da4cc02 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a.png new file mode 100644 index 0000000000000..fcee68b4dc1d3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/smgstockcol_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/stock.png new file mode 100644 index 0000000000000..86bdcb72253ce Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock.png new file mode 100644 index 0000000000000..fea129dd90d1d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221.png new file mode 100644 index 0000000000000..227fc6ef06c8c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221_guard.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221_guard.png new file mode 100644 index 0000000000000..f297b877b2484 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_221_guard.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_a.png new file mode 100644 index 0000000000000..fea129dd90d1d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/tactical_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/twobore_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/twobore_stock.png new file mode 100644 index 0000000000000..b5d7e32678b26 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/twobore_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type23_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type23_stock.png new file mode 100644 index 0000000000000..db2fcda5a7376 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type23_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type71_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type71_stock.png new file mode 100644 index 0000000000000..164fbc4f15049 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/type71_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_boomslang-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_boomslang-stock.png new file mode 100644 index 0000000000000..f8aefe7c11b72 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_boomslang-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock.png new file mode 100644 index 0000000000000..01a16d312f415 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock_a.png new file mode 100644 index 0000000000000..d40048756c046 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_m10_stock_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_r4t-stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_r4t-stock.png new file mode 100644 index 0000000000000..78a008bb7efba Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_r4t-stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_stock.png new file mode 100644 index 0000000000000..e21c736587db4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_vulture_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_vulture_stock.png new file mode 100644 index 0000000000000..5d331d881b5c9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_vulture_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_xm51_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_xm51_stock.png new file mode 100644 index 0000000000000..ed7101f9e1214 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/u_xm51_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/uppmg_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/uppmg_stock.png new file mode 100644 index 0000000000000..206a8dbe4be1a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/uppmg_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/vulture_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/vulture_stock.png new file mode 100644 index 0000000000000..d9aecacbf58a2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/vulture_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/xm51_stock.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/xm51_stock.png new file mode 100644 index 0000000000000..875cd4a103f0b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/stock.rsi/xm51_stock.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip.png new file mode 100644 index 0000000000000..ab24c4f348809 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip_a.png new file mode 100644 index 0000000000000..10bcfcbe31640 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/angledgrip_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod-on.png new file mode 100644 index 0000000000000..45574774fcf3c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod.png new file mode 100644 index 0000000000000..cc7fe9eca1e69 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a-on.png new file mode 100644 index 0000000000000..472efd3657a44 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a.png new file mode 100644 index 0000000000000..a6fa1fcce62db Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60-on.png new file mode 100644 index 0000000000000..212ff842bd3ae Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60.png new file mode 100644 index 0000000000000..47783e3e7f66e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a-on.png new file mode 100644 index 0000000000000..49b9063c280cc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a.png new file mode 100644 index 0000000000000..b5925d84e0edd Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/bipod_m60_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling.png new file mode 100644 index 0000000000000..39b65af2b0dcc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling_a.png new file mode 100644 index 0000000000000..85c7e626cd056 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_r4t-sling_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod-on.png new file mode 100644 index 0000000000000..2a7cba65699a3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod.png new file mode 100644 index 0000000000000..95f28d5a45fff Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/c_vulture_bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling.png new file mode 100644 index 0000000000000..9db25c7c5888c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling_a.png new file mode 100644 index 0000000000000..30c26e0acfe22 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_r4t-sling_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod-on.png new file mode 100644 index 0000000000000..ab2a2975226d2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod.png new file mode 100644 index 0000000000000..d0d06415ab0c0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/d_vulture_bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher-on.png new file mode 100644 index 0000000000000..82f7ad54b8fc9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher.png new file mode 100644 index 0000000000000..d550c8641c023 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher_a.png new file mode 100644 index 0000000000000..f4c5cbb763955 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/extinguisher_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle-on.png new file mode 100644 index 0000000000000..a600cd9df0c2d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle.png new file mode 100644 index 0000000000000..568ccfb101889 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_0.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_0.png new file mode 100644 index 0000000000000..193f031fd0be0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_0.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_1.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_1.png new file mode 100644 index 0000000000000..eb21aad01a47b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamer_nozzle_a_1.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower-on.png new file mode 100644 index 0000000000000..d38ddf3b47453 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower.png new file mode 100644 index 0000000000000..e1e36f0cc5068 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower_a.png new file mode 100644 index 0000000000000..d70b74f00c0ed Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flamethrower_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip-on.png new file mode 100644 index 0000000000000..63fcd4991dcc2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip.png new file mode 100644 index 0000000000000..4c255cce8d96f Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a-on.png new file mode 100644 index 0000000000000..4e4251fb71db3 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a.png new file mode 100644 index 0000000000000..b8ac0a5d1751d Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/flashgrip_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-on.png new file mode 100644 index 0000000000000..35958a43f44fa Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open.png new file mode 100644 index 0000000000000..dea5ca476fedb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open_a.png new file mode 100644 index 0000000000000..dea5ca476fedb Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203-open_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203.png new file mode 100644 index 0000000000000..18f20f8fdbe57 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203_a.png new file mode 100644 index 0000000000000..26e52ab3c6cb9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-m203_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-on.png new file mode 100644 index 0000000000000..b0a4d83e753ba Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open.png new file mode 100644 index 0000000000000..4030b6c1e2d6a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open_a.png new file mode 100644 index 0000000000000..0dc85372a870a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1-open_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1.png new file mode 100644 index 0000000000000..fabbbcffe2e47 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1_a.png new file mode 100644 index 0000000000000..d4ef9139bde53 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-mk1_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-on.png new file mode 100644 index 0000000000000..17ef7e4961bd7 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open.png new file mode 100644 index 0000000000000..2a761d8b4e037 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open_a.png new file mode 100644 index 0000000000000..f21dbedb97488 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade-open_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade.png new file mode 100644 index 0000000000000..7577549dfb423 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade_a.png new file mode 100644 index 0000000000000..1f33b7b48b2ed Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/grenade_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro.png new file mode 100644 index 0000000000000..7f3d3a2002254 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro_a.png new file mode 100644 index 0000000000000..e7dab14982f6c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/gyro_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight-on.png new file mode 100644 index 0000000000000..a389b080e8912 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight.png new file mode 100644 index 0000000000000..b5658370a105b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a-on.png new file mode 100644 index 0000000000000..548bd9a12a5f2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a.png new file mode 100644 index 0000000000000..3f57f4852b96b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/laserlight_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight.png new file mode 100644 index 0000000000000..0f603c31b8ec2 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_a.png new file mode 100644 index 0000000000000..ce25d7d0f373c Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro.png new file mode 100644 index 0000000000000..a166c1a842eca Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro_a.png new file mode 100644 index 0000000000000..cebc427c96967 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/lasersight_micro_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey-on.png new file mode 100644 index 0000000000000..222ad13c746f6 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey.png new file mode 100644 index 0000000000000..4f47df56ede17 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey_a.png new file mode 100644 index 0000000000000..01aa23e1a71f4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/masterkey_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/meta.json b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/meta.json new file mode 100644 index 0000000000000..8609f06f428ae --- /dev/null +++ b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/meta.json @@ -0,0 +1,283 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/44751f0cc11332a5ba4f05ef91b2d72a0b08082b/icons/obj/items/weapons/guns/attachments/under.dmi, grenade-mk1_a.png grenade-mk1-open_a.png edited by Cephalopod222, flashgrip flashgrip-on flashgrip_a flashgrip_a-on by Sigma Draconis. laserlight resprite by VictorJob, flamethrower by github noctyrnal", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "rapidfire" + }, + { + "name": "bipod" + }, + { + "name": "bipod-on" + }, + { + "name": "bipod_m60" + }, + { + "name": "bipod_m60-on" + }, + { + "name": "lasersight" + }, + { + "name": "lasersight_micro" + }, + { + "name": "laserlight" + }, + { + "name": "gyro" + }, + { + "name": "angledgrip" + }, + { + "name": "verticalgrip" + }, + { + "name": "flashgrip" + }, + { + "name": "flashgrip-on" + }, + { + "name": "rxfm5_eva_doodad" + }, + { + "name": "r4t-sling" + }, + { + "name": "d_r4t-sling" + }, + { + "name": "s_r4t-sling" + }, + { + "name": "u_r4t-sling" + }, + { + "name": "c_r4t-sling" + }, + { + "name": "extinguisher" + }, + { + "name": "grenade-mk1" + }, + { + "name": "grenade-mk1-open" + }, + { + "name": "grenade" + }, + { + "name": "grenade-open" + }, + { + "name": "grenade-m203" + }, + { + "name": "grenade-m203-open" + }, + { + "name": "flamethrower", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "masterkey" + }, + { + "name": "flamer_nozzle" + }, + { + "name": "rapidfire_a" + }, + { + "name": "bipod_a" + }, + { + "name": "bipod_a-on" + }, + { + "name": "bipod_m60_a" + }, + { + "name": "bipod_m60_a-on" + }, + { + "name": "lasersight_a" + }, + { + "name": "lasersight_micro_a" + }, + { + "name": "laserlight_a" + }, + { + "name": "laserlight_a-on" + }, + { + "name": "gyro_a", + "delays": [ + [ + 0.6, + 0.6, + 0.6, + 0.6 + ] + ] + }, + { + "name": "angledgrip_a" + }, + { + "name": "verticalgrip_a" + }, + { + "name": "flashgrip_a" + }, + { + "name": "flashgrip_a-on" + }, + { + "name": "rxfm5_eva_doodad_a" + }, + { + "name": "s_r4t-sling_a" + }, + { + "name": "u_r4t-sling_a" + }, + { + "name": "d_r4t-sling_a" + }, + { + "name": "r4t-sling_a" + }, + { + "name": "c_r4t-sling_a" + }, + { + "name": "vulture_bipod" + }, + { + "name": "vulture_bipod-on" + }, + { + "name": "s_vulture_bipod" + }, + { + "name": "s_vulture_bipod-on" + }, + { + "name": "u_vulture_bipod" + }, + { + "name": "u_vulture_bipod-on" + }, + { + "name": "c_vulture_bipod" + }, + { + "name": "c_vulture_bipod-on" + }, + { + "name": "d_vulture_bipod" + }, + { + "name": "d_vulture_bipod-on" + }, + { + "name": "extinguisher_a" + }, + { + "name": "grenade-mk1_a" + }, + { + "name": "grenade_a" + }, + { + "name": "grenade-mk1-open_a" + }, + { + "name": "grenade-open_a" + }, + { + "name": "grenade-m203_a" + }, + { + "name": "grenade-m203-open_a" + }, + { + "name": "flamethrower_a", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "masterkey_a" + }, + { + "name": "flamer_nozzle_a_0" + }, + { + "name": "flamer_nozzle_a_1" + }, + { + "name": "flamethrower-on", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "extinguisher-on" + }, + { + "name": "masterkey-on" + }, + { + "name": "grenade-mk1-on" + }, + { + "name": "grenade-on" + }, + { + "name": "flamer_nozzle-on" + }, + { + "name": "grenade-m203-on" + }, + { + "name": "laserlight-on" + }, + { + "name": "qyj72_bipod" + }, + { + "name": "qyj72_bipod-on" + }, + { + "name": "qyj72_bipod_a" + }, + { + "name": "qyj72_bipod_a-on" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod-on.png new file mode 100644 index 0000000000000..08aea159cf5d4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod.png new file mode 100644 index 0000000000000..80e5e58c4dee0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a-on.png new file mode 100644 index 0000000000000..08aea159cf5d4 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a.png new file mode 100644 index 0000000000000..80e5e58c4dee0 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/qyj72_bipod_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling.png new file mode 100644 index 0000000000000..39b65af2b0dcc Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling_a.png new file mode 100644 index 0000000000000..85c7e626cd056 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/r4t-sling_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire.png new file mode 100644 index 0000000000000..1ab4a1d286f25 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire_a.png new file mode 100644 index 0000000000000..1b4b8ed708881 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rapidfire_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad.png new file mode 100644 index 0000000000000..05682a6d2bfb7 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad_a.png new file mode 100644 index 0000000000000..ddd214859722a Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/rxfm5_eva_doodad_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling.png new file mode 100644 index 0000000000000..3f84d6357e87b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling_a.png new file mode 100644 index 0000000000000..3c2ba255dce28 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_r4t-sling_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod-on.png new file mode 100644 index 0000000000000..1d684ad24aec9 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod.png new file mode 100644 index 0000000000000..c94de116b0ce7 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/s_vulture_bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling.png new file mode 100644 index 0000000000000..a5ce2aef3e62b Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling_a.png new file mode 100644 index 0000000000000..3be592cf03a94 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_r4t-sling_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod-on.png new file mode 100644 index 0000000000000..5d08acc33370e Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod.png new file mode 100644 index 0000000000000..67bffec8c20ae Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/u_vulture_bipod.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip.png new file mode 100644 index 0000000000000..354410309f005 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip_a.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip_a.png new file mode 100644 index 0000000000000..ae260f9751d45 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/verticalgrip_a.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod-on.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod-on.png new file mode 100644 index 0000000000000..201f905a96424 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod-on.png differ diff --git a/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod.png b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod.png new file mode 100644 index 0000000000000..8bdff1945b614 Binary files /dev/null and b/Resources/Textures/_CM14/Objects/Weapons/Guns/Attachments/under.rsi/vulture_bipod.png differ diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index a4c3d8cbe0872..690085740be5b 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -659,3 +659,22 @@ binds: type: State key: MouseMiddle canFocus: true +- function: CMActivateAttachableBarrel + type: State + key: Z + mod1: Shift +- function: CMActivateAttachableRail + type: State + key: C + mod1: Shift +- function: CMActivateAttachableStock + type: State + key: X + mod1: Shift +- function: CMActivateAttachableUnderbarrel + type: State + key: V + mod1: Shift +- function: CMUniqueAction + type: State + key: Space diff --git a/needed.txt b/needed.txt new file mode 100644 index 0000000000000..8b137891791fe --- /dev/null +++ b/needed.txt @@ -0,0 +1 @@ +