Port Dogtags from CD and fix some minor issues with it. (#2301)
* Port Dogtags from CD and fix some minor issues with it. * Addressing reviews
This commit is contained in:
parent
a554a657db
commit
04b9239581
|
|
@ -0,0 +1,32 @@
|
|||
namespace Content.Server._CD.Engraving;
|
||||
|
||||
/// <summary>
|
||||
/// Allows an items' description to be modified with an engraving
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(EngraveableSystem))]
|
||||
public sealed partial class EngraveableComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Message given to user to notify them a message was sent
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public string EngravedMessage = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// The inspect text to use when there is no engraving
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId NoEngravingText = "engraving-dogtags-no-message";
|
||||
|
||||
/// <summary>
|
||||
/// The message to use when successfully engraving the item
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId EngraveSuccessMessage = "engraving-dogtags-succeed";
|
||||
|
||||
/// <summary>
|
||||
/// The inspect text to use when there is an engraving. The message will be shown seperately afterwards.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId HasEngravingText = "engraving-dogtags-has-message";
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
using Content.Server.Administration;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Server._CD.Engraving;
|
||||
|
||||
public sealed class EngraveableSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly QuickDialogSystem _dialog = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<EngraveableComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<EngraveableComponent, GetVerbsEvent<ActivationVerb>>(AddEngraveVerb);
|
||||
}
|
||||
|
||||
private void OnExamined(Entity<EngraveableComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
var msg = new FormattedMessage();
|
||||
msg.AddMarkupOrThrow(Loc.GetString(ent.Comp.EngravedMessage == string.Empty
|
||||
? ent.Comp.NoEngravingText
|
||||
: ent.Comp.HasEngravingText));
|
||||
|
||||
if (ent.Comp.EngravedMessage != string.Empty)
|
||||
msg.AddMarkupPermissive(Loc.GetString(ent.Comp.EngravedMessage));
|
||||
|
||||
args.PushMessage(msg, 1);
|
||||
}
|
||||
|
||||
private void AddEngraveVerb(Entity<EngraveableComponent> ent, ref GetVerbsEvent<ActivationVerb> args)
|
||||
{
|
||||
// First check if it's already been engraved. If it has, don't let them do it again.
|
||||
if (ent.Comp.EngravedMessage != string.Empty)
|
||||
return;
|
||||
|
||||
// We need an actor to give the verb.
|
||||
if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor))
|
||||
return;
|
||||
|
||||
// Make sure ghosts can't engrave stuff.
|
||||
if (!args.CanInteract)
|
||||
return;
|
||||
|
||||
var engraveVerb = new ActivationVerb
|
||||
{
|
||||
Text = Loc.GetString("engraving-verb-engrave"),
|
||||
Act = () =>
|
||||
{
|
||||
_dialog.OpenDialog(actor.PlayerSession,
|
||||
Loc.GetString("engraving-verb-engrave"),
|
||||
Loc.GetString("engraving-popup-ui-message"),
|
||||
(string message) =>
|
||||
{
|
||||
// If either the actor or comp have magically vanished
|
||||
if (actor.PlayerSession.AttachedEntity == null || !HasComp<EngraveableComponent>(ent))
|
||||
return;
|
||||
|
||||
ent.Comp.EngravedMessage = message;
|
||||
_popup.PopupEntity(Loc.GetString(ent.Comp.EngraveSuccessMessage),
|
||||
actor.PlayerSession.AttachedEntity.Value,
|
||||
actor.PlayerSession,
|
||||
PopupType.Medium);
|
||||
_adminLogger.Add(LogType.Action,
|
||||
LogImpact.Low,
|
||||
$"{ToPrettyString(actor.PlayerSession.AttachedEntity):player} engraved an item with message: {message}");
|
||||
});
|
||||
},
|
||||
Impact = LogImpact.Low,
|
||||
};
|
||||
engraveVerb.Impact = LogImpact.Low;
|
||||
args.Verbs.Add(engraveVerb);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
engraving-verb-engrave = Engrave
|
||||
engraving-popup-ui-message = Description
|
||||
|
||||
engraving-dogtags-no-message = The dogtags don't seem to have any kind of engraving.
|
||||
engraving-dogtags-has-message = The dogtags are engraved with a message that reads:{" "}
|
||||
engraving-dogtags-succeed = You successfully engrave the dogtags with your message.
|
||||
|
|
@ -50,6 +50,7 @@
|
|||
- SilverRing # DeltaV
|
||||
- Cane # DeltaV
|
||||
- WhiteCane #DeltaV
|
||||
- CDDogtags # _CD
|
||||
|
||||
- type: loadoutGroup
|
||||
id: Glasses
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
- type: entity
|
||||
id: CDDogtags
|
||||
parent: ClothingNeckBase
|
||||
name: dogtags
|
||||
description: A set of dogtags, hanging from a small piece of cord for wearing and carrying.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _CD/Objects/Misc/dogtags.rsi
|
||||
layers:
|
||||
- state: dogtag
|
||||
- type: Clothing
|
||||
sprite: _CD/Objects/Misc/dogtags.rsi
|
||||
- type: Appearance
|
||||
- type: Engraveable
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
- type: loadout
|
||||
id: CDDogtags
|
||||
storage:
|
||||
back:
|
||||
- CDDogtags
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 862 B |
Binary file not shown.
|
After Width: | Height: | Size: 332 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/a2d5ca6e69725341f0fa261a4a3f89c737e843b3/icons/obj/items/card.dmi",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "dogtag"
|
||||
},
|
||||
{
|
||||
"name": "equipped-NECK",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
Loading…
Reference in New Issue