using Content.Server._CP14.Farming.Components; using Content.Shared._CP14.Farming; using Content.Shared.Chemistry.Components.SolutionManager; namespace Content.Server._CP14.Farming; public sealed partial class CP14FarmingSystem { private void InitializeResources() { SubscribeLocalEvent(OnTakeEnergyFromLight); SubscribeLocalEvent(OnPlantMetabolizing); SubscribeLocalEvent(OnPlantFade); SubscribeLocalEvent(OnPlantGrowing); } private void OnPlantFade(Entity ent, ref CP14PlantUpdateEvent args) { var realFade = ent.Comp.ResourcePerMinute * (float)args.Plant.Comp.Age.TotalMinutes; if (args.Plant.Comp.Resource < realFade) { _damageable.TryChangeDamage(ent, ent.Comp.FadeDamage, true); } AffectResource(args.Plant, -realFade); } private void OnTakeEnergyFromLight(Entity regeneration, ref CP14PlantUpdateEvent args) { var gainEnergy = false; var daylight = _dayCycle.TryDaylightThere(regeneration, true); 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 (args.Plant.Comp.SoilUid == null || !TryComp(args.Plant.Comp.SoilUid, out var soil) || !TryComp(ent, out var plant) || !TryComp(args.Plant.Comp.SoilUid, out var solmanager)) return; var solEntity = new Entity(args.Plant.Comp.SoilUid.Value, solmanager); if (!_solutionContainer.TryGetSolution(solEntity, soil.Solution, out var soln, out var solution)) 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); } } } }