| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- using System.Linq;
- using Content.Server.Cargo.Components;
- using Content.Server.Power.Components;
- using Content.Server.Power.EntitySystems;
- using Content.Server.Station.Components;
- using Content.Shared.Cargo;
- using Content.Shared.Cargo.Components;
- using Content.Shared.DeviceLinking;
- using Content.Shared.Power;
- using Robust.Shared.Audio;
- using Robust.Shared.Random;
- using Robust.Shared.Utility;
- namespace Content.Server.Cargo.Systems;
- public sealed partial class CargoSystem
- {
- private void InitializeTelepad()
- {
- SubscribeLocalEvent<CargoTelepadComponent, ComponentInit>(OnInit);
- SubscribeLocalEvent<CargoTelepadComponent, ComponentShutdown>(OnShutdown);
- SubscribeLocalEvent<CargoTelepadComponent, PowerChangedEvent>(OnTelepadPowerChange);
- // Shouldn't need re-anchored event
- SubscribeLocalEvent<CargoTelepadComponent, AnchorStateChangedEvent>(OnTelepadAnchorChange);
- SubscribeLocalEvent<FulfillCargoOrderEvent>(OnTelepadFulfillCargoOrder);
- }
- private void OnTelepadFulfillCargoOrder(ref FulfillCargoOrderEvent args)
- {
- var query = EntityQueryEnumerator<CargoTelepadComponent, TransformComponent>();
- while (query.MoveNext(out var uid, out var tele, out var xform))
- {
- if (tele.CurrentState != CargoTelepadState.Idle)
- continue;
- if (!this.IsPowered(uid, EntityManager))
- continue;
- if (_station.GetOwningStation(uid, xform) != args.Station)
- continue;
- // todo cannot be fucking asked to figure out device linking rn but this shouldn't just default to the first port.
- if (!TryComp<DeviceLinkSinkComponent>(uid, out var sinkComponent) ||
- sinkComponent.LinkedSources.FirstOrNull() is not { } console ||
- console != args.OrderConsole.Owner)
- continue;
- for (var i = 0; i < args.Order.OrderQuantity; i++)
- {
- tele.CurrentOrders.Add(args.Order);
- }
- tele.Accumulator = tele.Delay;
- args.Handled = true;
- args.FulfillmentEntity = uid;
- return;
- }
- }
- private void UpdateTelepad(float frameTime)
- {
- var query = EntityQueryEnumerator<CargoTelepadComponent>();
- while (query.MoveNext(out var uid, out var comp))
- {
- // Don't EntityQuery for it as it's not required.
- TryComp<AppearanceComponent>(uid, out var appearance);
- if (comp.CurrentState == CargoTelepadState.Unpowered)
- {
- comp.CurrentState = CargoTelepadState.Idle;
- _appearance.SetData(uid, CargoTelepadVisuals.State, CargoTelepadState.Idle, appearance);
- 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(uid, CargoTelepadVisuals.State, CargoTelepadState.Idle, appearance);
- continue;
- }
- if (comp.CurrentOrders.Count == 0)
- {
- comp.Accumulator += comp.Delay;
- continue;
- }
- var xform = Transform(uid);
- var currentOrder = comp.CurrentOrders.First();
- if (FulfillOrder(currentOrder, xform.Coordinates, comp.PrinterOutput))
- {
- _audio.PlayPvs(_audio.ResolveSound(comp.TeleportSound), uid, AudioParams.Default.WithVolume(-8f));
- if (_station.GetOwningStation(uid) is { } station)
- UpdateOrders(station);
- comp.CurrentOrders.Remove(currentOrder);
- comp.CurrentState = CargoTelepadState.Teleporting;
- _appearance.SetData(uid, CargoTelepadVisuals.State, CargoTelepadState.Teleporting, appearance);
- }
- comp.Accumulator += comp.Delay;
- }
- }
- private void OnInit(EntityUid uid, CargoTelepadComponent telepad, ComponentInit args)
- {
- _linker.EnsureSinkPorts(uid, telepad.ReceiverPort);
- }
- private void OnShutdown(Entity<CargoTelepadComponent> ent, ref ComponentShutdown args)
- {
- if (ent.Comp.CurrentOrders.Count == 0)
- return;
- if (_station.GetStations().Count == 0)
- return;
- if (_station.GetOwningStation(ent) is not { } station)
- {
- station = _random.Pick(_station.GetStations().Where(HasComp<StationCargoOrderDatabaseComponent>).ToList());
- }
- if (!TryComp<StationCargoOrderDatabaseComponent>(station, out var db) ||
- !TryComp<StationDataComponent>(station, out var data))
- return;
- foreach (var order in ent.Comp.CurrentOrders)
- {
- TryFulfillOrder((station, data), order, db);
- }
- }
- private void SetEnabled(EntityUid uid, CargoTelepadComponent component, ApcPowerReceiverComponent? receiver = null,
- TransformComponent? xform = null)
- {
- // False due to AllCompsOneEntity test where they may not have the powerreceiver.
- if (!Resolve(uid, ref receiver, ref xform, false))
- return;
- var disabled = !receiver.Powered || !xform.Anchored;
- // Setting idle state should be handled by Update();
- if (disabled)
- return;
- TryComp<AppearanceComponent>(uid, out var appearance);
- component.CurrentState = CargoTelepadState.Unpowered;
- _appearance.SetData(uid, CargoTelepadVisuals.State, CargoTelepadState.Unpowered, appearance);
- }
- private void OnTelepadPowerChange(EntityUid uid, CargoTelepadComponent component, ref PowerChangedEvent args)
- {
- SetEnabled(uid, component);
- }
- private void OnTelepadAnchorChange(EntityUid uid, CargoTelepadComponent component, ref AnchorStateChangedEvent args)
- {
- SetEnabled(uid, component);
- }
- }
|