From 4df62fdc569da7d21f8fa35b86598375455e6199 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Thu, 19 Feb 2026 10:18:49 +0300 Subject: [PATCH 1/8] RobustToolbox --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index f509405022..c65fe5cb79 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit f509405022cf75c3a906b2e1bd0a3e8e7eafe3bc +Subproject commit c65fe5cb790d0fbdb90c0637c61892a96bb6bfb2 From a2304530e9b27c02fd9a5ba9135ae96ab40cf7e4 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Thu, 19 Feb 2026 16:17:47 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=81=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/_Goobstation/VehicleSystem.cs | 105 ++++ Content.Server/Mech/Systems/MechSystem.cs | 414 +++++++++++-- Content.Server/_Goobstation/VehicleSystem.cs | 7 + .../WhitelistClothingSystems.cs | 25 + .../Mech/Components/MechComponent.cs | 142 ++--- .../Mech/Components/MechImplantsComponents.cs | 10 + .../Mech/Components/MechPassengerComponent.cs | 15 + .../Mech/EntitySystems/SharedMechSystem.cs | 248 +++++--- Content.Shared/Mech/SharedMech.cs | 5 +- .../_Goobstation/SharedVehicleComponent.cs | 81 +++ .../_Goobstation/SharedVehicleSystem.cs | 254 ++++++++ .../WhitelistClothingComponents.cs | 12 + Resources/Audio/Mecha/cardrive.ogg | Bin 0 -> 29890 bytes .../entities/objects/vehicles/vehicle.ftl | 1 + Resources/Locale/ru-RU/mech/mech.ftl | 12 + .../Roles/Jobs/BrotherhoodMidwest/Serf.yml | 1 + .../Jobs/Townfolk/Townshopkeeperhelper.yml | 12 +- .../Roles/Jobs/Townfolk/town_entity.yml | 3 +- .../human_inventory_template.yml | 3 + .../supermutant_inventory_template.yml | 133 +++++ .../Prototypes/Species/species_weights.yml | 3 +- .../Prototypes/_Goobstation/Actions/types.yml | 19 + .../Entities/Markers/Spawners/vehicles.yml | 55 ++ .../_Goobstation/Entities/Unique/keys.yml | 67 +++ .../Entities/Unique/motorbike_keys.yml | 13 + .../_Goobstation/Entities/Unique/siren.yml | 4 + .../_Goobstation/Entities/Unique/vehicles.yml | 205 +++++++ .../Body/Parts/Supermutant_parts.yml | 476 +++++++++++++++ .../OuterClothing/supermutant_armor.yml | 94 +++ .../Entities/Objects/Vehicles/cars.yml | 202 +++++++ .../Objects/Vehicles/landvehicles.yml | 312 ++++++---- .../Entities/Structures/Doors/access.yml | 22 + .../Structures/Doors/access_slanted.yml | 34 +- .../Roles/Jobs/BrotherhoodMidwest/squire.yml | 1 + .../_Nuclear14/Roles/Jobs/Fun/followers.yml | 3 +- .../Roles/Jobs/Townsfolk/Towndoctor.yml | 8 +- .../Roles/Jobs/Townsfolk/Townmechanic.yml | 2 + .../Roles/Jobs/Townsfolk/Townshopkeeper.yml | 8 +- .../Roles/Jobs/Townsfolk/Townsperson.yml | 10 +- .../Roles/Jobs/Townsfolk/bartender.yml | 8 +- .../Roles/Jobs/Townsfolk/reporter.yml | 10 +- .../Roles/Jobs/Townsfolk/towndeputy.yml | 2 + .../Roles/Jobs/Townsfolk/townmayor.yml | 6 +- .../Roles/Jobs/Townsfolk/townsheriff.yml | 6 +- .../Roles/Jobs/Wastelanders/chaplain.yml | 2 + .../Roles/Jobs/Wastelanders/farmer.yml | 9 +- .../_Nuclear14/Species/Supermutant.yml | 550 ++++++++++++++++++ Resources/Prototypes/_Nuclear14/tags.yml | 20 +- .../_Shitmed/Damage/modifier_sets.yml | 11 + .../alkotop.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 2145 bytes .../InnerClothingm/alkotop.rsi/icon.png | Bin 0 -> 722 bytes .../alkotop.rsi/inhand-left.png | Bin 0 -> 459 bytes .../alkotop.rsi/inhand-right.png | Bin 0 -> 570 bytes .../InnerClothingm/alkotop.rsi/meta.json | 26 + .../master.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 1794 bytes .../MutantArmor/master.rsi/icon.png | Bin 0 -> 567 bytes .../MutantArmor/master.rsi/inhand-left.png | Bin 0 -> 810 bytes .../MutantArmor/master.rsi/inhand-right.png | Bin 0 -> 794 bytes .../MutantArmor/master.rsi/meta.json | 26 + .../metal.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 2142 bytes .../MutantArmor/metal.rsi/icon.png | Bin 0 -> 813 bytes .../MutantArmor/metal.rsi/inhand-left.png | Bin 0 -> 583 bytes .../MutantArmor/metal.rsi/inhand-right.png | Bin 0 -> 570 bytes .../MutantArmor/metal.rsi/meta.json | 26 + .../wild.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 2224 bytes .../MutantArmor/wild.rsi/icon.png | Bin 0 -> 694 bytes .../MutantArmor/wild.rsi/inhand-left.png | Bin 0 -> 583 bytes .../MutantArmor/wild.rsi/inhand-right.png | Bin 0 -> 570 bytes .../MutantArmor/wild.rsi/meta.json | 26 + .../organs.rsi/appendix-inflamed.png | Bin 0 -> 188 bytes .../Supermutant/organs.rsi/appendix.png | Bin 0 -> 158 bytes .../organs.rsi/brain-inhand-left.png | Bin 0 -> 300 bytes .../organs.rsi/brain-inhand-right.png | Bin 0 -> 312 bytes .../Species/Supermutant/organs.rsi/brain.png | Bin 0 -> 461 bytes .../Species/Supermutant/organs.rsi/ears.png | Bin 0 -> 619 bytes .../Supermutant/organs.rsi/eyeball-l.png | Bin 0 -> 364 bytes .../Supermutant/organs.rsi/eyeball-r.png | Bin 0 -> 354 bytes .../Supermutant/organs.rsi/heart-off.png | Bin 0 -> 242 bytes .../Supermutant/organs.rsi/heart-on.png | Bin 0 -> 436 bytes .../Supermutant/organs.rsi/kidney-l.png | Bin 0 -> 262 bytes .../Supermutant/organs.rsi/kidney-r.png | Bin 0 -> 259 bytes .../Species/Supermutant/organs.rsi/liver.png | Bin 0 -> 290 bytes .../Species/Supermutant/organs.rsi/lung-l.png | Bin 0 -> 279 bytes .../Species/Supermutant/organs.rsi/lung-r.png | Bin 0 -> 275 bytes .../Species/Supermutant/organs.rsi/meta.json | 80 +++ .../Species/Supermutant/organs.rsi/muscle.png | Bin 0 -> 219 bytes .../Species/Supermutant/organs.rsi/nerve.png | Bin 0 -> 155 bytes .../Supermutant/organs.rsi/stomach.png | Bin 0 -> 191 bytes .../Species/Supermutant/organs.rsi/tongue.png | Bin 0 -> 375 bytes .../Species/Supermutant/organs.rsi/vessel.png | Bin 0 -> 170 bytes .../Species/Supermutant/parts.rsi/full.png | Bin 0 -> 1913 bytes .../Species/Supermutant/parts.rsi/head_f.png | Bin 0 -> 563 bytes .../Species/Supermutant/parts.rsi/head_m.png | Bin 0 -> 563 bytes .../Species/Supermutant/parts.rsi/l_arm.png | Bin 0 -> 468 bytes .../Species/Supermutant/parts.rsi/l_foot.png | Bin 0 -> 290 bytes .../Species/Supermutant/parts.rsi/l_hand.png | Bin 0 -> 322 bytes .../Species/Supermutant/parts.rsi/l_leg.png | Bin 0 -> 436 bytes .../Species/Supermutant/parts.rsi/meta.json | 62 ++ .../Species/Supermutant/parts.rsi/r_arm.png | Bin 0 -> 464 bytes .../Species/Supermutant/parts.rsi/r_foot.png | Bin 0 -> 299 bytes .../Species/Supermutant/parts.rsi/r_hand.png | Bin 0 -> 339 bytes .../Species/Supermutant/parts.rsi/r_leg.png | Bin 0 -> 460 bytes .../Species/Supermutant/parts.rsi/torso_f.png | Bin 0 -> 832 bytes .../Species/Supermutant/parts.rsi/torso_m.png | Bin 0 -> 830 bytes .../Vehicles/highwayman.rsi/highwayman1.png | Bin 0 -> 11682 bytes .../Vehicles/highwayman.rsi/highwayman2.png | Bin 0 -> 18804 bytes .../highwayman.rsi/highwayman_open.png | Bin 0 -> 12777 bytes .../Objects/Vehicles/highwayman.rsi/meta.json | 45 ++ 108 files changed, 3548 insertions(+), 388 deletions(-) create mode 100644 Content.Client/_Goobstation/VehicleSystem.cs create mode 100644 Content.Server/_Goobstation/VehicleSystem.cs create mode 100644 Content.Server/_N14/WhitelistClothing/WhitelistClothingSystems.cs create mode 100644 Content.Shared/Mech/Components/MechImplantsComponents.cs create mode 100644 Content.Shared/Mech/Components/MechPassengerComponent.cs create mode 100644 Content.Shared/_Goobstation/SharedVehicleComponent.cs create mode 100644 Content.Shared/_Goobstation/SharedVehicleSystem.cs create mode 100644 Content.Shared/_N14/WhitelistClothing/WhitelistClothingComponents.cs create mode 100644 Resources/Audio/Mecha/cardrive.ogg create mode 100644 Resources/Locale/en-US/ss14-ru/prototypes/_nuclear14/entities/objects/vehicles/vehicle.ftl create mode 100644 Resources/Prototypes/InventoryTemplates/supermutant_inventory_template.yml create mode 100644 Resources/Prototypes/_Goobstation/Actions/types.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/vehicles.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Unique/keys.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Unique/motorbike_keys.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Unique/siren.yml create mode 100644 Resources/Prototypes/_Goobstation/Entities/Unique/vehicles.yml create mode 100644 Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml create mode 100644 Resources/Prototypes/_Nuclear14/Entities/Clothing/OuterClothing/supermutant_armor.yml create mode 100644 Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml create mode 100644 Resources/Prototypes/_Nuclear14/Species/Supermutant.yml create mode 100644 Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/icon.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/inhand-left.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/inhand-right.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/icon.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/inhand-left.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/inhand-right.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/icon.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/inhand-left.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/inhand-right.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/icon.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/inhand-left.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/inhand-right.png create mode 100644 Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix-inflamed.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain-inhand-left.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain-inhand-right.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/ears.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-l.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-r.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/heart-off.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/heart-on.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-l.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-r.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/liver.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-l.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-r.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/muscle.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/nerve.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/stomach.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/tongue.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/vessel.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/full.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_f.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_m.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_arm.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_foot.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_hand.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_leg.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/meta.json create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_arm.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_foot.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_hand.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_leg.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_f.png create mode 100644 Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_m.png create mode 100644 Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman1.png create mode 100644 Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman2.png create mode 100644 Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman_open.png create mode 100644 Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/meta.json diff --git a/Content.Client/_Goobstation/VehicleSystem.cs b/Content.Client/_Goobstation/VehicleSystem.cs new file mode 100644 index 0000000000..2d0575c1f5 --- /dev/null +++ b/Content.Client/_Goobstation/VehicleSystem.cs @@ -0,0 +1,105 @@ +using System.Numerics; +using System.Collections.Generic; +using Robust.Shared.Maths; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.GameObjects; +using Content.Shared.Vehicles; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; + +namespace Content.Client.Vehicles; + +public sealed class VehicleSystem : SharedVehicleSystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly IEyeManager _eye = default!; + [Dependency] private readonly SpriteSystem _sprites = default!; + + private const float FreezeRotationSpeed = 3f; + private readonly Dictionary _lastRotation = new(); + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnMove); + SubscribeLocalEvent(OnShutdown); + } + + private void OnAppearanceChange(EntityUid uid, VehicleComponent comp, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (!_appearance.TryGetData(uid, VehicleState.Animated, out var animated)) + return; + + if (!TryComp(uid, out var spriteComp)) + return; + + SpritePos(uid, comp); + spriteComp.LayerSetAutoAnimated(0, animated); + } + + private void OnMove(EntityUid uid, VehicleComponent component, ref MoveEvent args) + { + SpritePos(uid, component); + + if (!TryComp(uid, out var physics)) + return; + + if (!TryComp(uid, out var xform)) + return; + + var speed = physics.LinearVelocity.Length(); + + if (!_lastRotation.ContainsKey(uid)) + _lastRotation[uid] = xform.LocalRotation; + + if (speed >= FreezeRotationSpeed) + { + xform.LocalRotation = _lastRotation[uid]; + } + else + { + _lastRotation[uid] = xform.LocalRotation; + } + } + + private void OnShutdown(EntityUid uid, VehicleComponent comp, ComponentShutdown args) + { + _lastRotation.Remove(uid); + } + + private void SpritePos(EntityUid uid, VehicleComponent comp) + { + if (!TryComp(uid, out var spriteComp)) + return; + + if (!_appearance.TryGetData(uid, VehicleState.DrawOver, out var depth)) + return; + + spriteComp.DrawDepth = (int)Content.Shared.DrawDepth.DrawDepth.Objects; + + if (comp.RenderOver == VehicleRenderOver.None) + return; + + var eye = _eye.CurrentEye; + var vehicleDir = (Transform(uid).LocalRotation + eye.Rotation).GetCardinalDir(); + var renderOver = (VehicleRenderOver)(1 << (int)vehicleDir); + + if ((comp.RenderOver & renderOver) == renderOver) + { + spriteComp.DrawDepth = (int)Content.Shared.DrawDepth.DrawDepth.OverMobs; + } + else if (depth) + { + spriteComp.DrawDepth = (int)Content.Shared.DrawDepth.DrawDepth.OverMobs; + } + else + { + spriteComp.DrawDepth = (int)Content.Shared.DrawDepth.DrawDepth.Objects; + } + } +} diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index b7bbc4ad47..0bd1fff6fe 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -23,10 +23,18 @@ using Robust.Shared.Containers; using Robust.Shared.Player; using Content.Shared.Whitelist; - +// Forge-Change-start +using Content.Shared.Actions; +using Robust.Shared.Audio.Systems; +using Content.Shared.Implants.Components; // for IgnitionKey? Might need a new component +using Content.Shared.Vehicles; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Content.Shared.Atmos; +using Content.Shared.Hands.EntitySystems; +// Forge-Change-end namespace Content.Server.Mech.Systems; -/// public sealed partial class MechSystem : SharedMechSystem { [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; @@ -39,6 +47,12 @@ public sealed partial class MechSystem : SharedMechSystem [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; [Dependency] private readonly SharedToolSystem _toolSystem = default!; + // Forge-Change-start + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedMoverController _mover = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + // Forge-Change-end /// public override void Initialize() @@ -46,19 +60,23 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInteractUsing); - SubscribeLocalEvent(OnInsertBattery); + SubscribeLocalEvent(OnContainerInserted); // Forge-Change + SubscribeLocalEvent(OnRemoveIgnition); // Forge-Change SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent>(OnAlternativeVerb); SubscribeLocalEvent(OnOpenUi); SubscribeLocalEvent(OnRemoveBattery); + SubscribeLocalEvent(OnRemoveIgnitionKey); // Forge-Change SubscribeLocalEvent(OnMechEntry); SubscribeLocalEvent(OnMechExit); - + SubscribeLocalEvent(OnMechPassengerEntry); // Forge-Change SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnRemoveEquipmentMessage); - SubscribeLocalEvent(OnMechCanMoveEvent); - + SubscribeLocalEvent(OnActivate); // Forge-Change + SubscribeLocalEvent(OnEjectPassenger1); // Forge-Change + SubscribeLocalEvent(OnEjectPassenger2); // Forge-Change + SubscribeLocalEvent(OnEjectPassenger3); // Forge-Change SubscribeLocalEvent(OnToolUseAttempt); SubscribeLocalEvent(OnInhale); @@ -72,18 +90,43 @@ public override void Initialize() SubscribeLocalEvent(ReceiveEquipmentUiMesssages); #endregion } + // Forge-Change-start + #region Movement & Engine private void OnMechCanMoveEvent(EntityUid uid, MechComponent component, UpdateCanMoveEvent args) { - if (component.Broken || component.Integrity <= 0 || component.Energy <= 0) + if (component.Broken || component.Integrity <= 0 || component.Energy <= 0 || !component.EngineRunning) args.Cancel(); } + private void UpdateEngineRunning(EntityUid uid, MechComponent component) + { + if (component.PilotSlot.ContainedEntity != null) + { + if (component.EngineRunning) + _mover.SetRelay(component.PilotSlot.ContainedEntity.Value, uid); + else + RemComp(component.PilotSlot.ContainedEntity.Value); + } + _actionBlocker.UpdateCanMove(uid); + } + + #endregion + + #region Interaction (Using items) private void OnInteractUsing(EntityUid uid, MechComponent component, InteractUsingEvent args) { - if (TryComp(uid, out var panel) && !panel.Open) + bool isKeyInteraction = HasComp(args.Used); + + if (!isKeyInteraction && TryComp(uid, out var panel) && !panel.Open) return; + if (isKeyInteraction && component.IgnitionSlot.ContainedEntity == null) + { + InsertIgnitionKey(uid, args.Used, component); + _actionBlocker.UpdateCanMove(uid); + return; + } if (component.BatterySlot.ContainedEntity == null && TryComp(args.Used, out var battery)) { InsertBattery(uid, args.Used, component, battery); @@ -93,26 +136,104 @@ private void OnInteractUsing(EntityUid uid, MechComponent component, InteractUsi if (_toolSystem.HasQuality(args.Used, "Prying") && component.BatterySlot.ContainedEntity != null) { + if (TryComp(uid, out var panelCheck) && !panelCheck.Open) + return; + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.BatteryRemovalDelay, new RemoveBatteryEvent(), uid, target: uid, used: args.Target) { BreakOnMove = true }; - _doAfter.TryStartDoAfter(doAfterEventArgs); + return; + } + } + #endregion + + #region Container handling + + private void OnContainerInserted(EntityUid uid, MechComponent component, EntInsertedIntoContainerMessage args) + { + if (args.Container == component.BatterySlot && TryComp(args.Entity, out var battery)) + { + component.Energy = battery.CurrentCharge; + component.MaxEnergy = battery.MaxCharge; + Dirty(uid, component); + _actionBlocker.UpdateCanMove(uid); + UpdateUserInterface(uid, component); + return; } + if (args.Container == component.IgnitionSlot && HasComp(args.Entity)) + { + component.EngineRunning = true; + Dirty(uid, component); + UpdateEngineRunning(uid, component); + return; + } + } + private void OnRemoveIgnition(EntityUid uid, MechComponent component, EntRemovedFromContainerMessage args) + { + if (args.Container != component.IgnitionSlot) + return; + + component.EngineRunning = false; + Dirty(uid, component); + UpdateEngineRunning(uid, component); + } + #endregion + + #region Ignition key methods + private void InsertIgnitionKey(EntityUid uid, EntityUid toInsert, MechComponent component) + { + if (component.IgnitionSlot.ContainedEntity != null) + return; + _container.Insert(toInsert, component.IgnitionSlot); + } + private void RemoveIgnitionKey(EntityUid uid, MechComponent component) + { + if (component.IgnitionSlot.ContainedEntity == null) + return; + _container.EmptyContainer(component.IgnitionSlot); + } + private void OnRemoveIgnitionKey(EntityUid uid, MechComponent component, RemoveIgnitionKeyEvent args) + { + if (args.Cancelled || args.Handled) + return; + RemoveIgnitionKey(uid, component); + args.Handled = true; } + #endregion - private void OnInsertBattery(EntityUid uid, MechComponent component, EntInsertedIntoContainerMessage args) + #region Battery methods + public void InsertBattery(EntityUid uid, EntityUid toInsert, MechComponent? component = null, BatteryComponent? battery = null) { - if (args.Container != component.BatterySlot || !TryComp(args.Entity, out var battery)) + if (!Resolve(uid, ref component, false)) return; + if (!Resolve(toInsert, ref battery, false)) + return; + + _container.Insert(toInsert, component.BatterySlot); component.Energy = battery.CurrentCharge; component.MaxEnergy = battery.MaxCharge; + _actionBlocker.UpdateCanMove(uid); Dirty(uid, component); + UpdateUserInterface(uid, component); + } + public void RemoveBattery(EntityUid uid, MechComponent? component = null) + { + if (!Resolve(uid, ref component)) + return; + + _container.EmptyContainer(component.BatterySlot); + component.Energy = 0; + component.MaxEnergy = 0; + _actionBlocker.UpdateCanMove(uid); + + Dirty(uid, component); + UpdateUserInterface(uid, component); } private void OnRemoveBattery(EntityUid uid, MechComponent component, RemoveBatteryEvent args) @@ -125,25 +246,40 @@ private void OnRemoveBattery(EntityUid uid, MechComponent component, RemoveBatte args.Handled = true; } + #endregion + + #region MapInit, Equipment, Verbs, UI private void OnMapInit(EntityUid uid, MechComponent component, MapInitEvent args) { var xform = Transform(uid); - // TODO: this should use containerfill? foreach (var equipment in component.StartingEquipment) { var ent = Spawn(equipment, xform.Coordinates); InsertEquipment(uid, ent, component); } - // TODO: this should just be damage and battery component.Integrity = component.MaxIntegrity; component.Energy = component.MaxEnergy; + if (component.Airtight && !HasComp(uid)) + { + var airComp = AddComp(uid); + // Создаём стандартную атмосферу Земли (21% O2, 79% N2, 101.325 кПа, 293.15 K) + var volume = airComp.Air.Volume; // = 70 литров (из компонента) + var temp = Atmospherics.T20C; // 293.15 K + var pressure = Atmospherics.OneAtmosphere; // 101.325 кПа + var totalMoles = (pressure * volume) / (Atmospherics.R * temp); // уравнение Менделеева-Клапейрона + + airComp.Air.AdjustMoles(Gas.Oxygen, totalMoles * 0.21f); + airComp.Air.AdjustMoles(Gas.Nitrogen, totalMoles * 0.79f); + airComp.Air.Temperature = temp; + } + _actionBlocker.UpdateCanMove(uid); Dirty(uid, component); } - + // Forge-Change-end private void OnRemoveEquipmentMessage(EntityUid uid, MechComponent component, MechEquipmentRemoveMessage args) { var equip = GetEntity(args.Equipment); @@ -185,41 +321,77 @@ private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsE { BreakOnMove = true, }; - _doAfter.TryStartDoAfter(doAfterEventArgs); } }; - var openUiVerb = new AlternativeVerb //can't hijack someone else's mech + // Forge-Change-start + args.Verbs.Add(enterVerb); + } + else if (!IsEmpty(component) && CanInsertPassenger(uid, args.User, component)) + { + var passengerVerb = new AlternativeVerb { - Act = () => ToggleMechUi(uid, component, args.User), - Text = Loc.GetString("mech-ui-open-verb") + Text = Loc.GetString("mech-verb-enter-passenger"), + Act = () => + { + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.EntryDelay, new MechPassengerEntryEvent(), uid, target: uid) + { + BreakOnMove = true, + }; + _doAfter.TryStartDoAfter(doAfterEventArgs); + } }; - args.Verbs.Add(enterVerb); - args.Verbs.Add(openUiVerb); + args.Verbs.Add(passengerVerb); } - else if (!IsEmpty(component)) + + var openUiVerb = new AlternativeVerb + { + Act = () => ToggleMechUi(uid, component, args.User), + Text = Loc.GetString("mech-ui-open-verb") + }; + args.Verbs.Add(openUiVerb); + + if (!IsEmpty(component) || !IsPassengerEmpty(component)) { var ejectVerb = new AlternativeVerb { Text = Loc.GetString("mech-verb-exit"), - Priority = 1, // Promote to top to make ejecting the ALT-click action + Priority = 1, Act = () => { - if (args.User == uid || args.User == component.PilotSlot.ContainedEntity) + if (component.PilotSlot.ContainedEntity == args.User) { TryEject(uid, component); return; } + if (IsPassenger(args.User, component)) + { + TryEjectPassenger(uid, args.User, component); + return; + } + if (args.User == uid) + return; var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.ExitDelay, new MechExitEvent(), uid, target: uid); - _doAfter.TryStartDoAfter(doAfterEventArgs); } }; args.Verbs.Add(ejectVerb); } } + private bool IsPassengerEmpty(MechComponent component) + { + return component.PassengerSlot1.ContainedEntity == null && + component.PassengerSlot2.ContainedEntity == null && + component.PassengerSlot3.ContainedEntity == null; + } + private new bool IsPassenger(EntityUid uid, MechComponent component) + { + return component.PassengerSlot1.ContainedEntity == uid || + component.PassengerSlot2.ContainedEntity == uid || + component.PassengerSlot3.ContainedEntity == uid; + } private void OnMechEntry(EntityUid uid, MechComponent component, MechEntryEvent args) { @@ -232,20 +404,62 @@ private void OnMechEntry(EntityUid uid, MechComponent component, MechEntryEvent return; } - TryInsert(uid, args.Args.User, component); + if (!TryInsert(uid, args.User, component)) + { + _popup.PopupEntity("Cannot enter mech!", args.User); + return; + } + _actionBlocker.UpdateCanMove(uid); args.Handled = true; } + private void OnMechPassengerEntry(EntityUid uid, MechComponent component, MechPassengerEntryEvent args) + { + if (args.Cancelled || args.Handled) + return; + + if (!TryInsertPassenger(uid, args.User, component)) + { + _popup.PopupEntity("Cannot enter as passenger!", args.User); + return; + } + + _popup.PopupEntity("You enter as passenger.", args.User); + args.Handled = true; + } private void OnMechExit(EntityUid uid, MechComponent component, MechExitEvent args) { if (args.Cancelled || args.Handled) return; - TryEject(uid, component); + if (component.PilotSlot.ContainedEntity == args.User) + { + TryEject(uid, component); + } + else if (IsPassenger(args.User, component)) + { + TryEjectPassenger(uid, args.User, component); + } + else + { + foreach (var slot in GetPassengerSlots(component)) + { + if (slot.ContainedEntity != null) + { + TryEjectPassenger(uid, slot.ContainedEntity.Value, component); + args.Handled = true; + return; + } + } + if (component.PilotSlot.ContainedEntity != null) + { + TryEject(uid, component); + } + } args.Handled = true; } - + // Forge-Change-end private void OnDamageChanged(EntityUid uid, MechComponent component, DamageChangedEvent args) { var integrity = component.MaxIntegrity - args.Damageable.TotalDamage; @@ -310,8 +524,14 @@ public override void UpdateUserInterface(EntityUid uid, MechComponent? component public override void BreakMech(EntityUid uid, MechComponent? component = null) { + if (!Resolve(uid, ref component)) + return; + // Forge-Change base.BreakMech(uid, component); + if (component.IgnitionSlot.ContainedEntity != null) + RemoveIgnitionKey(uid, component); +// Forge-Change _ui.CloseUi(uid, MechUiKey.Key); _actionBlocker.UpdateCanMove(uid); } @@ -332,7 +552,7 @@ public override bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechCompo return false; _battery.SetCharge(battery!.Value, batteryComp.CurrentCharge + delta.Float(), batteryComp); - if (batteryComp.CurrentCharge != component.Energy) //if there's a discrepency, we have to resync them + if (batteryComp.CurrentCharge != component.Energy) // Forge-Change { Log.Debug($"Battery charge was not equal to mech charge. Battery {batteryComp.CurrentCharge}. Mech {component.Energy}"); component.Energy = batteryComp.CurrentCharge; @@ -342,38 +562,7 @@ public override bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechCompo return true; } - public void InsertBattery(EntityUid uid, EntityUid toInsert, MechComponent? component = null, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref component, false)) - return; - - if (!Resolve(toInsert, ref battery, false)) - return; - - _container.Insert(toInsert, component.BatterySlot); - component.Energy = battery.CurrentCharge; - component.MaxEnergy = battery.MaxCharge; - - _actionBlocker.UpdateCanMove(uid); - - Dirty(uid, component); - UpdateUserInterface(uid, component); - } - - public void RemoveBattery(EntityUid uid, MechComponent? component = null) - { - if (!Resolve(uid, ref component)) - return; - - _container.EmptyContainer(component.BatterySlot); - component.Energy = 0; - component.MaxEnergy = 0; - - _actionBlocker.UpdateCanMove(uid); - - Dirty(uid, component); - UpdateUserInterface(uid, component); - } + #endregion #region Atmos Handling private void OnInhale(EntityUid uid, MechPilotComponent component, InhaleLocationEvent args) @@ -415,7 +604,7 @@ private void OnExpose(EntityUid uid, MechPilotComponent component, ref AtmosExpo return; } - args.Gas = _atmosphere.GetContainingMixture(component.Mech, excite: args.Excite); + args.Gas = _atmosphere.GetContainingMixture(component.Mech, excite: args.Excite); // Forge-Change args.Handled = true; } @@ -424,11 +613,112 @@ private void OnGetFilterAir(EntityUid uid, MechAirComponent comp, ref GetFilterA if (args.Air != null) return; - // only airtight mechs get internal air if (!TryComp(uid, out var mech) || !mech.Airtight) return; args.Air = comp.Air; } #endregion + // Forge-Change-start + #region Horn & Siren (actions from Vehicle) + protected override void OnHornAction(EntityUid uid, MechComponent component, HornActionEvent args) + { + base.OnHornAction(uid, component, args); + if (args.Handled) + return; + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + if (component.HornSound == null) + return; + _audio.PlayPvs(component.HornSound, uid); + args.Handled = true; + } + protected override void OnSirenAction(EntityUid uid, MechComponent component, SirenActionEvent args) + { + base.OnSirenAction(uid, component, args); + if (args.Handled) + return; + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + if (component.SirenSound == null) + return; + if (component.SirenEnabled) + { + component.SirenStream = _audio.Stop(component.SirenStream); + } + else + { + component.SirenStream = _audio.PlayPvs(component.SirenSound, uid)?.Entity; + } + component.SirenEnabled = !component.SirenEnabled; + args.Handled = true; + } + #endregion + private void OnActivate(EntityUid uid, MechComponent component, ActivateInWorldEvent args) + { + if (args.Handled) + return; + + if (HasComp(args.User) || HasComp(args.User)) + return; + + if (component.IgnitionSlot.ContainedEntity is not { } key) + return; + + if (_hands.TryPickupAnyHand(args.User, key)) + { + _popup.PopupEntity(Loc.GetString("mech-key-removed"), uid, args.User); + } + else + { + Transform(key).Coordinates = Transform(uid).Coordinates; + _popup.PopupEntity(Loc.GetString("mech-key-dropped"), uid, args.User); + } + + _container.Remove(key, component.IgnitionSlot); + args.Handled = true; + } + private void OnEjectPassenger1(EntityUid uid, MechComponent component, MechEjectPassenger1Event args) + { + if (args.Handled) + return; + args.Handled = true; + + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + + if (component.PassengerSlot1.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 1)), uid, args.Performer); + } + private void OnEjectPassenger2(EntityUid uid, MechComponent component, MechEjectPassenger2Event args) + { + if (args.Handled) + return; + args.Handled = true; + + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + + if (component.PassengerSlot2.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 2)), uid, args.Performer); + } + private void OnEjectPassenger3(EntityUid uid, MechComponent component, MechEjectPassenger3Event args) + { + if (args.Handled) + return; + args.Handled = true; + + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + + if (component.PassengerSlot3.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 3)), uid, args.Performer); + } + // Forge-Change-end } diff --git a/Content.Server/_Goobstation/VehicleSystem.cs b/Content.Server/_Goobstation/VehicleSystem.cs new file mode 100644 index 0000000000..7eaab46432 --- /dev/null +++ b/Content.Server/_Goobstation/VehicleSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Vehicles; + +namespace Content.Server.Vehicles; + +public sealed class VehicleSystem : SharedVehicleSystem +{ +} diff --git a/Content.Server/_N14/WhitelistClothing/WhitelistClothingSystems.cs b/Content.Server/_N14/WhitelistClothing/WhitelistClothingSystems.cs new file mode 100644 index 0000000000..3e05033100 --- /dev/null +++ b/Content.Server/_N14/WhitelistClothing/WhitelistClothingSystems.cs @@ -0,0 +1,25 @@ +using Content.Shared.WhitelistClothing.Components; +using Content.Shared.Tag; +using Content.Shared.Inventory.Events; +using Content.Shared.Inventory; + +namespace Content.Server.WhitelistClothing.Systems; + +public sealed class WhitelistClothingSystems : EntitySystem +{ + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEquipAttempt); + } + private void OnEquipAttempt(DidEquipEvent args) + { + if (TryComp(args.Equipee, out var component) && component.WhitelistState == "humanoid" && !_tagSystem.HasTag(args.Equipment, component.Whitelist) && args.Slot.Equals("outerclothing", StringComparison.CurrentCultureIgnoreCase)) + _inventorySystem.TryUnequip(args.Equipee, args.Slot); + else if (TryComp(args.Equipment, out var componentEquipment) && componentEquipment.WhitelistState == "clothing" && !HasComp(args.Equipee)) + _inventorySystem.TryUnequip(args.Equipee, args.Slot); + } +} diff --git a/Content.Shared/Mech/Components/MechComponent.cs b/Content.Shared/Mech/Components/MechComponent.cs index 6ebfde5f99..927a6ca148 100644 --- a/Content.Shared/Mech/Components/MechComponent.cs +++ b/Content.Shared/Mech/Components/MechComponent.cs @@ -1,158 +1,74 @@ using Content.Shared.FixedPoint; using Content.Shared.Whitelist; +using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; namespace Content.Shared.Mech.Components; -/// -/// A large, pilotable machine that has equipment that is -/// powered via an internal battery. -/// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class MechComponent : Component { - /// - /// Goobstation: Whether or not an emag disables it. - /// [DataField("breakOnEmag")] [AutoNetworkedField] public bool BreakOnEmag = true; - - /// - /// How much "health" the mech has left. - /// [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public FixedPoint2 Integrity; - - /// - /// The maximum amount of damage the mech can take. - /// [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 MaxIntegrity = 250; - - /// - /// How much energy the mech has. - /// Derived from the currently inserted battery. - /// [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public FixedPoint2 Energy = 0; - - /// - /// The maximum amount of energy the mech can have. - /// Derived from the currently inserted battery. - /// [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] public FixedPoint2 MaxEnergy = 0; - - /// - /// The slot the battery is stored in. - /// [ViewVariables] public ContainerSlot BatterySlot = default!; - [ViewVariables] public readonly string BatterySlotId = "mech-battery-slot"; - - /// - /// A multiplier used to calculate how much of the damage done to a mech - /// is transfered to the pilot - /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float MechToPilotDamageMultiplier; - - /// - /// Whether the mech has been destroyed and is no longer pilotable. - /// [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool Broken = false; - - /// - /// The slot the pilot is stored in. - /// [ViewVariables(VVAccess.ReadWrite)] public ContainerSlot PilotSlot = default!; - [ViewVariables] public readonly string PilotSlotId = "mech-pilot-slot"; - - /// - /// The current selected equipment of the mech. - /// If null, the mech is using just its fists. - /// [ViewVariables, AutoNetworkedField] public EntityUid? CurrentSelectedEquipment; - - /// - /// The maximum amount of equipment items that can be installed in the mech - /// [DataField("maxEquipmentAmount"), ViewVariables(VVAccess.ReadWrite)] public int MaxEquipmentAmount = 3; - - /// - /// A whitelist for inserting equipment items. - /// [DataField] public EntityWhitelist? EquipmentWhitelist; [DataField] public EntityWhitelist? PilotWhitelist; - - /// - /// A container for storing the equipment entities. - /// [ViewVariables(VVAccess.ReadWrite)] public Container EquipmentContainer = default!; - [ViewVariables] public readonly string EquipmentContainerId = "mech-equipment-container"; - - /// - /// How long it takes to enter the mech. - /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float EntryDelay = 3; - - /// - /// How long it takes to pull *another person* - /// outside of the mech. You can exit instantly yourself. - /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float ExitDelay = 3; - - /// - /// How long it takes to pull out the battery. - /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float BatteryRemovalDelay = 2; - - /// - /// Whether or not the mech is airtight. - /// - /// - /// This needs to be redone - /// when mech internals are added - /// [DataField, ViewVariables(VVAccess.ReadWrite)] public bool Airtight; - - /// - /// The equipment that the mech initially has when it spawns. - /// Good for things like nukie mechs that start with guns. - /// [DataField] public List StartingEquipment = new(); - #region Action Prototypes [DataField] public EntProtoId MechCycleAction = "ActionMechCycleEquipment"; [DataField] - public EntProtoId ToggleAction = "ActionToggleLight"; //Goobstation Mech Lights toggle action + public EntProtoId ToggleAction = "ActionToggleLight"; [DataField] public EntProtoId MechUiAction = "ActionMechOpenUI"; [DataField] public EntProtoId MechEjectAction = "ActionMechEject"; + [DataField] + public EntProtoId MechHornAction = "ActionMechHorn"; // Forge-Change + [DataField] + public EntProtoId MechSirenAction = "ActionMechSiren"; // Forge-Change #endregion #region Visualizer States @@ -163,9 +79,51 @@ public sealed partial class MechComponent : Component [DataField] public string? BrokenState; #endregion - [DataField] public EntityUid? MechCycleActionEntity; [DataField] public EntityUid? MechUiActionEntity; [DataField] public EntityUid? MechEjectActionEntity; - [DataField, AutoNetworkedField] public EntityUid? ToggleActionEntity; //Goobstation Mech Lights toggle action + // Forge-Change-start + [DataField, AutoNetworkedField] public EntityUid? ToggleActionEntity; + [DataField, AutoNetworkedField] public EntityUid? MechHornActionEntity; + [DataField, AutoNetworkedField] public EntityUid? MechSirenActionEntity; + [DataField] + public SoundSpecifier? HornSound; + [DataField] + public SoundSpecifier? SirenSound; + [DataField] + public string? EngineOnState; + [DataField, AutoNetworkedField] public bool SirenEnabled; + [DataField, AutoNetworkedField] public EntityUid? SirenStream; + [ViewVariables] + public ContainerSlot IgnitionSlot = default!; + [ViewVariables] + public readonly string IgnitionSlotId = "mech-ignition-slot"; + [DataField, AutoNetworkedField] public bool EngineRunning; // true when key is inserted + [ViewVariables] + public ContainerSlot PassengerSlot1 = default!; + [ViewVariables] + public readonly string PassengerSlot1Id = "mech-passenger-1"; + [ViewVariables] + public ContainerSlot PassengerSlot2 = default!; + [ViewVariables] + public readonly string PassengerSlot2Id = "mech-passenger-2"; + [ViewVariables] + public ContainerSlot PassengerSlot3 = default!; + [ViewVariables] + public readonly string PassengerSlot3Id = "mech-passenger-3"; + #region Action Prototypes + [DataField] + public EntProtoId MechEjectPassenger1Action = "ActionMechEjectPassenger1"; + [DataField] + public EntProtoId MechEjectPassenger2Action = "ActionMechEjectPassenger2"; + [DataField] + public EntProtoId MechEjectPassenger3Action = "ActionMechEjectPassenger3"; + #endregion + + #region Action Entities + [DataField, AutoNetworkedField] public EntityUid? MechEjectPassenger1ActionEntity; + [DataField, AutoNetworkedField] public EntityUid? MechEjectPassenger2ActionEntity; + [DataField, AutoNetworkedField] public EntityUid? MechEjectPassenger3ActionEntity; + #endregion + // Forge-Change-end } diff --git a/Content.Shared/Mech/Components/MechImplantsComponents.cs b/Content.Shared/Mech/Components/MechImplantsComponents.cs new file mode 100644 index 0000000000..15b3e184a5 --- /dev/null +++ b/Content.Shared/Mech/Components/MechImplantsComponents.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Implants.Components; // или Content.Shared.Mech.Components + +[RegisterComponent, NetworkedComponent] +public sealed partial class IgnitionKeyComponent : Component +{ + // Можно добавить дополнительные поля, если нужно (например, уровень доступа) +} + // Forge-Change diff --git a/Content.Shared/Mech/Components/MechPassengerComponent.cs b/Content.Shared/Mech/Components/MechPassengerComponent.cs new file mode 100644 index 0000000000..7456a5f57c --- /dev/null +++ b/Content.Shared/Mech/Components/MechPassengerComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Containers; +using Robust.Shared.GameStates; + +namespace Content.Shared.Mech.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class MechPassengerComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public EntityUid Mech; + + [ViewVariables] + public ContainerSlot? Slot; +} + // Forge-Change diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs index f977a2eeb4..fc645a59d1 100644 --- a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs @@ -21,7 +21,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Timing; -// Goobstation Change +// Goobstation additions using Content.Shared.CCVar; using Content.Shared._Goobstation.CCVar; using Content.Shared.Emag.Systems; @@ -30,7 +30,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Inventory.VirtualItem; using Robust.Shared.Configuration; -using Content.Shared.Implants.Components; +using Content.Shared.Vehicles; // for HornActionEvent, SirenActionEvent // Forge-Change namespace Content.Shared.Mech.EntitySystems; @@ -56,7 +56,7 @@ public abstract class SharedMechSystem : EntitySystem // Goobstation: Local variable for checking if mech guns can be used out of them. private bool _canUseMechGunOutside; - + /// public override void Initialize() { @@ -70,11 +70,16 @@ public override void Initialize() SubscribeLocalEvent(OnCanDragDrop); SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(OnHornAction); // Forge-Change + SubscribeLocalEvent(OnSirenAction); // Forge-Change SubscribeLocalEvent(OnGetMeleeWeapon); SubscribeLocalEvent(OnCanAttackFromContainer); SubscribeLocalEvent(OnAttackAttempt); SubscribeLocalEvent(OnEntGotRemovedFromContainer); SubscribeLocalEvent(OnShotAttempted); // Goobstation + + SubscribeLocalEvent(OnPassengerRemoved); // Forge-Change + Subs.CVar(_config, GoobCVars.MechGunOutsideMech, value => _canUseMechGunOutside = value, true); // Goobstation } @@ -83,6 +88,12 @@ private void OnEntGotRemovedFromContainer(EntityUid uid, MechPilotComponent comp { TryEject(component.Mech, pilot: uid); } + private void OnPassengerRemoved(EntityUid uid, MechPassengerComponent component, EntGotRemovedFromContainerMessage args) + { + if (component.Mech == default) + return; + TryEjectPassenger(component.Mech, uid); // Forge-Change + } private void OnToggleEquipmentAction(EntityUid uid, MechComponent component, MechToggleEquipmentEvent args) { @@ -97,16 +108,68 @@ private void OnEjectPilotEvent(EntityUid uid, MechComponent component, MechEject if (args.Handled) return; args.Handled = true; - TryEject(uid, component); + // Forge-Change-start + + if (TryComp(args.Performer, out var pilot) && pilot.Mech == uid) + { + TryEject(uid, component); + } + else if (TryComp(args.Performer, out var passenger) && passenger.Mech == uid) + { + TryEjectPassenger(uid, args.Performer); + } + } + protected virtual void OnHornAction(EntityUid uid, MechComponent component, HornActionEvent args) + { + } + protected virtual void OnSirenAction(EntityUid uid, MechComponent component, SirenActionEvent args) + { + } + protected virtual void OnEjectPassenger1(EntityUid uid, MechComponent component, MechEjectPassenger1Event args) + { + if (args.Handled) + return; + args.Handled = true; + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + if (component.PassengerSlot1.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 1)), uid, args.Performer); } + protected virtual void OnEjectPassenger2(EntityUid uid, MechComponent component, MechEjectPassenger2Event args) + { + if (args.Handled) + return; + args.Handled = true; + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + if (component.PassengerSlot2.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 2)), uid, args.Performer); + } + + protected virtual void OnEjectPassenger3(EntityUid uid, MechComponent component, MechEjectPassenger3Event args) + { + if (args.Handled) + return; + args.Handled = true; + if (component.PilotSlot.ContainedEntity != args.Performer) + return; + if (component.PassengerSlot3.ContainedEntity is { } passenger) + TryEjectPassenger(uid, passenger, component); + else + _popup.PopupEntity(Loc.GetString("mech-no-passenger-in-slot", ("slot", 3)), uid, args.Performer); + } + // Forge-Change-end private void RelayInteractionEvent(EntityUid uid, MechComponent component, UserActivateInWorldEvent args) { var pilot = component.PilotSlot.ContainedEntity; if (pilot == null) return; - // TODO why is this being blocked? if (!_timing.IsFirstTimePredicted) return; @@ -121,6 +184,10 @@ private void OnStartup(EntityUid uid, MechComponent component, ComponentStartup component.PilotSlot = _container.EnsureContainer(uid, component.PilotSlotId); component.EquipmentContainer = _container.EnsureContainer(uid, component.EquipmentContainerId); component.BatterySlot = _container.EnsureContainer(uid, component.BatterySlotId); + component.IgnitionSlot = _container.EnsureContainer(uid, component.IgnitionSlotId); // Forge-Change + component.PassengerSlot1 = _container.EnsureContainer(uid, component.PassengerSlot1Id); // Forge-Change + component.PassengerSlot2 = _container.EnsureContainer(uid, component.PassengerSlot2Id); // Forge-Change + component.PassengerSlot3 = _container.EnsureContainer(uid, component.PassengerSlot3Id); // Forge-Change UpdateAppearance(uid, component); } @@ -145,10 +212,10 @@ private void SetupUser(EntityUid mech, EntityUid pilot, MechComponent? component var rider = EnsureComp(pilot); - // Warning: this bypasses most normal interaction blocking components on the user, like drone laws and the like. var irelay = EnsureComp(pilot); - _mover.SetRelay(pilot, mech); + if (component.EngineRunning) // Forge-Change + _mover.SetRelay(pilot, mech); _interaction.SetRelay(pilot, mech, irelay); rider.Mech = mech; Dirty(pilot, rider); @@ -159,7 +226,12 @@ private void SetupUser(EntityUid mech, EntityUid pilot, MechComponent? component _actions.AddAction(pilot, ref component.MechCycleActionEntity, component.MechCycleAction, mech); _actions.AddAction(pilot, ref component.MechUiActionEntity, component.MechUiAction, mech); _actions.AddAction(pilot, ref component.MechEjectActionEntity, component.MechEjectAction, mech); - _actions.AddAction(pilot, ref component.ToggleActionEntity, component.ToggleAction, mech); //Goobstation Mech Lights toggle action + _actions.AddAction(pilot, ref component.ToggleActionEntity, component.ToggleAction, mech); + _actions.AddAction(pilot, ref component.MechHornActionEntity, component.MechHornAction, mech); // Forge-Change + _actions.AddAction(pilot, ref component.MechSirenActionEntity, component.MechSirenAction, mech); // Forge-Change + _actions.AddAction(pilot, ref component.MechEjectPassenger1ActionEntity, component.MechEjectPassenger1Action, mech); // Forge-Change + _actions.AddAction(pilot, ref component.MechEjectPassenger2ActionEntity, component.MechEjectPassenger2Action, mech); // Forge-Change + _actions.AddAction(pilot, ref component.MechEjectPassenger3ActionEntity, component.MechEjectPassenger3Action, mech); // Forge-Change } private void RemoveUser(EntityUid mech, EntityUid pilot) @@ -175,14 +247,17 @@ private void RemoveUser(EntityUid mech, EntityUid pilot) /// /// Destroys the mech, removing the user and ejecting all installed equipment. /// - /// - /// public virtual void BreakMech(EntityUid uid, MechComponent? component = null) { if (!Resolve(uid, ref component)) return; TryEject(uid, component); + foreach (var slot in GetPassengerSlots(component)) + { + if (slot.ContainedEntity != null) + TryEjectPassenger(uid, slot.ContainedEntity.Value); + } // Forge-Change var equipment = new List(component.EquipmentContainer.ContainedEntities); foreach (var ent in equipment) { @@ -196,8 +271,6 @@ public virtual void BreakMech(EntityUid uid, MechComponent? component = null) /// /// Cycles through the currently selected equipment. /// - /// - /// public void CycleEquipment(EntityUid uid, MechComponent? component = null) { if (!Resolve(uid, ref component)) @@ -230,10 +303,6 @@ public void CycleEquipment(EntityUid uid, MechComponent? component = null) /// /// Inserts an equipment item into the mech. /// - /// - /// - /// - /// public void InsertEquipment(EntityUid uid, EntityUid toInsert, MechComponent? component = null, MechEquipmentComponent? equipmentComponent = null) { @@ -259,11 +328,6 @@ public void InsertEquipment(EntityUid uid, EntityUid toInsert, MechComponent? co /// /// Removes an equipment item from a mech. /// - /// - /// - /// - /// - /// Whether or not the removal can be cancelled public void RemoveEquipment(EntityUid uid, EntityUid toRemove, MechComponent? component = null, MechEquipmentComponent? equipmentComponent = null, bool forced = false) { @@ -295,10 +359,6 @@ public void RemoveEquipment(EntityUid uid, EntityUid toRemove, MechComponent? co /// /// Attempts to change the amount of energy in the mech. /// - /// The mech itself - /// The change in energy - /// - /// If the energy was successfully changed. public virtual bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechComponent? component = null) { if (!Resolve(uid, ref component)) @@ -316,9 +376,6 @@ public virtual bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechCompon /// /// Sets the integrity of the mech. /// - /// The mech itself - /// The value the integrity will be set at - /// public void SetIntegrity(EntityUid uid, FixedPoint2 value, MechComponent? component = null) { if (!Resolve(uid, ref component)) @@ -343,20 +400,11 @@ public void SetIntegrity(EntityUid uid, FixedPoint2 value, MechComponent? compon /// /// Checks if the pilot is present /// - /// - /// Whether or not the pilot is present public bool IsEmpty(MechComponent component) { return component.PilotSlot.ContainedEntity == null; } - /// - /// Checks if an entity can be inserted into the mech. - /// - /// - /// - /// - /// public bool CanInsert(EntityUid uid, EntityUid toInsert, MechComponent? component = null) { if (!Resolve(uid, ref component)) @@ -368,9 +416,6 @@ public bool CanInsert(EntityUid uid, EntityUid toInsert, MechComponent? componen /// /// Updates the user interface /// - /// - /// This is defined here so that UI updates can be accessed from shared. - /// public virtual void UpdateUserInterface(EntityUid uid, MechComponent? component = null) { } @@ -378,10 +423,6 @@ public virtual void UpdateUserInterface(EntityUid uid, MechComponent? component /// /// Attempts to insert a pilot into the mech. /// - /// - /// - /// - /// Whether or not the entity was inserted public bool TryInsert(EntityUid uid, EntityUid? toInsert, MechComponent? component = null) { if (!Resolve(uid, ref component)) @@ -403,10 +444,6 @@ public bool TryInsert(EntityUid uid, EntityUid? toInsert, MechComponent? compone /// /// Attempts to eject the current pilot from the mech /// - /// - /// - /// The pilot to eject - /// Whether or not the pilot was ejected. public bool TryEject(EntityUid uid, MechComponent? component = null, EntityUid? pilot = null) { if (!Resolve(uid, ref component)) @@ -424,7 +461,67 @@ public bool TryEject(EntityUid uid, MechComponent? component = null, EntityUid? UpdateHands(pilot.Value, uid, false); // Goobstation return true; } + // Forge-Change-start + public bool CanInsertPassenger(EntityUid uid, EntityUid toInsert, MechComponent component) + { + if (HasComp(toInsert) || IsPassenger(toInsert, component)) + return false; + if (GetFreePassengerSlot(component) == null) + return false; + return _actionBlocker.CanInteract(toInsert, uid); + } + public bool TryInsertPassenger(EntityUid uid, EntityUid toInsert, MechComponent component) + { + if (!CanInsertPassenger(uid, toInsert, component)) + return false; + + var slot = GetFreePassengerSlot(component)!; + _container.Insert(toInsert, slot); + + var passenger = EnsureComp(toInsert); + passenger.Mech = uid; + passenger.Slot = slot; + Dirty(toInsert, passenger); + + return true; + } + public bool TryEjectPassenger(EntityUid uid, EntityUid passenger, MechComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + foreach (var slot in GetPassengerSlots(component)) + { + if (slot.ContainedEntity == passenger) + { + _container.RemoveEntity(uid, passenger); + RemComp(passenger); + return true; + } + } + return false; + } + protected ContainerSlot? GetFreePassengerSlot(MechComponent component) + { + if (component.PassengerSlot1.ContainedEntity == null) + return component.PassengerSlot1; + if (component.PassengerSlot2.ContainedEntity == null) + return component.PassengerSlot2; + if (component.PassengerSlot3.ContainedEntity == null) + return component.PassengerSlot3; + return null; + } + protected IEnumerable GetPassengerSlots(MechComponent component) + { + yield return component.PassengerSlot1; + yield return component.PassengerSlot2; + yield return component.PassengerSlot3; + } + protected bool IsPassenger(EntityUid uid, MechComponent component) + { + return GetPassengerSlots(component).Any(slot => slot.ContainedEntity == uid); + } + // Forge-Change-end // Goobstation Change Start private void UpdateHands(EntityUid uid, EntityUid mech, bool active) { @@ -468,7 +565,6 @@ private void FreeHands(EntityUid uid, EntityUid mech) { _virtualItem.DeleteInHandsMatching(uid, mech); } - // Goobstation Change End private void OnGetMeleeWeapon(EntityUid uid, MechPilotComponent component, GetMeleeWeaponEvent args) { @@ -517,6 +613,7 @@ private void UpdateAppearance(EntityUid uid, MechComponent? component = null, _appearance.SetData(uid, MechVisuals.Open, IsEmpty(component), appearance); _appearance.SetData(uid, MechVisuals.Broken, component.Broken, appearance); + _appearance.SetData(uid, MechVisuals.EngineOn, component.EngineRunning, appearance); // Forge-Change } private void OnDragDrop(EntityUid uid, MechComponent component, ref DragDropTargetEvent args) @@ -526,19 +623,28 @@ private void OnDragDrop(EntityUid uid, MechComponent component, ref DragDropTarg args.Handled = true; - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Dragged, component.EntryDelay, new MechEntryEvent(), uid, target: uid) + if (CanInsert(uid, args.Dragged, component)) + { // Forge-Change + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Dragged, component.EntryDelay, new MechEntryEvent(), uid, target: uid) + { + BreakOnMove = true, + }; + _doAfter.TryStartDoAfter(doAfterEventArgs); + } + else if (CanInsertPassenger(uid, args.Dragged, component)) { - BreakOnMove = true, - }; - - _doAfter.TryStartDoAfter(doAfterEventArgs); + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Dragged, component.EntryDelay, new MechPassengerEntryEvent(), uid, target: uid) + { + BreakOnMove = true, + }; + _doAfter.TryStartDoAfter(doAfterEventArgs); + } // Forge-Change } private void OnCanDragDrop(EntityUid uid, MechComponent component, ref CanDropTargetEvent args) { args.Handled = true; - - args.CanDrop |= !component.Broken && CanInsert(uid, args.Dragged, component); + args.CanDrop |= !component.Broken && (CanInsert(uid, args.Dragged, component) || CanInsertPassenger(uid, args.Dragged, component)); } private void OnEmagged(EntityUid uid, MechComponent component, ref GotEmaggedEvent args) // Goobstation @@ -551,36 +657,30 @@ private void OnEmagged(EntityUid uid, MechComponent component, ref GotEmaggedEve } } -/// -/// Event raised when the battery is successfully removed from the mech, -/// on both success and failure -/// +public sealed partial class MechEjectPassenger1Event : InstantActionEvent; // Forge-Change +public sealed partial class MechEjectPassenger2Event : InstantActionEvent; // Forge-Change +public sealed partial class MechEjectPassenger3Event : InstantActionEvent; // Forge-Change + [Serializable, NetSerializable] public sealed partial class RemoveBatteryEvent : SimpleDoAfterEvent { } - -/// -/// Event raised when a person removes someone from a mech, -/// on both success and failure -/// [Serializable, NetSerializable] public sealed partial class MechExitEvent : SimpleDoAfterEvent { } - -/// -/// Event raised when a person enters a mech, on both success and failure -/// [Serializable, NetSerializable] public sealed partial class MechEntryEvent : SimpleDoAfterEvent { } - -/// -/// Event raised when an user attempts to fire a mech weapon to check if its battery is drained -/// - +[Serializable, NetSerializable] +public sealed partial class MechPassengerEntryEvent : SimpleDoAfterEvent // Forge-Change +{ +} +[Serializable, NetSerializable] +public sealed partial class RemoveIgnitionKeyEvent : SimpleDoAfterEvent // Forge-Change +{ +} [Serializable, NetSerializable] public sealed partial class HandleMechEquipmentBatteryEvent : EntityEventArgs { diff --git a/Content.Shared/Mech/SharedMech.cs b/Content.Shared/Mech/SharedMech.cs index 94af4453d4..2dd46d5192 100644 --- a/Content.Shared/Mech/SharedMech.cs +++ b/Content.Shared/Mech/SharedMech.cs @@ -6,8 +6,9 @@ namespace Content.Shared.Mech; [Serializable, NetSerializable] public enum MechVisuals : byte { - Open, //whether or not it's open and has a rider - Broken //if it broke and no longer works. + Open, + Broken, + EngineOn // Forge-Change } [Serializable, NetSerializable] diff --git a/Content.Shared/_Goobstation/SharedVehicleComponent.cs b/Content.Shared/_Goobstation/SharedVehicleComponent.cs new file mode 100644 index 0000000000..7503656c76 --- /dev/null +++ b/Content.Shared/_Goobstation/SharedVehicleComponent.cs @@ -0,0 +1,81 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Vehicles; + +[RegisterComponent, NetworkedComponent] +public sealed partial class VehicleComponent : Component +{ + [ViewVariables] + public EntityUid? Driver; + + [ViewVariables] + public EntityUid? HornAction; + + [ViewVariables] + public EntityUid? SirenAction; + + public bool SirenEnabled = false; + + public EntityUid? SirenStream; + + /// + /// If non-zero how many virtual items to spawn on the driver + /// unbuckles them if they dont have enough + /// + [DataField] + public int RequiredHands = 1; + + /// + /// Will the vehicle move when a driver buckles + /// + [DataField] + public bool EngineRunning = false; + + /// + /// What sound to play when the driver presses the horn action (plays once) + /// + [DataField] + public SoundSpecifier? HornSound; + + /// + /// What sound to play when the driver presses the siren action (loops) + /// + [DataField] + public SoundSpecifier? SirenSound; + + /// + /// If they should be rendered ontop of the vehicle if true or behind + /// + [DataField] + public VehicleRenderOver RenderOver = VehicleRenderOver.None; +} +[Serializable, NetSerializable] +public enum VehicleState : byte +{ + Animated, + DrawOver +} + +[Serializable, NetSerializable, Flags] +public enum VehicleRenderOver +{ + None = 0, + North = 1, + NorthEast = 2, + East = 4, + SouthEast = 8, + South = 16, + SouthWest = 32, + West = 64, + NorthWest = 128, +} + +[Serializable, NetSerializable] +public enum VehicleVisualLayers : byte +{ + Base, + AutoAnimate, + Cover, +} diff --git a/Content.Shared/_Goobstation/SharedVehicleSystem.cs b/Content.Shared/_Goobstation/SharedVehicleSystem.cs new file mode 100644 index 0000000000..5a3b2bb920 --- /dev/null +++ b/Content.Shared/_Goobstation/SharedVehicleSystem.cs @@ -0,0 +1,254 @@ +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Content.Shared.Actions; +using Content.Shared.Audio; +using Content.Shared.Buckle; +using Content.Shared.Buckle.Components; +using Content.Shared.Hands; +using Content.Shared.Inventory.VirtualItem; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Robust.Shared.Audio; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Vehicles; + +public abstract partial class SharedVehicleSystem : EntitySystem +{ + [Dependency] private readonly AccessReaderSystem _access = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedBuckleSystem _buckle = default!; + [Dependency] private readonly SharedMoverController _mover = default!; + [Dependency] private readonly SharedVirtualItemSystem _virtualItem = default!; + + public static readonly EntProtoId HornActionId = "ActionHorn"; + public static readonly EntProtoId SirenActionId = "ActionSiren"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnRemove); + SubscribeLocalEvent(OnStrapAttempt); + SubscribeLocalEvent(OnStrapped); + SubscribeLocalEvent(OnUnstrapped); + SubscribeLocalEvent(OnDropped); + + SubscribeLocalEvent(OnInsert); + SubscribeLocalEvent(OnEject); + + SubscribeLocalEvent(OnHorn); + SubscribeLocalEvent(OnSiren); + } + + private void OnInit(EntityUid uid, VehicleComponent component, ComponentInit args) + { + _appearance.SetData(uid, VehicleState.Animated, component.EngineRunning); + _appearance.SetData(uid, VehicleState.DrawOver, false); + } + + private void OnRemove(EntityUid uid, VehicleComponent component, ComponentRemove args) + { + if (component.Driver == null) + return; + + _buckle.TryUnbuckle(component.Driver.Value, component.Driver.Value); + Dismount(component.Driver.Value, uid); + _appearance.SetData(uid, VehicleState.DrawOver, false); + } + + private void OnInsert(EntityUid uid, VehicleComponent component, ref EntInsertedIntoContainerMessage args) + { + if (HasComp(args.Entity)) + return; + + component.EngineRunning = true; + _appearance.SetData(component.Owner, VehicleState.Animated, true); + + _ambientSound.SetAmbience(component.Owner, true); + + if (component.Driver == null) + return; + + Mount(component.Driver.Value, component.Owner); + } + + private void OnEject(EntityUid uid, VehicleComponent component, ref EntRemovedFromContainerMessage args) + { + component.EngineRunning = false; + _appearance.SetData(component.Owner, VehicleState.Animated, false); + + _ambientSound.SetAmbience(component.Owner, false); + + if (component.Driver == null) + return; + + Dismount(component.Driver.Value, component.Owner); + } + + private void OnHorn(EntityUid uid, VehicleComponent component, InstantActionEvent args) + { + if (args.Handled == true) + return; + + if (component.Driver != args.Performer) + return; + + if (component.HornSound == null) + return; + + _audio.PlayPvs(component.HornSound, component.Owner); + args.Handled = true; + } + + private void OnSiren(EntityUid uid, VehicleComponent component, InstantActionEvent args) + { + if (args.Handled == true) + return; + + if (component.Driver != args.Performer) + return; + + if (component.SirenSound == null) + return; + + if (component.SirenEnabled) + { + component.SirenStream = _audio.Stop(component.SirenStream); + } + else + { + component.SirenStream = _audio.PlayPvs(component.SirenSound, uid)?.Entity; + } + + component.SirenEnabled = !component.SirenEnabled; + args.Handled = true; + } + + + private void OnStrapAttempt(Entity ent, ref StrapAttemptEvent args) + { + var driver = args.Buckle.Owner; // i dont want to re write this shit 100 fucking times + + if (ent.Comp.Driver != null) + { + args.Cancelled = true; + return; + } + + if (ent.Comp.RequiredHands != 0) + { + for (int hands = 0; hands < ent.Comp.RequiredHands; hands++) + { + if (!_virtualItem.TrySpawnVirtualItemInHand(ent.Owner, driver, false)) + { + args.Cancelled = true; + _virtualItem.DeleteInHandsMatching(driver, ent.Owner); + return; + } + } + } + + AddHorns(driver, ent); + } + + private void OnStrapped(Entity ent, ref StrappedEvent args) + { + var driver = args.Buckle.Owner; + + if (!TryComp(driver, out MobMoverComponent? mover)) + return; + + if (ent.Comp.Driver != null) + return; + + ent.Comp.Driver = driver; + _appearance.SetData(ent.Owner, VehicleState.DrawOver, true); + + if (!ent.Comp.EngineRunning) + return; + + Mount(driver, ent.Owner); + } + + private void OnUnstrapped(Entity ent, ref UnstrappedEvent args) + { + if (ent.Comp.Driver != args.Buckle.Owner) + return; + + Dismount(args.Buckle.Owner, ent); + _appearance.SetData(ent.Owner, VehicleState.DrawOver, false); + } + + private void OnDropped(EntityUid uid, VehicleComponent comp, VirtualItemDeletedEvent args) + { + if (comp.Driver != args.User) + return; + + _buckle.TryUnbuckle(args.User, args.User); + + Dismount(args.User, comp.Owner); + _appearance.SetData(comp.Owner, VehicleState.DrawOver, false); + } + + private void AddHorns(EntityUid driver, EntityUid vehicle) + { + if (!TryComp(vehicle, out var vehicleComp)) + return; + + if (vehicleComp.HornSound != null) + _actions.AddAction(driver, ref vehicleComp.HornAction, HornActionId, vehicle); + + if (vehicleComp.SirenSound != null) + _actions.AddAction(driver, ref vehicleComp.SirenAction, SirenActionId, vehicle); + } + + private void Mount(EntityUid driver, EntityUid vehicle) + { + if (TryComp(vehicle, out var accessComp)) + { + var accessSources = _access.FindPotentialAccessItems(driver); + var access = _access.FindAccessTags(driver, accessSources); + + foreach (var tag in access) + { + accessComp.Tags.Add(tag); + } + } + + _mover.SetRelay(driver, vehicle); + } + + private void Dismount(EntityUid driver, EntityUid vehicle) + { + if (!TryComp(vehicle, out var vehicleComp)) + return; + + if (vehicleComp.Driver != driver) + return; + + RemComp(driver); + + vehicleComp.Driver = null; + + if (vehicleComp.HornAction != null) + _actions.RemoveAction(driver, vehicleComp.HornAction); + + if (vehicleComp.SirenAction != null) + _actions.RemoveAction(driver, vehicleComp.SirenAction); + + _virtualItem.DeleteInHandsMatching(driver, vehicle); + + if (TryComp(vehicle, out var accessComp)) + accessComp.Tags.Clear(); + } +} + +public sealed partial class HornActionEvent : InstantActionEvent; + +public sealed partial class SirenActionEvent : InstantActionEvent; diff --git a/Content.Shared/_N14/WhitelistClothing/WhitelistClothingComponents.cs b/Content.Shared/_N14/WhitelistClothing/WhitelistClothingComponents.cs new file mode 100644 index 0000000000..138f9cc5f9 --- /dev/null +++ b/Content.Shared/_N14/WhitelistClothing/WhitelistClothingComponents.cs @@ -0,0 +1,12 @@ +namespace Content.Shared.WhitelistClothing.Components; + +[RegisterComponent] +public sealed partial class WhitelistClothingComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string Whitelist = "SupermutantArmor"; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public string Slot = "outerclothing"; + [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] + public string WhitelistState = "humanoid"; +} diff --git a/Resources/Audio/Mecha/cardrive.ogg b/Resources/Audio/Mecha/cardrive.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5ed3156e6855025f0954302525437ed0f674d2db GIT binary patch literal 29890 zcmafabzEFcukhkpid%u=R@}U;Li#1 z_xl@!{2S+g%Nyrg3*&wt35wwB|0)4c|A=`9Zj~`~HDl*w_{_n;%*6CYP7MB-+8NuM zm^$%-8;!w@%&cs0t;9B#M*lEE!2I(~DkQ810T2KH$enR%#fqJ=gHiE?6!7*4geI-e z@q}d10tr}Tw8to%<4KD0gu=C{1E%9u0dEXpg6^2Xk%I6f!4$k2i9uAnU??02##z4M zP=)?;5d~U+TLs|>gZG#?k%JC6e-i|Y0yR*d<8!RRW9sw-y z8)opBU>SZeEfD@=Ffp4679bt~$Sa_ZETBe2#ji&M3Nbv78 zVZaLkfCtk_L>5WJ?n@++YbH|st%ng6bYt~@E6ZPY2>?Jr5n0p`6Yejc2><|}#~E3y z5m{^zc@!QC9~@c*3GfF1puyd+2`lr6CyPv}s4g|zuKlm7oob5rmmRD_)LBcja@cSt zC_LD|>i`~xKUySHzyE)f?2jvjQh-nm+{)g|(?rRXssj>cOEh^TW<|CFkFuR7M-H=@ zC&5rbwkC2WnC>XMKTi|!ABd{XV>*-e4d*y{VvvnC2!<%DJ>oNCn!pfDwPkFkbR8Iy zX!TIal77QEzlr*LIUP75$i{fPE$eJe&6*wnL-K2-e!;(zT;vYuRemV9ECPX3xr9)njAQ*@3^bp}gU@w2TWhv^)rvkofa#2T$MIV zU6i*Z2RtlV8mA7-K0;+SP9IWY7DgUS6%0;>0V@p}pa}LW=3(Z30;fsIQ*zNsAT43> zAW*!#a9&ZWu0)Gls<>IjdM_J%J4#)wC0$8atYTeJ2WA4mfj>z3)A3jk0+;|m0J0Jy zO-QoQB+XI0(kSqdz$g+}nr%D@q|Qkm1ybcCq0RZ}TsS!HE0 zRh2PBRk2i+Q)N|~OsCjvS5#CtuvHhDO||cQ)Kftltgsb|dY-qEweu zRM$Abt?Y^}x{9i%nqbMUx|&O>>We;L$qUM|D_E+ksj4drrmCqReHYaYHQkjZRn0}8 zwZ#zqMW5cXiZ;8^nwrY`s;7E}r?!i;WXU<1w*f7PD5}b;H`ywKY_%~&m#|b9Qbm

xjU=~|dSD!5xUEMU0u7;WReaIXLq?=;8rEaQu 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 X0i)U&-DCjX00000NkvXXu0mjfQuj5n literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/icon.png b/Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9142c14453948af05f35edb0e455d486b95e64 GIT binary patch literal 722 zcmV;@0xkWCP)adA-_BH)WsWHVD)r7%Q_GiRVA8L#=G8@zDW zhlI@+Q^C_GqTRpmUx*)l?7FV46g*G$YXSJm0Ac_N*KrV$rl$Jnn@}*+57Z-+x~}U8 z^3iqOxKgG7zDwZ`Adf0EKcKvMFecq~w_PBB^7e@sT|gAT$a{Wc13pXew&#h8Ous|i z6%*tTAOc5#DEZt0;FdVcHO9h3HY=W1Bl;f0N2wGYRTUFnnf(DXaP=pA!G$c(J}_rT zFCR?aJhLMJ0JG`Q*O;M)DrjB9UAdt`WkH}HC>PJIGM48`Beii;$EUv@*pOpb$zU*4 zDk5pbm=Tq)LZn(DYi>^M&j%}X-01-{+Kr5i&6zPfoUkk_Q4$Wby0S{xvh0PquPkMj zm|7BAj-8}u?7eRQtrD~xFMRjU*bDs-b#Fffw^py%_DmQSq`bYK4lKuL0InVr7E zp4F-2(dQU$QS&JP20u*|+1rseK*^m;TI>HD0D#^RoW6O^-k%hwZytI_w&g}!bq#H* zGE%E9w%t~hky-`tt6kU7ru{qC%0Om1O)SyM_;89?q7|UX&P=CuF;u;O>!_s36XAwtM!>(^t=VFAj6~yej$IHm&zeoGeL2i8Ee*kKY}6a<OfMqxNmt7|T|0KWFQ5>s_}hg;%tF-Q}-$ zQvAGY0Z)R$#p9<>Wu@9`S7wIjJ4)`c?S4@3MMUYJ&Do$hsjEx@8fB~*J$%=g#iscg zO`Yzvwc*5>_f9JM@3vCb zZ*yR>?X|nC|7IMkdXvi-^?KuW)}HH+tG3!)2Js(%y>YB;+1DGdy#tbMzkO$MNVomA si=h`Nz+`eQdHs8ab;n&?jDNB1?7Sy85}Sb4q9e05WIFBme*a literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/inhand-right.png b/Resources/Textures/_Nuclear14/Clothing/InnerClothingm/alkotop.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..0be4a135eebde84143dc55163bf8425fb73dc959 GIT binary patch literal 570 zcmV-A0>%A_P)`6pHRCt{2**|a7Ko|z_=RKR)MX3-=v!SRAjG8SYQiy}O%d0tp17!Z;33PQFiVa|;(xH_(^)4>8vUy>1EsgI;%6Yu$01TVkL$ zN$|>o;E6MoJe@C(x%G`*fTbs9+f2^xh`4N=l^r-mM{I=LZ zkSJf*=JM>!cE8Uf2HMJFsB)YkaW2r3WkOL~`CR!J%k z>;nJ<*CQ}lEHQCNB2o5eX473KbX>ByK$CBS+85fT(O6u&k2ox0p#+w=3f$u&k1Fb-T!Zi#f)wP=}u+zJD|c z=@P(5af&X1Cu5ULs$(<&O@4HR1=k}8hc`rPrMs4D{`Kr1?iii^LO;@xat{z@PZ)U1 zac9Ed0l=c)3B6j2w)1DD_`}h5{w(xrEiC$-ap!2@$BtBUfeZbRvJs|*Z-fS(XbMvJ z%O)G}?IoK2EytbQ(h&NaF^(#G%=*`BSduJw{)c~!z0^P)RrZXW5$fAZ4JmbL68OQ3 z(N`urq1{o4>ch3btwAz1?_>PIFjK2n6Q6$tuJ-t8JwN*#ckc~jYTn0C@rKrBOi#Eo zi9b$%YTn1Ntdbl%QjJn`S={*X(J>hGYCIVWOVUr8000Phyl7}`=A5{DZx}X<8CQPn ziyPbVO*>reWw_ka$B73#UP(cx)2E3~q;IuaaQ9wxZ;+y&G66bcG5)+Y$lX<~iokia z0amLuelVMdn*&z?AUgimAZciA#^T~~S|`Nn-@HD6uf9HymX@Z3W4#Mk;R{RCPx{Dc ztalRc%NN*@A3`V`!81>YId!s$0Knt1VfbGMV#ZUae*WbSXVYG4AjO~V#qalrBt4q= z`ZRbT`fLY)+qdt;jMeYfq1I8Ik-j9yj0O$yEr$RAuJ$(WcyHeg0DwWOg2xw>9PG!` zPq_qyG@tx1^?Lhm;Bajf9zGtAaprQ*Pf|=uA{Y9ivvr~41bM%s1ULHoz%UG+-v1TD z&lgZ#R)W(V-@zYvgD+Z6L$SJm@2~up^;tmm|G0e}dfhHOnVf~GRE@d$6=+oigb=iy zYnQB_^6N0AtJ_6hdPA6=aO2>iI_xo-W6t{*m!K*71lRfp@No16wAyW1eG$@Xw~>dV zFL14Y0Ggst;9p#dIlsqb#=%2%n4WOsr8gw$E4ioy0Kod%2J*KnvA(u}rPa5v)wQC! ztOT~YRz#2o_lz4hiw&>lW+j9so>z0Tuvu(y&$tmm9tsK=%+0T$pn$>B>f0Fqq#!B* zDnw9OQO1b?fK|t$xV)LM>R99{0JTN~_lz5AjYfKOBH-K4Q$+Q{;SI*BV*!8*zOteW zDnvxv6}1Uoywt}Cr?pbA0kDb{CLas_Aa{Hv7{v1OyR7d4E5RW5w?xMx6pjWN3P-S$ zeTSh(kGQdw74dJ1GBPqUGBPqUGBPqUGMSP|zra?|)$QWSbUA}xXX96Db1Etlezhtm ziO95HU@M>{JATq+4E3(()@fzr2RXPeL4t z`UQaK9pSIVoH~KnClH-|o9RgqT^i%p>w#zmmSvU1pjTsd?hV&7aJeVGbe&D8&d`Gg zFq?LPWtC)V-p9}+NbN}wy+#`AousHp3!SkT0go4dkBnl*AFa^1I?v(C54`|@_4k|G zSksZO00DrGZ(Zo^=?4()N7{ezbI!NL#bwbIX-UOVTCWGdm8}hh3KH;m`Q>pbCM834 z0v<24DuU$@^PexH1S8QIu$i8Oq%_t$NurI0_Tw2%IzsPGF3DGb7)?5^AyRnWUTPqX z^*Mem=3_KyNLS|>!m>)z)p;i8!h9{GLG#hyMA6lGhUm3vl=l@S% zI}L>j;+-7aGH1M#gTzp%Ahew}m5=F=v-1ZJuqPmYyAtNT7JBz{*Ca(zA%gX_4U9b<;T)p%`mI3N6X5vl kprob<85tQF8JQ^m0=`L)s@UF+3;+NC07*qoM6N<$f~2lrDgXcg literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/icon.png b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d07dcd09cf2815570226ede92ff49ea25b176e6f GIT binary patch literal 567 zcmV-70?7S|P)<=w@*}I7fUk#! z24yO&xLl>YU8so9E0N?9sgn8YL?o9;KCi@OENBUA^^NfN_W>&kiOvROuYV&EA1l#a zq))N7u?NW|QfN4e)X^`l0ySq74$5S=+u(3FV`h3DT^(&mrOrxp;}h}c1vBI3JcC>= zkM*q`&G?!f004)(8JjB#Y!-t2IRuZ#Qz~L+EHBK#QD;YJIEq{@&l6gka8Q0Z10%5r zjl?44Zgo&?4T>K19q@bx!aJOZYomFgpGf*Ed%f7#h_T zu4??fA1ISlXm$BJWs(YgY;XGad%qeoN#$*f4Gaw46;HlLxx%g7^PKTYp literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/inhand-left.png b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a659d146dc9d1af773ec5d35c99ef300239dab GIT binary patch literal 810 zcmV+_1J(SAP)d z@IfVeFz$hWSr`nf2SHlokbELRVUh+50_%aOj7=(qXjq>f$amaso_gE)D?cwd*zWti z&-d5ecZ2%?j4{R-V~jDz7-Q^W@wgR8^$7xi?caY1>wDEypCHvINC<_5P)H8gTrNM$I@TE0^X6-Sy-AdH zWP8Uk7RRieksY+F->Ns0F_9=4tPlzr6A5b7n{BU?6KvP+sgWHS>hGq2Un2mB4@Qft zWnEeG3R+jxTF-pM2crZ40l!8={oStJ1+G3vkzgBXY8~bmmTc?j>J)XJ-R66GEZ(fKIhulpRKLoQ&l7p|`B8w_l9*fWGerS`Alc zQmgmU-TM!*wVo|2YiPQPnP*Rs`|;<%HrA|8;#6GJohoux6nI{2Cb(3CDN9*-SJzf=IB9WFp4K+UnU& znm8`zM2w>(Uf6N=r3yaQxXMJ3Mdb0dU8GG`z)HGOFE o)qlrGjun3ajN}-)z-4$2;lztm(oE5fDN9AdAH#u_ z;6)|780W&jEDXfzB1nrIk~b0*CTXxBur5SpY*Hyi2kYrV-f@0-5|^^G_IyC_-FbcY zeV_Bb$BXj)8UWzkdM@C+9;&Yc02KF4dww+}NDT=RLLng(k`uOGw+8z}q8 zxx(7nIYH+DR_%H#8PjRs6hR1ujOjGB>#d%7V)zwP?fPq_Mn4NiC(dU5>3Z*mm z@cMZc0Pv;w)wA#LU>t?wf$P~|YotaJR45*xI~H{fu(P#^<&`yGJ^&>l6dE3kBiwq` zb#3GQIyAKbi?7~#=NCeu&WKL+LAZX5%oG`!DPQb+FEZnC`8y-}v0K(w4XrUqx9{G^ z-ge$KcvH(|EIfIH!na?(T><6fw>2illLP>(>uV_P?%4)NrIG-EXD^m~TL77VadFA^ zx!T->-e??vJHM^bqJ^mN{RaRbJ$0w_`Rv?006@EV0o#Rr-xi>p{ED?PHlDQo(T(12 zyjk6_4fbH>={ZC{8)ueZYYb98m!+2r4=JC^Qh!YM^~2ApKc?IAYmLG3^5=8es+zb{ zwdZGyF~%5Uj4{R-V~nxN^LiCs$xQ#E?lhf`J2+vQhk+|C&8XHQoT>l-5bKGmwdiG(#Wrqflq0?K;P*%R#`d5B_XYxD1i4*o~hLlk~LG;tE;QZ%;{X5v literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/meta.json b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/meta.json new file mode 100644 index 0000000000..835c6208ec --- /dev/null +++ b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/master.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by RavenReaper", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..48b59f16b90b8d6c38478863a7f9819ce09c2b57 GIT binary patch literal 2142 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/inhand-left.png b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..e41f6c1ebd6368a05e4f6f069ad7ce60a9be7076 GIT binary patch literal 583 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9GG!XV7ZFl&wk0|Vnv zPZ!6KiaBp@o%d#Plwti4e#$L@bEk_dyC(-%kWPG?qd*ygHUx7S%I#k>#}La z`~KOP$QsNI>{OeXc=#UU!d)^JHdg;X&bofx{IFfGT6WeUe%=2)n|;D=?RdMXiNT@N za>3L28-*futjnuwQ!NaaE>rvS;@w;A?EQOA03}z+rJvR4iskvX+qIiF)m=wQaAU@k z>&JH#+%1=E{+s80`eery)dg0$NoARm-_3V!DwegKd*kMvhHoG8ZY=NNF<#<#pvFRj z;eknU-=DjC-^FN%urTDje<%Gd@`T6IZ>4Y7t>f#d_$!(^L$Q>p>WbMy+kFfSVM@hE zzf~x4G6dX?E?jIY`At*#FwaW;gEI>@{IHzokyMhxaeVpoUDA=Uw^vmjn;$&aY~tx< zNAI26bt3h0(wXOGe;-MG-dQTS>T=lR|BR+nPcK_7x21%A_P)`6pHRCt{2+RsY@K^z6}S1ucYCFl|*9i)ShP+?&NT?$E%3W6f( zApUJp5JiWeB1(cTU4n`f5;{bOsE{@22Lw?}CuPS~qs3^4-Us$Dv(E5#oY~8M0U{zI zA|fIpA|j&yE-@Jsx~@srUuXJ>>gA|CIGw#og$F6?e@zcrs*MeWr2K}@<1Bx%kX7oztErx!h=_=Yh=_=Yh=|B7R4kmRrPawG z>w`C{zEFYo{ZH(yMF{zeTvG!n!CHh639I$pu$rSC0KK(RFW?V$;qvOHiIEgAn~Ya> zK)EPERgQ`sbX^nWZ|-aBJFc!A`xTk=T%`stlb%z02he}_1-SUl#~B~c0{{R307*qo IM6N<$g3f6K^#A|> literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/meta.json b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/meta.json new file mode 100644 index 0000000000..835c6208ec --- /dev/null +++ b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/metal.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by RavenReaper", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..dab83e7867c5865afd313872246e11a0a02561aa GIT binary patch literal 2224 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 IM6N<$g3f6K^#A|> literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/meta.json b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/meta.json new file mode 100644 index 0000000000..835c6208ec --- /dev/null +++ b/Resources/Textures/_Nuclear14/Clothing/OuterClothing/MutantArmor/wild.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Made by RavenReaper", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix-inflamed.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix-inflamed.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8f7a6ee95b232154c151cd56d04b483afb93e5 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)*8>L*oQU+f*g1Q1kN>m! ztk;VtZB*AhJS+Od+NcK?SH%I9F_r}R1v5B2yO9Ru_rGY zZMBM_JE@JatHC3}6-Z_mS+5eiUJ@ef;C&&agGFpHmxxv50;yAKN{y?UEDa??8xF2v g@@?4Jm{`Ef;If|cdoKI3LZHzMp00i_>zopr06OkJasU7T literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/appendix.png new file mode 100644 index 0000000000000000000000000000000000000000..f52d5b0cdc9107e523d1303c00afc770edcfe202 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*Y*g30*g5-DWYp`$ zle#6$G`zH>fU=AwL4Lsu4$p3+0XbHlE{-7@6O$7p-ZTitI(RVnHhMCwV%V%St6_uo zEWsC62CNr!69vj#%BKs?VpwgkYo0?%aHM1#(4det%wGccvQ+_1VeoYIb6Mw<&;$Ti CFE1eg literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain-inhand-left.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..cf6e4684e9c4c97a7ab764f319a7cd6440eb1919 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G6o zi(^Q|oVT|Q@*Xk}aJeYoY4@VREJH~*fLHedOYQ|nEkmPAaXXBrMV$Q;?6>-dY8c-~ z&d*E@m5c}WFeJn=80a(15N9~U&G3ws;WN_$xr#U21Ft_nUi*7{<$X`aXJ`9Pe=Xj- zciyI*rk`&}X0@nBJM8>1E1cui6Nar7S0~RZel~ll+u9`z+TUKB+PS%g71cN#wm3W% zNoT*swBnr77S+M>$M;J7 zgBvzQ#O`2U%O8J+P2+!s=I)e>^{am8%)PRVQ^LC9d$;NDGvTO)Vz(-yIywJ2+rFD7 zjC&MAJUo&{R L`njxgN@xNAKc#tm literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/brain.png new file mode 100644 index 0000000000000000000000000000000000000000..04d04890f6b4a831e8889c40f264d284b61fca71 GIT binary patch literal 461 zcmV;;0W$uHP)amXX`z%|4S0FqahNyry%`1+3WY+UxM#Gm55By4E0N*uU$OPw zz0h^~3Q=;Krc@ z`VyZs&EKtvFrAEISOq%2CK!p>=m{OC?t~J!_5A{Dq>?f>^MEVw3O%7?l`O2Y4qHWY z@K^9Jwu+`^6fOb$=3%+h1o~{GlKyJK{9d6@C;)x~p-rXfm=&9b00000NkvXXu0mjf DKDXCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/ears.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/ears.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9ab068ebcd284332fdf3905f688d2d3b56dfa8 GIT binary patch literal 619 zcmV-x0+juUP)&VUCG9{xw%Wz)`GHtoE{ zSw6RkHyO(T2nB-t`P%~E!+V2|Uw^nhV`JQ8EGGfJ1o-kP(~)sLWp3?+wodYOHZ86S z_gc#yZ@VhoueE;>-Yr|mr%Y9uB$Ujpm5+lqt?rrU3X> zyw&!@2Q-=^3|(O8f<$zWZS98@&+zi}#DR(Zjpm4WEJ7#{1fVw@(6TkY6mQiT*H%*X z&Gh_60_KHC@||5jFV7=-!vU3Qhl^U>Cy5PRsC}|=UlZa=<>l##6OTmzW<>ld{boOW zfT0UD5AgClZs0{O&BOIO?sPk9ED7SV2>ouGP#{S8;fYe&rc}1+4F~M(`UwSs^tfQwq) z_h`?G0F;PCbPq!pO2mB5)&drZkXIs!E7gfONh)8;n+RAYqEhXsCurz`O0`2g7MW?> zW!U%|mH)$`K8_#l$=abliC0y>m4JC6^LUNeg9i^1{{ZSoB6z)o*qQ(U002ovPDHLk FV1iDUAwU2C literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-l.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-l.png new file mode 100644 index 0000000000000000000000000000000000000000..14e728707a96ff43cf2e118f6d0d3681abcafff5 GIT binary patch literal 364 zcmV-y0h9iTP)p@G$ZbO+JRa(Y-sR21NopLg*T zMNvXfb4^vze|dRnh7XTlGF;z$0L4OB^iYy6@M@erv-iKhpF6|T=Pwz)ef`ex>gIih zV^dc!be}(p;s{UzB{w9P@L8UcoXa30BF~_$slvd|&&wd8rNm&J6~Rz$Xbq1RHbzEp z?jRT7bhYcc`(R6U`AIP_{Qt}F=kFVav*)icF#h?+up+k&u8tDl;|+ncuf8+vi8Wvl znR}lB>jFTOMRB!fDV9xfdK&iNO|VF)wHDm0000< KMNUMnLSTZYq^t7) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-r.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/eyeball-r.png new file mode 100644 index 0000000000000000000000000000000000000000..d18f4d4572511fc96b0b85503ff875353b14fb34 GIT binary patch literal 354 zcmV-o0iFJdP)0j6Lt-DVo}a0SXPQ;Fg0Ng6x<90W@<&p@9|AYOy(hi5iYb z(l;Z^au8sl)N(dPMh1Q)V?c2a68ndw=Fk8C3?Kjh!I}^$cEIa@zd;6r*`;Hd-{tL&5O7#>+0nBoc&tZmvd`ow5>*)6XFCU)&f9vRu|HxU8F5t`CoB#j+c?QRS zemtUIzCU(&GuTqsb@%@>PQ3bGc;=1&zkfXXf91$_q8vbR8jzQl0n-PberI5)vSRr3 z>mLI%GcyCfj5tyHDR#j9hflyX9~%>cP~S-g2Wd_)|Iy>8lp0MuIC6ON|9`)qf};XN zA3eO8{^dT%5%1sJ_e(BWe>i_53?D0yi6+#_MO*v^m?Oy zmoaYlaw7vE$Vsd|e*g$B{CKGJS4QA}iv8o8;r$P4W+=0BfFy!`|#GSrjI zbF^7sDoB=`xS{C(AWFt-TF*lL2e(`~oaQTBSQ;$LywqYxDMxJs-=(FJw-%;wvCNIl zYfsuRvub_V&WHcaSpW7PUwzt^K@bT3p8fOC_syD4i)nv^Z*t#@zt+*kW1W4;Tlv3IwcGrn^!QaXI|Tjqr=4f{S%m3q*^cma4kHF_Wvk);GNT#pNgQrvLAyoJsm?Px<%mnL1tJZo}#4)(j3=PZ%0j zoCw)GHRR`4skrU&r@l|lI*_wj>dN6&OuLF^#9!T@VLzq5?UXoMn>K?9SH99V+d$LB z>!msnpfC3RXU5#id3FnOqt3B!@qER&?0P@bkDCj=cnhzbn7l1A^DfIv(SZB&-&ff^ zu=g-cu=Fyp-~ZE8eu4GMr`12U{k`N8k`nd)oR_$q#5#%S!+$rv`_GWt_^>O>tpQ?- chyMM~n^rnpzA$Y8Fg6%GUHx3vIVCg!0E67gmjD0& literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-l.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-l.png new file mode 100644 index 0000000000000000000000000000000000000000..9bcb14ea9d3f3f6cb283a9bce160af850e2ba16e GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJvz{)FArY;~60D08M0%P69rQA; zT>k0bdmvfrg+zj4*h7)@@E!fd-`=GySsbWPyi*O&=s<{_n5-J4cI8L4sA` zbnjJ`18>aZ?;Sk)T0b^%iJO&z7ViNaw$=kTqva(W_AL)nQnBJyV4m<^Qo*t@iCsXH zY5x8iw#y49Fu1Z8H7(i6>~Qe!+u!CE|NnKjCrF8~ex1JV!ac?X59)sPG(LR#disM2 z43=$CmJJ&03f7Ol-OcAwkebHECc-m&Q3c4+23%}n1_lNU3=2a-=A~**mIQi?!PC{x JWt~$(697sRW0(K{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-r.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/kidney-r.png new file mode 100644 index 0000000000000000000000000000000000000000..442c81338c1f15403635468b5adebf3ea982f3f5 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJQ=Tr4ArY;~60D08M0%P69W*np zT>k0bDd@v2%dB(7D5Gn$wv9^Bw|8kOVe%Kb3K;`LIJ&)zBvx}agzowIsqf)KW3@%H zj)5X3uU;BliQmPvog>APqd}%wM#-d@fv2IS`r9>jHbFT>k#+%Q4PWN}jtd<)7g(@3 z1TuIt8_ci&_i1LvUlB`&6w5U-JN`dXjQMl>dp=KoyuJDeK%6H;Z?aGaiRm+as< z$E2LWLPf$s@gwiK;#~%7(8A5T-G@y GGywoav{>-~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/liver.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/liver.png new file mode 100644 index 0000000000000000000000000000000000000000..159339e36c980119539cd11dc43964731d721907 GIT binary patch literal 290 zcmV+-0p0$IP)N*Fo{3aju&wTFy4BgIweGJR(Pjf8@{h;_7U*FcVJR`jf0O)q^ zHq9}ig8~-Y0x5L40rvLx|07*qoM6N<$f)QGJ-2eap literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-l.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-l.png new file mode 100644 index 0000000000000000000000000000000000000000..32aca484b9fc08665323556abb5a3aab1e6e7cf7 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJd!8G4U-!7ULw@2AMbS?e{IeA*r(@YTh(izN9AEkB>i_cgZ@G za2(M2|Nk2=^A$m!{C#^C&u4aENU`kMW;QM9$DgOhwK5GNUwF>P?@dS$5lghF`X+gF zn($i&wiW9gr+IgI8rbZvW7R49tvC15f!o*5ORl@Sk8hjIGmZ%nf0t_aloT@X9MECE zc!kNu+F?SxK%S-PCwm@&SiT0G+J8?pnc4NlZx{k4k0&mk$LDp_x%Y=W#3zmHJUl!M Yt2&}y|Bvjb1p1W0)78&qol`;+06lANPXGV_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-r.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/lung-r.png new file mode 100644 index 0000000000000000000000000000000000000000..7e29649ccd8886c45fc090f4fb039498612cc5d2 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJTb?eCArY;~60D08M0%POd6!x2 z{^1*B%{+K3f-A?8<3PqPO9qy{d9}w5Xy_dJ@aHPG!Tc)$3r;X@ zfA4hZz~lS?Wl6FzQ?> zU|3_rV436~qi{l>qwL6Mb$>~Vik%*pPJ8gOo4k6tU`bWLtp#m6!F~vIs6KGu00YB* Xk4V|}u5V9)zGU!p^>bP0l+XkK4fJs$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/meta.json b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/meta.json new file mode 100644 index 0000000000..354132ea11 --- /dev/null +++ b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/meta.json @@ -0,0 +1,80 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation and cev-eris at https://github.com/tgstation/tgstation/commit/c4b7f3c41b6742aca260fe60cc358a778ba9b8c8 and https://github.com/discordia-space/CEV-Eris/commit/476e374cea95ff5e8b1603c48342bf700e2cd7af", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "appendix" + }, + { + "name": "appendix-inflamed" + }, + { + "name": "brain" + }, + { + "name": "brain-inhand-left", + "directions": 4 + }, + { + "name": "brain-inhand-right", + "directions": 4 + }, + { + "name": "ears" + }, + { + "name": "eyeball-l" + }, + { + "name": "eyeball-r" + }, + { + "name": "heart-off" + }, + { + "name": "heart-on", + "delays": [ + [ + 0.6, + 0.1, + 0.1 + ] + ] + }, + { + "name": "kidney-l" + }, + { + "name": "kidney-r" + }, + { + "name": "liver" + }, + { + "name": "lung-l" + }, + { + "name": "lung-r" + }, + { + "name": "stomach" + }, + { + "name": "tongue" + }, + { + "name": "muscle" + }, + { + "name": "nerve" + }, + { + "name": "vessel" + } + ] +} diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/muscle.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/muscle.png new file mode 100644 index 0000000000000000000000000000000000000000..38da7e760720f1bc6fb4a57d4cf3d086bc0e496c GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*yx%tS)}kq=8YXv3 zm~B+oOq0^|7M819ZTcLjhOs2bFPOpM*^M+Hr_j^IF+^ixa)Lz0ffWs>(uIs1L>yT9T3+ldmcYsBsp)v_(JQfeL17Il6M|kno7SXqKuB)Vq<3v9 z2Ufj$6*j4FNpt8K0ar%m#hardEjMXT5$!$`cxP?KlAcF-Y-y}*j{FQxCxw#(XID4@ PEobm_^>bP0l+XkK6L*yx%tS)}kq=8YY(= zSbP>J&R7!U7tG-B>_!@pW9#YS7$Pw>IbnhEi5P~3s&BXyc%Fr<=$LYand7kHC5A&6 z=A2+$CV5+=@&Hd>X6g#V?uA|w{tm1&Dl;C%FeL2akpGk@rwlZR!PC{xWt~$(695-3 BGdutQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/stomach.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/stomach.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf1d5f5141efea3d613ee4a659f6e4f6c6b9dd7 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*8>L*EVZ#Z5$W@+KI`j} zj{hgtB%H0^0hDDd3GxeOaCmkj4akZ1ba4#Pn0WTwMZpFI9_9=4^c>6`5*SqHG88c1 zsTZx!6uVHf&%0Xir@^TS+6T=XLf%#W>asn{e5Uz{V*p#NX;baDZmxm^*^bwaOj!}( m8D8zPMMJJPc})5Lob^X5=f?aEmDhpRFnGH9xvX8`(!|)tB*xg(3Kl`6)GtI(3U#qMcpJqVa1;b_RPYv@9D5Cdiy*qFR2Msy z;!ui|8e0ss$H~r#i_7_K2j27W^6-KrNs=T<|4fPd;c#U`qzxNQ)9LqnD2W7yp>uS1 z9Xks^i!*$-z9SYqfAoG2hq&1cSIDNj2wTK#Z@OZT-+=LE*?N2c=9a+CIG`2w@ofiy!rVN??JcTTRnnHj-hLSs zMARl?)pfAABn)MYT*}3=EPUG`p{OJslhmX|v)*8+D%2Wv&R^~$WyiXK%ePkrppq{L zz1L_1ORb002ovPDHLkV1gRrsQ>@~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/vessel.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/organs.rsi/vessel.png new file mode 100644 index 0000000000000000000000000000000000000000..cfca0298383538cd7e6e7318337bcc8e50b7bbde GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*8>L*Y*g3mmM}|`(q!G> z(g_r2ED7=pW^j0RBMr#$@pN$vk(ipCuz)>5w9#lrjr4*wD`yH!yRqZ);b6{ha9y`M!S+0dAC-!;* P&1LX(^>bP0l+XkKTjno@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/full.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..f97eeb8f4a29178647917129eb0739c440e42e8b GIT binary patch literal 1913 zcmV-<2Zs2GP)Tz0JETuPN#;!+iMtxfiMhl_wQFM7Ex*pP>pdM4sZCS`HT=X z7>Lleb#n1HFh!y(Cf7XlR&Z>WrRTV z=loXown|eq7ivy6%9}mI46JTcK<7y>`Iq$LQKz zEC`Tn+hZ>BpayJIOi!sBeH&Uk?n zrkmkx)xa#MgRL6k-ejt$R-i1%ur2)3Lv}pI-O)Y zuvG(#MZ&~l5eXsC-+}$Bq5`rd*==|XG=5`?_9K@D+&?_RvJBLo9x<8fSS%tq{TP?# zGn{^m#UjFFs-yOljJtn$RAP7^+P01mHFRwb#zL|3*+`VG4MbopMAzoY_Sq4!W|4af zj7GQGEU3dYIZTra=`Q_P+{^2GRWX_B7?1BXiZ2LR4VwjZjK_DHyj73k=*TRQ>?+98 zKlEG`U@WZsod;Lz_uqczb64K{NvAm3TwotPrvY8@7(7F zcJcc8^WO*Q=h79+GQe1fxv!zwOw=%HUZ8F3h?*AwfMzo}pwM}s3eY5J^4a^e7_u;W zy_V3F(q4chOTkCi=CE38G@JF*L5Qx2AO$65;{e*rmSw;|v^Alu%kA161|qQld2B)M z!;l<-ktUE3o}Qjl%n{)#3?iKbvpfKacY1eqk-A5;^PUKgifA;t)pi-5r>E!Cw+zO@ z%De$hLZ19&stZ?p|L~YvX&RUJIDGUllm)4^=dIv*$-Q2$RY~Bp56J=~E1kGq4W`*b z5NO{|fQefskEG%)avMPzL68W6q)gZQ#+L7>#bVAkakMGxs$SHs?j| zh(R`JPJcrro2e;l`1WBI)OQ*}0vW(;uyhQ$1VEBL7F#damKB7YG&u*d-XKq|a37R7CiTvq&glA7>MzqFVUwYwZ%WyzB9{OtJG4oJL@5R+ zET*8T>h!pr9U@~VgN!4PFAF5&r~qj4lw`;rdI$z0F{Vl(P$7h@KYe7#_e0e1rq{?V zgrg>tu@LtUhsS*LGHE9-59$0!-oF-cM;2A(A71f_9}uPd)=TyXR7JZ~*{aj2!D=N2 zuxuGjl{N)Gl%Xz4yU;_~$rH{Y1bOm=GD1*}U0rvuHF>sbh(3XHVEtv8D#%!^H9DPI zp-z!Xf_JO6#_IZ~DqfWftLvY(w67?X1mL;@?l|U7;)A!>`1s*{B}^T{#}Dr@czeBd z-)gPlIHs}|D0PScfN5@rqCk0Lq{7E8`vW9r0!q&0I~uQWb>-kUf*1D;uGwWiIArq^;D2)%gs?LP!<4V;Z}jNi18_d@%S#) zw?xI!A~8WB4FFEl30f4y%ULuai><=w8Bqo8()oaQS4jkT&VQbyI6#g7i=vbUkP)J$ zsdES+`!955jj(c`VD>m#buU0(9@0Gv#kazLY1&g%K{*=d00000NkvXXu0mjfL5hf$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_f.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_f.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc2584a97d88a2b98305b4f935b389d3ae945a7 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$aw1M z;uumf=j|>vJ1_(omoTe2c?RziBV)C`9P%f`3tGma+w;E~`dlW)*(n8#pb z+^u@hfHf)hmKv`$%a%xu{Bqe?v48thUY;)dekXRlc_F{Um-VJ4+--^B&z?`8e*M;0 z9qWIy{1g>yUgn;kP~Y<5>G`E%=@UOrb$_=*{6ue9<()?-dBp!doPVB0v1aFGGlTnW z6-I~uS{%N5)x&aMP@};cuiMjZWO=4EOC0;>R#-F3#9*#jR<&%^-o1}je*bNL%kX+= zos26d19!A;r^$_$#x)jx%X`1Se;v5=^5-eqoQKzy+*SMI$8dVn1QkxVa%UU+{W__J zYrHbq81gqCD9!D8*S7TcYLC~QPgm#d&P}rMV|2)7jH)dC|5p$J0#&D)8Bd$3ykW(S zsX{6-+c}S)VPN3z&)&-GBvH0>yDc+=%gVsa_@LDnj-Pw}N}}cGx#z2Rnu^*w1nO3P z4$M-JKC&t_^E8{`qAMEfWR06&n{D0pYD-XxUD28CHjTTM98Amn_A*G0;rwQM-go6p zGO}_yO9Jm(TG=$*=k)px)bRY~sjr!P*DqJ!y>w+*so}4+>#xZ(SXl4>ds}AVd8x_s w-2;Q7`x*rHmB_5#5qI>Ah!PAeT3W&S_{`B%&%<&}z*NBC>FVdQ&MBb@0L3WuL;wH) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_m.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/head_m.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc2584a97d88a2b98305b4f935b389d3ae945a7 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$aw1M z;uumf=j|>vJ1_(omoTe2c?RziBV)C`9P%f`3tGma+w;E~`dlW)*(n8#pb z+^u@hfHf)hmKv`$%a%xu{Bqe?v48thUY;)dekXRlc_F{Um-VJ4+--^B&z?`8e*M;0 z9qWIy{1g>yUgn;kP~Y<5>G`E%=@UOrb$_=*{6ue9<()?-dBp!doPVB0v1aFGGlTnW z6-I~uS{%N5)x&aMP@};cuiMjZWO=4EOC0;>R#-F3#9*#jR<&%^-o1}je*bNL%kX+= zos26d19!A;r^$_$#x)jx%X`1Se;v5=^5-eqoQKzy+*SMI$8dVn1QkxVa%UU+{W__J zYrHbq81gqCD9!D8*S7TcYLC~QPgm#d&P}rMV|2)7jH)dC|5p$J0#&D)8Bd$3ykW(S zsX{6-+c}S)VPN3z&)&-GBvH0>yDc+=%gVsa_@LDnj-Pw}N}}cGx#z2Rnu^*w1nO3P z4$M-JKC&t_^E8{`qAMEfWR06&n{D0pYD-XxUD28CHjTTM98Amn_A*G0;rwQM-go6p zGO}_yO9Jm(TG=$*=k)px)bRY~sjr!P*DqJ!y>w+*so}4+>#xZ(SXl4>ds}AVd8x_s w-2;Q7`x*rHmB_5#5qI>Ah!PAeT3W&S_{`B%&%<&}z*NBC>FVdQ&MBb@0L3WuL;wH) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_arm.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..69177d35d9ecc38cfb3e8f35ed41cf3c6447c880 GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$Y}F) zaSW-L^Y)fuUbBM$>xFy|=BC^U(o%X4h5Qb%S}?SKX02)3qIr3VkFfYe=^h`YL^D<< z#pMU@-HfpKUpnnf$K1J*U6BnP9UV(VT$e3Pe)iMtb_X|u|0Txjj@D|4yKCcS9@Fmf zS>G(iyJn4iU+)6XJBppwkFzwoeAElu+16cI{a0xoL%gL$sH|V8x|nfLS(*HX5JrXz z2TWHr+1!6odZBOs_uu*(%V!JOGxJ^LnppI}`EkHZSw`NNAJeMp72+5tS&M4gZVQ&E zN-A8wW~)OyXWDM_Im+EuEQc=~etmnphfcg@#sj4wspHAYLZ2s9FsbbOJN=%$%$qX( zM}>^tx(S~zySg9%!>@&}O#g2;%Goh}lTT^vckfx&3k2u$-FJ>$cI&X@zDpkpj-}hy zM|S%=L@wJk-|4HfUc9A)?f=T`#T)kLEh!X?IrHSwv@i`dzMu<> zI#fzN)+%^&y|(=KU0L4bb+>ZL z?v;P3W$xXWr)9j_Xmiw=wU0U&#Z_N^Ub1+HAnAwP13vhSkm?4?@B$z8#NB$xBB&sUti@mlE1LkX8jg>oA+1d_tllM Ye|cf2x@+3TKOkc~UHx3vIVCg!0Kh_VqyPW_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_hand.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..33cc74db0ae4a1fb917f3f716fd3f231fc8d55e8 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsIDEP(G z#WAE}&f8nN3lBMnv_4e+z@z5C*j4aoLQBBH(1T_hSTFPlUw32D;~Alyp^~K|oOAJx$4^<&xTDchQ|Mzvk9{mHPa%TXbjU=C_#} zBUEQ@eJ(5El)3og1=ZCjd?!uHjq@sCnDph(m!(SPSI_1a=Wp{o=BE1QIHLu Lu6{1-oD!M<*!+e) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_leg.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..1a907ae16ceef2e8ac17aca6763234585bc40dd0 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$Vl^a zaSW-L^Y)fuUbBM$>xKTeZ5>M&dQbM=QQ~)iwT3}&vfA?xtQL+_&ZW*WnRaK!p+%9( z9w{?@1$7TabmmCpDE<%M$hvv=;>I*K1tl0*^!uR)OXs4QoHfB~?d|pp9`~MjgTY|F z{p{t(H$|;CSJn~BSNiB4%iQwt3WLL{qwlJdwrj6?9y9%eO|!lrGgC6lKFgb%*Pi1HIOV$6=J%?WT(ib*=2!D)u}tLJP!y|lT4v+> z%UQ>w^PlwT3Ta;7FZ$s@_p{IbU%Os=JvqX9jN#W`!CSRCn_k@4_oMG8U*OExcA_XYY3dvOS-v~`jNg0R`l6<8JLj=l&|3x1eR}hJ zBuiLtxM?!%u-GDXMk0mjQN_zEyAPKYE%7~GF@ZB*Tg literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/meta.json b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/meta.json new file mode 100644 index 0000000000..b495662fb0 --- /dev/null +++ b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by RavenReaper", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_arm.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..198ab59d7ea4b275a8da581ff2575ba3a0beca68 GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$Y}C( zaSW-L^Y)gZ-(dq0wg>jQJZok21E=ZjW#JaGbku*qT=LY-)%fA5E^4EyruPY(Zi20=l=P(!ti|7Dw73_D|W)*aax=V8aeu+eH; z=W1iG$Rn?Wj;WOG-N(J^Sbt2t)Z`mK*Bqz`o1=e-?}O|gjHG4B-uI#MA_e#Oj&qN}G* z{=Q^XzH(~ArqFk{H(O436J?kamm~lTEg<;$lKJ+X{GV@m*WUt05re0zpUXO@geCy_ COT={m literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_foot.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..8843bf85c8168bd59e1bbc6bfa0dcc044b79b2e2 GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsID0tV? z#WAE}&f8mixeghKv^_j;zhQx%U#Z|8w(D_@`3mN*Vl8&<;Ls~8%3R=jE31|caG}vEQ9hBnpWLme=q!Pbsu9C}&JF_<546C}o#3F9DfsFn6 z(#>CMS^LkYXYORWyRYMR&(AZq;p-a19(ok+DGR;FSIc_s*{!$x`EM?{`|na23(Q;w zh8Npz{jE(_GM_nR?(?5(?({F;x8|(1p?<*ha=QnUb#&X+fL3144A`lDU-jP4hVpCA iHhp`l^fPgm*d0a=0Y|T|3x)GQhIzXBxvXejewX8BCm_z{kghIy8msA<^H|$t}a!3%@@3S8&bPm=&pSD)l+ZF z{9Zl#{hR-Lxn{A;OrN~T=l85|$iKZ;bmv_0h55JNrhl3#{vT-fZXM~J+wStey2S%D b^TTCv5mlE5d$YLIK~{LW`njxgN@xNAGe(ZE literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_leg.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..d454fbd4fe1813e9ed1a154efe1287cfa5a1998d GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9FLNg&J^uYMsI$f)yl zaSW-L^Y)fu-XQ}Kwg>keLYFG(_@p|%y0la|`nK>BCYc7|l9!UZzOcwBh@arhFn1H1 z=A~1zVv~iKpwkiAMN3?!YDsIDe)(^ zeYax%h4=Sgzv~y)m;PDmP(g}F{MoXN5zqchv)JZZe>dl0E8lhVO2movEGnK^Hup6c z_q`82=4Dy@Bfx9H-Af*U?mDbuM!&`0`}gEK6nVGX1B+CPQYg*HYq2{VHW1rcCk zb=j*TJG(otBDgeEFT72usH!Vno}G1K)no~ly;rY3ja-~Dk+Cv3NVD-|$MHxD3ms6L9*1cKNfBCy@Ma1;v>sCj%tr4D}lKIp0*t7gV6T4H{8?W** re0o&QRkki8|NZLPBaSZhkA;8V$@?+&#>thy=wa}5^>bP0l+XkKA=bk` literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_f.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_f.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3cb519cd5cd69bfee6cd1a848accd8c1a874aa GIT binary patch literal 832 zcmV-G1Hb%_9Oq1E<1YCdv(5BgD zFT(-2Ku(a9Tc$}#Lkh+eHWR>LYYUGY+px2iWs}YB`x;x8MtXXZ-jk&V5ClOG|1a7{ z3n0T}a>vE{eEz8Y>3bR4^@w&EM#DIL|MC4Bf6s}}lrBe0rttmrhO6YO^5!QU^?dE@ zQ{>AarGPDTrF>Pk(6Lyy(0B5B?mHZdWvf#AQVQrh9MkFT*-@TOZ+TI$&w#WI$SPqr zd(y=FB|6`C_;1_E+6Ngb89^b${q%6U&|??n3h3m2`rZH#e-c3t4$lhu5&iO z2|Qne=WDPK<-S{p(mYwDW`OJJSS*w0dYuTdUPpl2!FnCRb(=MUO&~R7dbm$JKN`lk zvX2-IEg^NgOmbRn>NDm2;1hV&wcY_*fvKP9AFiRAp7?fhR3w? z!LEZaJf1CACuI$stRbvCUB%wt^EJ$7PZvK|$WHTzho2vFt|4o1>ZU1!OArJ>5ClOG z1VIo4K@k5i%7=*}K47y+s%qk1Ad5H$wC&_LQ1w7o`7%$O)mw-fzZ(=>*~gO$(yG*U zptNSO!)BU zw>G~O8C@{;sX~td)aV76d8iz$D8uv1zEVsuK@bE%5ClOGIer0R>MXnH?Y6`K0000< KMNUMnLSTYse1ARw literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_m.png b/Resources/Textures/_Nuclear14/Mobs/Species/Supermutant/parts.rsi/torso_m.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3b8edf96bcf1d4d1de5e6b416ad23dc6b2f280 GIT binary patch literal 830 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 G_rCy}l%*H| literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman2.png b/Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman2.png new file mode 100644 index 0000000000000000000000000000000000000000..aaf4a442634135e528124d9b9553965d36280e8e GIT binary patch literal 18804 zcmc$`cQjnl+xLCOL<>TqmmrAVyQql}A|jILo#QM1+>_Pdh~m3E$P#n=n+`|5 z6w4Jc<$!#n)Qcn0M_P{(+M&m!QXUM+Y(=9b1wNw+Y+9~KG)LQGt@ zuzUCO%4n&mroyQD9HWVj{pHkou5m>sbd*x{F-dT^e$iKnWG}m|F{j_9p%t%1{rIuo ziNwG_?0xlnnipJG-gZcu#fKwd;Spu&drCf{HK8yj=FDyE=_V(q(A5Ut&A5iUBvb=O z#lDl$HyFi2_e9i&FTNtTWXZoS4?!|hK@u+hHSbna)&=3vV*`UbL0QkA!!V5%KP$>> z-e%@RANfUISh0w7qorbOG3?;sNqEEQjq2=p(V2H>jbhcjc-OJ}5;>)r#0^H>&^=Tf z{&Vcu2h_!vT{;{hiB>GGPIMyux}c634_Qlb!tiTpaxbi;GdY#whF56|%!E^|{U1G| zhAgeDZi*vyI$F|0M$T5JmH|9N~_>6rmDot-*nXL@G%yuIM%j;;x+VO6H6bKa(;+CtsT zrnpYzrbM?VZQ>p(R#=GK`T2U_L2mgc!>qoGNXB=0yPTLBr(1dwNV*vYByG$0JsKnu zCTuF3N+Tr7p7cDpZ!(QFRK$c;>7a2NdRKUC6Sd#a5b{Q{i4D2OMm}*do!n9oKj*6( zJ2<-;5CiBNUnp*g2zFqFwe&-KW}mGH#vDO7phtIlqDZ>S_RaCf~+kzh)QDR}oj*40~C+NBo}dLIPIkKRW!d_Y|P zLRWRBDER~mE=0NSi3AvwH!sFzj!1lI2nkJ+6!_fBs3~>SrwVS)=G*>J>GnKWMusvs z7&uex?-%js9|j{6&(1!r`3|g%@6~AcvZ?Cy)qncHX@2coKy2PfR9xk(#k#Mvtn8!y z=lkx6oVqgo7_FV%JpH)tODoFA_d0FxCrH2dT*_==YMABqP3k!z`+=3)X4<8HcPwY^ z7YconI~Mj~kk|LZOiiEG%87kYMpMyMVhK)+LVv%+@kDc+1atNg-8_H{pHFfxg|c}AP`)h zKsI~=lYGa$OPLt8Rqt1r6pTcg+`M|irbOD-g5y2z|Gr<_p-s7uuh55l;ZnAs;lXw0 z(FR6eHxRrNB3~NpuRvBLH;qLw_VZyyHX2^@|{OZYYA-BldWGa+R39BgDavgqV^~ z`8c zy}C!esfH%$=1TVdvui_ga&oeMpR@%-VGS8$ zwbwVF_bJDuS_Hu03=h6XC#|eFLJ3JXKZBc1w z8*IrrMQ=@(V@BVJq2dx>Rff&|VgbDH@-%IW%_ zH0VT^ZtRL+yShHOFey>S<5uQKO&DKet0Rr@ZHp^FpH`vE%I=??cd1fF*;1jJ*in+lvhAR)!iNSQ*)H&18ytwn2*67DiHX58IdYH z_5mDzwNGyIn3_eD)KaT zSqw$sFK?JXdnU!r{n4u0ZnjyuPUIQ|dxTl|R7IYHR_(gPrHQ9(_t6Iz|GhSDp*`nk zaIXeYO)r8ewChF&oAQI@m)@qOrO_dH{^t7)ApDje)`7TSwSDMECpEmC-rBHsa!edI zZGrH-h(1hji^4%$13f&g_YH~=ggwryUH9IYlT{dg#;iPvQU){rUruKDyUKjd+Q;#i z$pl6sqKFZ?elAiOr+=Hs(t(kkv79cYB^zxZmJ^R+a#1qr`zc~dXAtQ01w6ylobcHj zE`e`;bB`*I8O(IxbUSSYQJQQoN}OFVAdOs=kMfwgb#xqKuYvo!{180)vt-!ntT&u( zynHAUXZb+wt3KX`?}~Tfn9pTDDEr5~sMn;PwV1fWN!l~cQzib^#k@UG%*e?Ei^L~I=xR-ZqIydb4zSsa|0xZC{l zWVF4m2F4@FMMBP>LZtCX0es+sHs#pi{Hs0fHGjt9EkEhh&f72cM6NGRg)0Z_eexr# z9f$JbdY~k!D&y44RODN&(S2~}?p^-t2nhf4+tKiWC$Sv9nd+wO2^S(XBI8 zNIs>rl0Bnu&WNNa_6e9YxBo4G6^uh;f&{*2s<^$NgqN9xoa4LFYZs z@Ev|7k^>S_%=Ij~ICnmoKz?=+nPx(}R0Qnn%kK$eumLp91U?XWih8OAFirdR@h#HQ zlKO7n*U^a{+&SMGBW|7=#m!d zAIVqiFC{h|YJ&9Hr6($m+h;9Xsuc|RLm2|l*YFs8ZVT(n`?FwBda66WTh+mKG_pIkWyjBl zdcg2=VP6;CQgL<9y^D{5v4z2K{8(W}Y+74%;a7-19p~dUm$vVZFhU8cE&jrBD0%;)yykYI&z?G!vviz0OFb#Ve-^HA ze9WDEjG8;7y!v=zxI!7L10k2NO9*P~UJY%+6tlzyNK{EtWE6k)e+LOk`G5K(7)IIp zXhx^;S7{cm=hE4JA1CgeMI*@AJd1d_5C?^ z^i1wF!e+V_bhPA~kAGg$k0Fm^7ZQT!rJ{(^-6L;p#D?v$v6uzm*L{o@7tD|Sc~XY; zXDoEW`f^Aub)Pm{pT-)7^GA4W9ZPu5F0r*F&8pfN-x$G2mmYV6Y0PYfPhy^aif(6B z_N1;9D#lJX9zJ?*Aa4&r%Iijt-=YZJiB#k_jAx0FIo>~}Cz+$CO<;=(ZdHeZPCxo; zj-(FXXe5ASeSBxi$$9lWI{SK+)Dw3SMOst{O`ZQ;SL`O+jaNlQ{AUxpB76r0vTXV{ z-H^DY*L^k)4kS3QlV=ds%Z**D-dcVp71xlO>tw;f^j8kr{Hm+>Ln<*BAqV+!I}az0 zyz|HM(0c;yJ#qGPXX?SXZ@}EfpbI_O?Cj{oBqX9{Do7tEt-o5u$w*ecD;H&+SQ6$| zI|I)R-IuHvQc@eL_IC_!F}?!_eCad$#i{V6f8bBdk4u(*F1Mb(wLzTac$`I|2%tFS z|oH?^E4!k@%n=Mw*baP13=5MFEo=MX2)p^oX}3+y zIWPpjAnyLQ&6Cq=M!eZUK_Qfuk#Wn;_~OTpAGfwt;~|JOWcl*=vn@BM1$-dodrn41 z>($z+s7}^E^2#vZ>55L)wntM~GH;Y=d_nU${io7WH9O;|MbHSJ@$XeMG;|y7ZIp_i z3%%~s;IkLjs&!6Bi4dfj8}eT~wr4jVQ?yvVu-(-;Ym2U%J23HF?!U$oxJaHIuy!A6 zsj&YsUGJ_OK3Je*yjkw1bXANJF~LY`IX-_qLx? z0;B59%2*t@L3K-5&gHe`R@9{I_4@{+hhS>t2v%*DoDgqt>r zzYN?^CRm!6EEysn->b;95)f3^)Pg+SNU2tQ4jL|3{uMvf`_GcVc|{M?># z-(Dc5oE?#{-`aE^6%teFxW#t1x|->P8(erYsXZo^@;dDeiJs z@SOI&SUHd7%EQ?;W_N3gV8!q0AUa=mYtKkeKd}>>qY<#P``Bz`Xc!b^=ffHt9Ng90 z9d=!U!X15{Evu*`9oJ(}mWx7Ba)zq%jv4W%yD9&U8_zQJ46ycM+H5{lx+qq7q%0;E z+uW@5Yoio%G$MQBh7wIr>w+;=f&2}n_V)QI4hqnnSs&^*gN7z1+9NOrzzr^aF%7pj zAo%91{|?Ol^@2Z`l^=1!F)^2%g;RARRL5qdJ<-O4XWLaNJUg@u*}?n6#7*xPXTx^G z=f%tiX|=%$;%7c`PS0UGqs*|p(ks=;{0@qODWlU*+dwkX;4Mb=i+7J-<3%CxVb`j5 zJMZhvsFf(`?F^l~!Td43^6@N}-^Y0Y*HuEn0aZpGn5D|=;8YIOsN1Q) z_y6%TmjtE477}r|F%gB6$laQHBbsV(7DUYTQ zxM0j#u>ndwDbC&^2!mTzJxrg+p|{&TaTZGc3TwfI>6?q0?j1cM=&Z-?b8zJO>EWrf zvoj2;QOJBUx`I%=>cbcWE`UXxWBAS{?Jucf*`U@~+{Q%1c|^!&!jsAIGZyF_xOZ$J zM^*#LFg&Cq=72NYQPaz3gPh97^6Gy~Ph0i}ul=beyTgi&Kl*x@-J10D^6+Nq8$o46 zAwA}J^r+Rw0^{3!yq|E&#KO{EX4X)iBJ6OjQ!wZqW-j9+V+Z~BOI(qmAN7=5f!Xf1Nxan_KdpkSu01`ryl9IUvOIc6+RaH5;)rr7+ zYCbh5&TjN{bPxoG!!cv+n^P*p_UCJb}bc%{9TVSLl=$$(3-iv9Yqg z8!SxB%$Nnv%I6~7CH9Nc`?ZrDpXS7YG{O(x=q?DBAqS@-|ZClr#lwC$t0?_*TVW>|7_?l#4WR@{_t?2K_CQhHlA0$n!F3!S69q=ureT`vuyH)LDNlNEvo!cox*TRd+OI zt{auU!uLz62Hz#-jC#788?*ESXz4Fiq9ueio1@X-T%JnQ3kA~TfT6y&HkpKW)?2SV zghNym9y6`=9~_>;-jlBd9(3$61dZ-=2}ojnAMJM1tor(%b2|noLo3P*UueYvS00hQ z&5;lTKy7gzh$~^3`ZTuC-_u@4?0xri3W-XPVD00_M75WkSl zZ~RQa=cu3e=5o@$RP9gASB!W)fd^0Lc<6BodzV*9zu9;g&V|TtcxnIU?#}M@F^6Xh zs_%ajI0O1e0Cf3kLf`JL&o>0~?-8$c(f(U*-w3ZAZj>00&NmTnoG z3jSkZz%!p$TT9=EKH?Po$4u2%%8bP}W;z;bEnYn`({^olB-NLGbDsyCHzCnZtws(W zudv5{B`SaMnaV{{Ai z%8i!B`-;mtcbM*HpS_Qqpy~uiBsN&se=KO9GA?zOEg#Y=#nc!iMcGvvdg=A-&v&zB zAoH;Q#al)OEd~${|2f$mq4Sc4O(s@@Bv>fITyxTF_yy*5d_j;&XL*0Ce0XQ*h5>JA zJK&TVX?VdnOL=@mkhzHIE;sa&nb`Tf{#->4NO=!(fz*Yx!4B(# zb4DrvNIwb6ZEpUVbB~h1`R2)R1px=Voo%P5cIRuKMi{C()_4uxc`2Aw4xFvn#)0w` zIhFF>!J(#`$Ljj#BUib$YgzL73!P(e30R6Ue2wO$wc}bE)j~yr@7(VpQsPos_ob2I z3bTE8LlDAVQL?nnC8ngs8%SEWZ>p|i>9A^sW28W5&fxK8NQ`zY2Ty^RggfNwo@X zayB&Yu*JxWNlP(RRxyzNud>sX!iPcvlcY<(Vt#hN0{8ftHy-+Sv_-Q)E~AV@`CKjI zvv-%16Cr%nAsa8*Z-!7t$*CP(N*i9Ma6WxMa}81fi1kVHQ**x;HLcW;k)^vMI@B;BOf!9rQqf_3B zN^43Y9oXT`=CJ(y{8tCBlasICrz9tz?pS126Eh?h7l*Dt^Bg=rk|D&rT+4A+7?Lp>xNVvu&Edj+Pdv zY^?gxJsa_T6-_{J2f&k!=XJCEM=_wfXKL^tc&mK6Qmko5`e)I2%XS@lC6xfc=+N?U?l+tfV&y*EZPu*b+paOqiUSHRn68#FK zS>8Vcol@~y4AWS)!TL*PJ>EgtY(nvx$!hPKiED7RBoF?n_AbQV@ttqV%>)qdsNU%@3<#1G);-y zqNKS0`Ud)JL1e~9q|K>U@&+HiZW-$q+7E85M+1EB(%Y+Vi9T`#jc?d`j&tFkoqtUP z^Zybt-9-*WpNAl0W|q2L#-5L4^!2fKzuJlLna4bw2hI@DS@~+A`q>&Us-yZjSz0K-ns}-kDHlI9cIK0008rxX z_rHlChG(YgPkXejzd-NGDriBd_gUj@4I?XR(3JgO1T((ALTgqsy2-Q(@(7L=Rk^WH zcjch@`215cTzRvSIDTfB?d<+p(_r(Rtg`>YmP&4bJPdb~%Y%s3@xaI|-Wg7he@XvA zNz;RJAC2FA%N8}LxYVEye$7#?2gw6Q4${9<#dPl1g{N)YI95m_RTR7a7oVZZgi>etAW1apgn z>()to+)OkWGTtfusIXWfI8PguRZI_`s+iSo$G*6{hFOUuUs0C*(ij(d6T~@C*h|!R z2Se(AQ#xQWSYp}dy>%C}s?efSQw}=#Kn@zv>EsglPc|nPR|(QJXE*gJ{q%{%n5eM@ zW;vU|nLGEXdQl%hMHQ zVGxUuN1@f<6ueZ|K2^a<+#g6L_H>QKu9x8IJ|Tax!`tI5mrjeZ-kt$&TO5l-B2nmL zt#;%AUrW+l)Df|Yr}58xujBND&t`l7#b1-djuR%XP3vXaXbI-5Cpe>$5yVe&KD!n7*mFlAI0Ooi&yM%jXp-U`xTW!l z;a`~8wz?yOj8&ke5!mp%`plHhq@6L9YIoeFc$PnsiBE}5|Fv*Bk4UW^;>%x&`=An0 zCMz6`mTaI8(Y5|jye6aG7rVVmslc?Zz%B5KaasmVJ4w_@ZYcmS+Y7l6eVv}QkD#%*2OME-^;5{LXAy?947W%)PupYZ62 zMo9|#%eSv!{8Jajj`mx0iY*1kqFJ8uo0?k;bYz2oxuMerkXq>5@a}H0g4VgqA4gXh zsEdqI*B{7zqIi3nV`=}z8;aFkh3oTre7FHhUN5$6~?K$i8&(8 zBH_>2U|*p}Kh$WJ1c-lq-t~G>bAh~cgC~cM{TLL!=#`j@t=yO4NWLYGyU{xjjJZrN zZyyI~XlrA>%}NeQJe__^H;efuXlrCdH#fLjWLuCDz7AY2E&cBJPCZ9+nLd8dxNUND z!SBW}Jh8L)N%hyxl!m2*j4ziPem%Av4cou>{!aV1=kZOQmAM)bLOk?wJ>9q~;zAlY zB0c;P|2TCJ1t*!n2=nuH{P`;`m_iP{SY|Bj5#HjYKNE*q)JMzfcXl$Lh8?Pr97MeW z(TuHyW)&_uQ9i}i?Vk@;_l1RpcYj7ic2-`gfgM$O<2KsTI(bvdkCXvV_MD^^ArwXx z^%@AkO9vs=pHvC@_jg7j-lSOQq|VBq*Y9NJ{qj@Twn9Fc?(UPB z*^oDW9i>NZ!Q3emH~tc>u>E{7D7>?hBjx6&5jejh2d~K_9$o(zg?69g?%*;1tN#OM zOB_;}e6JIznE!gn!~>4`KOUx7xw;Z!pGgo2?-RXMR+J|+iSu}xYdoy@&~Ka4^e;vz z&<)cyO)@YbE*fy`lyICP#3s-BztjG<+H`V`ueHA`Eq4F$(OEh~C$$8hi66cl)t3`V zt&D>{(y)mS4$PR6D=C9i{9mhuOQ_D+oCCr4r7#UG?K@8VTTV;l&~$-fbkXht3u1?l z1u? z4v)(hO=v0JNh^;fhBY^nkt&m1ga9s-u5N1jcs~n!u#K8&c@CHLUZ#pud`i?8yl@|) zD$vPMiuIierpLocPv$#_&5v&T1GM%qQ%GMDVCLjtN<5JT z=oF7U?C;Qr3=c-iyP;_Tke=0PK9g<68R)=~vgbS&AuL0`^y-3J{hmub)4LJ~B~G0M zxLJIuqdX4DWICKlb#IDgW-oe-TqE0!!N+)@VEj0xzj=)z)ku?ip<0*NUVvFfZE1!94P=?dnL55=I5WyggJ3@ zziod&Rbf;YGqfwKK3DPF*!i~fzwxRli91cbBLF6{!6%a0r{CVn9(-qnVB2f}E#J>k zDy3@tgB`(vR^mI{Kl(GwqRI1aR@vvxn~&z2dGCB>z}F6sT@%8>FrDs=6}nc)VuSF1 zgOimN{yXD&rjn0@OBjZik6*>Yf(<*-N%`)>C#a^?`a?m9&F`Fxc)qQ4Ce(a3eG^Z! zvFAb!*NM6emqQW3W}hj>I^7ZHtbqPTcBbWIs=3|2wo#8G`O&=1{jq~Zc5gJ$^B`8H z0@cjA_?;#uCdSIn?r&yAoUS0BprDeHgnT@ppySx?F;N-$SZ22ykd_@2K)1Rzl{7Nr z-uOl|`s`fz=9BV2fNJEz_?qO73t?JDHm1|rH45inLjXN+c?z!MdCKDshwup3+dJr0 zWVfT3;+)Ogh=GO3M`8#ZQs;pUdf5ICnb@e1kWS;UIaz{(t=I z6^uKNTBThCZ&`u8d;eanWS{5l{iOM&V&T;lIi6!h@BJ%|@vk=VVvqdmtkR12-H_Dz zC4t4Tw)rkmh(E&8h4{QvjblCmh)AIg!J7B8E*10qi@@Ln)VvjnH~G6Sd3@WP5d;bL z#loN;ZyQt=%D?&yATnMPr&cn;%l%(7z5CEe041a*|0Rx*QL(XUvT!yk8KiU6VitC? zZ57$|qZ38X!=W|w{(W48dk$%OpQYzO>+)xc)b&pYyozVAM*`5Q41E_lZf7Xp*aKdK z4t0$<#@HQ8F=7JG%@w)Y6>&>zdqrlY17QD(BweG;_W-T3?p6cEPwqS6Vshd!=e3h7 z_KF-rF1CSE@ug~<)0DIl18A`m8Q2Th&aRgv1v`CMHWA4o4TJ>o?o$l`lHGjhst~C4 z&g=cKBNvtN;dA)TU&Mb7C|0*ZsVqd2(ec1GkJ~3Ch+Ti1_=7EbJOZ%VfPf!X!`T7z zX^-?wd}`d4gwDjO2Wak}Y2rGTE!JQa83~cE33Gv)F2UA(l4IB9H&k(J@?sC^Fa&r} zE98>S^z~x+HB=B}o8Lkye4l94oioX{?OV#aRx_@#2+tn8kGOWCgoE3{W$XIf-B!|JI&kX&(2deFQ9Q`h>wNZ_|EFUyCCE?QCH91 zu&0w@XN@cv@p_eGed9P|GTTR^^wIUAD0&EJnd0;a4btEIMV_wjbh0L^3s@mhzheSu z{ivvSX}5!cF|%XBH@FqID>J2=1Y4PsJulc60GL4x*&{_!!Z+7kHLs?hVl+NAkVx;W zLHWm8{N~oygj0C8YuWq~d-q zAPg2e(s9Lku&hTC+%#=DwwG({#q861jmizhExX5H>{O?Eh%&%VTeCyrLYyP9 zt^qq?oy}3h_p@8_I$4v?>}_X!`y$m}r@{q7UspKB#Kq(m?$bdJ04du;dz!x8%OM~k z^6)pEy{n~V9!Z)8oBwJ7*0_iov(wz9eMtR+d8{Ros8QG@AJ32)hZjkb#fA(&{I8Ye z!k7-n{p|UfCujzAZMq<32xu@cC^kA$t-ig`>A$dS%-(ZQ|My zZ{gTUk3MjHJbK8R@){dTt#w{-L0**6(q@c-8KSyZKJRH`>q?8HIvsb(WC$EOecfh_ zQj`4F(q-QNb<7=~eAU$>^l($4v^FBHeT7r>=<9+=$od#4c9P;VqfebsiOn0VOik>2 zECxi7cX5}A5<0WLwzHK~$Es*>qr2H%nR+57{pFLMql5>PhkGI4o=w ze%@hf@ND|FV)?%pIj`|4rb3tpOMNgdq%r5FkTG@3yqx|47PR? z9ok$x-1=u2Up7q{vWtmvvJfZIz$sJ=A^IPcKS+S(IzvMjoyF#iX$$saf@RA`Oa$u_ zy(}xHTp0Jvn!*#UnL~Ew(2vgSD-0TTxRyXs^mfoix{Cw2p?#71i`-}?PWz5({u+X9 z7bx3-;hm3fei3YBM}z!dp7vo_#!f_J-i>E1Xa1SCJnBwo;u9(TOWWc401E~dPguE)pT}c+nGlPU;RV9Rd`=70;sj&s&ZL&xV?)3{AF8_vRUJJ z+0cZAg((&BP0oA}FojVfPlABUP(yqFtD*$y2WV7(X-LjScxJ!$hbi+C!BX`>g{guN_tEaci8}_;$G@Pm_jx!M)m@G(#V!cfCYr+0L!S9Q;t^KyxTQ$GVwI3 zSn%u6g4JOjM1?_swaNqAsmc{r-W9~|rxj%fz(f1{pl`!0B&CzzqKFw8=`a=g=PPMm zrlkJ-32w#|{?`{JA~p%B92|*7EL6<(ix$lqhAj|^pS`5*#UVhyz6#Zj6UfqY^-*uf z6TF05NPpevCnT7S|3G~AB)$n7+K9)sQ4WmACQ9Bx{qV%IAm9hnr1y7QyQ2S*1w#6# zXQL=gTViu=2x9F@MI@fn2`(Z%+A=YT0+E3wY_xuxO@|!9@cNeDi-j0gstuz;u*OPO z^stSH*mIA;4npE83JjJZ-Nb@~U;dow#b^CJdFS4Iy1d5c`Q`ZI7{>8{7XruwS(Sg4 zH64ORcE}#@UMsM(Ff&{&6q6E|@6Jk(3R@9d$%O8NW3=k;Eei-_C!8i7&=JJLB=tVN zJ9pjxeEpoc0I`B+n9uiC93X7C5FHt|(PH}s$*9oD8TE)6TVwtR!uFXWzpZW8W={Sn zAUpexZgSC&F5TWz!aN&(M9Au>bM0I+jTZ_l4_#yjjg|g^1wGuEUXv z>x17Qy)MKNY&))vDFqvf5#2eFxsS8P-zOD!xTPy2$dkR|(&F9t7~FWp*iYQ-B2 zC2_y}>YkWLlrNjV{%+zyHnwD(@7ri+tErZj&RF+DS5NP{(GaLnaUIzI$hzs7yj7C$ zr`Yg$zs&qL>Y<*hGhQ~R=$w=NWrsteLy*(_B0oy0tLIj;;P`N0QSvjlGK%O8+FqNk zp63(gJn?dUJ3CC!dzK>sX+1qX2iN+`DD*KA#Qr;pAjhIEToBRA6Ya0lCx=PqAezcc zu&8kxF%wjZ4L)r0>|G zP=oU5|C8O@S7T@SOv;1QnDsOaBexa*=7~{BS8t8xx90`b3+m7d#vL!O*Yz71VB9NK zGEz9Ms(<_D+U{$+AGg1CEc|6d55$QF4tC@*%uGby$Ip2%Cn2gFqE~b?9ZJSq@#6D# zTF)vQ8@a{cQ~dF9v2FD~y^1gj3{I=1{;99^6QX-KE9-tte(>kHfltV*JG?}UfFB{J zxh-+O@3H5wts6$XL74x-qz@Rli_bXsu5O}>zVu0<$SB!@Y2pNeJ$}@`cBlUKE5u9) z7+Q{23v$Q>&J78NQkonbU8UD_$p_FiSha-&*axme*b7YK_KE)dSc%6E!f$)y$8qmY zbp@7s6VuZ_8WVk$#jfKn-9ey^CK(}y(YoA;r|&6MDY6V>*zq?y-3HU;p5*8?#>^j{w%aGb3Hav2-?%F zNM-?esSws~#&4Wezr6qyDtDI3-|J^YRhh(e=eeYpv_cj_JBm$gJ>_ zKktZ0eC|OS&)GPsZDx;4&l;r}jKeC*Wh3&{WU$N8IMh+=2atG8N`PI8t_B9p_%qaO zTAa<=N2TTt4-K87cXDtnIw8A#lEi$Ny>Hfiv%>L*Sx=2K+$w2-7@^p&zVc{Gh^5Ul zUnk2Rb=l4D6pY{Pi)U#jY4i<;uiJAXM50B`SEw)k3{-UUYhv1->gvo1I`&j^ZY+N2 zr|<&P3{nFmI$sw9Y&umrP7!~!Ry1)Zs}>JQfH95Yfr-f`4vlL=Ae%m3nmQ4&AQhn8 zsq2}0>!{gz^is4hC6(fhvfjN@J4=z>&%?iF`mlRARU;##_S1w+BqrPJs#We`z{FN& zkZ2~{qHrr9EEThR47$oKr{}jcaR@;*XB?7JMA?R$O1_u1V^8~oH*)R3n)T$bg)Y8& zE7gJ>vWuL?uJ0*p4ZV)mXZ1yQM_{gtL|sfSU0T}{EE&}oThDx+Y@*s^nWV#dBG`Pm zhrqPI+#6#RYJ9Icdi@-LASD=tB@N` z&NI!K>^3Vc@Fe}~yDm(v4cbuieJ~>^?5}J3fW@xv!?G;|85(;zF4{~ay2ag?89X$)3 zl*-62MfqD2R_MW@TW6uwaXU}FP{Ts3!&%95wT9ojK9iv0!Ii8~Rc)TVut1Ps;)&

X7;OhkO$e@nRj@mzPRYI)jj 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 F1OP9n`t1M! literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman_open.png b/Resources/Textures/_Nuclear14/Objects/Vehicles/highwayman.rsi/highwayman_open.png new file mode 100644 index 0000000000000000000000000000000000000000..98b60cc7df0159d43f366ced06402f3ae7e39185 GIT binary patch literal 12777 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 Date: Thu, 19 Feb 2026 17:49:39 +0300 Subject: [PATCH 3/8] Update RobustToolbox submodule to latest master --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index c65fe5cb79..48dbcf7fd4 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit c65fe5cb790d0fbdb90c0637c61892a96bb6bfb2 +Subproject commit 48dbcf7fd4bd6e0c32495fba472239277af61aaf From e8041be2d4830a58fe7218b2af58f13f2f52c495 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Thu, 19 Feb 2026 20:59:16 +0300 Subject: [PATCH 4/8] modified: RobustToolbox --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 48dbcf7fd4..f509405022 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 48dbcf7fd4bd6e0c32495fba472239277af61aaf +Subproject commit f509405022cf75c3a906b2e1bd0a3e8e7eafe3bc From d5007eb79cc197817ad1f59dd8e5ddb2bf322cb2 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Fri, 20 Feb 2026 15:28:45 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20linter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/Locale/en-US/_Nuclear14/species.ftl | 3 +- .../en-US/metabolism/metabolizer-types.ftl | 1 + .../ru-RU/metabolism/metabolizer-types.ftl | 1 + .../entities/mobs/species/supermutant.ftl | 4 + .../Roles/Jobs/Townfolk/town_entity.yml | 1 - .../_Goobstation/Entities/Unique/vehicles.yml | 2 - .../Body/Parts/Supermutant_parts.yml | 136 +++++++++--------- .../Entities/Objects/Vehicles/cars.yml | 5 - .../Objects/Vehicles/landvehicles.yml | 3 - .../_Nuclear14/Species/Supermutant.yml | 7 +- Resources/Prototypes/_Nuclear14/tags.yml | 10 ++ 11 files changed, 89 insertions(+), 84 deletions(-) create mode 100644 Resources/Locale/ru-RU/ss14-ru/prototypes/_nuclear14/entities/mobs/species/supermutant.ftl diff --git a/Resources/Locale/en-US/_Nuclear14/species.ftl b/Resources/Locale/en-US/_Nuclear14/species.ftl index 4714ab0b4d..2fe9bc009a 100644 --- a/Resources/Locale/en-US/_Nuclear14/species.ftl +++ b/Resources/Locale/en-US/_Nuclear14/species.ftl @@ -3,4 +3,5 @@ species-name-ghoul = Ghoul species-name-ghoul-glowing = Glowing Ghoul species-name-ratfolk = Rat Folk -species-name-ratmonarch = Rat Monarch \ No newline at end of file +species-name-ratmonarch = Rat Monarch +species-name-Supermutant = Супермутант diff --git a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl index 97d5c068c4..47cb3e9ac1 100644 --- a/Resources/Locale/en-US/metabolism/metabolizer-types.ftl +++ b/Resources/Locale/en-US/metabolism/metabolizer-types.ftl @@ -13,3 +13,4 @@ metabolizer-type-vampiric = Vampiric metabolizer-type-liquorlifeline = Liquor Lifeline metabolizer-type-shadowkin = Shadowkin metabolizer-type-plasmaman = Plasmaman +metabolizer-type-supermutant = Supermutant diff --git a/Resources/Locale/ru-RU/metabolism/metabolizer-types.ftl b/Resources/Locale/ru-RU/metabolism/metabolizer-types.ftl index 7a17abf365..b5aa0018ee 100644 --- a/Resources/Locale/ru-RU/metabolism/metabolizer-types.ftl +++ b/Resources/Locale/ru-RU/metabolism/metabolizer-types.ftl @@ -9,3 +9,4 @@ metabolizer-type-plant = Растение metabolizer-type-dwarf = Дварф metabolizer-type-moth = Ниан metabolizer-type-arachnid = Арахнид +metabolizer-type-supermutant = Супермутант diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_nuclear14/entities/mobs/species/supermutant.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_nuclear14/entities/mobs/species/supermutant.ftl new file mode 100644 index 0000000000..8f3fa121fe --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_nuclear14/entities/mobs/species/supermutant.ftl @@ -0,0 +1,4 @@ +ent-N14BaseMobSupermutant = супермутант + .desc = { ent-BaseMobHuman.desc } +ent-N14MobSupermutantDummy = { ent-MobHumanDummy } + .desc = { ent-MobHumanDummy.desc } diff --git a/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/town_entity.yml b/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/town_entity.yml index f034256b81..dba701b243 100644 --- a/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/town_entity.yml +++ b/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/town_entity.yml @@ -13,4 +13,3 @@ factions: - Wastelander - Townsfolk - - Supermutant # Forge-Change diff --git a/Resources/Prototypes/_Goobstation/Entities/Unique/vehicles.yml b/Resources/Prototypes/_Goobstation/Entities/Unique/vehicles.yml index 282310c8d6..feb6dae2d3 100644 --- a/Resources/Prototypes/_Goobstation/Entities/Unique/vehicles.yml +++ b/Resources/Prototypes/_Goobstation/Entities/Unique/vehicles.yml @@ -152,7 +152,6 @@ variation: 0.125 - type: Strap position: Stand - renderOver: North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest - type: ItemSlots slots: key_slot: @@ -180,7 +179,6 @@ - type: Vehicle - type: Strap position: Stand - renderOver: North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest - type: ItemSlots slots: key_slot: diff --git a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml index 89ed1af987..90fb1ad8b9 100644 --- a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml +++ b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml @@ -32,40 +32,40 @@ - ReagentId: Blood Quantity: 40 - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior {} - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Slash + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 2500 + behaviors: + - !type:SpawnEntitiesBehavior + spawnInContainer: true + spawn: + Ash: + min: 2 + max: 5 + - !type:BurnBodyBehavior {} + - !type:PlaySoundBehavior + sound: + collection: MeatLaserImpact - type: entity id: HeadSupermutant @@ -86,42 +86,42 @@ damageContainer: Biological damageModifierSet: SupermutantPartDamage - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior {} - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Slash + damage: 2500 + behaviors: + - !type:GibPartBehavior {} + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 2500 + behaviors: + - !type:SpawnEntitiesBehavior + spawnInContainer: true + spawn: + Ash: + min: 2 + max: 5 + - !type:BurnBodyBehavior {} + - !type:PlaySoundBehavior sound: collection: MeatLaserImpact + sound: + collection: MeatLaserImpact - type: entity id: LeftArmSupermutant diff --git a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml index 52e840c88f..9e88e23813 100644 --- a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml +++ b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml @@ -54,7 +54,6 @@ - LowImpassable - BulletImpassable - type: Appearance - autoRot: true - type: ContainerContainer containers: mech-pilot-slot: !type:ContainerSlot @@ -84,10 +83,6 @@ node: start - !type:DoActsBehavior acts: ["Destruction"] - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 # Goobstation Change Start - type: StaticPrice price: 2000 diff --git a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/landvehicles.yml b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/landvehicles.yml index 6dd439e43d..abd930f5e5 100644 --- a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/landvehicles.yml +++ b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/landvehicles.yml @@ -4,9 +4,6 @@ name: green motorbike description: A clean green motorbike. components: - - type: Vehicle - northOverride: -0.1 - southOverride: 0.1 - type: Sprite sprite: _Nuclear14/Objects/Vehicles/bikesbuggy.rsi layers: diff --git a/Resources/Prototypes/_Nuclear14/Species/Supermutant.yml b/Resources/Prototypes/_Nuclear14/Species/Supermutant.yml index 6976054f65..87d09d519f 100644 --- a/Resources/Prototypes/_Nuclear14/Species/Supermutant.yml +++ b/Resources/Prototypes/_Nuclear14/Species/Supermutant.yml @@ -89,8 +89,8 @@ part: LeftFootSupermutant - type: metabolizerType - id: Supermutant - name: Supermutant + id: supermutant + name: metabolizer-type-supermutant - type: entity save: false @@ -188,7 +188,7 @@ - type: Butcherable butcheringType: Spike spawned: - - id: FoodMeathuman + - id: FoodMeatHuman amount: 4 - type: Fixtures fixtures: @@ -241,7 +241,6 @@ - CanPilot - FootstepSound - DoorBumpOpener - - AnomalyHost - SupermutantArmor - type: Damageable damageModifierSet: Supermutant diff --git a/Resources/Prototypes/_Nuclear14/tags.yml b/Resources/Prototypes/_Nuclear14/tags.yml index 0d27d1729e..0227d7a300 100644 --- a/Resources/Prototypes/_Nuclear14/tags.yml +++ b/Resources/Prototypes/_Nuclear14/tags.yml @@ -430,3 +430,13 @@ - type: Tag id: JanicartKeys +# Forge-Change-start +- type: Tag + id: MechKey + +- type: Tag + id: Magazine556Rifle30 + +- type: Tag + id: N14Magazine308RifleSnipers +# Forge-Change-end From 6b46e104fdd4e251ea8c4d08f6a121a316719e01 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Sun, 22 Feb 2026 23:17:04 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=80=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Towndoctor.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townmechanic.yml | 1 - .../_Nuclear14/Roles/Jobs/Townsfolk/Townshopkeeper.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townsperson.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/bartender.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/reporter.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/towndeputy.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townmayor.yml | 1 - .../Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townsheriff.yml | 1 - 9 files changed, 9 deletions(-) diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Towndoctor.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Towndoctor.yml index 3610250b6b..6b806b3a07 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Towndoctor.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Towndoctor.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townmechanic.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townmechanic.yml index 1acc38a9e3..b79627169b 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townmechanic.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townmechanic.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townshopkeeper.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townshopkeeper.yml index fe801311ce..39341263f5 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townshopkeeper.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townshopkeeper.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townsperson.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townsperson.yml index c77945b98e..c77cb4b28a 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townsperson.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/Townsperson.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterOverallTimeRequirement min: 3600 # 1 hour startingGear: TownspersonGear diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/bartender.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/bartender.yml index 1568e8be18..fcd5a5210b 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/bartender.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/bartender.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/reporter.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/reporter.yml index a042d1b2d9..6ad960933d 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/reporter.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/reporter.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/towndeputy.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/towndeputy.yml index 4b47efd31c..3e9990f5f2 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/towndeputy.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/towndeputy.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 14400 # 4 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townmayor.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townmayor.yml index 2b5709495f..e3856ed409 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townmayor.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townmayor.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 36000 # 10 hours diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townsheriff.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townsheriff.yml index 47325bb665..f4d6e575ef 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townsheriff.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Townsfolk/townsheriff.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 28800 # 8 hours From d7f92842d34b06d81b190014a44005e4549cc02d Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Mon, 9 Mar 2026 19:33:53 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B0=D0=BB=20=D0=BA=D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8,=20=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=BA=D0=B8=20=D1=80=D0=BE=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Roles/Jobs/BrotherhoodMidwest/Serf.yml | 5 - .../Jobs/Townfolk/Townshopkeeperhelper.yml | 1 - .../Body/Parts/Supermutant_parts.yml | 383 ++---------------- .../Entities/Objects/Vehicles/cars.yml | 2 + .../Roles/Jobs/Wastelanders/chaplain.yml | 1 - .../_Shitmed/Damage/modifier_sets.yml | 8 +- 6 files changed, 33 insertions(+), 367 deletions(-) diff --git a/Resources/Prototypes/Corvax/Roles/Jobs/BrotherhoodMidwest/Serf.yml b/Resources/Prototypes/Corvax/Roles/Jobs/BrotherhoodMidwest/Serf.yml index 14343e7945..f9003ff9fd 100644 --- a/Resources/Prototypes/Corvax/Roles/Jobs/BrotherhoodMidwest/Serf.yml +++ b/Resources/Prototypes/Corvax/Roles/Jobs/BrotherhoodMidwest/Serf.yml @@ -12,7 +12,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterOverallTimeRequirement min: 3600 startingGear: BoSMidSerfGear @@ -37,9 +36,5 @@ gloves: N14ClothingHandsGlovesCloth bandage: NCClothingCollarBoSSerf - - type: playTimeTracker id: BoSMidSerf - - - diff --git a/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/Townshopkeeperhelper.yml b/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/Townshopkeeperhelper.yml index 68331a9af3..1d0c795aff 100644 --- a/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/Townshopkeeperhelper.yml +++ b/Resources/Prototypes/Corvax/Roles/Jobs/Townfolk/Townshopkeeperhelper.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml index 90fb1ad8b9..d3de9ec42f 100644 --- a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml +++ b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml @@ -8,53 +8,30 @@ - type: Damageable damageContainer: OrganicPart # Shitmed Change damageModifierSet: SupermutantPartDamage - - type: Extractable - juiceSolution: - reagents: - - ReagentId: Fat - Quantity: 3 - - ReagentId: Blood - Quantity: 10 - -- type: entity - id: TorsoSupermutant - name: "Supermutant torso" - parent: [PartSupermutant, BaseTorso] - components: - - type: Sprite - sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi - state: "torso_m" - - type: Extractable - juiceSolution: - reagents: - - ReagentId: Fat - Quantity: 10 - - ReagentId: Blood - Quantity: 40 - type: Destructible thresholds: - trigger: !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 + damageType: Brute + damage: 800 behaviors: - !type:GibPartBehavior {} - trigger: !type:DamageTypeTrigger damageType: Piercing - damage: 2500 + damage: 800 behaviors: - !type:GibPartBehavior {} - trigger: !type:DamageTypeTrigger damageType: Slash - damage: 2500 + damage: 1600 behaviors: - !type:GibPartBehavior {} - trigger: !type:DamageTypeTrigger damageType: Heat - damage: 2500 + damage: 800 behaviors: - !type:SpawnEntitiesBehavior spawnInContainer: true @@ -66,62 +43,40 @@ - !type:PlaySoundBehavior sound: collection: MeatLaserImpact + sound: + collection: MeatLaserImpact + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 5 + - ReagentId: Blood + Quantity: 10 - type: entity - id: HeadSupermutant - name: "Supermutant head" - parent: [PartSupermutant, BaseHead] + id: TorsoSupermutant + name: "Supermutant torso" + parent: [PartSupermutant, BaseTorso] components: - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi - state: "head_m" + state: "torso_m" - type: Extractable juiceSolution: reagents: - ReagentId: Fat - Quantity: 5 - - ReagentId: Blood Quantity: 10 - - type: Damageable - damageContainer: Biological - damageModifierSet: SupermutantPartDamage - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior {} - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior {} - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - sound: - collection: MeatLaserImpact + - ReagentId: Blood + Quantity: 40 + +- type: entity + id: HeadSupermutant + name: "Supermutant head" + parent: [PartSupermutant, BaseHead] + components: + - type: Sprite + sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi + state: "head_m" - type: entity id: LeftArmSupermutant @@ -131,41 +86,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "l_arm" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: RightArmSupermutant @@ -175,41 +95,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "r_arm" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: LeftHandSupermutant @@ -219,41 +104,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "l_hand" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: RightHandSupermutant @@ -263,41 +113,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "r_hand" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: LeftLegSupermutant @@ -307,41 +122,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "l_leg" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: RightLegSupermutant @@ -351,41 +131,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "r_leg" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: LeftFootSupermutant @@ -395,41 +140,6 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "l_foot" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact - type: entity id: RightFootSupermutant @@ -439,38 +149,3 @@ - type: Sprite sprite: _Nuclear14/Mobs/Species/Supermutant/parts.rsi state: "r_foot" - - type: Destructible - thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Slash - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Piercing - damage: 2500 - behaviors: - - !type:GibPartBehavior { } - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 2500 - behaviors: - - !type:SpawnEntitiesBehavior - spawnInContainer: true - spawn: - Ash: - min: 2 - max: 5 - - !type:BurnBodyBehavior { } - - !type:PlaySoundBehavior - sound: - collection: MeatLaserImpact diff --git a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml index 9e88e23813..f44aff6bf9 100644 --- a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml +++ b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml @@ -70,6 +70,8 @@ - type: FootstepModifier footstepSoundCollection: path: /Audio/Mecha/cardrive.ogg + range: 20 + volume: -5 - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Wastelanders/chaplain.yml b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Wastelanders/chaplain.yml index f093bd622d..32d7e278f8 100644 --- a/Resources/Prototypes/_Nuclear14/Roles/Jobs/Wastelanders/chaplain.yml +++ b/Resources/Prototypes/_Nuclear14/Roles/Jobs/Wastelanders/chaplain.yml @@ -11,7 +11,6 @@ species: - Human - Ghoul - - Supermutant # Forge-Change - !type:CharacterDepartmentTimeRequirement # Forge-Add department: Townsfolk min: 7200 # 2 hours diff --git a/Resources/Prototypes/_Shitmed/Damage/modifier_sets.yml b/Resources/Prototypes/_Shitmed/Damage/modifier_sets.yml index 0f68176faa..4367f60284 100644 --- a/Resources/Prototypes/_Shitmed/Damage/modifier_sets.yml +++ b/Resources/Prototypes/_Shitmed/Damage/modifier_sets.yml @@ -17,10 +17,6 @@ - type: damageModifierSet id: SupermutantPartDamage coefficients: - Blunt: 0.4 - Slash: 0.6 - Piercing: 0.25 - Cold: 0.25 - Heat: 0.4 - Shock: 0.25 + Slash: 0.5 + Cold: 0.5 # Forge-Change-end From 50b16b14d48f5dd7da69e38fc8f481d5f780f177 Mon Sep 17 00:00:00 2001 From: RavenAzala Date: Mon, 9 Mar 2026 20:08:43 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=BF=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BB=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml | 2 +- .../Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml index d3de9ec42f..f862f5c17a 100644 --- a/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml +++ b/Resources/Prototypes/_Nuclear14/Body/Parts/Supermutant_parts.yml @@ -12,7 +12,7 @@ thresholds: - trigger: !type:DamageTypeTrigger - damageType: Brute + damageType: Blunt damage: 800 behaviors: - !type:GibPartBehavior {} diff --git a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml index f44aff6bf9..9e88e23813 100644 --- a/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml +++ b/Resources/Prototypes/_Nuclear14/Entities/Objects/Vehicles/cars.yml @@ -70,8 +70,6 @@ - type: FootstepModifier footstepSoundCollection: path: /Audio/Mecha/cardrive.ogg - range: 20 - volume: -5 - type: Destructible thresholds: - trigger: