* Shelve * 22 file diff * What if it was just better * Hold that thought * Near final Commit, then YAML hell * 95% done with cs * Working Commit * Final Commit (Before reviews tear it apart and kill me) * Add a really stupid comment. * KILL * EXPLODE TEST FAILS WITH MY MIND * I hate it here * TACTICAL NUCLEAR STRIKE * Wait what the fuck was I doing? * Comments * Me when I'm stupid * Food doesn't need solutions * API improvements with some API weirdness * Move non-API out of API * Better comment * Fixes and spelling mistakes * Final fixes * Final fixes for real... * Kill food and drink localization files because I hate them. * Water droplet fix * Utensil fixes * Fix verb priority (It should've been 2) * A few minor localization fixes * merge conflict and stuff * MERGE CONFLICT NUCLEAR WAR!!! * Cleanup --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
80 lines
2.7 KiB
C#
80 lines
2.7 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Gives ability to produce fiber reagents;
|
|
/// produces endlessly if the owner has no HungerComponent.
|
|
/// </summary>
|
|
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<WoolyComponent, MapInitEvent>(OnMapInit);
|
|
SubscribeLocalEvent<WoolyComponent, EntRemovedFromContainerMessage>(OnEntRemoved);
|
|
}
|
|
|
|
private void OnMapInit(EntityUid uid, WoolyComponent component, MapInitEvent args)
|
|
{
|
|
component.NextGrowth = _timing.CurTime + component.GrowthDelay;
|
|
}
|
|
|
|
private void OnEntRemoved(Entity<WoolyComponent> 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<WoolyComponent>();
|
|
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 _);
|
|
}
|
|
}
|
|
}
|