2024-06-22 13:53:37 +03:00
|
|
|
|
using Content.Shared._White.Lighting.PointLight.Airlock;
|
|
|
|
|
|
using Content.Shared.Doors.Components;
|
|
|
|
|
|
using Robust.Client.GameObjects;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Content.Client._White.Lighting.PointLight.Airlock;
|
|
|
|
|
|
|
2024-06-29 09:49:43 +03:00
|
|
|
|
// TODO: Перепилить емаггинг дверей, потому что ебучие двери вообще не в курсе, емагнуты они или нет.
|
|
|
|
|
|
// А сам емаг просто ставит стейты, а не поражает дверь
|
|
|
|
|
|
// А еще он ставит дверь на болты каким-то хуем не меняя DoorVisuals.BoltLights
|
2024-06-22 13:53:37 +03:00
|
|
|
|
public sealed class PointLightAirlockSystem : EntitySystem
|
|
|
|
|
|
{
|
|
|
|
|
|
[Dependency] private readonly SharedPointLightSystem _pointLightSystem = default!;
|
|
|
|
|
|
public override void Initialize()
|
|
|
|
|
|
{
|
|
|
|
|
|
base.Initialize();
|
|
|
|
|
|
SubscribeLocalEvent<PointLightAirlockComponent, AppearanceChangeEvent>(OnLightsChanged);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void ToggleLight(EntityUid uid, string hex, PointLightAirlockComponent airlockLight, bool enable = true)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!_pointLightSystem.TryGetLight(uid, out var pointLightComponent))
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (enable)
|
|
|
|
|
|
{
|
|
|
|
|
|
var color = Color.FromHex(hex);
|
|
|
|
|
|
_pointLightSystem.SetColor(uid, color, pointLightComponent);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_pointLightSystem.SetEnabled(uid, enable, pointLightComponent);
|
|
|
|
|
|
|
|
|
|
|
|
RaiseLocalEvent(uid, new PointLightToggleEvent(enable), true);
|
|
|
|
|
|
airlockLight.IsLightsEnabled = enable;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnLightsChanged(EntityUid uid, PointLightAirlockComponent component, AppearanceChangeEvent args)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (args.AppearanceData.TryGetValue(DoorVisuals.Powered, out var isPowered) && !(bool) isPowered)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (component.IsLightsEnabled)
|
|
|
|
|
|
ToggleLight(uid, string.Empty, component, false);
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!args.AppearanceData.TryGetValue(DoorVisuals.State, out var state))
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
2024-06-29 09:49:43 +03:00
|
|
|
|
if (!component.IsEmagged)
|
|
|
|
|
|
HandleState(uid, component, (DoorState) state);
|
2024-06-22 13:53:37 +03:00
|
|
|
|
|
|
|
|
|
|
if (args.AppearanceData.TryGetValue(DoorVisuals.EmergencyLights, out var emergency))
|
2024-06-29 09:49:43 +03:00
|
|
|
|
{
|
|
|
|
|
|
if ((bool) emergency)
|
|
|
|
|
|
ToggleLight(uid, component.YellowColor, component, (bool) emergency);
|
|
|
|
|
|
else if (!component.IsEmagged)
|
|
|
|
|
|
HandleState(uid, component, (DoorState) state);
|
|
|
|
|
|
}
|
2024-06-22 13:53:37 +03:00
|
|
|
|
|
|
|
|
|
|
if (!args.AppearanceData.TryGetValue(DoorVisuals.BoltLights, out var boltsDown))
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
if (component.LastBoltsState != (bool) boltsDown)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((bool) boltsDown)
|
|
|
|
|
|
ToggleLight(uid, component.RedColor, component, (bool) boltsDown);
|
|
|
|
|
|
else if (args.AppearanceData.TryGetValue(DoorVisuals.EmergencyLights, out var emergencyLights) && (bool) emergencyLights)
|
|
|
|
|
|
ToggleLight(uid, component.YellowColor, component);
|
|
|
|
|
|
else
|
2024-06-29 09:49:43 +03:00
|
|
|
|
{
|
|
|
|
|
|
if (component.IsEmagged)
|
|
|
|
|
|
component.IsEmagged = false;
|
2024-06-22 13:53:37 +03:00
|
|
|
|
HandleState(uid, component, (DoorState) state);
|
2024-06-29 09:49:43 +03:00
|
|
|
|
}
|
2024-06-22 13:53:37 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
component.LastBoltsState = (bool) boltsDown;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void HandleState(EntityUid uid, PointLightAirlockComponent component, DoorState state)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (state)
|
|
|
|
|
|
{
|
2024-06-29 09:49:43 +03:00
|
|
|
|
case DoorState.Emagging:
|
|
|
|
|
|
ToggleLight(uid, component.RedColor, component);
|
|
|
|
|
|
component.IsEmagged = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2024-06-22 13:53:37 +03:00
|
|
|
|
case DoorState.Open:
|
|
|
|
|
|
ToggleLight(uid, component.BlueColor, component);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DoorState.Opening:
|
|
|
|
|
|
ToggleLight(uid, component.GreenColor, component);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DoorState.Closing:
|
|
|
|
|
|
ToggleLight(uid, component.GreenColor, component);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DoorState.Closed:
|
|
|
|
|
|
ToggleLight(uid, component.BlueColor, component);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case DoorState.Denying:
|
|
|
|
|
|
ToggleLight(uid, component.RedColor, component);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|