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")); } } }