diff --git a/Content.Client/Fax/AdminUI/AdminFaxEui.cs b/Content.Client/Fax/AdminUI/AdminFaxEui.cs
index ace3f3eb7b..452c54eb79 100644
--- a/Content.Client/Fax/AdminUI/AdminFaxEui.cs
+++ b/Content.Client/Fax/AdminUI/AdminFaxEui.cs
@@ -16,7 +16,7 @@ public sealed class AdminFaxEui : BaseEui
_window.OnClose += () => SendMessage(new AdminFaxEuiMsg.Close());
_window.OnFollowFax += entity => SendMessage(new AdminFaxEuiMsg.Follow(entity));
_window.OnMessageSend += args => SendMessage(new AdminFaxEuiMsg.Send(args.entity, args.title,
- args.stampedBy, args.message, args.stampSprite, args.stampColor));
+ args.stampedBy, args.message, args.stampSprite, args.stampColor, args.locked));
}
public override void Opened()
diff --git a/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml b/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml
index d469a0e9d3..dc4092a3b5 100644
--- a/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml
+++ b/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml
@@ -23,7 +23,7 @@
-
-
+
+
diff --git a/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml.cs b/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml.cs
index c1fba48309..698b3114b7 100644
--- a/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml.cs
+++ b/Content.Client/Fax/AdminUI/AdminFaxWindow.xaml.cs
@@ -14,7 +14,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
{
private const string StampsRsiPath = "/Textures/Objects/Misc/bureaucracy.rsi";
- public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor)>? OnMessageSend;
+ public Action<(NetEntity entity, string title, string stampedBy, string message, string stampSprite, Color stampColor, bool locked)>? OnMessageSend;
public Action? OnFollowFax;
[Dependency] private readonly IResourceCache _resCache = default!;
@@ -98,6 +98,7 @@ public sealed partial class AdminFaxWindow : DefaultWindow
var from = FromEdit.Text;
var stampColor = StampColorSelector.Color;
- OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor));
+ var locked = LockPageCheckbox.Pressed;
+ OnMessageSend?.Invoke((faxEntity.Value, title, from, message, stamp, stampColor, locked));
}
}
diff --git a/Content.Server/Fax/AdminUI/AdminFaxEui.cs b/Content.Server/Fax/AdminUI/AdminFaxEui.cs
index 452fc593d9..fe6b03fab7 100644
--- a/Content.Server/Fax/AdminUI/AdminFaxEui.cs
+++ b/Content.Server/Fax/AdminUI/AdminFaxEui.cs
@@ -1,3 +1,4 @@
+using Content.Server.Construction.Conditions;
using Content.Server.DeviceNetwork.Components;
using Content.Server.EUI;
using Content.Shared.Eui;
@@ -56,7 +57,8 @@ public sealed class AdminFaxEui : BaseEui
case AdminFaxEuiMsg.Send sendData:
{
var printout = new FaxPrintout(sendData.Content, sendData.Title, null, null, sendData.StampState,
- new() { new StampDisplayInfo { StampedName = sendData.From, StampedColor = sendData.StampColor } });
+ new() { new StampDisplayInfo { StampedName = sendData.From, StampedColor = sendData.StampColor } },
+ locked: sendData.Locked);
_faxSystem.Receive(_entityManager.GetEntity(sendData.Target), printout);
break;
}
diff --git a/Content.Server/Fax/FaxConstants.cs b/Content.Server/Fax/FaxConstants.cs
index 24ed7cbcf3..4b0ff7853e 100644
--- a/Content.Server/Fax/FaxConstants.cs
+++ b/Content.Server/Fax/FaxConstants.cs
@@ -29,4 +29,5 @@ public static class FaxConstants
public const string FaxPaperStampStateData = "fax_data_stamp_state";
public const string FaxPaperStampedByData = "fax_data_stamped_by";
public const string FaxSyndicateData = "fax_data_i_am_syndicate";
+ public const string FaxPaperLockedData = "fax_data_locked";
}
diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs
index 82acb3c60c..2b059b4b80 100644
--- a/Content.Server/Fax/FaxSystem.cs
+++ b/Content.Server/Fax/FaxSystem.cs
@@ -300,8 +300,9 @@ public sealed class FaxSystem : EntitySystem
args.Data.TryGetValue(FaxConstants.FaxPaperStampStateData, out string? stampState);
args.Data.TryGetValue(FaxConstants.FaxPaperStampedByData, out List? stampedBy);
args.Data.TryGetValue(FaxConstants.FaxPaperPrototypeData, out string? prototypeId);
+ args.Data.TryGetValue(FaxConstants.FaxPaperLockedData, out bool? locked);
- var printout = new FaxPrintout(content, name, label, prototypeId, stampState, stampedBy);
+ var printout = new FaxPrintout(content, name, label, prototypeId, stampState, stampedBy, locked ?? false);
Receive(uid, printout, args.SenderAddress);
break;
@@ -473,7 +474,8 @@ public sealed class FaxSystem : EntitySystem
labelComponent?.CurrentLabel,
metadata.EntityPrototype?.ID ?? DefaultPaperPrototypeId,
paper.StampState,
- paper.StampedBy);
+ paper.StampedBy,
+ paper.EditingDisabled);
component.PrintingQueue.Enqueue(printout);
component.SendTimeoutRemaining += component.SendTimeout;
@@ -522,6 +524,7 @@ public sealed class FaxSystem : EntitySystem
{ FaxConstants.FaxPaperNameData, nameMod?.BaseName ?? metadata.EntityName },
{ FaxConstants.FaxPaperLabelData, labelComponent?.CurrentLabel },
{ FaxConstants.FaxPaperContentData, paper.Content },
+ { FaxConstants.FaxPaperLockedData, paper.EditingDisabled },
};
if (metadata.EntityPrototype != null)
@@ -598,6 +601,8 @@ public sealed class FaxSystem : EntitySystem
_paperSystem.TryStamp(printed, stamp, printout.StampState);
}
}
+
+ paper.EditingDisabled = printout.Locked;
}
_metaData.SetEntityName(printed, printout.Name);
diff --git a/Content.Server/Paper/PaperComponent.cs b/Content.Server/Paper/PaperComponent.cs
index 6c379eea2b..7b04a77d57 100644
--- a/Content.Server/Paper/PaperComponent.cs
+++ b/Content.Server/Paper/PaperComponent.cs
@@ -1,5 +1,4 @@
using Content.Shared.Paper;
-using Robust.Shared.GameStates;
namespace Content.Server.Paper;
@@ -21,4 +20,7 @@ public sealed partial class PaperComponent : SharedPaperComponent
///
[DataField("stampState")]
public string? StampState { get; set; }
+
+ [DataField]
+ public bool EditingDisabled = false;
}
diff --git a/Content.Server/Paper/PaperSystem.cs b/Content.Server/Paper/PaperSystem.cs
index 4a7828c78c..3935df8370 100644
--- a/Content.Server/Paper/PaperSystem.cs
+++ b/Content.Server/Paper/PaperSystem.cs
@@ -102,6 +102,14 @@ namespace Content.Server.Paper
var editable = paperComp.StampedBy.Count == 0 || _tagSystem.HasTag(args.Used, "WriteIgnoreStamps");
if (_tagSystem.HasTag(args.Used, "Write") && editable)
{
+ if (paperComp.EditingDisabled)
+ {
+ var paperEditingDisabledMessage = Loc.GetString("paper-tamper-proof-modified-message");
+ _popupSystem.PopupEntity(paperEditingDisabledMessage, uid, args.User);
+
+ args.Handled = true;
+ return;
+ }
var writeEvent = new PaperWriteEvent(uid, args.User);
RaiseLocalEvent(args.Used, ref writeEvent);
diff --git a/Content.Shared/Fax/AdminFaxEui.cs b/Content.Shared/Fax/AdminFaxEui.cs
index 7b3e1fae8d..613a13d012 100644
--- a/Content.Shared/Fax/AdminFaxEui.cs
+++ b/Content.Shared/Fax/AdminFaxEui.cs
@@ -56,8 +56,9 @@ public static class AdminFaxEuiMsg
public string Content { get; }
public string StampState { get; }
public Color StampColor { get; }
+ public bool Locked { get; }
- public Send(NetEntity target, string title, string from, string content, string stamp, Color stampColor)
+ public Send(NetEntity target, string title, string from, string content, string stamp, Color stampColor, bool locked)
{
Target = target;
Title = title;
@@ -65,6 +66,7 @@ public static class AdminFaxEuiMsg
Content = content;
StampState = stamp;
StampColor = stampColor;
+ Locked = locked;
}
}
}
diff --git a/Content.Shared/Fax/Components/FaxMachineComponent.cs b/Content.Shared/Fax/Components/FaxMachineComponent.cs
index 6664ce023d..1c08986508 100644
--- a/Content.Shared/Fax/Components/FaxMachineComponent.cs
+++ b/Content.Shared/Fax/Components/FaxMachineComponent.cs
@@ -150,11 +150,14 @@ public sealed partial class FaxPrintout
[DataField("stampedBy")]
public List StampedBy { get; private set; } = new();
+ [DataField]
+ public bool Locked { get; private set; }
+
private FaxPrintout()
{
}
- public FaxPrintout(string content, string name, string? label = null, string? prototypeId = null, string? stampState = null, List? stampedBy = null)
+ public FaxPrintout(string content, string name, string? label = null, string? prototypeId = null, string? stampState = null, List? stampedBy = null, bool locked = false)
{
Content = content;
Name = name;
@@ -162,5 +165,6 @@ public sealed partial class FaxPrintout
PrototypeId = prototypeId ?? "";
StampState = stampState;
StampedBy = stampedBy ?? new List();
+ Locked = locked;
}
}
diff --git a/Resources/Locale/en-US/fax/fax-admin.ftl b/Resources/Locale/en-US/fax/fax-admin.ftl
index eff7e15fe8..8a8f37809e 100644
--- a/Resources/Locale/en-US/fax/fax-admin.ftl
+++ b/Resources/Locale/en-US/fax/fax-admin.ftl
@@ -12,3 +12,5 @@ admin-fax-message-placeholder = Your message here...
admin-fax-stamp = Stamp icon:
admin-fax-stamp-color = Stamp color:
admin-fax-send = Send
+admin-fax-lock-page = Lock Page
+admin-fax-lock-page-tooltip = Lock the paper such that it cannot be edited even by things such as cybersun pens.
diff --git a/Resources/Locale/en-US/paper/paper-component.ftl b/Resources/Locale/en-US/paper/paper-component.ftl
index a62616631f..c2d9d5712b 100644
--- a/Resources/Locale/en-US/paper/paper-component.ftl
+++ b/Resources/Locale/en-US/paper/paper-component.ftl
@@ -12,3 +12,5 @@ paper-component-action-stamp-paper-other = {CAPITALIZE(THE($user))} stamps {THE(
paper-component-action-stamp-paper-self = You stamp {THE($target)} with {THE($stamp)}.
paper-ui-save-button = Save ({$keybind})
+
+paper-tamper-proof-modified-message = This page was written using tamper-proof ink.