Files
crystall-punk-14/Content.Server/_CP14/Farming/CP14FarmingSystem.Resourse.cs
Ed 8cbd26ae2f Farming WIP (#269)
* setup planting doafter

* spawn plants after use seed

* some work

* move comps to separate folder

* public check daylight

* daylight plant energy regeneration

* some fixes

* bruh, im thinking

* added ingame soil

* added hoe

* attaching plants

* hoe system

* block plant dublicating

* some planting refactor

* shovel as pant + soil remover

* plant growing visualizer

* soil resprite

* split farming system to second partial class

* update throught event refactor

* tring sync update plant with update visuals

* finish visual sync

* plants growing

* more partial splitting, naming work, clean up

* Update FARMINGTEST.yml

* Update FARMINGTEST.yml

* fix typo

* prototype value validating

* Оно бухает воду!

* solution visualizer in soil

* forgot some fix

* part of Tornado review fix

* destroy RemovePlantComponent

* more fixes

* simple harvesting

* refactor plant component values changing

* harvest redo

* gather on destroyByTool

* sickle resprite

* plant fading

* fading per minute!

* wheat sprites

* YML restruct

* fixes

* auto root plants

* add comments

* move sprites

* split structures from object textures

* wheat farming!

* Update CP14FarmingSystem.Interactions.cs

* seedbed (#297)

seedbed :^)

* a

* Update soil.yml

---------

Co-authored-by: Jaraten <116667537+Jaraten@users.noreply.github.com>
2024-07-15 23:58:03 +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 = _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<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);
}
}
}
}