* serv3 in shared pt 1 * beginning of deepclone api * progress in implementing ideepclone & serv3 in content * adds target * its cant hurt you it cant hurt you * more changes to content.server * adds dataclasses * almost there * renamed & edited entry * finishes refactoring content to use serv3 * gasmixture runtimes, next: reagentunit * fucin hell that was an annoying one * adds flags * fixes some yaml errors * removes comment * fixes generic components for now * removes todo actually clones values my god paul fixes bug involving resolving custom data classes from other proj renames dataclass fixes spritecomp adds WithFormat.Constants support * adds deepclone to ResistanceSet * adds a bunch of deepclone implementations adds a deepclone analyzer (TODO) adds a deep clone fallback for classes & structs * fixes a bunch of runtimes * adds deepclone to entityuid * adds generator to sln * gets rid of warnings * fixes * argh * componentdata refactors * more deepclone impl * heck me i reworked all of content deepclone * renames custom dataclasstarget * misc * reworks prototypes * deepclone nuke * renamed customdataclass attribute * fixes everything * misc fixed * the killcommit * getting there * changed yamlfieldattribute namespace * adds back iselfserialize * renames everything to data(field/definition) * ouch * Fix most errors on content * Fix more errors in content * Fix some components * work on tests * fixes some customdataclasses * fuggin shit * yes * yeas * Remove data classes * Data field naming fixes * arg * Git resetti RobustToolbox * Merge fixes * General fixes * Fix startup serialization errors * Fix DamageContainerPrototype when supported classes or types are null * Implement construction graph step type serializer * Fix up construction serialization * Fix up construction serialization part 2 * Fix null list in technology database component * Fix body serialization * Fix entity storage serialization * Fix actions serialization * Fix AI serialization * Fix reaction serialization * Fix body serialization * Fix grid atmosphere serialization * Rename IServ3Manager to ISerializationManager * Convert every non generic serializer to the new format, general fixes * Serialization and body system fix * pushinheritance fix * Update all prototypes to have a parent and have consistent id/parent properties * Merge fixes * smh my head * cuddling slaps * Content commit for engine PR * stuff * more fixes * argh * yes even you are fixed * changelog fixes * fixes seeds * argh * Test fixes * Add writing for alert order prototype * Fix alert order writing * FIX * its been alot ok * Fix the rest of the visualizers * Fix server alerts component tests * Fix alert prototype tests not using the read value * Fix alert prototype tests initializing serialization multiple times * THIS IS AN AMERICAN CODEBASE GOD BLESS THE USA * Add ImplicitDataDefinitionForInheritors to IMechanismBehavior Fixes the behaviors not being found * Fix NRE in strap component Good night to the 1 buckle optimization * Fix clothing component slot flags serialization tag * Fix body component in all components test * Merge fixes * ffs * Make construction graph prototype use serialization hooks * human yaml linted * a * Do the thing for construction * stuff * a * monke see yaml linter * LINT HARDER * Remove redundant todo * yes * Add skip hook argument to readers and copiers * we gamin * test/datafield fixes * adds more verbose validation * moves linter to action * Improve construction graph step type serializer error message * Fix ammo box component NRE * gamin * some updates to the linter * yes * removes that test * misc fixes * array fix priority fix misc fixes * adds proper info the validation * adds alwaysrelevant usa * Make yaml linter take half as long to run (~50% less) * Make yaml linter 5 times faster (~80% less execution time) * based vera being based * fixes mapsaving * warning cleanup & moves surpressor * removes old msbuild targets * Revert "Make yaml linter 5 times faster (~80% less execution time)" This reverts commit 3e6091359a26252c3e98828199553de668031c63. * Add -nowarn to yaml linter run configuration * Improve yaml linter message feedback * Make dependencies an argument instead of a property on the serialization manager * yamllinting slaps * Clean up type serializers * Move yaml linter code to its own method * Fix yaml errors * Change yaml linter action name and remove -nowarn * yaml linter please shut * Git resetti robust toolbox Co-authored-by: Paul <ritter.paul1+git@googlemail.com> Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com>
175 lines
6.4 KiB
C#
175 lines
6.4 KiB
C#
#nullable enable
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Robust.Shared.Log;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Serialization;
|
|
using Robust.Shared.Serialization.Manager.Attributes;
|
|
using Robust.Shared.Utility;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Shared.Actions
|
|
{
|
|
/// <summary>
|
|
/// Base class for action prototypes.
|
|
/// </summary>
|
|
[ImplicitDataDefinitionForInheritors]
|
|
public abstract class BaseActionPrototype : IPrototype, ISerializationHooks
|
|
{
|
|
public abstract string ID { get; }
|
|
|
|
[ViewVariables]
|
|
[field: DataField("parent")]
|
|
public string? Parent { get; }
|
|
|
|
/// <summary>
|
|
/// Icon representing this action in the UI.
|
|
/// </summary>
|
|
[ViewVariables]
|
|
[field: DataField("icon")]
|
|
public SpriteSpecifier Icon { get; } = SpriteSpecifier.Invalid;
|
|
|
|
/// <summary>
|
|
/// For toggle actions only, icon to show when toggled on. If omitted,
|
|
/// the action will simply be highlighted when turned on.
|
|
/// </summary>
|
|
[ViewVariables]
|
|
[field: DataField("iconOn")]
|
|
public SpriteSpecifier IconOn { get; } = SpriteSpecifier.Invalid;
|
|
|
|
/// <summary>
|
|
/// Name to show in UI. Accepts formatting.
|
|
/// </summary>
|
|
[DataField("name")]
|
|
public FormattedMessage Name { get; private set; } = new();
|
|
|
|
/// <summary>
|
|
/// Description to show in UI. Accepts formatting.
|
|
/// </summary>
|
|
[field: DataField("description")]
|
|
public FormattedMessage Description { get; } = new();
|
|
|
|
/// <summary>
|
|
/// Requirements message to show in UI. Accepts formatting, but generally should be avoided
|
|
/// so the requirements message isn't too prominent in the tooltip.
|
|
/// </summary>
|
|
[field: DataField("requires")]
|
|
public string Requires { get; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// The type of behavior this action has. This is valid clientside and serverside.
|
|
/// </summary>
|
|
[DataField("behaviorType")]
|
|
public BehaviorType BehaviorType { get; protected set; } = BehaviorType.None;
|
|
|
|
/// <summary>
|
|
/// For targetpoint or targetentity actions, if this is true the action will remain
|
|
/// selected after it is used, so it can be continuously re-used. If this is false,
|
|
/// the action will be deselected after one use.
|
|
/// </summary>
|
|
[field: DataField("repeat")]
|
|
public bool Repeat { get; }
|
|
|
|
/// <summary>
|
|
/// For TargetEntity/TargetPoint actions, should the action be de-selected if currently selected (choosing a target)
|
|
/// when it goes on cooldown. Defaults to false.
|
|
/// </summary>
|
|
[field: DataField("deselectOnCooldown")]
|
|
public bool DeselectOnCooldown { get; }
|
|
|
|
/// <summary>
|
|
/// For TargetEntity actions, should the action be de-selected if the user doesn't click an entity when
|
|
/// selecting a target. Defaults to false.
|
|
/// </summary>
|
|
[field: DataField("deselectWhenEntityNotClicked")]
|
|
public bool DeselectWhenEntityNotClicked { get; }
|
|
|
|
[DataField("filters")] private List<string> _filters = new();
|
|
|
|
/// <summary>
|
|
/// Filters that can be used to filter this item in action menu.
|
|
/// </summary>
|
|
public IEnumerable<string> Filters => _filters;
|
|
|
|
[DataField("keywords")] private List<string> _keywords = new();
|
|
|
|
/// <summary>
|
|
/// Keywords that can be used to search this item in action menu.
|
|
/// </summary>
|
|
public IEnumerable<string> Keywords => _keywords;
|
|
|
|
/// <summary>
|
|
/// True if this is an action that requires selecting a target
|
|
/// </summary>
|
|
public bool IsTargetAction =>
|
|
BehaviorType == BehaviorType.TargetEntity || BehaviorType == BehaviorType.TargetPoint;
|
|
|
|
public virtual void AfterDeserialization()
|
|
{
|
|
Name = new FormattedMessage();
|
|
Name.AddText(ID);
|
|
|
|
if (BehaviorType == BehaviorType.None)
|
|
{
|
|
Logger.ErrorS("action", "Missing behaviorType for action with name {0}", Name);
|
|
}
|
|
|
|
if (BehaviorType != BehaviorType.Toggle && IconOn != SpriteSpecifier.Invalid)
|
|
{
|
|
Logger.ErrorS("action", "for action {0}, iconOn was specified but behavior" +
|
|
" type was {1}. iconOn is only supported for Toggle behavior type.", Name);
|
|
}
|
|
|
|
if (Repeat && BehaviorType != BehaviorType.TargetEntity && BehaviorType != BehaviorType.TargetPoint)
|
|
{
|
|
Logger.ErrorS("action", " action named {0} used repeat: true, but this is only supported for" +
|
|
" TargetEntity and TargetPoint behaviorType and its behaviorType is {1}",
|
|
Name, BehaviorType);
|
|
}
|
|
}
|
|
|
|
protected void ValidateBehaviorType(BehaviorType expected, Type actualInterface)
|
|
{
|
|
if (BehaviorType != expected)
|
|
{
|
|
Logger.ErrorS("action", "for action named {0}, behavior implements " +
|
|
"{1}, so behaviorType should be {2} but was {3}", Name, actualInterface.Name, expected, BehaviorType);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// The behavior / logic of the action. Each of these corresponds to a particular IActionBehavior
|
|
/// (for actions) or IItemActionBehavior (for item actions)
|
|
/// interface. Corresponds to action.behaviorType in YAML
|
|
/// </summary>
|
|
public enum BehaviorType
|
|
{
|
|
/// <summary>
|
|
/// Action doesn't do anything.
|
|
/// </summary>
|
|
None,
|
|
|
|
/// <summary>
|
|
/// IInstantAction/IInstantItemAction. Action which does something immediately when used and has
|
|
/// no target.
|
|
/// </summary>
|
|
Instant,
|
|
|
|
/// <summary>
|
|
/// IToggleAction/IToggleItemAction Action which can be toggled on and off
|
|
/// </summary>
|
|
Toggle,
|
|
|
|
/// <summary>
|
|
/// ITargetEntityAction/ITargetEntityItemAction. Action which is used on a targeted entity.
|
|
/// </summary>
|
|
TargetEntity,
|
|
|
|
/// <summary>
|
|
/// ITargetPointAction/ITargetPointItemAction. Action which requires the user to select a target point, which
|
|
/// does not necessarily have an entity on it.
|
|
/// </summary>
|
|
TargetPoint
|
|
}
|
|
}
|