diff --git a/Content.Server/GameObjects/Components/ComputerComponent.cs b/Content.Server/GameObjects/Components/ComputerComponent.cs index bef1ff8355..0fe0246042 100644 --- a/Content.Server/GameObjects/Components/ComputerComponent.cs +++ b/Content.Server/GameObjects/Components/ComputerComponent.cs @@ -1,13 +1,28 @@ using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Shared.GameObjects.Components; +using JetBrains.Annotations; using Robust.Server.GameObjects; +using Robust.Server.GameObjects.Components.Container; +using Robust.Server.Interfaces.GameObjects; using Robust.Shared.GameObjects; +using Robust.Shared.Log; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components { [RegisterComponent] - public sealed class ComputerComponent : SharedComputerComponent + public sealed class ComputerComponent : SharedComputerComponent, IMapInit { + [ViewVariables] + private string _boardPrototype; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref _boardPrototype, "board", string.Empty); + } + public override void Initialize() { base.Initialize(); @@ -21,6 +36,8 @@ namespace Content.Server.GameObjects.Components appearance.SetData(ComputerVisuals.Powered, powerReceiver.Powered); } } + + CreateComputerBoard(); } public override void OnRemove() @@ -40,5 +57,36 @@ namespace Content.Server.GameObjects.Components appearance.SetData(ComputerVisuals.Powered, e.Powered); } } + + /// + /// Creates the corresponding computer board on the computer. + /// This exists so when you deconstruct computers that were serialized with the map, + /// you can retrieve the computer board. + /// + private void CreateComputerBoard() + { + // We don't do anything if this is null or empty. + if (string.IsNullOrEmpty(_boardPrototype)) + return; + + var container = ContainerManagerComponent.Ensure("board", Owner, out var existed); + + if (existed) + { + // We already contain a board. Note: We don't check if it's the right one! + if (container.ContainedEntities.Count != 0) + return; + } + + var board = Owner.EntityManager.SpawnEntity(_boardPrototype, Owner.Transform.Coordinates); + + if(!container.Insert(board)) + Logger.Warning($"Couldn't insert board {board} to computer {Owner}!"); + } + + public void MapInit() + { + CreateComputerBoard(); + } } } diff --git a/Resources/Prototypes/Entities/Constructible/Power/arcade.yml b/Resources/Prototypes/Entities/Constructible/Power/arcade.yml index 429b2d217a..8841f0a6f6 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/arcade.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/arcade.yml @@ -34,6 +34,8 @@ type: SpaceVillainArcadeBoundUserInterface - key: enum.WiresUiKey.Key type: WiresBoundUserInterface + - type: Computer + board: SpaceVillainArcadeComputerCircuitboard - type: entity id: BlockGameArcade @@ -69,3 +71,5 @@ type: BlockGameBoundUserInterface - key: enum.WiresUiKey.Key type: WiresBoundUserInterface + - type: Computer + board: BlockGameArcadeComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Constructible/Power/computers.yml b/Resources/Prototypes/Entities/Constructible/Power/computers.yml index fb9b3315b0..947fefb4a8 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/computers.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/computers.yml @@ -168,6 +168,8 @@ interfaces: - key: enum.CargoConsoleUiKey.Key type: CargoConsoleBoundUserInterface + - type: Computer + board: SupplyComputerCircuitboard - type: entity id: ComputerSupplyRequest @@ -182,6 +184,8 @@ screen: request - type: CargoConsole requestOnly: true + - type: Computer + board: SupplyRequestComputerCircuitboard - type: entity id: ComputerMedicalRecords @@ -219,6 +223,8 @@ - type: PowerReceiver load: 200 priority: Low + - type: Computer + board: ResearchComputerCircuitboard - type: entity id: ComputerId @@ -238,6 +244,8 @@ - type: ComputerVisualizer key: id_key screen: id + - type: Computer + board: IDComputerCircuitboard - type: entity id: computerBodyScanner @@ -255,6 +263,8 @@ - type: ComputerVisualizer key: generic_key screen: generic + - type: Computer + board: BodyScannerComputerCircuitboard - type: entity id: ComputerComms @@ -272,6 +282,8 @@ interfaces: - key: enum.CommunicationsConsoleUiKey.Key type: CommunicationsConsoleBoundUserInterface + - type: Computer + board: CommsComputerCircuitboard - type: entity id: ComputerSolarControl @@ -289,3 +301,5 @@ interfaces: - key: enum.SolarControlConsoleUiKey.Key type: SolarControlConsoleBoundUserInterface + - type: Computer + board: SolarControlComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Objects/Misc/computer_circuitboards.yml b/Resources/Prototypes/Entities/Objects/Misc/computer_circuitboards.yml index 71396f6a7a..01968130e0 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/computer_circuitboards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/computer_circuitboards.yml @@ -64,3 +64,19 @@ components: - type: ComputerBoard prototype: ComputerSolarControl + +- type: entity + id: SpaceVillainArcadeComputerCircuitboard + parent: BaseComputerCircuitboard + name: space villain arcade computer circuit board + components: + - type: ComputerBoard + prototype: Arcade + +- type: entity + id: BlockGameArcadeComputerCircuitboard + parent: BaseComputerCircuitboard + name: block game arcade computer circuit board + components: + - type: ComputerBoard + prototype: BlockGameArcade