Skip to content

Commit

Permalink
improve job special (#30753)
Browse files Browse the repository at this point in the history
* cleanup of AddComponentSpecial

* add RemoveComponentSpecial

* require

---------

Co-authored-by: deltanedas <@deltanedas:kde.org>
  • Loading branch information
deltanedas authored Aug 9, 2024
1 parent d0a2187 commit ed8bcb0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 26 deletions.
40 changes: 14 additions & 26 deletions Content.Server/Jobs/AddComponentSpecial.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,22 @@
using Content.Shared.Roles;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager;

namespace Content.Server.Jobs
{
[UsedImplicitly]
public sealed partial class AddComponentSpecial : JobSpecial
{
[DataField("components")]
[AlwaysPushInheritance]
public ComponentRegistry Components { get; private set; } = new();
namespace Content.Server.Jobs;

public override void AfterEquip(EntityUid mob)
{
// now its a registry of components, still throws i bet.
// TODO: This is hot garbage and probably needs an engine change to not be a POS.
var factory = IoCManager.Resolve<IComponentFactory>();
var entityManager = IoCManager.Resolve<IEntityManager>();
var serializationManager = IoCManager.Resolve<ISerializationManager>();
public sealed partial class AddComponentSpecial : JobSpecial
{
[DataField(required: true)]
public ComponentRegistry Components { get; private set; } = new();

foreach (var (name, data) in Components)
{
var component = (Component) factory.GetComponent(name);
/// <summary>
/// If this is true then existing components will be removed and replaced with these ones.
/// </summary>
[DataField]
public bool RemoveExisting = true;

var temp = (object)component;
serializationManager.CopyTo(data.Component, ref temp);
entityManager.RemoveComponent(mob, temp!.GetType());
entityManager.AddComponent(mob, (Component)temp);
}
}
public override void AfterEquip(EntityUid mob)
{
var entMan = IoCManager.Resolve<IEntityManager>();
entMan.AddComponents(mob, Components, removeExisting: RemoveExisting);
}
}
16 changes: 16 additions & 0 deletions Content.Server/Jobs/RemoveComponentSpecial.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Content.Shared.Roles;
using Robust.Shared.Prototypes;

namespace Content.Server.Jobs;

public sealed partial class RemoveComponentSpecial : JobSpecial
{
[DataField(required: true)]
public ComponentRegistry Components { get; private set; } = new();

public override void AfterEquip(EntityUid mob)
{
var entMan = IoCManager.Resolve<IEntityManager>();
entMan.RemoveComponents(mob, Components);
}
}

0 comments on commit ed8bcb0

Please sign in to comment.