mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-10-12 03:41:14 +03:00
Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: Partmedia <kevinz5000@gmail.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Victor Shen <71985089+Vexerot@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: Kirus59 <145689588+Kirus59@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Stomf <5dorkydorks@gmail.com> Co-authored-by: drakewill-CRL <46307022+drakewill-CRL@users.noreply.github.com> Co-authored-by: PraxisMapper <praxismapper@gmail.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com> Co-authored-by: abadaba695 <spacestation13thingy@gmail.com> Co-authored-by: kosticia <kosticia46@gmail.com> Co-authored-by: Thinbug <101073555+Thinbug0@users.noreply.github.com> Co-authored-by: pathetic meowmeow <uhhadd@gmail.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: ActiveMammmoth <140334666+ActiveMammmoth@users.noreply.github.com> Co-authored-by: Myra <vasilis@pikachu.systems> Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Gentleman-Bird <dcgreen406@gmail.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: BIGZi0348 <svalker0348@gmail.com> Co-authored-by: LaCumbiaDelCoronavirus <90893484+LaCumbiaDelCoronavirus@users.noreply.github.com> Co-authored-by: imatsoup <93290208+imatsoup@users.noreply.github.com> Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com> Co-authored-by: Ertanic <36124833+Ertanic@users.noreply.github.com> Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: eoineoineoin <helloworld@eoinrul.es> Co-authored-by: Tiniest Shark <head.rebel@yahoo.com> Co-authored-by: nikitosych <boriszyn@gmail.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com> Co-authored-by: YoungThug <ramialanbagy@gmail.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Co-authored-by: Vladislav Suchkov <20380250+murolem@users.noreply.github.com> Co-authored-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: Unkn0wn_Gh0st <shadowstalkermll@gmail.com> Co-authored-by: 3nderall <101940324+3nderall@users.noreply.github.com> Co-authored-by: Radezolid <snappednexus@gmail.com> Co-authored-by: J <billsmith116@gmail.com> Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com> Co-authored-by: Minemoder5000 <minemoder50000@gmail.com> Co-authored-by: Spanky <scott@wearejacob.com> Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Deerstop <edainturner@gmail.com> Co-authored-by: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Co-authored-by: archee1 <archee3@hotmail.co.uk> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com> Co-authored-by: poklj <compgeek223@gmail.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: OnyxTheBrave <131422822+OnyxTheBrave@users.noreply.github.com> Co-authored-by: UpAndLeaves <92269094+Alpha-Two@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Zalycon <84675130+Zalycon@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: ScarKy0 <scarky0@onet.eu> Co-authored-by: Dmitry <57028746+dimm00n@users.noreply.github.com>
201 lines
7 KiB
C#
201 lines
7 KiB
C#
using Content.Server.Botany.Components;
|
|
using Content.Server.Kitchen.Components;
|
|
using Content.Server.Popups;
|
|
using Content.Shared.Chemistry.EntitySystems;
|
|
using Content.Shared.Botany;
|
|
using Content.Shared.Examine;
|
|
using Content.Shared.Hands.EntitySystems;
|
|
using Content.Shared.Popups;
|
|
using Content.Shared.Random;
|
|
using Content.Shared.Random.Helpers;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.Map;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Random;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Linq;
|
|
using Content.Shared.Administration.Logs;
|
|
using Content.Shared.Database;
|
|
|
|
namespace Content.Server.Botany.Systems;
|
|
|
|
public sealed partial class BotanySystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
|
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
|
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
|
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
|
[Dependency] private readonly SharedHandsSystem _hands = default!;
|
|
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
|
|
[Dependency] private readonly MetaDataSystem _metaData = default!;
|
|
[Dependency] private readonly RandomHelperSystem _randomHelper = default!;
|
|
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<SeedComponent, ExaminedEvent>(OnExamined);
|
|
SubscribeLocalEvent<ProduceComponent, ExaminedEvent>(OnProduceExamined);
|
|
}
|
|
|
|
public bool TryGetSeed(SeedComponent comp, [NotNullWhen(true)] out SeedData? seed)
|
|
{
|
|
if (comp.Seed != null)
|
|
{
|
|
seed = comp.Seed;
|
|
return true;
|
|
}
|
|
|
|
if (comp.SeedId != null
|
|
&& _prototypeManager.TryIndex(comp.SeedId, out SeedPrototype? protoSeed))
|
|
{
|
|
seed = protoSeed;
|
|
return true;
|
|
}
|
|
|
|
seed = null;
|
|
return false;
|
|
}
|
|
|
|
public bool TryGetSeed(ProduceComponent comp, [NotNullWhen(true)] out SeedData? seed)
|
|
{
|
|
if (comp.Seed != null)
|
|
{
|
|
seed = comp.Seed;
|
|
return true;
|
|
}
|
|
|
|
if (comp.SeedId != null
|
|
&& _prototypeManager.TryIndex(comp.SeedId, out SeedPrototype? protoSeed))
|
|
{
|
|
seed = protoSeed;
|
|
return true;
|
|
}
|
|
|
|
seed = null;
|
|
return false;
|
|
}
|
|
|
|
private void OnExamined(EntityUid uid, SeedComponent component, ExaminedEvent args)
|
|
{
|
|
if (!args.IsInDetailsRange)
|
|
return;
|
|
|
|
if (!TryGetSeed(component, out var seed))
|
|
return;
|
|
|
|
using (args.PushGroup(nameof(SeedComponent), 1))
|
|
{
|
|
var name = Loc.GetString(seed.DisplayName);
|
|
args.PushMarkup(Loc.GetString($"seed-component-description", ("seedName", name)));
|
|
args.PushMarkup(Loc.GetString($"seed-component-plant-yield-text", ("seedYield", seed.Yield)));
|
|
args.PushMarkup(Loc.GetString($"seed-component-plant-potency-text", ("seedPotency", seed.Potency)));
|
|
}
|
|
}
|
|
|
|
#region SeedPrototype prototype stuff
|
|
|
|
/// <summary>
|
|
/// Spawns a new seed packet on the floor at a position, then tries to put it in the user's hands if possible.
|
|
/// </summary>
|
|
public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates coords, EntityUid user, float? healthOverride = null)
|
|
{
|
|
var seed = Spawn(proto.PacketPrototype, coords);
|
|
var seedComp = EnsureComp<SeedComponent>(seed);
|
|
seedComp.Seed = proto;
|
|
seedComp.HealthOverride = healthOverride;
|
|
|
|
var name = Loc.GetString(proto.Name);
|
|
var noun = Loc.GetString(proto.Noun);
|
|
var val = Loc.GetString("botany-seed-packet-name", ("seedName", name), ("seedNoun", noun));
|
|
_metaData.SetEntityName(seed, val);
|
|
|
|
// try to automatically place in user's other hand
|
|
_hands.TryPickupAnyHand(user, seed);
|
|
return seed;
|
|
}
|
|
|
|
public IEnumerable<EntityUid> AutoHarvest(SeedData proto, EntityCoordinates position, int yieldMod = 1)
|
|
{
|
|
if (position.IsValid(EntityManager) &&
|
|
proto.ProductPrototypes.Count > 0)
|
|
{
|
|
if (proto.HarvestLogImpact != null)
|
|
_adminLogger.Add(LogType.Botany, proto.HarvestLogImpact.Value, $"Auto-harvested {Loc.GetString(proto.Name):seed} at Pos:{position}.");
|
|
|
|
return GenerateProduct(proto, position, yieldMod);
|
|
}
|
|
|
|
return Enumerable.Empty<EntityUid>();
|
|
}
|
|
|
|
public IEnumerable<EntityUid> Harvest(SeedData proto, EntityUid user, int yieldMod = 1)
|
|
{
|
|
if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0)
|
|
{
|
|
_popupSystem.PopupCursor(Loc.GetString("botany-harvest-fail-message"), user, PopupType.Medium);
|
|
return Enumerable.Empty<EntityUid>();
|
|
}
|
|
|
|
var name = Loc.GetString(proto.DisplayName);
|
|
_popupSystem.PopupCursor(Loc.GetString("botany-harvest-success-message", ("name", name)), user, PopupType.Medium);
|
|
|
|
if (proto.HarvestLogImpact != null)
|
|
_adminLogger.Add(LogType.Botany, proto.HarvestLogImpact.Value, $"{ToPrettyString(user):player} harvested {Loc.GetString(proto.Name):seed} at Pos:{Transform(user).Coordinates}.");
|
|
|
|
return GenerateProduct(proto, Transform(user).Coordinates, yieldMod);
|
|
}
|
|
|
|
public IEnumerable<EntityUid> GenerateProduct(SeedData proto, EntityCoordinates position, int yieldMod = 1)
|
|
{
|
|
var totalYield = 0;
|
|
if (proto.Yield > -1)
|
|
{
|
|
if (yieldMod < 0)
|
|
totalYield = proto.Yield;
|
|
else
|
|
totalYield = proto.Yield * yieldMod;
|
|
|
|
totalYield = Math.Max(1, totalYield);
|
|
}
|
|
|
|
var products = new List<EntityUid>();
|
|
|
|
if (totalYield > 1 || proto.HarvestRepeat != HarvestType.NoRepeat)
|
|
proto.Unique = false;
|
|
|
|
for (var i = 0; i < totalYield; i++)
|
|
{
|
|
var product = _robustRandom.Pick(proto.ProductPrototypes);
|
|
|
|
var entity = Spawn(product, position);
|
|
_randomHelper.RandomOffset(entity, 0.25f);
|
|
products.Add(entity);
|
|
|
|
var produce = EnsureComp<ProduceComponent>(entity);
|
|
|
|
produce.Seed = proto;
|
|
ProduceGrown(entity, produce);
|
|
|
|
_appearance.SetData(entity, ProduceVisuals.Potency, proto.Potency);
|
|
|
|
if (proto.Mysterious)
|
|
{
|
|
var metaData = MetaData(entity);
|
|
_metaData.SetEntityName(entity, metaData.EntityName + "?", metaData);
|
|
_metaData.SetEntityDescription(entity,
|
|
metaData.EntityDescription + " " + Loc.GetString("botany-mysterious-description-addon"), metaData);
|
|
}
|
|
}
|
|
|
|
return products;
|
|
}
|
|
|
|
public bool CanHarvest(SeedData proto, EntityUid? held = null)
|
|
{
|
|
return !proto.Ligneous || proto.Ligneous && held != null && HasComp<SharpComponent>(held);
|
|
}
|
|
|
|
#endregion
|
|
}
|