From: AndrewFenriz <78079974+AndrewFenriz@users.noreply.github.com> Date: Sun, 31 Aug 2025 12:54:45 +0000 (+0300) Subject: Migrate all mechs to PartAssembly and remove legacy MechAssemblySystem (#39027) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=0e23e4537fd895fb0a6fcdd7b435dbb43d7d7822;p=space-station-14.git Migrate all mechs to PartAssembly and remove legacy MechAssemblySystem (#39027) * Removed the old MechAssembly system and component. Converted all mechs to use the unified PartAssembly system. Removed dismantling mechs during assembly logic to simplify the code. * Delete Chassis via migration --- diff --git a/Content.Server/Mech/Components/MechAssemblyComponent.cs b/Content.Server/Mech/Components/MechAssemblyComponent.cs deleted file mode 100644 index 2d352cbf15..0000000000 --- a/Content.Server/Mech/Components/MechAssemblyComponent.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Content.Shared.Storage.Components; -using Content.Shared.Tag; -using Content.Shared.Tools; -using Robust.Shared.Containers; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; - -namespace Content.Server.Mech.Components; - -/// -/// A component used to create a mech chassis -/// after the correct parts have been placed inside -/// of it. -/// -/// -/// The actual visualization of the parts being inserted is -/// done via -/// -[RegisterComponent] -public sealed partial class MechAssemblyComponent : Component -{ - /// - /// The parts needed to be placed within the assembly, - /// stored as a tag and a bool tracking whether or not - /// they're present. - /// - [DataField("requiredParts", required: true, customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] - public Dictionary RequiredParts = new(); - - /// - /// The prototype spawned when the assembly is finished - /// - [DataField("finishedPrototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] - public string FinishedPrototype = default!; - - /// - /// The container that stores all of the parts when - /// they're being assembled. - /// - [ViewVariables] - public Container PartsContainer = default!; - - /// - /// The quality of tool needed to remove all the parts - /// from the parts container. - /// - [DataField("qualityNeeded", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Prying"; -} diff --git a/Content.Server/Mech/Systems/MechAssemblySystem.cs b/Content.Server/Mech/Systems/MechAssemblySystem.cs deleted file mode 100644 index bfd88d53b9..0000000000 --- a/Content.Server/Mech/Systems/MechAssemblySystem.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Content.Server.Mech.Components; -using Content.Shared.Interaction; -using Content.Shared.Tag; -using Content.Shared.Tools.Components; -using Content.Shared.Tools.Systems; -using Robust.Server.Containers; -using Robust.Shared.Containers; - -namespace Content.Server.Mech.Systems; - -/// -/// Handles and the insertion -/// and removal of parts from the assembly. -/// -public sealed class MechAssemblySystem : EntitySystem -{ - [Dependency] private readonly ContainerSystem _container = default!; - [Dependency] private readonly TagSystem _tag = default!; - [Dependency] private readonly SharedToolSystem _toolSystem = default!; - - /// - public override void Initialize() - { - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnInteractUsing); - } - - private void OnInit(EntityUid uid, MechAssemblyComponent component, ComponentInit args) - { - component.PartsContainer = _container.EnsureContainer(uid, "mech-assembly-container"); - } - - private void OnInteractUsing(EntityUid uid, MechAssemblyComponent component, InteractUsingEvent args) - { - if (_toolSystem.HasQuality(args.Used, component.QualityNeeded)) - { - foreach (var tag in component.RequiredParts.Keys) - { - component.RequiredParts[tag] = false; - } - _container.EmptyContainer(component.PartsContainer); - return; - } - - if (!TryComp(args.Used, out var tagComp)) - return; - - foreach (var (tag, val) in component.RequiredParts) - { - if (!val && _tag.HasTag(tagComp, tag)) - { - component.RequiredParts[tag] = true; - _container.Insert(args.Used, component.PartsContainer); - break; - } - } - - //check to see if we have all the parts - foreach (var val in component.RequiredParts.Values) - { - if (!val) - return; - } - Spawn(component.FinishedPrototype, Transform(uid).Coordinates); - Del(uid); - } -} diff --git a/Resources/Locale/en-US/mech/mech.ftl b/Resources/Locale/en-US/mech/mech.ftl index 7fac0387ed..95bb7f6ab0 100644 --- a/Resources/Locale/en-US/mech/mech.ftl +++ b/Resources/Locale/en-US/mech/mech.ftl @@ -18,4 +18,6 @@ mech-slot-display = Open Slots: {$amount} mech-no-enter = You cannot pilot this. -mech-eject-pilot-alert = {$user} is pulling the pilot out of the {$item}! \ No newline at end of file +mech-eject-pilot-alert = {$user} is pulling the pilot out of the {$item}! + +mech-construction-guide-string = All mech parts must be attached to the harness. diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml index c40073c659..2731c6909f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mech_construction.yml @@ -75,16 +75,23 @@ - type: ContainerContainer containers: mech-assembly-container: !type:Container - - type: MechAssembly - finishedPrototype: RipleyChassis - requiredParts: - RipleyLArm: false - RipleyRArm: false - RipleyLLeg: false - RipleyRLeg: false + battery-container: !type:Container + - type: MechAssemblyVisuals + statePrefix: ripley - type: Sprite state: ripley_harness+o noRot: true + - type: PartAssembly + parts: + Ripley: + - RipleyLArm + - RipleyRArm + - RipleyLLeg + - RipleyRLeg + containerId: mech-assembly-container + - type: Construction + graph: Ripley + node: start - type: entity parent: BaseRipleyPartItem @@ -134,26 +141,6 @@ tags: - RipleyRArm -- type: entity - id: RipleyChassis - parent: BaseRipleyPart - name: ripley chassis - description: An in-progress construction of the Ripley APLU mech. - components: - - type: Appearance - - type: ContainerContainer - containers: - battery-container: !type:Container - - type: MechAssemblyVisuals - statePrefix: ripley - - type: Sprite - noRot: true - state: ripley0 - - type: Construction - graph: Ripley - node: start - defaultTarget: ripley - # H.O.N.K. - type: entity @@ -203,16 +190,23 @@ - type: ContainerContainer containers: mech-assembly-container: !type:Container - - type: MechAssembly - finishedPrototype: HonkerChassis - requiredParts: - HonkerLArm: false - HonkerRArm: false - HonkerLLeg: false - HonkerRLeg: false + battery-container: !type:Container + - type: MechAssemblyVisuals + statePrefix: honker - type: Sprite state: honker_harness+o noRot: true + - type: PartAssembly + parts: + Honker: + - HonkerLArm + - HonkerRArm + - HonkerLLeg + - HonkerRLeg + containerId: mech-assembly-container + - type: Construction + graph: Honker + node: start - type: entity parent: BaseHonkerPartItem @@ -262,26 +256,6 @@ tags: - HonkerRArm -- type: entity - id: HonkerChassis - parent: BaseHonkerPart - name: H.O.N.K. chassis - description: An in-progress construction of a H.O.N.K. mech. Contains chuckle unit, bananium core and honk support systems. - components: - - type: Appearance - - type: ContainerContainer - containers: - battery-container: !type:Container - - type: MechAssemblyVisuals - statePrefix: honker - - type: Sprite - noRot: true - state: honker0 - - type: Construction - graph: Honker - node: start - defaultTarget: honker - # H.A.M.T.R. - type: entity @@ -331,16 +305,23 @@ - type: ContainerContainer containers: mech-assembly-container: !type:Container - - type: MechAssembly - finishedPrototype: HamtrChassis - requiredParts: - HamtrLArm: false - HamtrRArm: false - HamtrLLeg: false - HamtrRLeg: false + battery-container: !type:Container + - type: MechAssemblyVisuals + statePrefix: hamtr - type: Sprite state: hamtr_harness+o noRot: true + - type: PartAssembly + parts: + Hamtr: + - HamtrLArm + - HamtrRArm + - HamtrLLeg + - HamtrRLeg + containerId: mech-assembly-container + - type: Construction + graph: Hamtr + node: start - type: entity parent: BaseHamtrPartItem @@ -390,26 +371,6 @@ tags: - HamtrRArm -- type: entity - id: HamtrChassis - parent: BaseHamtrPart - name: HAMTR chassis - description: An in-progress construction of the HAMTR mech. - components: - - type: Appearance - - type: ContainerContainer - containers: - battery-container: !type:Container - - type: MechAssemblyVisuals - statePrefix: hamtr - - type: Sprite - noRot: true - state: hamtr0 - - type: Construction - graph: Hamtr - node: start - defaultTarget: hamtr - # Vim!!!!!! - type: entity @@ -455,30 +416,17 @@ - type: ContainerContainer containers: mech-assembly-container: !type:Container - - type: MechAssembly - finishedPrototype: VimChassis - requiredParts: - HelmetEVA: false - BorgLeg: false - - type: Sprite - state: harness - noRot: true - -- type: entity - id: VimChassis - parent: BaseVimPart - name: vim chassis - description: An in-progress construction of the Vim exosuit. - components: - - type: Appearance - - type: ContainerContainer - containers: battery-container: !type:Container - - type: MechAssemblyVisuals - statePrefix: vim + - type: PartAssembly + parts: + Vim: + - HelmetEVA + - BorgLeg + - BorgLeg + containerId: mech-assembly-container - type: Sprite + state: harness noRot: true - state: vim0 - type: Construction graph: Vim node: start diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/hamtr_construction.yml b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/hamtr_construction.yml index 687d72f390..a71846755f 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/hamtr_construction.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/hamtr_construction.yml @@ -6,6 +6,9 @@ edges: - to: hamtr steps: + - assemblyId: Hamtr + guideString: mech-construction-guide-string + - tool: Anchoring doAfter: 1 completed: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml index 8274c4c0d1..a821cf18a2 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/honker_construction.yml @@ -6,6 +6,9 @@ edges: - to: honker steps: + - assemblyId: Honker + guideString: mech-construction-guide-string + - tool: Honking doAfter: 1 completed: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/ripley_construction.yml b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/ripley_construction.yml index db45cbc4f1..f9e5451849 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/ripley_construction.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/ripley_construction.yml @@ -6,6 +6,9 @@ edges: - to: ripley steps: + - assemblyId: Ripley + guideString: mech-construction-guide-string + - tool: Anchoring doAfter: 1 completed: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/vim_construction.yml b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/vim_construction.yml index 7feed88cc5..5a1c614550 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/mechs/vim_construction.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/mechs/vim_construction.yml @@ -6,6 +6,9 @@ edges: - to: vim steps: + - assemblyId: Vim + guideString: mech-construction-guide-string + - tag: VoiceTrigger name: construction-graph-tag-voice-trigger icon: diff --git a/Resources/migration.yml b/Resources/migration.yml index ef78bc5fdd..92715e9f2f 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -701,6 +701,12 @@ BarSignWhiskeyEchoesAlignTile: BarSignWhiskeyEchoes # 2025-06-21 ClothingNeckHeadphones: ClothingMultipleHeadphones +# 2025-07-17 +RipleyChassis: null +HonkerChassis: null +HamtrChassis: null +VimChassis: null + # 2025-08-01 FoodDonutJellySlugcat: FoodDonutJellyScurret