Files
tbd-station-14/Content.Server/Chemistry/EntitySystems/TransformableContainerSystem.cs
Vera Aguilera Puerto f06bfc22ce Inline Description
2021-12-03 11:18:05 +01:00

82 lines
3.3 KiB
C#

using Content.Server.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using JetBrains.Annotations;
using Robust.Server.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Server.Chemistry.EntitySystems
{
[UsedImplicitly]
public class TransformableContainerSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SolutionContainerSystem _solutionsSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TransformableContainerComponent, SolutionChangedEvent>(OnSolutionChange);
}
private void OnSolutionChange(EntityUid uid, TransformableContainerComponent component,
SolutionChangedEvent args)
{
if (!_solutionsSystem.TryGetFitsInDispenser(uid, out var solution))
return;
//Transform container into initial state when emptied
if (component.CurrentReagent != null && solution.Contents.Count == 0)
{
CancelTransformation(component);
}
//the biggest reagent in the solution decides the appearance
var reagentId = solution.GetPrimaryReagentId();
//If biggest reagent didn't changed - don't change anything at all
if (component.CurrentReagent != null && component.CurrentReagent.ID == reagentId)
{
return;
}
//Only reagents with spritePath property can change appearance of transformable containers!
if (!string.IsNullOrWhiteSpace(reagentId)
&& _prototypeManager.TryIndex(reagentId, out ReagentPrototype? proto)
&& !string.IsNullOrWhiteSpace(proto.SpriteReplacementPath))
{
var spriteSpec =
new SpriteSpecifier.Rsi(
new ResourcePath("Objects/Consumable/Drinks/" + proto.SpriteReplacementPath), "icon");
var ownerEntity = EntityManager.GetEntity(uid);
if (ownerEntity.TryGetComponent(out SpriteComponent? sprite))
{
sprite?.LayerSetSprite(0, spriteSpec);
}
ownerEntity.Name = proto.Name + " glass";
IoCManager.Resolve<IEntityManager>().GetComponent<MetaDataComponent>(ownerEntity.Uid).EntityDescription = proto.Description;
component.CurrentReagent = proto;
component.Transformed = true;
}
}
private void CancelTransformation(TransformableContainerComponent component)
{
component.CurrentReagent = null;
component.Transformed = false;
if (component.Owner.TryGetComponent(out SpriteComponent? sprite) &&
component.InitialSprite != null)
{
sprite.LayerSetSprite(0, component.InitialSprite);
}
component.Owner.Name = component.InitialName;
IoCManager.Resolve<IEntityManager>().GetComponent<MetaDataComponent>(component.Owner.Uid).EntityDescription = component.InitialDescription;
}
}
}