using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Mobs.Systems;
using Content.Shared.Nutrition;
using Content.Shared.Nutrition.Components;
using Content.Shared.Nutrition.EntitySystems;
using Robust.Shared.Containers;
using Robust.Shared.Timing;
namespace Content.Shared.Animals;
///
/// Gives ability to produce fiber reagents;
/// produces endlessly if the owner has no HungerComponent.
///
public sealed class WoolySystem : EntitySystem
{
[Dependency] private readonly HungerSystem _hunger = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent(OnMapInit);
SubscribeLocalEvent(OnEntRemoved);
}
private void OnMapInit(EntityUid uid, WoolyComponent component, MapInitEvent args)
{
component.NextGrowth = _timing.CurTime + component.GrowthDelay;
}
private void OnEntRemoved(Entity entity, ref EntRemovedFromContainerMessage args)
{
// Make sure the removed entity was our contained solution
if (entity.Comp.Solution == null || args.Entity != entity.Comp.Solution.Value.Owner)
return;
// Clear our cached reference to the solution entity
entity.Comp.Solution = null;
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var wooly))
{
if (_timing.CurTime < wooly.NextGrowth)
continue;
wooly.NextGrowth += wooly.GrowthDelay;
if (_mobState.IsDead(uid))
continue;
if (!_solutionContainer.ResolveSolution(uid, wooly.SolutionName, ref wooly.Solution, out var solution))
continue;
if (solution.AvailableVolume == 0)
continue;
// Actually there is food digestion so no problem with instant reagent generation "OnFeed"
if (TryComp(uid, out HungerComponent? hunger))
{
// Is there enough nutrition to produce reagent?
if (_hunger.GetHungerThreshold(hunger) < HungerThreshold.Okay)
continue;
_hunger.ModifyHunger(uid, -wooly.HungerUsage, hunger);
}
_solutionContainer.TryAddReagent(wooly.Solution.Value, wooly.ReagentId, wooly.Quantity, out _);
}
}
}