namespace Content.Server.Storage.Components;
[RegisterComponent]
public sealed partial class BluespaceLockerComponent : Component
{
///
/// If length > 0, when something is added to the storage, it will instead be teleported to a random storage
/// from the list and the other storage will be opened.
///
[DataField("bluespaceLinks"), ViewVariables(VVAccess.ReadOnly)]
public HashSet BluespaceLinks = new();
///
/// Each time the system attempts to get a link, it will link additional lockers to ensure the minimum amount
/// are linked.
///
[DataField("minBluespaceLinks"), ViewVariables(VVAccess.ReadWrite)]
public uint MinBluespaceLinks;
///
/// Determines if links automatically added are restricted to the same map
///
[DataField("pickLinksFromSameMap"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromSameMap;
///
/// Determines if links automatically added must have ResistLockerComponent
///
[DataField("pickLinksFromResistLockers"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromResistLockers = true;
///
/// Determines if links automatically added are restricted to being on a station
///
[DataField("pickLinksFromStationGrids"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromStationGrids = true;
///
/// Determines if links automatically added are restricted to having the same access
///
[DataField("pickLinksFromSameAccess"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromSameAccess = true;
///
/// Determines if links automatically added are restricted to existing bluespace lockers
///
[DataField("pickLinksFromBluespaceLockers"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromBluespaceLockers;
///
/// Determines if links automatically added are restricted to non-bluespace lockers
///
[DataField("pickLinksFromNonBluespaceLockers"), ViewVariables(VVAccess.ReadWrite)]
public bool PickLinksFromNonBluespaceLockers = true;
///
/// Determines if links automatically added get the source locker set as a target
///
[DataField("autoLinksBidirectional"), ViewVariables(VVAccess.ReadWrite)]
public bool AutoLinksBidirectional;
///
/// Determines if links automatically use
///
[DataField("autoLinksUseProperties"), ViewVariables(VVAccess.ReadWrite)]
public bool AutoLinksUseProperties;
[DataField("usesSinceLinkClear"), ViewVariables(VVAccess.ReadWrite)]
public int UsesSinceLinkClear;
[DataField("bluespaceEffectMinInterval"), ViewVariables(VVAccess.ReadOnly)]
public uint BluespaceEffectNextTime { get; set; }
///
/// Determines properties of automatically created links
///
[DataField("autoLinkProperties"), ViewVariables(VVAccess.ReadOnly)]
public BluespaceLockerBehaviorProperties AutoLinkProperties = new();
///
/// Determines properties of this locker
///
[DataField("behaviorProperties"), ViewVariables(VVAccess.ReadOnly)]
public BluespaceLockerBehaviorProperties BehaviorProperties = new();
}
[DataDefinition]
public partial record BluespaceLockerBehaviorProperties
{
///
/// Determines if gas will be transported.
///
[DataField("transportGas"), ViewVariables(VVAccess.ReadWrite)]
public bool TransportGas { get; set; } = true;
///
/// Determines if entities will be transported.
///
[DataField("transportEntities"), ViewVariables(VVAccess.ReadWrite)]
public bool TransportEntities { get; set; } = true;
///
/// Determines if entities with a Mind component will be transported.
///
[DataField("transportSentient"), ViewVariables(VVAccess.ReadWrite)]
public bool TransportSentient { get; set; } = true;
///
/// Determines if the the locker will act on opens.
///
[DataField("actOnOpen"), ViewVariables(VVAccess.ReadWrite)]
public bool ActOnOpen { get; set; } = true;
///
/// Determines if the the locker will act on closes.
///
[DataField("actOnClose"), ViewVariables(VVAccess.ReadWrite)]
public bool ActOnClose { get; set; } = true;
///
/// Delay to wait after closing before transporting
///
[DataField("delay"), ViewVariables(VVAccess.ReadWrite)]
public float Delay { get; set; }
///
/// Determines if bluespace effect is show on component init
///
[DataField("bluespaceEffectOnInit"), ViewVariables(VVAccess.ReadWrite)]
public bool BluespaceEffectOnInit;
///
/// Defines prototype to spawn for bluespace effect
///
[DataField("bluespaceEffectPrototype"), ViewVariables(VVAccess.ReadWrite)]
public string BluespaceEffectPrototype { get; set; } = "EffectFlashBluespace";
///
/// Determines if bluespace effect is show on teleport at the source
///
[DataField("bluespaceEffectOnTeleportSource"), ViewVariables(VVAccess.ReadWrite)]
public bool BluespaceEffectOnTeleportSource { get; set; }
///
/// Determines if bluespace effect is show on teleport at the target
///
[DataField("bluespaceEffectOnTeleportTarget"), ViewVariables(VVAccess.ReadWrite)]
public bool BluespaceEffectOnTeleportTarget { get; set; }
///
/// Determines the minimum interval between bluespace effects
///
///
[DataField("bluespaceEffectMinInterval"), ViewVariables(VVAccess.ReadWrite)]
public double BluespaceEffectMinInterval { get; set; } = 2;
///
/// Uses left before the locker is destroyed. -1 indicates infinite
///
[DataField("destroyAfterUses"), ViewVariables(VVAccess.ReadWrite)]
public int DestroyAfterUses { get; set; } = -1;
///
/// Minimum number of entities that must be transported to count a use for
///
[DataField("destroyAfterUsesMinItemsToCountUse"), ViewVariables(VVAccess.ReadWrite)]
public int DestroyAfterUsesMinItemsToCountUse { get; set; }
///
/// How to destroy the locker after it runs out of uses
///
[DataField("destroyType"), ViewVariables(VVAccess.ReadWrite)]
public BluespaceLockerDestroyType DestroyType { get; set; } = BluespaceLockerDestroyType.Delete;
///
/// Uses left before the lockers links are cleared. -1 indicates infinite
///
[DataField("clearLinksEvery"), ViewVariables(VVAccess.ReadWrite)]
public int ClearLinksEvery { get; set; } = -1;
///
/// Determines if cleared links have their component removed
///
[DataField("clearLinksDebluespaces"), ViewVariables(VVAccess.ReadWrite)]
public bool ClearLinksDebluespaces { get; set; }
///
/// Links will not be valid if they're not bidirectional
///
[DataField("invalidateOneWayLinks"), ViewVariables(VVAccess.ReadWrite)]
public bool InvalidateOneWayLinks { get; set; }
}
[Flags]
public enum BluespaceLockerDestroyType
{
Delete,
DeleteComponent,
Explode,
}