Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Frontier Mail #1652

Merged
merged 41 commits into from Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
458a0fa
Does all the under the hood changes to mail components before I EVEN …
Jun 28, 2024
4bea3b1
Mail Handheld Rapid Parcel Delivery System (#974)
ErhardSteinhauer Feb 10, 2024
3249372
Mail Buff (#1473)
dvir001 Jun 7, 2024
bc31ced
Merge branch 'master' into The-Mail-Refactor
Aug 18, 2024
5167f03
Mail table rework (#1477)
whatston3 Jun 14, 2024
22e4fb4
Kills accidentally cherrypicked platinum cig, makes mail be sorted in…
Aug 19, 2024
8e1db27
THE MAIL TABLE!!!!! AHHHHHHHHHHHHHHHHHHHH
Aug 20, 2024
81d4308
NUKES two UNNECCESSARY RANDOMLY PASTED BRACKETS
Aug 20, 2024
af07919
a semicolon for good measure
Aug 20, 2024
1ba12cf
Fuck is this? Why is it in my mail?
Aug 22, 2024
4cd9972
Pro forgot values for two of the engineering mails
Aug 22, 2024
60da64b
First pass to fix various mail bugs + editing of papers
Aug 22, 2024
ef5c174
obliterates a random S in a C# file, also returns the mail teleporter…
Aug 22, 2024
ed10f45
Merge branch 'master' into The-Mail-Refactor
Aug 22, 2024
be4c1ba
Nukes the platinum cigar's YAML
Aug 22, 2024
15d616d
Merge branch 'The-Mail-Refactor' of https://github.com/adeinitas/Delt…
Aug 22, 2024
ebafc0a
Milon's Review
Aug 22, 2024
33568e5
Milon's Review 2, Electric Boogaloo
Aug 22, 2024
329531c
Various YAML fixes as I try to satisfy the Linter and fail
Aug 22, 2024
a446199
Fixes Mail.yml / If I get rid of the EMP china lake does it fix thing…
Aug 22, 2024
6afc378
Cleans up more C# at Milon's behest
Aug 22, 2024
b1d415a
TORTUGAAAAAAAAAAAAAAAAAAAA!!!!
Aug 22, 2024
88ec8b1
Revert "TORTUGAAAAAAAAAAAAAAAAAAAA!!!!"
Aug 22, 2024
52a3935
Migrations
Aug 22, 2024
5b46054
Does a bit more fixing
Aug 22, 2024
29129df
Update Resources/Locale/en-US/_NF/mail/mail.ftl
Aug 23, 2024
0ee3869
Update Resources/Locale/en-US/nyanotrasen/Mail/mail.ftl
Aug 23, 2024
079c749
Fixes Mail Capsule / Creates frontierMigrations
Aug 23, 2024
6db5c8d
Merge branch 'The-Mail-Refactor' of https://github.com/adeinitas/Delt…
Aug 23, 2024
faa40a1
Update Resources/Migrations/deltaMigrations.yml
Aug 23, 2024
e8f91dc
Rewords that one fucking comment I made 2 months ago about MIT / AGPL
Aug 23, 2024
2475617
Merge branch 'The-Mail-Refactor' of https://github.com/adeinitas/Delt…
Aug 23, 2024
8dbea7a
Just gives the delayed smoke prank and delayed EMP effects the instan…
Aug 23, 2024
a337b6c
Where the fuck are these random curly braces from??
Aug 23, 2024
4c50a3e
An attempt to satisfy the Yaml Linter
Aug 23, 2024
021c446
Revert "Update Resources/Locale/en-US/nyanotrasen/Mail/mail.ftl"
Aug 23, 2024
1243ec0
Revert "Update Resources/Locale/en-US/_NF/mail/mail.ftl"
Aug 23, 2024
3cce4f6
Mail FTL fixes / I think I know what the linter wants
Aug 23, 2024
4286a29
will this sprite be valid pretty please?
Aug 23, 2024
737b552
Does a first pass on noSpawn for all mails.
Aug 25, 2024
813e771
Unfucks noSpawn from the mail prototypes
Aug 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 20 additions & 15 deletions Content.Server/Nyanotrasen/Mail/Components/MailComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,17 @@ namespace Content.Server.Mail.Components
[RegisterComponent]
public sealed partial class MailComponent : SharedMailComponent
{
[ViewVariables(VVAccess.ReadWrite)]
[DataField("recipient")]
[DataField, ViewVariables(VVAccess.ReadWrite)]
public string Recipient = "None";

[ViewVariables(VVAccess.ReadWrite)]
[DataField("recipientJob")]
[DataField, ViewVariables(VVAccess.ReadWrite)]
public string RecipientJob = "None";

// Why do we not use LockComponent?
// Because this can't be locked again,
// and we have special conditions for unlocking,
// and we don't want to add a verb.
[ViewVariables(VVAccess.ReadWrite)]
[DataField("isLocked")]
[DataField, ViewVariables(VVAccess.ReadWrite)]
public bool IsLocked = true;

/// <summary>
Expand All @@ -32,7 +29,7 @@ public sealed partial class MailComponent : SharedMailComponent
/// This is useful for broken fragile packages and packages that were
/// not delivered in time.
/// </remarks>
[DataField("isProfitable")]
[DataField]
public bool IsProfitable = true;

/// <summary>
Expand All @@ -42,7 +39,7 @@ public sealed partial class MailComponent : SharedMailComponent
/// This can be set to true in the YAML files for a mail delivery to
/// always be Fragile, despite its contents.
/// </remarks>
[DataField("isFragile")]
[DataField]
public bool IsFragile = false;

/// <summary>
Expand All @@ -58,43 +55,51 @@ public sealed partial class MailComponent : SharedMailComponent
/// This can be set to true in the YAML files for a mail delivery to
/// always be Priority.
/// </remarks>
[DataField("isPriority")]
[DataField]
public bool IsPriority = false;

// Code imported from New Frontiers, licensed under MIT: large mail
/// <summary>
/// Whether this parcel is large.
/// </summary>
[DataField]
public bool IsLarge = false;
// End Frontier: large mail

/// <summary>
/// What will be packaged when the mail is spawned.
/// </summary>
[DataField("contents")]
[DataField]
public List<EntitySpawnEntry> Contents = new();

/// <summary>
/// The amount that cargo will be awarded for delivering this mail.
/// </summary>
[DataField("bounty")]
[DataField]
public int Bounty = 750;

/// <summary>
/// Penalty if the mail is destroyed.
/// </summary>
[DataField("penalty")]
[DataField]
public int Penalty = -250;

/// <summary>
/// The sound that's played when the mail's lock is broken.
/// </summary>
[DataField("penaltySound")]
[DataField]
public SoundSpecifier PenaltySound = new SoundPathSpecifier("/Audio/Machines/Nuke/angry_beep.ogg");

/// <summary>
/// The sound that's played when the mail's opened.
/// </summary>
[DataField("openSound")]
[DataField]
public SoundSpecifier OpenSound = new SoundPathSpecifier("/Audio/Effects/packetrip.ogg");

/// <summary>
/// The sound that's played when the mail's lock has been emagged.
/// </summary>
[DataField("emagSound")]
[DataField]
public SoundSpecifier EmagSound = new SoundCollectionSpecifier("sparks");

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public sealed partial class MailTeleporterComponent : Component
/// teleporter can deliver.
/// </summary>
[DataField("mailPool")]
public string MailPool = "RandomMailDeliveryPool";
public string MailPool = "RandomDeltaVMailDeliveryPool"; // Frontier / DeltaV: Mail rework

/// <summary>
/// How many mail candidates do we need per actual delivery sent when
Expand Down Expand Up @@ -104,5 +104,19 @@ public sealed partial class MailTeleporterComponent : Component
/// </summary>
[DataField("priorityMalus")]
public int PriorityMalus = -250;

// Frontier: Large mail
/// <summary>
/// What's the bonus for delivering a large package intact?
/// </summary>
[DataField("largeBonus")]
public int LargeBonus = 1500; //DeltaV; 5000 to 1500

/// <summary>
/// What's the malus for failing to deliver a large package?
/// </summary>
[DataField("largeMalus")]
public int LargeMalus = -500; //DeltaV; -250 to -500
// End Frontier: Large mail
}
}
20 changes: 16 additions & 4 deletions Content.Server/Nyanotrasen/Mail/MailCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public sealed class MailToCommand : IConsoleCommand
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;

private readonly string _blankMailPrototype = "MailAdminFun";
private readonly string _blankLargeMailPrototype = "MailLargeAdminFun"; // Frontier: large mail
private readonly string _container = "storagebase";
private readonly string _mailContainer = "contents";

Expand Down Expand Up @@ -56,6 +57,16 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args)
return;
}

// Frontier: Large Mail
bool isLarge = false;
if (args.Length > 4 && !Boolean.TryParse(args[4], out isLarge))
{
shell.WriteError(Loc.GetString("shell-invalid-bool"));
return;
}
var mailPrototype = isLarge ? _blankLargeMailPrototype : _blankMailPrototype;
// End Frontier


var _mailSystem = _entitySystemManager.GetEntitySystem<MailSystem>();
var _containerSystem = _entitySystemManager.GetEntitySystem<SharedContainerSystem>();
Expand All @@ -66,9 +77,9 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args)
return;
}

if (!_prototypeManager.HasIndex<EntityPrototype>(_blankMailPrototype))
if (!_prototypeManager.HasIndex<EntityPrototype>(mailPrototype)) // Frontier: _blankMailPrototype<mailPrototype
{
shell.WriteLine(Loc.GetString("command-mailto-no-blankmail", ("blankMail", _blankMailPrototype)));
shell.WriteLine(Loc.GetString("command-mailto-no-blankmail", ("blankMail", mailPrototype))); // Frontier: _blankMailPrototype<mailPrototype
return;
}

Expand All @@ -90,12 +101,12 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args)
return;
}

var mailUid = _entityManager.SpawnEntity(_blankMailPrototype, _entityManager.GetComponent<TransformComponent>(containerUid).Coordinates);
var mailUid = _entityManager.SpawnEntity(mailPrototype, _entityManager.GetComponent<TransformComponent>(containerUid).Coordinates); // Frontier: _blankMailPrototype<mailPrototype
var mailContents = _containerSystem.EnsureContainer<Container>(mailUid, _mailContainer);

if (!_entityManager.TryGetComponent(mailUid, out MailComponent? mailComponent))
{
shell.WriteLine(Loc.GetString("command-mailto-bogus-mail", ("blankMail", _blankMailPrototype), ("requiredMailComponent", nameof(MailComponent))));
shell.WriteLine(Loc.GetString("command-mailto-bogus-mail", ("blankMail", mailPrototype), ("requiredMailComponent", nameof(MailComponent)))); // Frontier: _blankMailPrototype<mailPrototype
return;
}

Expand All @@ -104,6 +115,7 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args)

mailComponent.IsFragile = isFragile;
mailComponent.IsPriority = isPriority;
mailComponent.IsLarge = isLarge;

_mailSystem.SetupMail(mailUid, teleporterComponent, recipient.Value);

Expand Down
18 changes: 15 additions & 3 deletions Content.Server/Nyanotrasen/Mail/MailSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,13 +257,14 @@ private void OnAfterInteractUsing(EntityUid uid, MailComponent component, AfterI

private void OnExamined(EntityUid uid, MailComponent component, ExaminedEvent args)
{
MailEntityStrings mailEntityStrings = component.IsLarge ? MailConstants.MailLarge : MailConstants.Mail; //Frontier: mail types stored per type (large mail)
if (!args.IsInDetailsRange)
{
args.PushMarkup(Loc.GetString("mail-desc-far"));
args.PushMarkup(Loc.GetString(mailEntityStrings.DescFar)); // Frontier: mail constants struct
return;
}

args.PushMarkup(Loc.GetString("mail-desc-close", ("name", component.Recipient), ("job", component.RecipientJob)));
args.PushMarkup(Loc.GetString(mailEntityStrings.DescClose, ("name", component.Recipient), ("job", component.RecipientJob))); // Frontier: mail constants struct

if (component.IsFragile)
args.PushMarkup(Loc.GetString("mail-desc-fragile"));
Expand Down Expand Up @@ -501,6 +502,15 @@ public void SetupMail(EntityUid uid, MailTeleporterComponent component, MailReci
mailComp.RecipientJob = recipient.Job;
mailComp.Recipient = recipient.Name;

// Frontier: Large mail bonus
MailEntityStrings mailEntityStrings = mailComp.IsLarge ? MailConstants.MailLarge : MailConstants.Mail;
if (mailComp.IsLarge)
{
mailComp.Bounty += component.LargeBonus;
mailComp.Penalty += component.LargeMalus;
}
// End Frontier

if (mailComp.IsFragile)
{
mailComp.Bounty += component.FragileBonus;
Expand Down Expand Up @@ -534,7 +544,7 @@ public void SetupMail(EntityUid uid, MailTeleporterComponent component, MailReci

_appearanceSystem.SetData(uid, MailVisuals.JobIcon, recipient.JobIcon);

_metaDataSystem.SetEntityName(uid, Loc.GetString("mail-item-name-addressed",
_metaDataSystem.SetEntityName(uid, Loc.GetString(mailEntityStrings.NameAddressed, // Frontier: move constant to MailEntityString
("recipient", recipient.Name)));

var accessReader = EnsureComp<AccessReaderComponent>(uid);
Expand Down Expand Up @@ -713,6 +723,8 @@ public void SpawnMail(EntityUid uid, MailTeleporterComponent? component = null)

var mail = EntityManager.SpawnEntity(chosenParcel, Transform(uid).Coordinates);
SetupMail(mail, component, candidate);

_tagSystem.AddTag(mail, "Mail"); // Frontier
}

if (_containerSystem.TryGetContainer(uid, "queued", out var queued))
Expand Down
16 changes: 16 additions & 0 deletions Content.Server/_NF/Mail/DelayedItemComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace Content.Server.Mail
{
/// <summary>
/// A placeholder for another entity, spawned when dropped or placed in someone's hands.
/// Useful for storing instant effect entities, e.g. smoke, in the mail.
/// </summary>
[RegisterComponent]
public sealed partial class DelayedItemComponent : Component
{
/// <summary>
/// The entity to replace this when opened or dropped.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
public string Item = "None";
}
}
56 changes: 56 additions & 0 deletions Content.Server/_NF/Mail/DelayedItemSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using Content.Shared.Damage;
using Content.Shared.Hands;
using Robust.Shared.Containers;

namespace Content.Server.Mail
{
/// <summary>
/// A placeholder for another entity, spawned when taken out of a container, with the placeholder deleted shortly after.
/// Useful for storing instant effect entities, e.g. smoke, in the mail.
/// </summary>
public sealed class DelayedItemSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();

SubscribeLocalEvent<DelayedItemComponent, DropAttemptEvent>(OnDropAttempt);
SubscribeLocalEvent<DelayedItemComponent, GotEquippedHandEvent>(OnHandEquipped);
SubscribeLocalEvent<DelayedItemComponent, DamageChangedEvent>(OnDamageChanged);
SubscribeLocalEvent<DelayedItemComponent, EntGotRemovedFromContainerMessage>(OnRemovedFromContainer);
}

/// <summary>
/// EntGotRemovedFromContainerMessage handler - spawn the intended entity after removed from a container.
/// </summary>
private void OnRemovedFromContainer(EntityUid uid, DelayedItemComponent component, ContainerModifiedMessage args)
{
Spawn(component.Item, Transform(uid).Coordinates);
}

/// <summary>
/// GotEquippedHandEvent handler - destroy the placeholder.
/// </summary>
private void OnHandEquipped(EntityUid uid, DelayedItemComponent component, EquippedHandEvent args)
{
EntityManager.DeleteEntity(uid);
}

/// <summary>
/// OnDropAttempt handler - destroy the placeholder.
/// </summary>
private void OnDropAttempt(EntityUid uid, DelayedItemComponent component, DropAttemptEvent args)
{
EntityManager.DeleteEntity(uid);
}

/// <summary>
/// OnDamageChanged handler - item has taken damage (e.g. inside the envelope), spawn the intended entity outside of any container and delete the placeholder.
/// </summary>
private void OnDamageChanged(EntityUid uid, DelayedItemComponent component, DamageChangedEvent args)
{
Spawn(component.Item, Transform(uid).Coordinates);
EntityManager.DeleteEntity(uid);
}
}
}
38 changes: 38 additions & 0 deletions Content.Server/_NF/Mail/MailConstants.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
namespace Content.Server.Mail
{
/// <summary>
/// A set of localized strings related to mail entities
/// </summary>
public struct MailEntityStrings
{
public string NameAddressed;
public string DescClose;
public string DescFar;
}

/// <summary>
/// Constants related to mail.
/// </summary>
public sealed class MailConstants : EntitySystem
{
/// <summary>
/// Locale strings related to small parcels.
/// <summary>
public static readonly MailEntityStrings Mail = new()
{
NameAddressed = "mail-item-name-addressed",
DescClose = "mail-desc-close",
DescFar = "mail-desc-far"
};

/// <summary>
/// Locale strings related to large packages.
/// <summary>
public static readonly MailEntityStrings MailLarge = new()
{
NameAddressed = "mail-large-item-name-addressed",
DescClose = "mail-large-desc-close",
DescFar = "mail-large-desc-far"
};
}
}
9 changes: 9 additions & 0 deletions Resources/Locale/en-US/_NF/mail/mail.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
mail-large-item-name-unaddressed = package
mail-large-item-name-addressed = package ({$recipient})
mail-large-desc-far = A large package.
mail-large-desc-close = A large package addressed to {CAPITALIZE($name)}, {$job}. Last known location: {$station}.

# Frontier: mailtestbulk
command-mailtestbulk = Sends one of each type of parcel to a given mail teleporter. Implicitly calls mailnow.
command-mailtestbulk-help = Usage: {$command} <teleporter_id>
command-mailtestbulk-success = Success! All mail teleporters will be delivering another round of mail soon.
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@ mail-desc-priority = The anti-tamper lock's [color=yellow]yellow priority tape[/
mail-desc-priority-inactive = The anti-tamper lock's [color=#886600]yellow priority tape[/color] is inactive.
mail-unlocked = Anti-tamper system unlocked.
mail-unlocked-by-emag = Anti-tamper system *BZZT*.
mail-unlocked-reward = Anti-tamper system unlocked. {$bounty} spesos have been added to logistics's account.
mail-penalty-lock = ANTI-TAMPER LOCK BROKEN. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} CREDITS.
mail-penalty-fragile = INTEGRITY COMPROMISED. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} CREDITS.
mail-penalty-expired = DELIVERY PAST DUE. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} CREDITS.
mail-unlocked-reward = Anti-tamper system unlocked. {$bounty} spesos have been added to logistics' account.
mail-penalty-lock = ANTI-TAMPER LOCK BROKEN. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} SPESOS.
mail-penalty-fragile = INTEGRITY COMPROMISED. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} SPESOS.
mail-penalty-expired = DELIVERY PAST DUE. LOGISTICS BANK ACCOUNT PENALIZED BY {$credits} SPESOS.
mail-item-name-unaddressed = mail
mail-item-name-addressed = mail ({$recipient})

command-mailto-description = Queue a parcel to be delivered to an entity. Example usage: `mailto 1234 5678 false false`. The target container's contents will be transferred to an actual mail parcel.
command-mailto-help = Usage: {$command} <recipient entityUid> <container entityUid> [is-fragile: true or false] [is-priority: true or false]
# Frontier: add is-large description
command-mailto-help = Usage: {$command} <recipient entityUid> <container entityUid> [is-fragile: true or false] [is-priority: true or false] [is-large: true or false, optional]
command-mailto-no-mailreceiver = Target recipient entity does not have a {$requiredComponent}.
command-mailto-no-blankmail = The {$blankMail} prototype doesn't exist. Something is very wrong. Contact a programmer.
command-mailto-bogus-mail = {$blankMail} did not have {$requiredMailComponent}. Something is very wrong. Contact a programmer.
Expand All @@ -28,3 +29,8 @@ command-mailto-success = Success! Mail parcel has been queued for next teleport
command-mailnow = Force all mail teleporters to deliver another round of mail as soon as possible. This will not bypass the undelivered mail limit.
command-mailnow-help = Usage: {$command}
command-mailnow-success = Success! All mail teleporters will be delivering another round of mail soon.

# Frontier: mailtestbulk
command-mailtestbulk = Sends one of each type of parcel to a given mail teleporter. Implicitly calls mailnow.
command-mailtestbulk-help = Usage: {$command} <teleporter_id>
command-mailtestbulk-success = Success! All mail teleporters will be delivering another round of mail soon.
Loading
Loading