From 334568dad22bf24f09b0242cd2df369cdf464ab6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 15 Feb 2022 15:01:45 +1100 Subject: [PATCH] ECS cargo telepad and cleanup (#6450) Co-authored-by: metalgearsloth --- Content.Client/Cargo/CargoSystem.Telepad.cs | 98 +++++++++++ Content.Client/Cargo/CargoSystem.cs | 15 ++ Content.Client/Cargo/CargoTelepadComponent.cs | 10 ++ Content.Client/Entry/IgnoredComponents.cs | 1 - ...onsoleSystem.cs => CargoSystem.Console.cs} | 43 ++--- Content.Server/Cargo/CargoSystem.Telepad.cs | 130 +++++++++++++++ Content.Server/Cargo/CargoSystem.cs | 27 +++ .../Cargo/Components/CargoConsoleComponent.cs | 6 +- .../Components/CargoOrderDatabaseComponent.cs | 2 +- .../Cargo/Components/CargoTelepadComponent.cs | 154 +++--------------- .../Components/SharedCargoTelepadComponent.cs | 8 + Content.Shared/Cargo/SharedCargoSystem.cs | 21 +++ .../Entities/Structures/cargo_telepad.yml | 11 +- .../Structures/cargo_telepad.rsi/beam.png | Bin 1660 -> 14085 bytes .../Structures/cargo_telepad.rsi/idle.png | Bin 1138 -> 10426 bytes .../Structures/cargo_telepad.rsi/meta.json | 2 +- 16 files changed, 368 insertions(+), 160 deletions(-) create mode 100644 Content.Client/Cargo/CargoSystem.Telepad.cs create mode 100644 Content.Client/Cargo/CargoSystem.cs create mode 100644 Content.Client/Cargo/CargoTelepadComponent.cs rename Content.Server/Cargo/{CargoConsoleSystem.cs => CargoSystem.Console.cs} (93%) create mode 100644 Content.Server/Cargo/CargoSystem.Telepad.cs create mode 100644 Content.Server/Cargo/CargoSystem.cs create mode 100644 Content.Shared/Cargo/Components/SharedCargoTelepadComponent.cs create mode 100644 Content.Shared/Cargo/SharedCargoSystem.cs diff --git a/Content.Client/Cargo/CargoSystem.Telepad.cs b/Content.Client/Cargo/CargoSystem.Telepad.cs new file mode 100644 index 0000000000..f369b7cf82 --- /dev/null +++ b/Content.Client/Cargo/CargoSystem.Telepad.cs @@ -0,0 +1,98 @@ +using Content.Shared.Cargo; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; + +namespace Content.Client.Cargo; + +public sealed partial class CargoSystem +{ + private static readonly Animation CargoTelepadBeamAnimation = new() + { + Length = TimeSpan.FromSeconds(0.5), + AnimationTracks = + { + new AnimationTrackSpriteFlick + { + LayerKey = CargoTelepadLayers.Beam, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(new RSI.StateId("beam"), 0f) + } + } + } + }; + + private static readonly Animation CargoTelepadIdleAnimation = new() + { + Length = TimeSpan.FromSeconds(0.8), + AnimationTracks = + { + new AnimationTrackSpriteFlick + { + LayerKey = CargoTelepadLayers.Beam, + KeyFrames = + { + new AnimationTrackSpriteFlick.KeyFrame(new RSI.StateId("idle"), 0f) + } + } + } + }; + + private const string TelepadBeamKey = "cargo-telepad-beam"; + private const string TelepadIdleKey = "cargo-telepad-idle"; + + private void InitializeCargoTelepad() + { + SubscribeLocalEvent(OnCargoAppChange); + SubscribeLocalEvent(OnCargoAnimComplete); + } + + private void OnCargoAppChange(EntityUid uid, CargoTelepadComponent component, ref AppearanceChangeEvent args) + { + OnChangeData(args.Component); + } + + private void OnCargoAnimComplete(EntityUid uid, CargoTelepadComponent component, AnimationCompletedEvent args) + { + if (!TryComp(uid, out var appearance)) return; + + OnChangeData(appearance); + } + + private void OnChangeData(AppearanceComponent component) + { + if (!TryComp(component.Owner, out var sprite)) return; + + component.TryGetData(CargoTelepadVisuals.State, out CargoTelepadState? state); + AnimationPlayerComponent? player = null; + + switch (state) + { + case CargoTelepadState.Teleporting: + if (_player.HasRunningAnimation(component.Owner, TelepadBeamKey)) return; + _player.Stop(component.Owner, player, TelepadIdleKey); + _player.Play(component.Owner, player, CargoTelepadBeamAnimation, TelepadBeamKey); + break; + case CargoTelepadState.Unpowered: + sprite.LayerSetVisible(CargoTelepadLayers.Beam, false); + _player.Stop(component.Owner, player, TelepadBeamKey); + _player.Stop(component.Owner, player, TelepadIdleKey); + break; + default: + sprite.LayerSetVisible(CargoTelepadLayers.Beam, true); + + if (_player.HasRunningAnimation(component.Owner, player, TelepadIdleKey) || + _player.HasRunningAnimation(component.Owner, player, TelepadBeamKey)) return; + + _player.Play(component.Owner, player, CargoTelepadIdleAnimation, TelepadIdleKey); + break; + } + } + + private enum CargoTelepadLayers : byte + { + Base = 0, + Beam = 1, + } +} diff --git a/Content.Client/Cargo/CargoSystem.cs b/Content.Client/Cargo/CargoSystem.cs new file mode 100644 index 0000000000..ce26dc7ecf --- /dev/null +++ b/Content.Client/Cargo/CargoSystem.cs @@ -0,0 +1,15 @@ +using Content.Shared.Cargo; +using Robust.Client.GameObjects; + +namespace Content.Client.Cargo; + +public sealed partial class CargoSystem : SharedCargoSystem +{ + [Dependency] private readonly AnimationPlayerSystem _player = default!; + + public override void Initialize() + { + base.Initialize(); + InitializeCargoTelepad(); + } +} diff --git a/Content.Client/Cargo/CargoTelepadComponent.cs b/Content.Client/Cargo/CargoTelepadComponent.cs new file mode 100644 index 0000000000..884718f783 --- /dev/null +++ b/Content.Client/Cargo/CargoTelepadComponent.cs @@ -0,0 +1,10 @@ +using Content.Shared.Cargo.Components; +using Robust.Shared.GameObjects; + +namespace Content.Client.Cargo; + +[RegisterComponent] +public sealed class CargoTelepadComponent : SharedCargoTelepadComponent +{ + +} diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 20bc61f63c..1d0a90ee68 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -227,7 +227,6 @@ namespace Content.Client.Entry "MachineFrame", "MachineBoard", "ChemicalAmmo", - "CargoTelepad", "TraitorDeathMatchRedemption", "CanHostGuardian", "SliceableFood", diff --git a/Content.Server/Cargo/CargoConsoleSystem.cs b/Content.Server/Cargo/CargoSystem.Console.cs similarity index 93% rename from Content.Server/Cargo/CargoConsoleSystem.cs rename to Content.Server/Cargo/CargoSystem.Console.cs index 317fa8b9d0..fd6a76c4c0 100644 --- a/Content.Server/Cargo/CargoConsoleSystem.cs +++ b/Content.Server/Cargo/CargoSystem.Console.cs @@ -11,7 +11,7 @@ using Robust.Shared.IoC; namespace Content.Server.Cargo { - public class CargoConsoleSystem : EntitySystem + public sealed partial class CargoSystem { /// /// How much time to wait (in seconds) before increasing bank accounts balance. @@ -50,36 +50,41 @@ namespace Content.Server.Cargo [Dependency] private readonly IdCardSystem _idCardSystem = default!; [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; - public override void Initialize() + private void InitializeConsole() { SubscribeLocalEvent(Reset); - - CreateBankAccount("Space Station 14", 1000); - CreateOrderDatabase(0); + Reset(); } - public override void Update(float frameTime) + private void Reset(RoundRestartCleanupEvent ev) { - _timer += frameTime; - if (_timer < Delay) - { - return; - } - - _timer -= Delay; - foreach (var account in BankAccounts) - { - account.Balance += PointIncrease; - } + Reset(); } - public void Reset(RoundRestartCleanupEvent ev) + private void Reset() { _accountsDict.Clear(); _databasesDict.Clear(); _timer = 0; _accountIndex = 0; - Initialize(); + + CreateBankAccount("Space Station 14", 1000); + CreateOrderDatabase(0); + } + + private void UpdateConsole(float frameTime) + { + _timer += frameTime; + + while (_timer > Delay) + { + _timer -= Delay; + + foreach (var account in BankAccounts) + { + account.Balance += PointIncrease; + } + } } /// diff --git a/Content.Server/Cargo/CargoSystem.Telepad.cs b/Content.Server/Cargo/CargoSystem.Telepad.cs new file mode 100644 index 0000000000..b4abde682f --- /dev/null +++ b/Content.Server/Cargo/CargoSystem.Telepad.cs @@ -0,0 +1,130 @@ +using Content.Server.Cargo.Components; +using Content.Server.Labels.Components; +using Content.Server.Paper; +using Content.Server.Power.Components; +using Content.Shared.Cargo; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Player; + +namespace Content.Server.Cargo; + +public sealed partial class CargoSystem +{ + private void InitializeTelepad() + { + SubscribeLocalEvent(OnTelepadPowerChange); + SubscribeLocalEvent(OnTelepadAnchorChange); + } + + private void UpdateTelepad(float frameTime) + { + foreach (var comp in EntityManager.EntityQuery()) + { + // Don't EntityQuery for it as it's not required. + TryComp(comp.Owner, out var appearance); + + if (comp.CurrentState == CargoTelepadState.Unpowered || comp.TeleportQueue.Count <= 0) + { + comp.CurrentState = CargoTelepadState.Idle; + appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Idle); + comp.Accumulator = comp.Delay; + continue; + } + + comp.Accumulator -= frameTime; + + // Uhh listen teleporting takes time and I just want the 1 float. + if (comp.Accumulator > 0f) + { + comp.CurrentState = CargoTelepadState.Idle; + appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Idle); + continue; + } + + var product = comp.TeleportQueue.Pop(); + + SoundSystem.Play(Filter.Pvs(comp.Owner), comp.TeleportSound.GetSound(), comp.Owner, AudioParams.Default.WithVolume(-8f)); + SpawnProduct(comp, product); + + comp.CurrentState = CargoTelepadState.Teleporting; + appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Teleporting); + comp.Accumulator = comp.Delay; + } + } + + private void SetEnabled(CargoTelepadComponent component, ApcPowerReceiverComponent? receiver = null, + TransformComponent? xform = null) + { + // False due to AllCompsOneEntity test where they may not have the powerreceiver. + if (!Resolve(component.Owner, ref receiver, ref xform, false)) return; + + var disabled = !receiver.Powered || !xform.Anchored; + + // Setting idle state should be handled by Update(); + if (disabled) return; + + TryComp(component.Owner, out var appearance); + component.CurrentState = CargoTelepadState.Unpowered; + appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Unpowered); + } + + private void OnTelepadPowerChange(EntityUid uid, CargoTelepadComponent component, PowerChangedEvent args) + { + SetEnabled(component); + } + + private void OnTelepadAnchorChange(EntityUid uid, CargoTelepadComponent component, ref AnchorStateChangedEvent args) + { + SetEnabled(component); + } + + public void QueueTeleport(CargoTelepadComponent component, CargoOrderData order) + { + for (var i = 0; i < order.Amount; i++) + { + component.TeleportQueue.Push(order); + } + } + + /// + /// Spawn the product and a piece of paper. Attempt to attach the paper to the product. + /// + private void SpawnProduct(CargoTelepadComponent component, CargoOrderData data) + { + // spawn the order + if (!_protoMan.TryIndex(data.ProductId, out CargoProductPrototype? prototype)) + return; + + var xform = Transform(component.Owner); + + var product = EntityManager.SpawnEntity(prototype.Product, xform.Coordinates); + + Transform(product).Anchored = false; + + // spawn a piece of paper. + var printed = EntityManager.SpawnEntity(component.PrinterOutput, xform.Coordinates); + + if (!TryComp(printed, out var paper)) + return; + + // fill in the order data + var val = Loc.GetString("cargo-console-paper-print-name", ("orderNumber", data.OrderNumber)); + + MetaData(printed).EntityName = val; + + paper.SetContent(Loc.GetString( + "cargo-console-paper-print-text", + ("orderNumber", data.OrderNumber), + ("requester", data.Requester), + ("reason", data.Reason), + ("approver", data.Approver))); + + // attempt to attach the label + if (TryComp(product, out var label)) + { + _slots.TryInsert(component.Owner, label.LabelSlot, printed, null); + } + } +} diff --git a/Content.Server/Cargo/CargoSystem.cs b/Content.Server/Cargo/CargoSystem.cs new file mode 100644 index 0000000000..e387569615 --- /dev/null +++ b/Content.Server/Cargo/CargoSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Cargo; +using Content.Shared.Containers.ItemSlots; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; + +namespace Content.Server.Cargo; + +public sealed partial class CargoSystem : SharedCargoSystem +{ + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly ItemSlotsSystem _slots = default!; + + public override void Initialize() + { + base.Initialize(); + InitializeConsole(); + InitializeTelepad(); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + UpdateConsole(frameTime); + UpdateTelepad(frameTime); + } +} diff --git a/Content.Server/Cargo/Components/CargoConsoleComponent.cs b/Content.Server/Cargo/Components/CargoConsoleComponent.cs index c713623b78..b5aaf4c4d8 100644 --- a/Content.Server/Cargo/Components/CargoConsoleComponent.cs +++ b/Content.Server/Cargo/Components/CargoConsoleComponent.cs @@ -60,7 +60,7 @@ namespace Content.Server.Cargo.Components private SoundSpecifier _errorSound = new SoundPathSpecifier("/Audio/Effects/error.ogg"); private bool Powered => !_entMan.TryGetComponent(Owner, out ApcPowerReceiverComponent? receiver) || receiver.Powered; - private CargoConsoleSystem _cargoConsoleSystem = default!; + private CargoSystem _cargoConsoleSystem = default!; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(CargoConsoleUiKey.Key); @@ -76,7 +76,7 @@ namespace Content.Server.Cargo.Components UserInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; } - _cargoConsoleSystem = EntitySystem.Get(); + _cargoConsoleSystem = EntitySystem.Get(); BankAccount = _cargoConsoleSystem.StationAccount; } @@ -188,7 +188,7 @@ namespace Content.Server.Cargo.Components orders.Database.ClearOrderCapacity(); foreach (var order in approvedOrders) { - telepadComponent.QueueTeleport(order); + _cargoConsoleSystem.QueueTeleport(telepadComponent, order); } } } diff --git a/Content.Server/Cargo/Components/CargoOrderDatabaseComponent.cs b/Content.Server/Cargo/Components/CargoOrderDatabaseComponent.cs index 57760739c4..c184a0fe12 100644 --- a/Content.Server/Cargo/Components/CargoOrderDatabaseComponent.cs +++ b/Content.Server/Cargo/Components/CargoOrderDatabaseComponent.cs @@ -14,7 +14,7 @@ namespace Content.Server.Cargo.Components { base.Initialize(); - Database = EntitySystem.Get().StationOrderDatabase; + Database = EntitySystem.Get().StationOrderDatabase; } public override ComponentState GetComponentState() diff --git a/Content.Server/Cargo/Components/CargoTelepadComponent.cs b/Content.Server/Cargo/Components/CargoTelepadComponent.cs index e7314571e0..cab5b63576 100644 --- a/Content.Server/Cargo/Components/CargoTelepadComponent.cs +++ b/Content.Server/Cargo/Components/CargoTelepadComponent.cs @@ -1,150 +1,38 @@ -using System; -using System.Collections.Generic; -using Content.Server.Labels.Components; -using Content.Server.Paper; -using Content.Server.Power.Components; using Content.Shared.Cargo; -using Content.Shared.Containers.ItemSlots; +using Content.Shared.Cargo.Components; using Content.Shared.Sound; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Player; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Cargo.Components { - - //This entire class is a PLACEHOLDER for the cargo shuttle. - //welp only need auto-docking now. - - [RegisterComponent] - public class CargoTelepadComponent : Component + /// + /// Handles teleporting in requested cargo after the specified delay. + /// + [RegisterComponent, Friend(typeof(CargoSystem))] + public sealed class CargoTelepadComponent : SharedCargoTelepadComponent { - [Dependency] private readonly IEntityManager _entMan = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [DataField("delay")] + public float Delay = 20f; - private const float TeleportDuration = 0.5f; - private const float TeleportDelay = 15f; - private List _teleportQueue = new(); - private CargoTelepadState _currentState = CargoTelepadState.Unpowered; - [DataField("teleportSound")] private SoundSpecifier _teleportSound = new SoundPathSpecifier("/Audio/Machines/phasein.ogg"); + /// + /// How much time we've accumulated until next teleport. + /// + [ViewVariables] + public float Accumulator = 0f; + + [ViewVariables] + public readonly Stack TeleportQueue = new(); + + [ViewVariables] + public CargoTelepadState CurrentState = CargoTelepadState.Unpowered; + + [DataField("teleportSound")] public SoundSpecifier TeleportSound = new SoundPathSpecifier("/Audio/Machines/phasein.ogg"); /// /// The paper-type prototype to spawn with the order information. /// [DataField("printerOutput", customTypeSerializer: typeof(PrototypeIdSerializer))] public string PrinterOutput = "Paper"; - - [Obsolete("Component Messages are deprecated, use Entity Events instead.")] - public override void HandleMessage(ComponentMessage message, IComponent? component) - { -#pragma warning disable 618 - base.HandleMessage(message, component); -#pragma warning restore 618 - switch (message) - { - case PowerChangedMessage powerChanged: - PowerUpdate(powerChanged); - break; - } - } - - public void QueueTeleport(CargoOrderData order) - { - for (var i = 0; i < order.Amount; i++) - { - _teleportQueue.Add(order); - } - TeleportLoop(); - } - - private void PowerUpdate(PowerChangedMessage args) - { - if (args.Powered && _currentState == CargoTelepadState.Unpowered) { - _currentState = CargoTelepadState.Idle; - if(_entMan.TryGetComponent(Owner, out var spriteComponent) && spriteComponent.LayerCount > 0) - spriteComponent.LayerSetState(0, "idle"); - TeleportLoop(); - } - else if (!args.Powered) - { - _currentState = CargoTelepadState.Unpowered; - if (_entMan.TryGetComponent(Owner, out var spriteComponent) && spriteComponent.LayerCount > 0) - spriteComponent.LayerSetState(0, "offline"); - } - } - private void TeleportLoop() - { - if (_currentState == CargoTelepadState.Idle && _teleportQueue.Count > 0) - { - _currentState = CargoTelepadState.Charging; - if (_entMan.TryGetComponent(Owner, out var spriteComponent) && spriteComponent.LayerCount > 0) - spriteComponent.LayerSetState(0, "idle"); - Owner.SpawnTimer((int) (TeleportDelay * 1000), () => - { - if (!Deleted && !_entMan.Deleted(Owner) && _currentState == CargoTelepadState.Charging && _teleportQueue.Count > 0) - { - _currentState = CargoTelepadState.Teleporting; - if (_entMan.TryGetComponent(Owner, out var spriteComponent) && spriteComponent.LayerCount > 0) - spriteComponent.LayerSetState(0, "beam"); - Owner.SpawnTimer((int) (TeleportDuration * 1000), () => - { - if (!Deleted && !((!_entMan.EntityExists(Owner) ? EntityLifeStage.Deleted : _entMan.GetComponent(Owner).EntityLifeStage) >= EntityLifeStage.Deleted) && _currentState == CargoTelepadState.Teleporting && _teleportQueue.Count > 0) - { - SoundSystem.Play(Filter.Pvs(Owner), _teleportSound.GetSound(), Owner, AudioParams.Default.WithVolume(-8f)); - SpawnProduct(_teleportQueue[0]); - _teleportQueue.RemoveAt(0); - if (_entMan.TryGetComponent(Owner, out var spriteComponent) && spriteComponent.LayerCount > 0) - spriteComponent.LayerSetState(0, "idle"); - _currentState = CargoTelepadState.Idle; - TeleportLoop(); - } - }); - } - }); - } - } - - /// - /// Spawn the product and a piece of paper. Attempt to attach the paper to the product. - /// - private void SpawnProduct(CargoOrderData data) - { - // spawn the order - if (!_prototypeManager.TryIndex(data.ProductId, out CargoProductPrototype? prototype)) - return; - - var product = _entMan.SpawnEntity(prototype.Product, _entMan.GetComponent(Owner).Coordinates); - - _entMan.GetComponent(product).Anchored = false; - - // spawn a piece of paper. - var printed = _entMan.SpawnEntity(PrinterOutput, _entMan.GetComponent(Owner).Coordinates); - if (!_entMan.TryGetComponent(printed, out PaperComponent paper)) - return; - - // fill in the order data - string val = Loc.GetString("cargo-console-paper-print-name", ("orderNumber", data.OrderNumber)); - _entMan.GetComponent(printed).EntityName = val; - paper.SetContent(Loc.GetString( - "cargo-console-paper-print-text", - ("orderNumber", data.OrderNumber), - ("requester", data.Requester), - ("reason", data.Reason), - ("approver", data.Approver))); - - // attempt to attach the label - if (_entMan.TryGetComponent(product, out PaperLabelComponent label)) - { - EntitySystem.Get().TryInsert(Owner, label.LabelSlot, printed, null); - } - } - - private enum CargoTelepadState { Unpowered, Idle, Charging, Teleporting }; } } diff --git a/Content.Shared/Cargo/Components/SharedCargoTelepadComponent.cs b/Content.Shared/Cargo/Components/SharedCargoTelepadComponent.cs new file mode 100644 index 0000000000..6b8df740e6 --- /dev/null +++ b/Content.Shared/Cargo/Components/SharedCargoTelepadComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameObjects; + +namespace Content.Shared.Cargo.Components; + +public abstract class SharedCargoTelepadComponent : Component +{ + +} diff --git a/Content.Shared/Cargo/SharedCargoSystem.cs b/Content.Shared/Cargo/SharedCargoSystem.cs new file mode 100644 index 0000000000..eba723261c --- /dev/null +++ b/Content.Shared/Cargo/SharedCargoSystem.cs @@ -0,0 +1,21 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.Cargo; + +public abstract class SharedCargoSystem : EntitySystem {} + +[Serializable, NetSerializable] +public enum CargoTelepadState : byte +{ + Unpowered, + Idle, + Teleporting, +}; + +[Serializable, NetSerializable] +public enum CargoTelepadVisuals : byte +{ + State, +}; diff --git a/Resources/Prototypes/Entities/Structures/cargo_telepad.yml b/Resources/Prototypes/Entities/Structures/cargo_telepad.yml index 8bf778eb4a..7004fc8025 100644 --- a/Resources/Prototypes/Entities/Structures/cargo_telepad.yml +++ b/Resources/Prototypes/Entities/Structures/cargo_telepad.yml @@ -6,7 +6,7 @@ components: - type: InteractionOutline - type: Physics - bodyType: Static + bodyType: Static - type: Transform anchored: true - type: Fixtures @@ -18,9 +18,15 @@ layer: - Passable - type: Sprite + netsync: false sprite: Structures/cargo_telepad.rsi - state: offline drawdepth: FloorObjects + layers: + - state: offline + map: ["enum.CargoTelepadLayers.Base"] + - state: idle + map: [ "enum.CargoTelepadLayers.Beam" ] + shader: unshaded - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic @@ -40,3 +46,4 @@ - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: CargoTelepad + - type: Appearance diff --git a/Resources/Textures/Structures/cargo_telepad.rsi/beam.png b/Resources/Textures/Structures/cargo_telepad.rsi/beam.png index 08e4dd0edadf3954b885f88271a2cd147d02cf65..2f571bcd3d55a7a84c89f3a332499d33152dc294 100644 GIT binary patch literal 14085 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 delta 1118 zcmV-k1fl!7QSu0oBYy-rNklo*;%}maX{*-5Mvw`tsM-( zI0s`0h*UoGV(87v!Sv8xf^Vh}h|>nzL(su-AP~|+6NnOW5^iZQ0wK#~<6wG`Y8{-` zGK&cW0*MdPgEFhp{_*Zgt0+$910nD8&ilQYeL}|X1Gu=jxPQ2~xVX5uxVX5ud?_r- z(PfgK^^OWRj3YfvA(ou5^JDpRKW@3X3u+r9lpB z!=Q?>%M%u5vYb4e??slj35zn3hljB7&>rF-map$^U}5uH~y{JWBB9Ec_^>4 z(2l3DS=q%mpFYB!*L6OP*J^th$Dg>ecG45S$9!rFVt>{sC@jikYGTB)`Fx>>cZ~Ha4q^D3`uOc3c z0yd$2vwHrTzK`C4 z2EV2^;*!{hj1PVfd!cEXP~NUuZi>gE_4Z;Q_kR5ii3o7_{_jn3cJr*FE_TN%@g_L^H)9Pguf+&1r*KR>7$-+uy`o!0q>{v~L%kN&tX-q1g0$za8+d z_?94rvkS}xQ5Y+8QFiOS974DGo}?%WQ51#TURfse=Rgv7f#33pu+YFx_6YGUMI2Rr zkAM3uTwGjSTwGjSTwGjSTwGje3@bkbe?UwB59s|#Hinq&_={DiCd1@feIo3}?}*+v ze?TdXuJJANd8a4dDZ@fg{s7y=cBe{PjZR#blOSYKFp6Mb=C$f%(sQA1eEM2Wf|Sy* z@UPE=eev7!2e9+`ApHRgViuz}5g5Oe27jT`VOM{^^g*`i#OZu~?sV1S4`Ao>tUut^ z>@kZ!faZ1c2YBUQR-Ypgfx%z809!uo2q(U+KVbSGYYZOgyI+~t=R)570n-QBCeMLa zUjQrfdMCc^a5NW6A@i_4SI=z%8@t6@Nfb^Z9o8^8xT34}eYPG@obTZu5D+dRKhz4`@Z)AAs)9 k=ey0f6meAfAH6@|e?$g21bwi)Gynhq07*qoM6N<$f~CAQod5s; diff --git a/Resources/Textures/Structures/cargo_telepad.rsi/meta.json b/Resources/Textures/Structures/cargo_telepad.rsi/meta.json index e924ea5fbd..78aca01881 100644 --- a/Resources/Textures/Structures/cargo_telepad.rsi/meta.json +++ b/Resources/Textures/Structures/cargo_telepad.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from /vg/station at commit 5c50dee8fb2a55d6be3b3c9c90a782a618a5506e", + "copyright": "Taken from /vg/station at commit 5c50dee8fb2a55d6be3b3c9c90a782a618a5506e Cut out for unshaded by metalgearsloth", "size": { "x": 32, "y": 32