Files
crystall-punk-14/Content.Server/_CP14/Cooking/CP14CookingSystem.cs
2025-09-08 11:51:45 +03:00

116 lines
3.6 KiB
C#

/*
* This file is sublicensed under MIT License
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using System.Linq;
using System.Numerics;
using Content.Server.Nutrition.Components;
using Content.Server.Temperature.Systems;
using Content.Shared._CP14.Cooking;
using Content.Shared._CP14.Cooking.Components;
using Content.Shared._CP14.Temperature;
using Content.Shared.Chemistry.EntitySystems;
using Robust.Shared.Random;
namespace Content.Server._CP14.Cooking;
public sealed class CP14CookingSystem : CP14SharedCookingSystem
{
[Dependency] private readonly TemperatureSystem _temperature = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14FoodHolderComponent, SolutionContainerChangedEvent>(OnHolderChanged);
}
protected override bool TryTransferFood(Entity<CP14FoodHolderComponent> target, Entity<CP14FoodHolderComponent> source)
{
if (base.TryTransferFood(target, source))
{
//Sliceable
if (source.Comp.FoodData?.SliceProto is not null)
{
var sliceable = EnsureComp<SliceableFoodComponent>(target);
sliceable.Slice = source.Comp.FoodData.SliceProto;
sliceable.TotalCount = source.Comp.FoodData.SliceCount;
}
}
return true;
}
private void OnHolderChanged(Entity<CP14FoodHolderComponent> ent, ref SolutionContainerChangedEvent args)
{
if (args.Solution.Volume != 0)
return;
ent.Comp.FoodData = null;
Dirty(ent);
}
protected override void OnCookBurned(Entity<CP14FoodCookerComponent> ent, ref CP14BurningDoAfter args)
{
if (args.Cancelled || args.Handled)
return;
base.OnCookBurned(ent, ref args);
if (_random.Prob(ent.Comp.BurntAdditionalSpawnProb))
Spawn(ent.Comp.BurntAdditionalSpawn, Transform(ent).Coordinates);
}
protected override void UpdateFoodDataVisuals(Entity<CP14FoodHolderComponent> ent, CP14FoodData data, bool rename = true)
{
base.UpdateFoodDataVisuals(ent, data, rename);
if (ent.Comp.FoodData?.SliceProto is null)
return;
if (!TryComp<SliceableFoodComponent>(ent, out var sliceable))
return;
sliceable.Slice = ent.Comp.FoodData.SliceProto;
sliceable.TotalCount = ent.Comp.FoodData.SliceCount;
}
protected override void OnCookFinished(Entity<CP14FoodCookerComponent> ent, ref CP14CookingDoAfter args)
{
if (args.Cancelled || args.Handled)
return;
//We need transform all BEFORE Shared cooking code
TryTransformAll(ent);
base.OnCookFinished(ent, ref args);
}
private void TryTransformAll(Entity<CP14FoodCookerComponent> ent)
{
if (!_container.TryGetContainer(ent, ent.Comp.ContainerId, out var container))
return;
var containedEntities = container.ContainedEntities.ToList();
foreach (var contained in containedEntities)
{
if (!TryComp<CP14TemperatureTransformationComponent>(contained, out var transformable))
continue;
if (!transformable.AutoTransformOnCooked)
continue;
if (transformable.Entries.Count == 0)
continue;
var entry = transformable.Entries[0];
var newTemp = (entry.TemperatureRange.X + entry.TemperatureRange.Y) / 2;
_temperature.ForceChangeTemperature(contained, newTemp);
}
}
}