refactor rehydration (#14707)

This commit is contained in:
deltanedas
2023-03-24 05:00:38 +00:00
committed by GitHub
parent 377f473ced
commit 0663211bd0
2 changed files with 67 additions and 51 deletions

View File

@@ -1,18 +1,39 @@
namespace Content.Server.Chemistry.Components using Content.Server.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Chemistry.Components;
/// <summary>
/// Basically, monkey cubes.
/// But specifically, this component deletes the entity and spawns in a new entity when the entity is exposed to a certain amount of a given reagent.
/// </summary>
[RegisterComponent, Access(typeof(RehydratableSystem))]
public sealed class RehydratableComponent : Component
{ {
/// <summary> /// <summary>
/// Basically, monkey cubes. /// The reagent that must be present to count as hydrated.
/// But specifically, this component deletes the entity and spawns in a new entity when the entity is exposed to a given reagent.
/// </summary> /// </summary>
[RegisterComponent] [DataField("catalyst", customTypeSerializer: typeof(PrototypeIdSerializer<ReagentPrototype>)), ViewVariables(VVAccess.ReadWrite)]
public sealed class RehydratableComponent : Component public string CatalystPrototype = "Water";
{
[DataField("catalyst")]
internal string CatalystPrototype = "Water";
[DataField("target")] /// <summary>
internal string? TargetPrototype = default!; /// The minimum amount of catalyst that must be present to be hydrated.
/// </summary>
[DataField("catalystMinimum"), ViewVariables(VVAccess.ReadWrite)]
public FixedPoint2 CatalystMinimum = FixedPoint2.Zero;
internal bool Expanding; /// <summary>
} /// The entity to create when hydrated.
/// </summary>
[DataField("target", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>)), ViewVariables(VVAccess.ReadWrite)]
public string? TargetPrototype = default!;
} }
/// <summary>
/// Raised on the rehydrated entity with target being the new entity it became.
/// </summary>
[ByRefEvent]
public readonly record struct GotRehydratedEvent(EntityUid Target);

View File

@@ -1,47 +1,42 @@
using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Components;
using Content.Server.Popups;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using JetBrains.Annotations; using Content.Shared.Popups;
namespace Content.Server.Chemistry.EntitySystems namespace Content.Server.Chemistry.EntitySystems;
public sealed class RehydratableSystem : EntitySystem
{ {
[UsedImplicitly] [Dependency] private readonly SharedPopupSystem _popups = default!;
public sealed class RehydratableSystem : EntitySystem [Dependency] private readonly SolutionContainerSystem _solutions = default!;
public override void Initialize()
{ {
[Dependency] private readonly SolutionContainerSystem _solutionsSystem = default!; base.Initialize();
public override void Initialize()
SubscribeLocalEvent<RehydratableComponent, SolutionChangedEvent>(OnSolutionChange);
}
private void OnSolutionChange(EntityUid uid, RehydratableComponent comp, SolutionChangedEvent args)
{
var quantity = _solutions.GetReagentQuantity(uid, comp.CatalystPrototype);
if (quantity != FixedPoint2.Zero && quantity >= comp.CatalystMinimum)
{ {
base.Initialize(); Expand(uid, comp);
SubscribeLocalEvent<RehydratableComponent, SolutionChangedEvent>(OnSolutionChange);
}
private void OnSolutionChange(EntityUid uid, RehydratableComponent component, SolutionChangedEvent args)
{
if (_solutionsSystem.GetReagentQuantity(uid, component.CatalystPrototype) > FixedPoint2.Zero)
{
Expand(component, component.Owner);
}
}
// Try not to make this public if you can help it.
private void Expand(RehydratableComponent component, EntityUid owner)
{
if (component.Expanding)
{
return;
}
component.Expanding = true;
owner.PopupMessageEveryone(Loc.GetString("rehydratable-component-expands-message", ("owner", owner)));
if (!string.IsNullOrEmpty(component.TargetPrototype))
{
var ent = EntityManager.SpawnEntity(component.TargetPrototype,
EntityManager.GetComponent<TransformComponent>(owner).Coordinates);
EntityManager.GetComponent<TransformComponent>(ent).AttachToGridOrMap();
}
EntityManager.QueueDeleteEntity((EntityUid) owner);
} }
} }
// Try not to make this public if you can help it.
private void Expand(EntityUid uid, RehydratableComponent comp)
{
_popups.PopupEntity(Loc.GetString("rehydratable-component-expands-message", ("owner", uid)), uid);
var target = Spawn(comp.TargetPrototype, Transform(uid).Coordinates);
Transform(target).AttachToGridOrMap();
var ev = new GotRehydratedEvent(target);
RaiseLocalEvent(uid, ref ev);
// prevent double hydration while queued
RemComp<RehydratableComponent>(uid);
QueueDel(uid);
}
} }