Save seed data in components and remove the seed-database (#7499)
This commit is contained in:
@@ -1,12 +1,8 @@
|
||||
using System.Collections.Generic;
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Server.Chemistry.EntitySystems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Tag;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
@@ -20,49 +16,13 @@ namespace Content.Server.Botany.Systems
|
||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!;
|
||||
|
||||
private int _nextUid = 0;
|
||||
private float _timer = 0f;
|
||||
|
||||
public readonly Dictionary<int, SeedPrototype> Seeds = new();
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<RoundRestartCleanupEvent>(Reset);
|
||||
|
||||
InitializeSeeds();
|
||||
|
||||
PopulateDatabase();
|
||||
}
|
||||
|
||||
private void PopulateDatabase()
|
||||
{
|
||||
_nextUid = 0;
|
||||
|
||||
Seeds.Clear();
|
||||
|
||||
foreach (var seed in _prototypeManager.EnumeratePrototypes<SeedPrototype>())
|
||||
{
|
||||
seed.Uid = GetNextSeedUid();
|
||||
Seeds[seed.Uid] = seed;
|
||||
}
|
||||
}
|
||||
|
||||
public bool AddSeedToDatabase(SeedPrototype seed)
|
||||
{
|
||||
// If it's not -1, it's already in the database. Probably.
|
||||
if (seed.Uid != -1)
|
||||
return false;
|
||||
|
||||
seed.Uid = GetNextSeedUid();
|
||||
Seeds[seed.Uid] = seed;
|
||||
return true;
|
||||
}
|
||||
|
||||
private int GetNextSeedUid()
|
||||
{
|
||||
return _nextUid++;
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
@@ -80,10 +40,5 @@ namespace Content.Server.Botany.Systems
|
||||
plantHolder.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public void Reset(RoundRestartCleanupEvent ev)
|
||||
{
|
||||
PopulateDatabase();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Maths;
|
||||
|
||||
namespace Content.Server.Botany.Systems;
|
||||
|
||||
@@ -10,7 +8,7 @@ public sealed partial class BotanySystem
|
||||
{
|
||||
public void ProduceGrown(EntityUid uid, ProduceComponent produce)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<SeedPrototype>(produce.SeedName, out var seed))
|
||||
if (!TryGetSeed(produce, out var seed))
|
||||
return;
|
||||
|
||||
if (TryComp(uid, out SpriteComponent? sprite))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Server.Kitchen.Components;
|
||||
@@ -26,35 +27,64 @@ public sealed partial class BotanySystem
|
||||
SubscribeLocalEvent<SeedComponent, ExaminedEvent>(OnExamined);
|
||||
}
|
||||
|
||||
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 (!_prototypeManager.TryIndex<SeedPrototype>(component.SeedName, out var seed))
|
||||
if (!TryGetSeed(component, out var seed))
|
||||
return;
|
||||
|
||||
args.PushMarkup(Loc.GetString($"seed-component-description", ("seedName", seed.DisplayName)));
|
||||
|
||||
if (!seed.RoundStart)
|
||||
{
|
||||
args.PushMarkup(Loc.GetString($"seed-component-has-variety-tag", ("seedUid", seed.Uid)));
|
||||
}
|
||||
else
|
||||
{
|
||||
args.PushMarkup(Loc.GetString($"seed-component-plant-yield-text", ("seedYield", seed.Yield)));
|
||||
args.PushMarkup(Loc.GetString($"seed-component-plant-potency-text", ("seedPotency", seed.Potency)));
|
||||
}
|
||||
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
|
||||
|
||||
public EntityUid SpawnSeedPacket(SeedPrototype proto, EntityCoordinates transformCoordinates)
|
||||
public EntityUid SpawnSeedPacket(SeedData proto, EntityCoordinates transformCoordinates)
|
||||
{
|
||||
var seed = Spawn(SeedPrototype.Prototype, transformCoordinates);
|
||||
|
||||
var seed = Spawn(proto.PacketPrototype, transformCoordinates);
|
||||
var seedComp = EnsureComp<SeedComponent>(seed);
|
||||
seedComp.SeedName = proto.ID;
|
||||
seedComp.Seed = proto;
|
||||
|
||||
if (TryComp(seed, out SpriteComponent? sprite))
|
||||
{
|
||||
@@ -63,13 +93,13 @@ public sealed partial class BotanySystem
|
||||
sprite.LayerSetSprite(0, new SpriteSpecifier.Rsi(proto.PlantRsi, "seed"));
|
||||
}
|
||||
|
||||
string val = Loc.GetString("botany-seed-packet-name", ("seedName", proto.SeedName), ("seedNoun", proto.SeedNoun));
|
||||
string val = Loc.GetString("botany-seed-packet-name", ("seedName", proto.Name), ("seedNoun", proto.Noun));
|
||||
MetaData(seed).EntityName = val;
|
||||
|
||||
return seed;
|
||||
}
|
||||
|
||||
public IEnumerable<EntityUid> AutoHarvest(SeedPrototype proto, EntityCoordinates position, int yieldMod = 1)
|
||||
public IEnumerable<EntityUid> AutoHarvest(SeedData proto, EntityCoordinates position, int yieldMod = 1)
|
||||
{
|
||||
if (position.IsValid(EntityManager) &&
|
||||
proto.ProductPrototypes.Count > 0)
|
||||
@@ -78,10 +108,8 @@ public sealed partial class BotanySystem
|
||||
return Enumerable.Empty<EntityUid>();
|
||||
}
|
||||
|
||||
public IEnumerable<EntityUid> Harvest(SeedPrototype proto, EntityUid user, int yieldMod = 1)
|
||||
public IEnumerable<EntityUid> Harvest(SeedData proto, EntityUid user, int yieldMod = 1)
|
||||
{
|
||||
if (AddSeedToDatabase(proto)) proto.Name = proto.Uid.ToString();
|
||||
|
||||
if (proto.ProductPrototypes.Count == 0 || proto.Yield <= 0)
|
||||
{
|
||||
_popupSystem.PopupCursor(Loc.GetString("botany-harvest-fail-message"),
|
||||
@@ -94,16 +122,13 @@ public sealed partial class BotanySystem
|
||||
return GenerateProduct(proto, Transform(user).Coordinates, yieldMod);
|
||||
}
|
||||
|
||||
public IEnumerable<EntityUid> GenerateProduct(SeedPrototype proto, EntityCoordinates position, int yieldMod = 1)
|
||||
public IEnumerable<EntityUid> GenerateProduct(SeedData proto, EntityCoordinates position, int yieldMod = 1)
|
||||
{
|
||||
var totalYield = 0;
|
||||
if (proto.Yield > -1)
|
||||
{
|
||||
if (yieldMod < 0)
|
||||
{
|
||||
yieldMod = 1;
|
||||
totalYield = proto.Yield;
|
||||
}
|
||||
else
|
||||
totalYield = proto.Yield * yieldMod;
|
||||
|
||||
@@ -112,6 +137,9 @@ public sealed partial class BotanySystem
|
||||
|
||||
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);
|
||||
@@ -122,7 +150,7 @@ public sealed partial class BotanySystem
|
||||
|
||||
var produce = EnsureComp<ProduceComponent>(entity);
|
||||
|
||||
produce.SeedName = proto.ID;
|
||||
produce.Seed = proto;
|
||||
ProduceGrown(entity, produce);
|
||||
|
||||
if (TryComp<AppearanceComponent>(entity, out var appearance))
|
||||
@@ -141,7 +169,7 @@ public sealed partial class BotanySystem
|
||||
return products;
|
||||
}
|
||||
|
||||
public bool CanHarvest(SeedPrototype proto, EntityUid? held = null)
|
||||
public bool CanHarvest(SeedData proto, EntityUid? held = null)
|
||||
{
|
||||
return !proto.Ligneous || proto.Ligneous && held != null && HasComp<SharpComponent>(held);
|
||||
}
|
||||
|
||||
@@ -98,12 +98,12 @@ namespace Content.Server.Botany.Systems
|
||||
{
|
||||
if (component.Seed == null)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<SeedPrototype>(seeds.SeedName, out var seed))
|
||||
return;
|
||||
|
||||
if (!_botanySystem.TryGetSeed(seeds, out var seed))
|
||||
return ;
|
||||
|
||||
_popupSystem.PopupCursor(Loc.GetString("plant-holder-component-plant-success-message",
|
||||
("seedName", seed.SeedName),
|
||||
("seedNoun", seed.SeedNoun)), Filter.Entities(args.User));
|
||||
("seedName", seed.Name),
|
||||
("seedNoun", seed.Noun)), Filter.Entities(args.User));
|
||||
|
||||
component.Seed = seed;
|
||||
component.Dead = false;
|
||||
@@ -215,6 +215,7 @@ namespace Content.Server.Botany.Systems
|
||||
return;
|
||||
}
|
||||
|
||||
component.Seed.Unique = false;
|
||||
var seed = _botanySystem.SpawnSeedPacket(component.Seed, Transform(args.User).Coordinates);
|
||||
seed.RandomOffset(0.25f);
|
||||
_popupSystem.PopupCursor(Loc.GetString("plant-holder-component-take-sample-message",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Server.Botany.Components;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Shared.Interaction;
|
||||
@@ -14,7 +14,6 @@ namespace Content.Server.Botany.Systems;
|
||||
public sealed class SeedExtractorSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly BotanySystem _botanySystem = default!;
|
||||
|
||||
@@ -32,7 +31,7 @@ public sealed class SeedExtractorSystem : EntitySystem
|
||||
|
||||
if (TryComp(args.Used, out ProduceComponent? produce))
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<SeedPrototype>(produce.SeedName, out var seed))
|
||||
if (!_botanySystem.TryGetSeed(produce, out var seed))
|
||||
return;
|
||||
|
||||
_popupSystem.PopupCursor(Loc.GetString("seed-extractor-component-interact-message",("name", args.Used)),
|
||||
@@ -43,6 +42,9 @@ public sealed class SeedExtractorSystem : EntitySystem
|
||||
var random = _random.Next(component.MinSeeds, component.MaxSeeds);
|
||||
var coords = Transform(uid).Coordinates;
|
||||
|
||||
if (random > 1)
|
||||
seed.Unique = false;
|
||||
|
||||
for (var i = 0; i < random; i++)
|
||||
{
|
||||
_botanySystem.SpawnSeedPacket(seed, coords);
|
||||
|
||||
Reference in New Issue
Block a user