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.
This commit is contained in:
Red
2025-07-27 17:18:25 +03:00
committed by GitHub
parent e020394f56
commit 5c0eb97571
2 changed files with 20 additions and 48 deletions

View File

@@ -29,85 +29,55 @@ public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem
private void OnAppearanceChange(Entity<CP14FoodHolderComponent> ent, ref AppearanceChangeEvent args)
{
var solutionId = string.Empty;
if (TryComp<CP14FoodHolderComponent>(ent, out var holder))
solutionId = holder.SolutionId;
UpdateVisuals(
ent,
solutionId,
ref ent.Comp.RevealedLayers,
ent.Comp.TargetLayerMap,
ent.Comp.MaxDisplacementFillLevels,
ent.Comp.DisplacementRsiPath,
ent.Comp.FoodData);
UpdateVisuals(ent);
}
private void OnAfterHandleState(Entity<CP14FoodHolderComponent> ent, ref AfterAutoHandleStateEvent args)
{
var solutionId = string.Empty;
if (TryComp<CP14FoodHolderComponent>(ent, out var holder))
solutionId = holder.SolutionId;
UpdateVisuals(
ent,
solutionId,
ref ent.Comp.RevealedLayers,
ent.Comp.TargetLayerMap,
ent.Comp.MaxDisplacementFillLevels,
ent.Comp.DisplacementRsiPath,
ent.Comp.FoodData);
UpdateVisuals(ent);
}
private void UpdateVisuals(
EntityUid ent,
string? solutionId,
ref HashSet<string> revealedLayers,
string targetLayerMap,
int maxDisplacementFillLevels,
string? displacementRsiPath,
CP14FoodData? data)
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 revealedLayers)
foreach (var key in ent.Comp.RevealedLayers)
{
_sprite.RemoveLayer((ent, sprite), key);
}
revealedLayers.Clear();
ent.Comp.RevealedLayers.Clear();
if (data is null)
return;
if (!_solution.TryGetSolution(ent, solutionId, out var soln, out var solution))
return;
_sprite.LayerMapTryGet((ent, sprite), targetLayerMap, out var index, false);
_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, maxDisplacementFillLevels + 1);
var closestFillSprite = ContentHelpers.RoundToLevels(fillLevel, 1, ent.Comp.MaxDisplacementFillLevels + 1);
//Add new layers
var counter = 0;
foreach (var layer in data.Visuals)
foreach (var layer in ent.Comp.FoodData.Visuals)
{
var layerIndex = index + counter;
var keyCode = $"cp14-food-layer-{counter}";
revealedLayers.Add(keyCode);
ent.Comp.RevealedLayers.Add(keyCode);
_sprite.AddBlankLayer((ent, sprite), layerIndex);
_sprite.LayerMapSet((ent, sprite), keyCode, layerIndex);
_sprite.LayerSetData((ent, sprite), layerIndex, layer);
if (displacementRsiPath is not null)
if (ent.Comp.DisplacementRsiPath is not null)
{
var displaceData = new DisplacementData
{
@@ -116,7 +86,7 @@ public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem
{
32, new PrototypeLayerData
{
RsiPath = displacementRsiPath,
RsiPath = ent.Comp.DisplacementRsiPath,
State = "fill-" + closestFillSprite,
}
},
@@ -128,7 +98,7 @@ public sealed class CP14ClientCookingSystem : CP14SharedCookingSystem
keyCode,
out var displacementKey))
{
revealedLayers.Add(displacementKey);
ent.Comp.RevealedLayers.Add(displacementKey);
}
}

View File

@@ -209,6 +209,8 @@ public abstract partial class CP14SharedCookingSystem : EntitySystem
layer.Scale = new Vector2(-1, 1);
}
DirtyField(ent, ent.Comp, nameof(CP14FoodHolderComponent.FoodData));
//Sliceable
// > on server overrided side
}