diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj
index 2c678c7603..1896fea3d9 100644
--- a/Content.Server/Content.Server.csproj
+++ b/Content.Server/Content.Server.csproj
@@ -193,4 +193,4 @@
-
\ No newline at end of file
+
diff --git a/Content.Server/GameObjects/Components/Power/LightBulbComponent.cs b/Content.Server/GameObjects/Components/Power/LightBulbComponent.cs
index 1ff15d0223..d5f56baaea 100644
--- a/Content.Server/GameObjects/Components/Power/LightBulbComponent.cs
+++ b/Content.Server/GameObjects/Components/Power/LightBulbComponent.cs
@@ -1,8 +1,9 @@
using System;
-using SS14.Server.GameObjects;
-using SS14.Shared.Enums;
using SS14.Shared.GameObjects;
+using SS14.Shared.Maths;
using SS14.Shared.Serialization;
+using SS14.Shared.ViewVariables;
+using SpriteComponent = SS14.Server.GameObjects.SpriteComponent;
namespace Content.Server.GameObjects.Components.Power
{
@@ -28,6 +29,20 @@ namespace Content.Server.GameObjects.Components.Power
/// Invoked whenever the state of the light bulb changes.
///
public event EventHandler OnLightBulbStateChange;
+ public event EventHandler OnLightColorChange;
+
+ private Color _color = Color.White;
+
+ [ViewVariables(VVAccess.ReadWrite)] public Color Color
+ {
+ get { return _color; }
+ set
+ {
+ _color = value;
+ OnLightColorChange?.Invoke(this, null);
+ UpdateColor();
+ }
+ }
public override string Name => "LightBulb";
@@ -37,7 +52,7 @@ namespace Content.Server.GameObjects.Components.Power
/// The current state of the light bulb. Invokes the OnLightBulbStateChange event when set.
/// It also updates the bulb's sprite accordingly.
///
- public LightBulbState State
+ [ViewVariables(VVAccess.ReadWrite)] public LightBulbState State
{
get { return _state; }
set
@@ -65,7 +80,19 @@ namespace Content.Server.GameObjects.Components.Power
public override void ExposeData(ObjectSerializer serializer)
{
serializer.DataField(ref Type, "bulb", LightBulbType.Tube);
+ serializer.DataField(ref _color, "color", Color.White);
}
+ public void UpdateColor()
+ {
+ var sprite = Owner.GetComponent();
+ sprite.Color = Color;
+ }
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ UpdateColor();
+ }
}
}
diff --git a/Content.Server/GameObjects/Components/Power/PoweredLightComponent.cs b/Content.Server/GameObjects/Components/Power/PoweredLightComponent.cs
index dddbae410b..b053aff790 100644
--- a/Content.Server/GameObjects/Components/Power/PoweredLightComponent.cs
+++ b/Content.Server/GameObjects/Components/Power/PoweredLightComponent.cs
@@ -34,16 +34,16 @@ namespace Content.Server.GameObjects.Components.Power
[ViewVariables] private float Load = 40;
- [ViewVariables] private ContainerSlot LightBulbContainer;
+ [ViewVariables] private ContainerSlot _lightBulbContainer;
[ViewVariables]
private LightBulbComponent LightBulb
{
get
{
- if (LightBulbContainer.ContainedEntity == null) return null;
+ if (_lightBulbContainer.ContainedEntity == null) return null;
- LightBulbContainer.ContainedEntity.TryGetComponent(out LightBulbComponent bulb);
+ _lightBulbContainer.ContainedEntity.TryGetComponent(out LightBulbComponent bulb);
return bulb;
}
@@ -51,17 +51,7 @@ namespace Content.Server.GameObjects.Components.Power
bool IAttackby.Attackby(IEntity user, IEntity attackwith)
{
- if (!attackwith.HasComponent()) return false;
-
- if (LightBulb != null) return false;
-
- user.GetComponent().Drop(attackwith, LightBulbContainer);
-
- var inserted = LightBulbContainer.Insert(attackwith);
-
- UpdateLight();
-
- return inserted;
+ return InsertBulb(attackwith);
}
bool IAttackHand.Attackhand(IEntity user)
@@ -83,6 +73,26 @@ namespace Content.Server.GameObjects.Components.Power
return false;
}
+ ///
+ /// Inserts the bulb if possible.
+ ///
+ /// True if it could insert it, false if it couldn't.
+ private bool InsertBulb(IEntity bulb)
+ {
+ if (LightBulb != null) return false;
+ if (!bulb.TryGetComponent(out LightBulbComponent lightBulb)) return false;
+ if (lightBulb.Type != BulbType) return false;
+
+ var inserted = _lightBulbContainer.Insert(bulb);
+
+ lightBulb.OnLightBulbStateChange += UpdateLight;
+ lightBulb.OnLightColorChange += UpdateLight;
+
+ UpdateLight();
+
+ return inserted;
+ }
+
///
/// Ejects the bulb to a mob's hand if possible.
///
@@ -92,7 +102,10 @@ namespace Content.Server.GameObjects.Components.Power
var bulb = LightBulb;
- if (!LightBulbContainer.Remove(bulb.Owner)) return;
+ bulb.OnLightBulbStateChange -= UpdateLight;
+ bulb.OnLightColorChange -= UpdateLight;
+
+ if (!_lightBulbContainer.Remove(bulb.Owner)) return;
if (!user.TryGetComponent(out HandsComponent hands)
|| !hands.PutInHand(bulb.Owner.GetComponent()))
@@ -137,6 +150,7 @@ namespace Content.Server.GameObjects.Components.Power
device.Load = Load;
sprite.LayerSetState(0, "on");
light.State = LightState.On;
+ light.Color = LightBulb.Color;
var time = IoCManager.Resolve().CurTime;
if (time > _lastThunk + _thunkDelay)
{
@@ -172,11 +186,11 @@ namespace Content.Server.GameObjects.Components.Power
var device = Owner.GetComponent();
device.OnPowerStateChanged += UpdateLight;
- LightBulbContainer = ContainerManagerComponent.Ensure("light_bulb", Owner, out var existed);
+ _lightBulbContainer = ContainerManagerComponent.Ensure("light_bulb", Owner, out var existed);
if (!existed) // Insert a light tube if there wasn't any.
{
- LightBulbContainer.Insert(Owner.EntityManager.SpawnEntity("LightTube"));
+ _lightBulbContainer.Insert(Owner.EntityManager.SpawnEntity("LightTube"));
}
}
}