Files
crystall-punk-14/Content.Server/_CP14/Farming/CP14FarmingSystem.Resourse.cs
Ed 1867903c46 Planetarization (#1040)
* tiers to level demiplanes

* Update demiplane_keys.yml

* demiplane on planets

* migrate to wizden dayCycle + planetarize Comoss

* Update comoss_d.yml

* Update audio_music.yml

* Update dev_map.yml

* add shadows to demiplanes

* remove outdated systems

* fix silvas

* silva fix

* Update factoria.yml

* Update island.yml
2025-03-19 12:52:37 +03:00

88 lines
3.3 KiB
C#

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<CP14PlantEnergyFromLightComponent, CP14PlantUpdateEvent>(OnTakeEnergyFromLight);
SubscribeLocalEvent<CP14PlantMetabolizerComponent, CP14PlantUpdateEvent>(OnPlantMetabolizing);
SubscribeLocalEvent<CP14PlantFadingComponent, CP14PlantUpdateEvent>(OnPlantFade);
SubscribeLocalEvent<CP14PlantGrowingComponent, CP14AfterPlantUpdateEvent>(OnPlantGrowing);
}
private void OnPlantFade(Entity<CP14PlantFadingComponent> 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<CP14PlantEnergyFromLightComponent> regeneration, ref CP14PlantUpdateEvent args)
{
var gainEnergy = false;
var daylight = true;//_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<CP14PlantGrowingComponent> 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<CP14PlantMetabolizerComponent> ent, ref CP14PlantUpdateEvent args)
{
if (args.Plant.Comp.SoilUid == null ||
!TryComp<CP14SoilComponent>(args.Plant.Comp.SoilUid, out var soil) ||
!TryComp<CP14PlantComponent>(ent, out var plant) ||
!TryComp<SolutionContainerManagerComponent>(args.Plant.Comp.SoilUid, out var solmanager))
return;
var solEntity = new Entity<SolutionContainerManagerComponent?>(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);
}
}
}
}