diff --git a/Content.Server/Explosion/Components/ExplosiveComponent.cs b/Content.Server/Explosion/Components/ExplosiveComponent.cs index 04a08955a35..2b27a89d9db 100644 --- a/Content.Server/Explosion/Components/ExplosiveComponent.cs +++ b/Content.Server/Explosion/Components/ExplosiveComponent.cs @@ -81,6 +81,13 @@ public sealed partial class ExplosiveComponent : Component [DataField("deleteAfterExplosion")] public bool? DeleteAfterExplosion; + /// + /// Whether to not set to true, allowing it to explode multiple times. + /// This should never be used if it is damageable. + /// + [DataField] + public bool Repeatable; + /// /// Avoid somehow double-triggering this explosion (e.g. by damaging this entity from its own explosion. /// diff --git a/Content.Server/Explosion/Components/RepeatingTriggerComponent.cs b/Content.Server/Explosion/Components/RepeatingTriggerComponent.cs new file mode 100644 index 00000000000..cc08de53f90 --- /dev/null +++ b/Content.Server/Explosion/Components/RepeatingTriggerComponent.cs @@ -0,0 +1,25 @@ +using Content.Server.Explosion.EntitySystems; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server.Explosion.Components; + +/// +/// Constantly triggers after being added to an entity. +/// +[RegisterComponent, Access(typeof(TriggerSystem))] +[AutoGenerateComponentPause] +public sealed partial class RepeatingTriggerComponent : Component +{ + /// + /// How long to wait between triggers. + /// The first trigger starts this long after the component is added. + /// + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(1); + + /// + /// When the next trigger will be. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] + public TimeSpan NextTrigger; +} diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 1f91b28ec2b..eb2cf9b6548 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -165,7 +165,7 @@ public void TriggerExplosive(EntityUid uid, ExplosiveComponent? explosive = null if (explosive.Exploded) return; - explosive.Exploded = true; + explosive.Exploded = !explosive.Repeatable; // Override the explosion intensity if optional arguments were provided. if (radius != null) diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index eb5aeec8158..37c63438152 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -98,6 +98,7 @@ public override void Initialize() SubscribeLocalEvent(OnStepTriggered); SubscribeLocalEvent(OnSlipTriggered); SubscribeLocalEvent(OnEmptyTriggered); + SubscribeLocalEvent(OnRepeatInit); SubscribeLocalEvent(OnSpawnTrigger); SubscribeLocalEvent(HandleDeleteTrigger); @@ -278,6 +279,11 @@ private void OnEmptyTriggered(EntityUid uid, TriggerWhenEmptyComponent component Trigger(uid, args.EmptyGun); } + private void OnRepeatInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextTrigger = _timing.CurTime + ent.Comp.Delay; + } + public bool Trigger(EntityUid trigger, EntityUid? user = null) { var triggerEvent = new TriggerEvent(trigger, user); @@ -360,6 +366,7 @@ public override void Update(float frameTime) UpdateProximity(); UpdateTimer(frameTime); UpdateTimedCollide(frameTime); + UpdateRepeat(); } private void UpdateTimer(float frameTime) @@ -394,5 +401,19 @@ private void UpdateTimer(float frameTime) _appearance.SetData(uid, TriggerVisuals.VisualState, TriggerVisualState.Unprimed, appearance); } } + + private void UpdateRepeat() + { + var now = _timing.CurTime; + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.NextTrigger > now) + continue; + + comp.NextTrigger = now + comp.Delay; + Trigger(uid); + } + } } } diff --git a/Content.Shared/Access/Components/IdCardConsoleComponent.cs b/Content.Shared/Access/Components/IdCardConsoleComponent.cs index 5fe5fe1024b..16aaae9b45b 100644 --- a/Content.Shared/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/IdCardConsoleComponent.cs @@ -72,7 +72,6 @@ public WriteToTargetIdMessage(string fullName, string jobTitle, List ent, ref Before } #region Hands - /// /// Spawns a virtual item in a empty hand /// @@ -151,7 +150,7 @@ public void DeleteInHandsMatching(EntityUid user, EntityUid matching) /// /// The entity we will make a virtual entity copy of /// The entity that we want to insert the virtual entity - /// The slot to which we will insert the virtual entity (could be the "shoes" slot, for example)The slot to which we will insert the virtual entity (could be the "shoes" slot, for example) /// Whether or not to force an equip public bool TrySpawnVirtualItemInInventory(EntityUid blockingEnt, EntityUid user, string slot, bool force = false) { @@ -173,6 +172,8 @@ public bool TrySpawnVirtualItemInInventory(EntityUid blockingEnt, EntityUid user /// that's done check if the found virtual entity is a copy of our matching entity, /// if it is, delete it /// + /// The entity that we want to delete the virtual entity from + /// The entity that made the virtual entity /// Set this param if you have the name of the slot, it avoids unnecessary queries /// The entity that we want to delete the virtual entity from /// The entity that made the virtual entity diff --git a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs index e1c6f8395d0..ff3db32fd6f 100644 --- a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs +++ b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs @@ -74,12 +74,20 @@ public void EnsureValid(ICommonSession session, IDependencyCollection collection { var loadout = loadouts[i]; + // Old prototype or otherwise invalid. if (!protoManager.TryIndex(loadout.Prototype, out var loadoutProto)) { loadouts.RemoveAt(i); continue; } + // Malicious client maybe, check the group even has it. + if (!groupProto.Loadouts.Contains(loadout.Prototype)) + { + loadouts.RemoveAt(i); + continue; + } + // Validate the loadout can be applied (e.g. points). if (!IsValid(session, loadout.Prototype, collection, out _)) { diff --git a/Content.Shared/Weapons/Ranged/Components/ActionGunComponent.cs b/Content.Shared/Weapons/Ranged/Components/ActionGunComponent.cs new file mode 100644 index 00000000000..112339efd74 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Components/ActionGunComponent.cs @@ -0,0 +1,37 @@ +using Content.Shared.Actions; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Weapons.Ranged.Components; + +/// +/// Lets you shoot a gun using an action. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(ActionGunSystem))] +public sealed partial class ActionGunComponent : Component +{ + /// + /// Action to create, must use . + /// + [DataField(required: true)] + public EntProtoId Action = string.Empty; + + [DataField] + public EntityUid? ActionEntity; + + /// + /// Prototype of gun entity to spawn. + /// Deleted when this component is removed. + /// + [DataField(required: true)] + public EntProtoId GunProto = string.Empty; + + [DataField] + public EntityUid? Gun; +} + +/// +/// Action event for to shoot at a position. +/// +public sealed partial class ActionGunShootEvent : WorldTargetActionEvent; diff --git a/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs b/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs index 0c9802e7ae0..0d938a89065 100644 --- a/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs +++ b/Content.Shared/Weapons/Ranged/Events/ShotAttemptedEvent.cs @@ -1,4 +1,6 @@ using Content.Shared.Weapons.Ranged.Components; + + namespace Content.Shared.Weapons.Ranged.Events; /// diff --git a/Content.Shared/Weapons/Ranged/Systems/ActionGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/ActionGunSystem.cs new file mode 100644 index 00000000000..f3dfe8a2a03 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Systems/ActionGunSystem.cs @@ -0,0 +1,41 @@ +using Content.Shared.Actions; +using Content.Shared.Weapons.Ranged.Components; + +namespace Content.Shared.Weapons.Ranged.Systems; + +public sealed class ActionGunSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedGunSystem _gun = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnShoot); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (string.IsNullOrEmpty(ent.Comp.Action)) + return; + + _actions.AddAction(ent, ref ent.Comp.ActionEntity, ent.Comp.Action); + ent.Comp.Gun = Spawn(ent.Comp.GunProto); + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (ent.Comp.Gun is {} gun) + QueueDel(gun); + } + + private void OnShoot(Entity ent, ref ActionGunShootEvent args) + { + if (TryComp(ent.Comp.Gun, out var gun)) + _gun.AttemptShoot(ent, ent.Comp.Gun.Value, gun, args.Target); + } +} + diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index cedfb3f4629..743405f8fc6 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -210,8 +210,9 @@ public bool TryWield(EntityUid used, WieldableComponent component, EntityUid use if (component.WieldSound != null) _audioSystem.PlayPredicted(component.WieldSound, used, user); - - var virtuals = new List(); + + + var virtuals = new List(); for (var i = 0; i < component.FreeHandsRequired; i++) { if (_virtualItemSystem.TrySpawnVirtualItemInHand(used, user, out var virtualItem, true)) diff --git a/Resources/Audio/_NF/Jukebox/attributions.yml b/Resources/Audio/_NF/Jukebox/attributions.yml new file mode 100644 index 00000000000..92e453f3ef3 --- /dev/null +++ b/Resources/Audio/_NF/Jukebox/attributions.yml @@ -0,0 +1,4 @@ +- files: ["lateraligator.ogg"] + license: "CC-BY-3.0" + copyright: "Later Alligator By Silverman Sound Studios. Converted to mono ogg" + source: "https://soundcloud.com/silvermansound/later-alligator" diff --git a/Resources/Audio/_NF/Jukebox/lateraligator.ogg b/Resources/Audio/_NF/Jukebox/lateraligator.ogg new file mode 100644 index 00000000000..e4186cccdf9 Binary files /dev/null and b/Resources/Audio/_NF/Jukebox/lateraligator.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f6548202538..8489a3c74a0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4710,3 +4710,44 @@ Entries: Frontier. id: 4997 time: '2024-05-31T11:11:02.0000000+00:00' +- author: dvir01 + changes: + - type: Tweak + message: Added more selections to loadouts options! make sure to pick new items! + id: 4998 + time: '2024-06-01T12:46:43.0000000+00:00' +- author: Katarn1933 + changes: + - type: Add + message: New swampy tune for jukebox + id: 4999 + time: '2024-06-01T13:03:59.0000000+00:00' +- author: erhardsteinhauer + changes: + - type: Add + message: >- + Added new messenger bags: arcadia, chaplain, chief engineer, contractor, + SR, security, black, blue, green, orange, red, purple, brown, light + brown, white. Most of new messenger bags available through loadouts. + - type: Tweak + message: >- + Resprited some messenger bags a bit (engineering, janitor, cultist, both + NFSD). + id: 5000 + time: '2024-06-01T14:44:45.0000000+00:00' +- author: erhardsteinhauer + changes: + - type: Fix + message: >- + Mail RPDS, N2554 Pattern Repeater and BB gun no longer turn invisible if + wielded or put in suit storage slot. + id: 5001 + time: '2024-06-01T15:17:54.0000000+00:00' +- author: Leander + changes: + - type: Tweak + message: >- + Silver Industries has released the argenti 2.0 with improved chamber and + shooting speed. + id: 5002 + time: '2024-06-01T16:30:25.0000000+00:00' diff --git a/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl b/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl index b2e2b077145..79a9a45c33a 100644 --- a/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/_NF/preferences/loadout-groups.ftl @@ -14,12 +14,6 @@ loadout-group-contractor-face = mask loadout-group-contractor-utility = tools loadout-group-contractor-fun = fun loadout-group-contractor-trinkets = trinkets -# Security - -loadout-group-security-guard-jumpsuit = head -loadout-group-security-guard-jumpsuit = jumpsuit -loadout-group-security-guard-gloves = gloves -loadout-group-security-guard-head = head -loadout-group-security-guard-outerclothing = outer clothing -loadout-group-security-guard-shoes = shoes -loadout-group-security-guard-id = ID +loadout-group-contractor-survival-box = survival box +loadout-group-contractor-encryption-key = encryption keys +loadout-group-contractor-implanter = implanters \ No newline at end of file diff --git a/Resources/Locale/en-US/wieldable/wieldable-component.ftl b/Resources/Locale/en-US/wieldable/wieldable-component.ftl index c92c0dab905..84b58224a77 100644 --- a/Resources/Locale/en-US/wieldable/wieldable-component.ftl +++ b/Resources/Locale/en-US/wieldable/wieldable-component.ftl @@ -1,4 +1,4 @@ -### Locale for wielding items; i.e. two-handing them +### Locale for wielding items; i.e. two-handing them wieldable-verb-text-wield = Wield wieldable-verb-text-unwield = Unwield @@ -17,4 +17,4 @@ wieldable-component-not-in-hands = { CAPITALIZE(THE($item)) } isn't in your hand wieldable-component-requires = { CAPITALIZE(THE($item))} must be wielded! -gunwieldbonus-component-examine = This weapon has improved accuracy when wielded. \ No newline at end of file +gunwieldbonus-component-examine = This weapon has improved accuracy when wielded. diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index dd47e1f015d..db359351e79 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -20,7 +20,6 @@ - Mail # Frontier - Medical - Mercenary # Frontier - - Pilot # Frontier - Quartermaster - Salvage - Cargo diff --git a/Resources/Prototypes/Catalog/Jukebox/Standard.yml b/Resources/Prototypes/Catalog/Jukebox/Standard.yml index 75a9bc8c8ae..2c8d44f19fc 100644 --- a/Resources/Prototypes/Catalog/Jukebox/Standard.yml +++ b/Resources/Prototypes/Catalog/Jukebox/Standard.yml @@ -57,5 +57,3 @@ name: Toby Fox - Undertale path: path: /Audio/Jukebox/undertale.ogg - - diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml index 2da725939f1..d313d408024 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml @@ -12,16 +12,17 @@ MagazineVector45Practice: 10 #FrontierCorvax MagazineBoxVector45: 5 #FrontierCorvax MagazineBoxVector45Practice: 10 #FrontierCorvax -# MagazineBoxLightRifleRubber: 15 # Frontier - TODO: Restore Rubber + MagazineBoxLightRifleRubber: 15 WeaponShotgunDoubleBarreled: 10 + WeaponRevolverArgenti: 10 BoxShotgunSlug: 10 BoxLethalshot: 10 BoxBeanbag: 10 BoxShotgunPractice: 10 - WeaponRevolverArgenti: 10 MagazineBoxRifle: 10 -# MagazineBoxRifleRubber: 15 # Frontier - TODO: Restore Rubber - MagazineBoxRiflePractice: 10 + MagazineBoxRifleRubber: 15 MagazineBoxMagnum: 10 + SpeedLoaderRifleHeavy: 10 + SpeedLoaderRifleHeavyRubber: 10 emaggedInventory: WeaponPistolViper: 1 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Fun/toy_guns.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Fun/toy_guns.yml index 9acf9740191..cbe7fea8475 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Fun/toy_guns.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Fun/toy_guns.yml @@ -1,6 +1,6 @@ - type: entity name: BB Gun - parent: BaseItem + parent: [BaseItem, BaseGunWieldable] # Frontier id: WeaponRifleBB description: The classic Red Ryder BB gun. Don't shoot your eye out. components: @@ -39,4 +39,4 @@ ents: [] - type: Appearance - type: StaticPrice - price: 2750 + price: 500 diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index c58577722c2..76260bb9e83 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -89,6 +89,12 @@ speedModifierThresholds: 250: 0.7 400: 0.5 + # disable taking damage from fire, since its a fire breathing dragon + - type: Flammable + damage: + types: {} + - type: Temperature + heatDamageThreshold: 800 - type: Metabolizer solutionOnBody: false updateInterval: 0.25 @@ -134,15 +140,37 @@ - type: entity parent: BaseMobDragon id: MobDragon + suffix: No role or objectives components: - type: Dragon spawnRiftAction: ActionSpawnRift - # - type: GenericAntag - # rule: Dragon + - type: ActionGun + action: ActionDragonsBreath + gunProto: DragonsBreathGun - type: GuideHelp guides: - MinorAntagonists +- type: entity + noSpawn: true + id: DragonsBreathGun + name: dragon's lung + description: For dragon's breathing + components: + - type: RechargeBasicEntityAmmo + rechargeCooldown: 5 + rechargeSound: + path: /Audio/Animals/space_dragon_roar.ogg + - type: BasicEntityAmmoProvider + proto: ProjectileDragonsBreath + capacity: 1 + count: 1 + - type: Gun + soundGunshot: + path: /Audio/Animals/space_dragon_roar.ogg + soundEmpty: null + projectileSpeed: 5 + - type: entity parent: BaseMobDragon id: MobDragonDungeon @@ -181,6 +209,7 @@ state: icon event: !type:DragonSpawnRiftActionEvent useDelay: 1 + priority: 3 - type: entity id: ActionDevour @@ -192,3 +221,18 @@ icon: { sprite : Interface/Actions/devour.rsi, state: icon } iconOn: { sprite : Interface/Actions/devour.rsi, state: icon-on } event: !type:DevourActionEvent + priority: 1 + +- type: entity + noSpawn: true + id: ActionDragonsBreath + name: "[color=orange]Dragon's Breath[/color]" + description: Spew out flames at anyone foolish enough to attack you! + components: + - type: WorldTargetAction + # TODO: actual sprite + icon: { sprite : Objects/Weapons/Guns/Projectiles/magic.rsi, state: fireball } + event: !type:ActionGunShootEvent + priority: 2 + checkCanAccess: false + range: 0 diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 65c958c16af..0c06c4d6e3d 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -44,7 +44,6 @@ - Maintenance - Medical - Mercenary # Frontier - - Pilot # Frontier - Quartermaster - Research - ResearchDirector diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml index d5fb4360a82..3241a892262 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml @@ -102,4 +102,4 @@ map: ["enum.GunVisualLayers.Base"] - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - - state: uranium + - state: uranium \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml index a35a42d8c2a..73f29189864 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml @@ -43,3 +43,4 @@ - state: tip map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml index 741f0a4e1a0..5ce0bf82fe9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml @@ -19,3 +19,14 @@ damage: types: Blunt: 2 + +- type: entity + id: BulletCaselessRifleRubber + name: bullet (.25 caseless rubber) + parent: BaseBulletRubber + noSpawn: true + components: + - type: Projectile + damage: + types: + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml index 8b9fb9aa2f5..b69efdb1aa6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml @@ -21,6 +21,17 @@ types: Blunt: 2 +- type: entity + id: BulletLightRifleRubber + name: bullet (.20 rifle rubber) + parent: BaseBulletRubber + noSpawn: true + components: + - type: Projectile + damage: + types: + Blunt: 3 + - type: entity id: BulletLightRifleIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml index 1201da619a7..84a079ff765 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml @@ -21,6 +21,19 @@ types: Blunt: 1 +- type: entity + id: BulletMagnumRubber + name: bullet (.45 magnum rubber) + parent: BaseBulletRubber + noSpawn: true + components: + - type: Projectile + damage: + types: + Blunt: 3 + - type: StaminaDamageOnCollide + damage: 35 # 3 hits to stun cuz revolver + - type: entity id: BulletMagnumIncendiary parent: BaseBulletIncendiary @@ -32,7 +45,7 @@ types: Blunt: 3 Heat: 32 - + - type: entity id: BulletMagnumAP name: bullet (.45 magnum armor-piercing) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml index 3cfcc0cf206..086a8dc914f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml @@ -20,6 +20,17 @@ types: Blunt: 2 +- type: entity + id: BulletPistolRubber + name: bullet (.35 auto rubber) + parent: BaseBulletRubber + noSpawn: true + components: + - type: Projectile + damage: + types: + Blunt: 3 + - type: entity id: BulletPistolIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml index 5b819d12f4f..99278c99b5a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml @@ -21,6 +21,17 @@ types: Blunt: 2 +- type: entity + id: BulletRifleRubber + name: bullet (0.20 rifle rubber) + parent: BaseBulletRubber + noSpawn: true + components: + - type: Projectile + damage: + types: + Blunt: 3 + - type: entity id: BulletRifleIncendiary parent: BaseBulletIncendiary @@ -32,7 +43,7 @@ types: Blunt: 2 Heat: 15 - + - type: entity id: BulletRifleUranium parent: BaseBulletUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml index 38eb2bfdf2f..70cc3e6eed3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_wieldable.yml @@ -9,4 +9,4 @@ maxAngle: -30 - type: Gun minAngle: 21 - maxAngle: 32 \ No newline at end of file + maxAngle: 32 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 576545f8e86..642447b49e5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -204,7 +204,7 @@ - type: entity name: laser rifle - parent: BaseWeaponBattery + parent: [BaseWeaponBattery, BaseGunWieldable] id: WeaponLaserCarbine description: A simple civilian grade laser carbine, the workhorse of many private security organizations. components: @@ -271,7 +271,7 @@ - type: entity name: pulse carbine - parent: BaseWeaponBattery + parent: [BaseWeaponBattery, BaseGunWieldable] id: WeaponPulseCarbine description: A high tech energy carbine favoured by the NT-ERT operatives. On the handle is a label that says 'for authorized use only.' components: @@ -302,7 +302,7 @@ - type: entity name: pulse rifle - parent: BaseWeaponBattery + parent: [BaseWeaponBattery, BaseGunWieldable] id: WeaponPulseRifle description: A weapon that is almost as infamous as its users. On the handle is a label that says 'for authorized use only.' components: @@ -329,7 +329,7 @@ - type: entity name: laser cannon - parent: BaseWeaponBattery + parent: [BaseWeaponBattery, BaseGunWieldable] id: WeaponLaserCannon description: A heavy duty, high powered laser weapon. On the handle is a label that says 'for authorized use only.' components: @@ -388,7 +388,7 @@ - type: entity name: x-ray cannon - parent: BaseWeaponBattery + parent: [BaseWeaponBattery, BaseGunWieldable] id: WeaponXrayCannon description: An illegal and experimental weapon that uses concentrated x-ray energy against its target. components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index baf16f15598..495acc5bf9e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -23,7 +23,7 @@ - type: entity name: china lake - parent: BaseWeaponLauncher + parent: [BaseWeaponLauncher, BaseGunWieldable] id: WeaponLauncherChinaLake description: PLOOP components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml index 3556d1c8f8b..d6adcd614e3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml @@ -30,6 +30,39 @@ - type: IgniteOnCollide fireStacks: 0.35 +- type: entity + noSpawn: true + parent: BaseBulletTrigger + id: ProjectileDragonsBreath + name: dragon's breath + description: Try not to get toasted. + components: + - type: PointLight + color: "#E25822" + radius: 3.0 + energy: 5.0 + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/magic.rsi + layers: + - state: fireball + shader: unshaded + - type: IgnitionSource + temperature: 1000 + ignited: true + - type: RepeatingTrigger + delay: 0.5 # line of fire as well as if it hits something + - type: ExplodeOnTrigger + - type: Explosive + explosionType: FireBomb + totalIntensity: 5 # low intensity, the point is to burn attackers not to break open walls, dragons can just eat them + intensitySlope: 1 + maxIntensity: 3 + canCreateVacuum: false + deleteAfterExplosion: false + repeatable: true + - type: TimedDespawn + lifetime: 5 + - type: entity id: ProjectileAnomalyFireball name: fireball diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 528a8e5904d..bc8a1b7360b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -104,6 +104,25 @@ types: Blunt: 1 +- type: entity + id: BaseBulletRubber + name: base bullet rubber + parent: BaseBullet + noSpawn: true + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi + layers: + - state: rubber + - type: Projectile + damage: + types: + Blunt: 3 + soundHit: + path: /Audio/Weapons/Guns/Hits/snap.ogg + - type: StaminaDamageOnCollide + damage: 22 # 5 hits to stun sounds reasonable + - type: entity id: BaseBulletIncendiary name: base bullet incendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index bbb13a8ea6f..1fe12a97aa6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -1,6 +1,6 @@ - type: entity name: BaseWeaponRifle - parent: BaseItem + parent: [BaseItem, BaseGunWieldable] id: BaseWeaponRifle description: A rooty tooty point and shooty. abstract: true @@ -187,3 +187,4 @@ steps: 1 zeroVisible: true - type: Appearance + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index c696ff34121..40e0f586f76 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -20,7 +20,7 @@ maxAngle: 16 fireRate: 8 angleIncrease: 3 - angleDecay: 16 + angleDecay: 16 selectedMode: FullAuto availableModes: - SemiAuto @@ -81,7 +81,7 @@ - type: entity name: C-20r sub machine gun - parent: BaseWeaponSubMachineGun + parent: [BaseWeaponSubMachineGun, BaseGunWieldable] id: WeaponSubMachineGunC20r description: An illegal firearm that is often used by the infamous nuclear operatives. Uses .35 auto ammo. components: @@ -95,6 +95,8 @@ - type: Clothing sprite: Objects/Weapons/Guns/SMGs/c20r.rsi - type: Gun + minAngle: 21 + maxAngle: 32 shotsPerBurst: 5 availableModes: - SemiAuto @@ -113,7 +115,7 @@ - type: entity name: Drozd - parent: BaseWeaponSubMachineGun + parent: [BaseWeaponSubMachineGun, BaseGunWieldable] id: WeaponSubMachineGunDrozd description: An excellent fully automatic Heavy SMG. An illegal firearm often used by Syndicate agents. components: @@ -127,6 +129,8 @@ - type: Clothing sprite: Objects/Weapons/Guns/SMGs/drozd.rsi - type: Gun + minAngle: 21 + maxAngle: 32 fireRate: 6 selectedMode: FullAuto soundGunshot: @@ -232,7 +236,7 @@ minAngle: 1 maxAngle: 6 angleIncrease: 1.5 - angleDecay: 6 + angleDecay: 6 selectedMode: FullAuto shotsPerBurst: 5 availableModes: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 9db9456341f..13f6c2f5000 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -47,7 +47,7 @@ - type: entity name: Bulldog # Don't parent to BaseWeaponShotgun because it differs significantly - parent: BaseItem + parent: [BaseItem, BaseGunWieldable] id: WeaponShotgunBulldog description: It's a magazine-fed shotgun designed for close quarters combat. Uses .50 shotgun shells. An illegal firearm often used by Syndicate agents. components: @@ -67,6 +67,7 @@ - Back - suitStorage - type: AmmoCounter + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: Gun fireRate: 2 selectedMode: FullAuto @@ -104,7 +105,7 @@ - type: entity name: double-barreled shotgun - parent: BaseWeaponShotgun + parent: [BaseWeaponShotgun, BaseGunWieldable] id: WeaponShotgunDoubleBarreled description: An immortal classic. A civilian grade shotgun. Uses .50 shotgun shells. components: @@ -114,8 +115,8 @@ size: Normal shape: - 0,0,4,0 - sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi - heldPrefix: db + sprite: Objects/Weapons/Guns/Shotguns/db_shotgun_inhands_64x.rsi + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: Gun fireRate: 2 - type: BallisticAmmoProvider @@ -139,7 +140,7 @@ - type: entity name: Enforcer - parent: BaseWeaponShotgun + parent: [BaseWeaponShotgun, BaseGunWieldable] id: WeaponShotgunEnforcer description: A premium combat shotgun based on the Kammerer design, featuring an upgraded clip capacity. .50 shotgun shells. On the receiver is a label that says 'for authorized use only.' components: @@ -148,9 +149,9 @@ - type: Clothing sprite: Objects/Weapons/Guns/Shotguns/enforcer.rsi - type: Item - sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi - heldPrefix: enforcer + sprite: Objects/Weapons/Guns/Shotguns/enforcer_inhands_64x.rsi - type: BallisticAmmoProvider + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: entity parent: WeaponShotgunEnforcer @@ -162,7 +163,7 @@ - type: entity name: Kammerer - parent: BaseWeaponShotgun + parent: [BaseWeaponShotgun, BaseGunWieldable] id: WeaponShotgunKammerer description: When an old Remington design meets modern materials, this is the result. A civilian grade shotgun, favored by militia forces throughout many worlds. Uses .50 shotgun shells. components: @@ -170,12 +171,12 @@ size: Normal shape: - 0,0,4,0 - sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi - heldPrefix: pump + sprite: Objects/Weapons/Guns/Shotguns/pump_inhands_64x.rsi - type: Sprite sprite: Objects/Weapons/Guns/Shotguns/pump.rsi - type: Clothing sprite: Objects/Weapons/Guns/Shotguns/pump.rsi + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: BallisticAmmoProvider capacity: 4 - type: Tag @@ -194,8 +195,7 @@ sprite: Objects/Weapons/Guns/Shotguns/sawn.rsi - type: Item size: Small - sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi - heldPrefix: sawn + sprite: Objects/Weapons/Guns/Shotguns/sawn_inhands_64x.rsi - type: Gun fireRate: 4 - type: BallisticAmmoProvider @@ -243,7 +243,7 @@ - type: entity name: blunderbuss - parent: BaseWeaponShotgun + parent: [BaseWeaponShotgun, BaseGunWieldable] id: WeaponShotgunBlunderbuss suffix: Pirate description: Deadly at close range, an illegal shotgun often found at the side of a pirate. @@ -254,6 +254,7 @@ - 0,0,4,0 - type: Sprite sprite: Objects/Weapons/Guns/Shotguns/blunderbuss.rsi + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: Gun fireRate: 2 - type: BallisticAmmoProvider @@ -263,7 +264,7 @@ - type: entity name: improvised shotgun - parent: BaseWeaponShotgun + parent: [BaseWeaponShotgun, BaseGunWieldable] id: WeaponShotgunImprovised description: A shitty, but legal, hand-made shotgun that uses .50 shotgun shells. It can only hold one round in the chamber. components: @@ -275,8 +276,8 @@ size: Normal shape: - 0,0,4,0 - sprite: Objects/Weapons/Guns/Shotguns/inhands_64x.rsi - heldPrefix: improvised + sprite: Objects/Weapons/Guns/Shotguns/improvised_shotgun_inhands_64x.rsi + - type: GunRequiresWield #remove when inaccuracy on spreads is fixed - type: Gun fireRate: 4 #No reason to stifle the firerate since you have to manually reload every time anyways. - type: BallisticAmmoProvider diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 826cf9ca13a..27bdca7bdfe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -41,7 +41,7 @@ - type: entity name: Kardashev-Mosin - parent: BaseWeaponSniper + parent: [BaseWeaponSniper, BaseGunWieldable] id: WeaponSniperMosin description: A civilian grade weapon for hunting, or endless trench warfare. Uses .30 rifle ammo. components: @@ -52,7 +52,7 @@ - type: entity name: Hristov - parent: BaseWeaponSniper + parent: [BaseWeaponSniper, BaseGunWieldable] id: WeaponSniperHristov description: A portable anti-materiel rifle. Fires armor piercing 14.5mm shells. Uses .60 anti-materiel ammo. On the receiver is a label that says 'for authorized use only.' components: diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index d78f93dd358..45e60239eda 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -198,6 +198,8 @@ - ShellTranquilizer - SpeedLoaderMagnum - SpeedLoaderMagnumEmpty + - SpeedLoaderRifleHeavy # Frontier + - SpeedLoaderRifleHeavyEmpty # Frontier emagDynamicRecipes: - BoxBeanbag - BoxShotgunIncendiary @@ -236,6 +238,8 @@ - PowerCageSmall - SpeedLoaderMagnumIncendiary - SpeedLoaderMagnumUranium + - SpeedLoaderRifleHeavyIncendiary # Frontier + - SpeedLoaderRifleHeavyUranium # Frontier - type: entity id: AutolatheHyperConvection @@ -912,6 +916,8 @@ - RiotShield - SpeedLoaderMagnum - SpeedLoaderMagnumEmpty + - SpeedLoaderRifleHeavy # Frontier + - SpeedLoaderRifleHeavyEmpty # Frontier - Stunbaton - TargetClown - TargetHuman @@ -984,6 +990,8 @@ - SignalTrigger - SpeedLoaderMagnumIncendiary - SpeedLoaderMagnumUranium + - SpeedLoaderRifleHeavyIncendiary # Frontier + - SpeedLoaderRifleHeavyUranium # Frontier - TelescopicShield - TimerTrigger - Truncheon @@ -1051,6 +1059,8 @@ - ShellTranquilizer - SpeedLoaderMagnum - SpeedLoaderMagnumEmpty + - SpeedLoaderRifleHeavy # Frontier + - SpeedLoaderRifleHeavyEmpty # Frontier - type: MaterialStorage whitelist: tags: diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index 316082562ba..7d9aedee1fd 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -75,8 +75,12 @@ groups: - LawyerNeck - LawyerJumpsuit - - LawyerBackpack + - ContractorBackpack - ContractorGlasses + - ContractorFace + - ContractorBoxSurvival + - ContractorEncryptionKey + - ContractorImplanter - ContractorFun - ContractorTrinkets @@ -87,9 +91,12 @@ - ChaplainMask - ChaplainNeck - ChaplainJumpsuit - - ChaplainBackpack + - ContractorBackpack - ChaplainOuterClothing - ContractorGlasses + - ContractorBoxSurvival + - ContractorEncryptionKey + - ContractorImplanter - ContractorFun - ContractorTrinkets @@ -99,9 +106,13 @@ - JanitorHead - JanitorJumpsuit - JanitorGloves - - CommonBackpack + - ContractorBackpack - JanitorOuterClothing + - ContractorFace - ContractorGlasses + - ContractorBoxSurvival + - ContractorEncryptionKey + - ContractorImplanter - ContractorFun - ContractorTrinkets diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml index ac623c3584c..c1cb949e981 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml @@ -16,7 +16,5 @@ - type: startingGear id: PrisonerGear equipment: - jumpsuit: ClothingUniformJumpsuitPrisoner shoes: ClothingShoesColorBlack - id: PrisonerPDA ears: ClothingHeadsetGrey diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index e681edde32c..9bd44354868 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -37,6 +37,7 @@ - MagazinePistolIncendiary - MagazineLightRifleIncendiary - SpeedLoaderMagnumIncendiary + - SpeedLoaderRifleHeavyIncendiary # Frontier - MagazineShotgunIncendiary - MagazineBoxPistolIncendiary - MagazineBoxMagnumIncendiary @@ -92,6 +93,7 @@ - MagazinePistolUranium - MagazineLightRifleUranium - SpeedLoaderMagnumUranium + - SpeedLoaderRifleHeavyUranium # Frontier - MagazineBoxPistolUranium - MagazineBoxMagnumUranium - MagazineBoxLightRifleUranium diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 677449cfac8..5395e9ed861 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -22,3 +22,5 @@ shoes: ClothingShoesColorBlack id: ChaplainPDA ears: ClothingHeadsetService + pocket1: Bible # Frontier + pocket2: RubberStampChaplain # Frontier diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index 347f4185df1..b2bf348ebde 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -16,10 +16,10 @@ - type: startingGear id: LawyerGear equipment: - jumpsuit: ClothingUniformJumpsuitLawyerBlack # TODO change jumpsuit to randomiser of the 4 variants - back: ClothingBackpackLawyerFilled # Frontier shoes: ClothingShoesBootsLaceup id: LawyerPDA - ears: ClothingHeadsetSecurity + ears: ClothingHeadsetNfsdGreen # Frontier ClothingHeadsetSecurity