using Content.Shared._CP14.DayCycle; using Content.Shared._CP14.Farming.Components; using Content.Shared.Chemistry.Components.SolutionManager; namespace Content.Server._CP14.Farming; public sealed partial class CP14FarmingSystem { [Dependency] private readonly CP14DayCycleSystem _dayCycle = default!; private void InitializeResources() { SubscribeLocalEvent(OnTakeEnergyFromLight); SubscribeLocalEvent(OnPlantMetabolizing); SubscribeLocalEvent(OnPlantGrowing); } private void OnTakeEnergyFromLight(Entity regeneration, ref CP14PlantUpdateEvent args) { var gainEnergy = false; var daylight = _dayCycle.UnderSunlight(regeneration); if (regeneration.Comp.Daytime && daylight) gainEnergy = true; if (regeneration.Comp.Nighttime && !daylight) gainEnergy = true; if (gainEnergy) args.EnergyDelta += regeneration.Comp.Energy; } private void OnPlantGrowing(Entity growing, ref CP14AfterPlantUpdateEvent args) { if (args.Plant.Comp.Energy < growing.Comp.EnergyCost) return; if (args.Plant.Comp.Resource < growing.Comp.ResourceCost) return; if (args.Plant.Comp.GrowthLevel >= 1) return; AffectEnergy(args.Plant, -growing.Comp.EnergyCost); AffectResource(args.Plant, -growing.Comp.ResourceCost); AffectGrowth(args.Plant, growing.Comp.GrowthPerUpdate); } private void OnPlantMetabolizing(Entity ent, ref CP14PlantUpdateEvent args) { if (!PlantQuery.TryComp(ent, out var plant) || !SolutionQuery.TryComp(args.Plant, out var solmanager)) return; var solEntity = new Entity(args.Plant, solmanager); if (!_solutionContainer.TryGetSolution(solEntity, plant.Solution, out var soln, out _)) return; if (!_proto.TryIndex(ent.Comp.MetabolizerId, out var metabolizer)) return; var splitted = _solutionContainer.SplitSolution(soln.Value, ent.Comp.SolutionPerUpdate); foreach (var reagent in splitted) { if (!metabolizer.Metabolization.ContainsKey(reagent.Reagent.ToString())) continue; foreach (var effect in metabolizer.Metabolization[reagent.Reagent.ToString()]) { effect.Effect((ent, plant), reagent.Quantity, EntityManager); } } } }