Files
crystall-punk-14/Content.Client/_CP14/Cooking/CP14ClientCookingSystem.cs
Red 5c0eb97571 Refactor food holder visual update logic (#1584)
Simplified UpdateVisuals method in CP14ClientCookingSystem by consolidating parameters and using component fields directly. Also ensured FoodData field is dirtied after updating visuals in CP14SharedCookingSystem to trigger proper synchronization.
2025-07-27 17:18:25 +03:00

109 lines
3.5 KiB
C#

/*
* This file is sublicensed under MIT License
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using System.Numerics;
using Content.Client.DisplacementMap;
using Content.Shared._CP14.Cooking;
using Content.Shared._CP14.Cooking.Components;
using Content.Shared.DisplacementMap;
using Content.Shared.Rounding;
using Robust.Client.GameObjects;
using Robust.Shared.Random;
namespace Content.Client._CP14.Cooking;
public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly DisplacementMapSystem _displacement = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14FoodHolderComponent, AfterAutoHandleStateEvent>(OnAfterHandleState);
SubscribeLocalEvent<CP14FoodHolderComponent, AppearanceChangeEvent>(OnAppearanceChange);
}
private void OnAppearanceChange(Entity<CP14FoodHolderComponent> ent, ref AppearanceChangeEvent args)
{
UpdateVisuals(ent);
}
private void OnAfterHandleState(Entity<CP14FoodHolderComponent> ent, ref AfterAutoHandleStateEvent args)
{
UpdateVisuals(ent);
}
private void UpdateVisuals(Entity<CP14FoodHolderComponent> ent)
{
if (!TryComp<SpriteComponent>(ent, out var sprite))
return;
if (ent.Comp.FoodData is null)
return;
if (!_solution.TryGetSolution(ent.Owner, ent.Comp.SolutionId, out var soln, out var solution))
return;
//Remove old layers
foreach (var key in ent.Comp.RevealedLayers)
{
_sprite.RemoveLayer((ent, sprite), key);
}
ent.Comp.RevealedLayers.Clear();
_sprite.LayerMapTryGet((ent, sprite), ent.Comp.TargetLayerMap, out var index, false);
var fillLevel = (float)solution.Volume / (float)solution.MaxVolume;
if (fillLevel > 1)
fillLevel = 1;
var closestFillSprite = ContentHelpers.RoundToLevels(fillLevel, 1, ent.Comp.MaxDisplacementFillLevels + 1);
//Add new layers
var counter = 0;
foreach (var layer in ent.Comp.FoodData.Visuals)
{
var layerIndex = index + counter;
var keyCode = $"cp14-food-layer-{counter}";
ent.Comp.RevealedLayers.Add(keyCode);
_sprite.AddBlankLayer((ent, sprite), layerIndex);
_sprite.LayerMapSet((ent, sprite), keyCode, layerIndex);
_sprite.LayerSetData((ent, sprite), layerIndex, layer);
if (ent.Comp.DisplacementRsiPath is not null)
{
var displaceData = new DisplacementData
{
SizeMaps = new Dictionary<int, PrototypeLayerData>
{
{
32, new PrototypeLayerData
{
RsiPath = ent.Comp.DisplacementRsiPath,
State = "fill-" + closestFillSprite,
}
},
}
};
if (_displacement.TryAddDisplacement(displaceData,
(ent, sprite),
layerIndex,
keyCode,
out var displacementKey))
{
ent.Comp.RevealedLayers.Add(displacementKey);
}
}
counter++;
}
}
}