Change Polymorph Actions to use Polymorph Proto Id (#26419)
* polymorph changes Adds poly proto ids to polymorph action event and checks for proto id when performing * nullable proto id * Replaces instances of Polymorph prototype with a proto id and tryindex * birdup --------- Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
This commit is contained in:
@@ -118,7 +118,10 @@ public sealed partial class PolymorphSystem : EntitySystem
|
|||||||
|
|
||||||
private void OnPolymorphActionEvent(Entity<PolymorphableComponent> ent, ref PolymorphActionEvent args)
|
private void OnPolymorphActionEvent(Entity<PolymorphableComponent> ent, ref PolymorphActionEvent args)
|
||||||
{
|
{
|
||||||
PolymorphEntity(ent, args.Prototype.Configuration);
|
if (!_proto.TryIndex(args.ProtoId, out var prototype))
|
||||||
|
return;
|
||||||
|
|
||||||
|
PolymorphEntity(ent, prototype.Configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnRevertPolymorphActionEvent(Entity<PolymorphedEntityComponent> ent,
|
private void OnRevertPolymorphActionEvent(Entity<PolymorphedEntityComponent> ent,
|
||||||
@@ -348,7 +351,9 @@ public sealed partial class PolymorphSystem : EntitySystem
|
|||||||
if (target.Comp.PolymorphActions.ContainsKey(id))
|
if (target.Comp.PolymorphActions.ContainsKey(id))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var polyProto = _proto.Index(id);
|
if (!_proto.TryIndex(id, out var polyProto))
|
||||||
|
return;
|
||||||
|
|
||||||
var entProto = _proto.Index(polyProto.Configuration.Entity);
|
var entProto = _proto.Index(polyProto.Configuration.Entity);
|
||||||
|
|
||||||
EntityUid? actionId = default!;
|
EntityUid? actionId = default!;
|
||||||
@@ -366,7 +371,7 @@ public sealed partial class PolymorphSystem : EntitySystem
|
|||||||
|
|
||||||
baseAction.Icon = new SpriteSpecifier.EntityPrototype(polyProto.Configuration.Entity);
|
baseAction.Icon = new SpriteSpecifier.EntityPrototype(polyProto.Configuration.Entity);
|
||||||
if (baseAction is InstantActionComponent action)
|
if (baseAction is InstantActionComponent action)
|
||||||
action.Event = new PolymorphActionEvent(prototype: polyProto);
|
action.Event = new PolymorphActionEvent(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemovePolymorphAction(ProtoId<PolymorphPrototype> id, Entity<PolymorphableComponent> target)
|
public void RemovePolymorphAction(ProtoId<PolymorphPrototype> id, Entity<PolymorphableComponent> target)
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ using Content.Server.Administration;
|
|||||||
using Content.Server.Polymorph.Systems;
|
using Content.Server.Polymorph.Systems;
|
||||||
using Content.Shared.Administration;
|
using Content.Shared.Administration;
|
||||||
using Content.Shared.Polymorph;
|
using Content.Shared.Polymorph;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Toolshed;
|
using Robust.Shared.Toolshed;
|
||||||
using Robust.Shared.Toolshed.TypeParsers;
|
|
||||||
|
|
||||||
namespace Content.Server.Polymorph.Toolshed;
|
namespace Content.Server.Polymorph.Toolshed;
|
||||||
|
|
||||||
@@ -15,22 +15,26 @@ namespace Content.Server.Polymorph.Toolshed;
|
|||||||
public sealed class PolymorphCommand : ToolshedCommand
|
public sealed class PolymorphCommand : ToolshedCommand
|
||||||
{
|
{
|
||||||
private PolymorphSystem? _system;
|
private PolymorphSystem? _system;
|
||||||
|
[Dependency] private IPrototypeManager _proto = default!;
|
||||||
|
|
||||||
[CommandImplementation]
|
[CommandImplementation]
|
||||||
public EntityUid? Polymorph(
|
public EntityUid? Polymorph(
|
||||||
[PipedArgument] EntityUid input,
|
[PipedArgument] EntityUid input,
|
||||||
[CommandArgument] Prototype<PolymorphPrototype> prototype
|
[CommandArgument] ProtoId<PolymorphPrototype> protoId
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
_system ??= GetSys<PolymorphSystem>();
|
_system ??= GetSys<PolymorphSystem>();
|
||||||
|
|
||||||
return _system.PolymorphEntity(input, prototype.Value.Configuration);
|
if (!_proto.TryIndex(protoId, out var prototype))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return _system.PolymorphEntity(input, prototype.Configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
[CommandImplementation]
|
[CommandImplementation]
|
||||||
public IEnumerable<EntityUid> Polymorph(
|
public IEnumerable<EntityUid> Polymorph(
|
||||||
[PipedArgument] IEnumerable<EntityUid> input,
|
[PipedArgument] IEnumerable<EntityUid> input,
|
||||||
[CommandArgument] Prototype<PolymorphPrototype> prototype
|
[CommandArgument] ProtoId<PolymorphPrototype> protoId
|
||||||
)
|
)
|
||||||
=> input.Select(x => Polymorph(x, prototype)).Where(x => x is not null).Select(x => (EntityUid)x!);
|
=> input.Select(x => Polymorph(x, protoId)).Where(x => x is not null).Select(x => (EntityUid)x!);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +1,20 @@
|
|||||||
using Content.Shared.Actions;
|
using Content.Shared.Actions;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Shared.Polymorph;
|
namespace Content.Shared.Polymorph;
|
||||||
|
|
||||||
public sealed partial class PolymorphActionEvent : InstantActionEvent
|
public sealed partial class PolymorphActionEvent : InstantActionEvent
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The polymorph prototype containing all the information about
|
/// The polymorph proto id, containing all the information about
|
||||||
/// the specific polymorph.
|
/// the specific polymorph.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public PolymorphPrototype Prototype = default!;
|
[DataField]
|
||||||
|
public ProtoId<PolymorphPrototype>? ProtoId;
|
||||||
|
|
||||||
public PolymorphActionEvent(PolymorphPrototype prototype) : this()
|
public PolymorphActionEvent(ProtoId<PolymorphPrototype> protoId) : this()
|
||||||
{
|
{
|
||||||
Prototype = prototype;
|
ProtoId = protoId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user