using Content.Client.Botany.Components; using Content.Shared.Botany.Components; using Content.Shared.Botany.Systems; using DrawDepth = Content.Shared.DrawDepth.DrawDepth; using Robust.Client.GameObjects; namespace Content.Client.Botany; public sealed partial class PlantVisualizerSystem : VisualizerSystem { [Dependency] private PlantSystem _plant = default!; [Dependency] private PlantHolderSystem _plantHolder = default!; [Dependency] private PlantTrayVisualizerSystem _plantTrayVisualizer = default!; [SubscribeLocalEvent] private void OnComponentInit(EntityUid uid, PlantVisualsComponent component, ComponentInit args) { if (!TryComp(uid, out var sprite)) return; // Ensure they always render above the tray sprite. SpriteSystem.SetDrawDepth((uid, sprite), (int)DrawDepth.SmallObjects); SpriteSystem.LayerMapReserve((uid, sprite), PlantLayers.Plant); SpriteSystem.LayerSetVisible((uid, sprite), PlantLayers.Plant, false); } [SubscribeLocalEvent] private void OnComponentStartup(Entity ent, ref ComponentStartup args) { UpdateSprite(ent.Owner); } [SubscribeLocalEvent] private void OnPlantState(Entity ent, ref AfterAutoHandleStateEvent args) { UpdateSprite(ent.Owner); } [SubscribeLocalEvent] private void OnHolderState(Entity ent, ref AfterAutoHandleStateEvent args) { UpdateSprite(ent.Owner); if (_plant.TryGetTray(ent.Owner, out var trayEnt)) _plantTrayVisualizer.UpdateTrayWarnings(trayEnt.AsNullable()); } [SubscribeLocalEvent] private void UpdateSprite(EntityUid plantUid) { if (!HasComp(plantUid) || !TryComp(plantUid, out var holder) || !TryComp(plantUid, out var sprite)) { return; } string state; var dead = _plantHolder.IsDead(plantUid); var harvestReady = holder.ReadyForHarvest; var growthStage = _plant.GetGrowthStageValue(plantUid); if (dead) state = "dead"; else if (harvestReady) state = "harvest"; else state = $"stage-{growthStage}"; var layer = SpriteSystem.LayerMapReserve((plantUid, sprite), PlantLayers.Plant); SpriteSystem.LayerSetVisible((plantUid, sprite), layer, true); SpriteSystem.LayerSetRsiState((plantUid, sprite), layer, state); } } public enum PlantLayers : byte { Plant }