Skip to content

Commit

Permalink
Pen signing rework (#1500)
Browse files Browse the repository at this point in the history
* Port pen signing from Sector-Umbra/Sector-Umbra#47

* Remove stampedBorderless references in maps from old signing system

* Remove the existence of PenComponent
  • Loading branch information
TsjipTsjip authored Jun 11, 2024
1 parent 4d053b7 commit f2076bb
Show file tree
Hide file tree
Showing 16 changed files with 171 additions and 203 deletions.
5 changes: 1 addition & 4 deletions Content.Client/Paper/UI/PaperWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -253,10 +253,7 @@ public void Populate(SharedPaperComponent.PaperBoundUserInterfaceState state)
StampDisplay.RemoveStamps();
foreach(var stamper in state.StampedBy)
{
if (stamper.StampedBorderless)
StampDisplay.AddStamp(new StampWidget(true) { StampInfo = stamper });
else
StampDisplay.AddStamp(new StampWidget { StampInfo = stamper });
StampDisplay.AddStamp(new StampWidget { StampInfo = stamper });
}
}

Expand Down
20 changes: 2 additions & 18 deletions Content.Client/Paper/UI/StampWidget.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@ public float Orientation

public StampDisplayInfo StampInfo {
set {
StampedByLabel.Text = Loc.GetString(value.StampedName);
StampedByLabel.Text = value.Type is StampType.Signature ? value.StampedName : Loc.GetString(value.StampedName);
StampedByLabel.FontColorOverride = value.StampedColor;
ModulateSelfOverride = value.StampedColor;
PanelOverride = value.Type is StampType.Signature ? null : _borderTexture;
}
}

Expand All @@ -45,23 +46,6 @@ public StampWidget()
_stampShader = prototypes.Index<ShaderPrototype>("PaperStamp").InstanceUnique();
}

public StampWidget(bool borderless)
{
RobustXamlLoader.Load(this);
var resCache = IoCManager.Resolve<IResourceCache>();
var borderImage = resCache.GetResource<TextureResource>(
"/Textures/Interface/Paper/paper_stamp_noborder.svg.96dpi.png");
_borderTexture = new StyleBoxTexture
{
Texture = borderImage,
};
_borderTexture.SetPatchMargin(StyleBoxTexture.Margin.All, 7.0f);
PanelOverride = _borderTexture;

var prototypes = IoCManager.Resolve<IPrototypeManager>();
_stampShader = prototypes.Index<ShaderPrototype>("PaperStamp").InstanceUnique();
}

protected override void Draw(DrawingHandleScreen handle)
{
_stampShader?.SetParameter("objCoord", GlobalPosition * UIScale * new Vector2(1, -1));
Expand Down
236 changes: 134 additions & 102 deletions Content.Server/Paper/PaperSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
using Robust.Shared.Utility;
using Robust.Shared.Audio;
using Content.Server.Access.Systems;
using Content.Server.Crayon;
using Content.Shared.Hands;
using Robust.Shared.Audio.Systems;
using static Content.Shared.Paper.SharedPaperComponent;
Expand Down Expand Up @@ -45,9 +46,8 @@ public override void Initialize()

SubscribeLocalEvent<PaperComponent, MapInitEvent>(OnMapInit);

SubscribeLocalEvent<StampComponent, GotEquippedHandEvent>(OnHandPickUp);

SubscribeLocalEvent<PenComponent, GetVerbsEvent<Verb>>(OnVerb);
// FRONTIER - Sign verb hook
SubscribeLocalEvent<PaperComponent, GetVerbsEvent<AlternativeVerb>>(AddSignVerb);
}

private void OnMapInit(EntityUid uid, PaperComponent paperComp, MapInitEvent args)
Expand All @@ -71,7 +71,6 @@ private void OnInit(EntityUid uid, PaperComponent paperComp, ComponentInit args)
if (paperComp.StampState != null)
_appearance.SetData(uid, PaperVisuals.Stamp, paperComp.StampState, appearance);
}

}

private void BeforeUIOpen(EntityUid uid, PaperComponent paperComp, BeforeActivatableUIOpenEvent args)
Expand All @@ -96,12 +95,37 @@ private void OnExamined(EntityUid uid, PaperComponent paperComp, ExaminedEvent a

if (paperComp.StampedBy.Count > 0)
{
var commaSeparated =
string.Join(", ", paperComp.StampedBy.Select(s => Loc.GetString(s.StampedName)));
args.PushMarkup(
Loc.GetString(
"paper-component-examine-detail-stamped-by", ("paper", uid), ("stamps", commaSeparated))
);
// BEGIN FRONTIER MODIFICATION - Make stamps and signatures render separately.
// Separate into stamps and signatures.
var stamps = paperComp.StampedBy.FindAll(s => s.Type == StampType.RubberStamp);
var signatures = paperComp.StampedBy.FindAll(s => s.Type == StampType.Signature);

// If we have stamps, render them.
if (stamps.Count > 0)
{
var joined = string.Join(", ", stamps.Select(s => Loc.GetString(s.StampedName)));
args.PushMarkup(
Loc.GetString(
"paper-component-examine-detail-stamped-by",
("paper", uid),
("stamps", joined)
)
);
}

// Ditto for signatures.
if (signatures.Count > 0)
{
var joined = string.Join(", ", signatures.Select(s => s.StampedName));
args.PushMarkup(
Loc.GetString(
"paper-component-examine-detail-signed-by",
("paper", uid),
("stamps", joined)
)
);
}
// END FRONTIER MODIFICATION
}
}
}
Expand All @@ -112,35 +136,36 @@ private void OnInteractUsing(EntityUid uid, PaperComponent paperComp, InteractUs
var editable = paperComp.StampedBy.Count == 0 || _tagSystem.HasTag(args.Used, "WriteIgnoreStamps");
if (_tagSystem.HasTag(args.Used, "Write") && editable)
{
if (TryComp<PenComponent>(args.Used, out var penComp) && penComp.Pen == PenMode.PenSign);
else // Frontier - Else the rest
{
var writeEvent = new PaperWriteEvent(uid, args.User);
RaiseLocalEvent(args.Used, ref writeEvent);
if (!TryComp<ActorComponent>(args.User, out var actor))
return;

paperComp.Mode = PaperAction.Write;
_uiSystem.OpenUi(uid, PaperUiKey.Key, args.User);
UpdateUserInterface(uid, paperComp);
args.Handled = true;
var writeEvent = new PaperWriteEvent(uid, args.User);
RaiseLocalEvent(args.Used, ref writeEvent);

// Frontier - Restrict writing to entities with ActorComponent, players only
if (!TryComp<ActorComponent>(args.User, out var actor))
return;
}

paperComp.Mode = PaperAction.Write;
_uiSystem.OpenUi(uid, PaperUiKey.Key, args.User);
UpdateUserInterface(uid, paperComp);
args.Handled = true;
return;
}

// If a stamp, attempt to stamp paper
if (TryComp<StampComponent>(args.Used, out var stampComp) && TryStamp(uid, GetStampInfo(stampComp), stampComp.StampState, paperComp))
if (TryComp<StampComponent>(args.Used, out var stampComp) &&
TryStamp(uid, GetStampInfo(stampComp), stampComp.StampState, paperComp))
{
if (stampComp.StampedPersonal) // Frontier
stampComp.StampedName = Loc.GetString("stamp-component-signee-name", ("user", args.User)); // Frontier
stampComp.StampedName =
Loc.GetString("stamp-component-signee-name", ("user", args.User)); // Frontier

// successfully stamped, play popup
var stampPaperOtherMessage = Loc.GetString("paper-component-action-stamp-paper-other",
("user", args.User), ("target", args.Target), ("stamp", args.Used));
("user", args.User), ("target", args.Target), ("stamp", args.Used));

_popupSystem.PopupEntity(stampPaperOtherMessage, args.User, Filter.PvsExcept(args.User, entityManager: EntityManager), true);
_popupSystem.PopupEntity(stampPaperOtherMessage, args.User,
Filter.PvsExcept(args.User, entityManager: EntityManager), true);
var stampPaperSelfMessage = Loc.GetString("paper-component-action-stamp-paper-self",
("target", args.Target), ("stamp", args.Used));
("target", args.Target), ("stamp", args.Used));
_popupSystem.PopupEntity(stampPaperSelfMessage, args.User, args.User);

_audio.PlayPvs(stampComp.Sound, uid);
Expand All @@ -154,8 +179,7 @@ private static StampDisplayInfo GetStampInfo(StampComponent stamp)
return new StampDisplayInfo
{
StampedName = stamp.StampedName,
StampedColor = stamp.StampedColor,
StampedBorderless = stamp.StampedBorderless
StampedColor = stamp.StampedColor
};
}

Expand Down Expand Up @@ -205,110 +229,118 @@ public bool TryStamp(EntityUid uid, StampDisplayInfo stampInfo, string spriteSta
_appearance.SetData(uid, PaperVisuals.Stamp, paperComp.StampState, appearance);
}
}

return true;
}

public void SetContent(EntityUid uid, string content, PaperComponent? paperComp = null)
// FRONTIER - Pen signing: Adds the sign verb for pen signing
private void AddSignVerb(EntityUid uid, PaperComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!Resolve(uid, ref paperComp))
if (!args.CanAccess || !args.CanInteract)
return;

paperComp.Content = content + '\n';
UpdateUserInterface(uid, paperComp);

if (!TryComp<AppearanceComponent>(uid, out var appearance))
// Sanity check
if (uid != args.Target)
return;

var status = string.IsNullOrWhiteSpace(content)
? PaperStatus.Blank
: PaperStatus.Written;

_appearance.SetData(uid, PaperVisuals.Status, status, appearance);
}

public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null)
{
if (!Resolve(uid, ref paperComp))
// Pens have a `Write` tag.
if (!args.Using.HasValue || !_tagSystem.HasTag(args.Using.Value, "Write"))
return;

_uiSystem.SetUiState(uid, PaperUiKey.Key, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode));
}

private void OnHandPickUp(EntityUid uid, StampComponent stampComp, GotEquippedHandEvent args)
{
if (stampComp.StampedPersonal)
AlternativeVerb verb = new()
{
if (stampComp.StampedPersonal) // Frontier
stampComp.StampedName = Loc.GetString("stamp-component-signee-name", ("user", args.User)); // Frontier
}
Act = () =>
{
TrySign(args.Target, args.User, args.Using.Value, component);
},
Text = Loc.GetString("paper-component-verb-sign")
// Icon = Don't have an icon yet. Todo for later.
};
args.Verbs.Add(verb);
}

private void OnVerb(EntityUid uid, PenComponent component, GetVerbsEvent<Verb> args)
// FRONTIER - TrySign method, attempts to place a signature
public bool TrySign(EntityUid paper, EntityUid signer, EntityUid pen, PaperComponent paperComp)
{
// standard interaction checks
if (!args.CanAccess || !args.CanInteract || args.Hands == null)
return;

args.Verbs.UnionWith(new[]
// Generate display information.
StampDisplayInfo info = new StampDisplayInfo
{
CreateVerb(uid, component, args.User, PenMode.PenWrite),
CreateVerb(uid, component, args.User, PenMode.PenSign)
});
}
StampedName = Name(signer),
StampedColor = Color.FromHex("#333333"),
Type = StampType.Signature
};

private Verb CreateVerb(EntityUid uid, PenComponent component, EntityUid userUid, PenMode mode)
{
return new Verb()
// Get Crayon component, and if present set custom color from crayon
if (TryComp<CrayonComponent>(pen, out var crayon))
{
Text = GetModeName(mode),
Disabled = component.Pen == mode,
Priority = -(int) mode, // sort them in descending order
Category = VerbCategory.Pen,
Act = () => SetPen(uid, mode, userUid, component)
};
}
info.StampedColor = crayon.Color;
crayon.Charges -= 1;
}

private string GetModeName(PenMode mode)
{
string name;
switch (mode)
// Try stamp with the info, return false if failed.
if (TryStamp(paper, info, "paper_stamp-generic", paperComp))
{
case PenMode.PenWrite:
name = "pen-mode-write";
break;
case PenMode.PenSign:
name = "pen-mode-sign";
break;
default:
return "";
// Signing successful, popup time.

_popupSystem.PopupEntity(
Loc.GetString(
"paper-component-action-signed-other",
("user", signer),
("target", paper)
),
signer,
Filter.PvsExcept(signer, entityManager: EntityManager),
true
);

_popupSystem.PopupEntity(
Loc.GetString(
"paper-component-action-signed-self",
("target", paper)
),
signer,
signer
);

_audio.PlayPvs(paperComp.Sound, paper);

_adminLogger.Add(LogType.Verb, LogImpact.Low,
$"{ToPrettyString(signer):player} has signed {ToPrettyString(paper):paper}.");

UpdateUserInterface(paper, paperComp);

return true;
}

return Loc.GetString(name);
return false;
}

public void SetPen(EntityUid uid, PenMode mode, EntityUid? userUid = null,
PenComponent? component = null)
public void SetContent(EntityUid uid, string content, PaperComponent? paperComp = null)
{
if (!Resolve(uid, ref component))
if (!Resolve(uid, ref paperComp))
return;

component.Pen = mode;
paperComp.Content = content + '\n';
UpdateUserInterface(uid, paperComp);

if (userUid != null)
{
var msg = Loc.GetString("pen-mode-state", ("mode", GetModeName(mode)));
_popupSystem.PopupEntity(msg, uid, userUid.Value);
}
if (!TryComp<AppearanceComponent>(uid, out var appearance))
return;

var status = string.IsNullOrWhiteSpace(content)
? PaperStatus.Blank
: PaperStatus.Written;

_appearance.SetData(uid, PaperVisuals.Status, status, appearance);
}

public PenStatus? GetPenState(EntityUid uid, PenComponent? pen = null, TransformComponent? transform = null)
public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null)
{
if (!Resolve(uid, ref pen, ref transform))
return null;
if (!Resolve(uid, ref paperComp))
return;

// finally, form pen status
var status = new PenStatus(GetNetEntity(uid));
return status;
_uiSystem.SetUiState(uid, PaperUiKey.Key,
new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode));
}
}

Expand Down
16 changes: 0 additions & 16 deletions Content.Server/Paper/PenComponent.cs

This file was deleted.

Loading

0 comments on commit f2076bb

Please sign in to comment.