+using System.Linq;
using System.Numerics;
using Content.Client.UserInterface.Controls;
using Robust.Client.AutoGenerated;
{
var input = RingerNoteInputs[i];
var index = i;
- var foo = () => // Prevents unauthorized characters from being entered into the LineEdit
+
+ input.OnTextChanged += args =>
{
- input.Text = input.Text.ToUpper();
+ if (input.Text.Length <= 0)
+ return;
- if (!IsNote(input.Text))
+ input.Text = args.Text.ToUpper();
+
+ var isValid = IsNote(input.Text);
+
+ if (!isValid)
{
input.Text = PreviousNoteInputs[index];
+ input.AddStyleClass("Caution");
}
else
+ {
PreviousNoteInputs[index] = input.Text;
+ input.RemoveStyleClass("Caution");
+ }
- input.RemoveStyleClass("Caution");
+ input.CursorPosition = input.Text.Length;
};
- input.OnFocusExit += _ => foo();
- input.OnTextEntered += _ =>
+ input.OnFocusExit += _ =>
{
- foo();
- input.CursorPosition = input.Text.Length; // Resets caret position to the end of the typed input
+ if (!IsNote(input.Text))
+ {
+ input.Text = PreviousNoteInputs[index];
+ input.RemoveStyleClass("Caution");
+ }
};
- input.OnTextChanged += args =>
+ input.OnTextEntered += _ =>
{
- // Convert to uppercase
- var upperText = args.Text.ToUpper();
-
- // Filter to only valid notes
- var newText = upperText;
- if (!IsNote(newText))
- {
- newText = PreviousNoteInputs[index];
- input.AddStyleClass("Caution");
- }
- else
+ if (!IsNote(input.Text))
{
- PreviousNoteInputs[index] = newText;
+ input.Text = PreviousNoteInputs[index];
input.RemoveStyleClass("Caution");
}
-
- // Only update if there's a change
- if (newText != input.Text)
- input.Text = newText;
+ input.CursorPosition = input.Text.Length;
};
}
}
/// </summary>
public static bool IsNote(string input)
{
+ if (input.Any(char.IsDigit))
+ return false;
+
input = input.Replace("#", "sharp");
return Enum.TryParse(input, true, out Note _);
/// </summary>
private void OnGenerateUplinkCode(Entity<RingerUplinkComponent> ent, ref GenerateUplinkCodeEvent ev)
{
- // Generate a new uplink code
var code = GenerateRingtone();
// Set the code on the component
if (!HasComp<StoreComponent>(uid))
return false;
+ // Wasn't generated yet
+ if (uplink.Code is null)
+ return false;
+
// On the server, we always check if the code matches
if (!uplink.Code.SequenceEqual(ringtone))
return false;
/// <inheritdoc/>
public override void Update(float frameTime)
{
- var ringerQuery = EntityQueryEnumerator<RingerComponent>();
- while (ringerQuery.MoveNext(out var uid, out var ringer))
+ var ringerQuery = EntityQueryEnumerator<RingerComponent, TransformComponent>();
+ while (ringerQuery.MoveNext(out var uid, out var ringer, out var xform))
{
if (!ringer.Active || !ringer.NextNoteTime.HasValue)
continue;
// and play it separately with PlayLocal, so that it's actually predicted
if (_net.IsServer)
{
- var ringerXform = Transform(uid);
_audio.PlayEntity(
GetSound(ringer.Ringtone[ringer.NoteCount]),
- Filter.Empty().AddInRange(_xform.GetMapCoordinates(uid, ringerXform), ringer.Range),
+ Filter.Empty().AddInRange(_xform.GetMapCoordinates(uid, xform), ringer.Range),
uid,
true,
AudioParams.Default.WithMaxDistance(ringer.Range).WithVolume(ringer.Volume)
return true;
}
- /// <summary>
- /// Helper method to determine if the mind is an antagonist.
- /// </summary>
- protected bool IsAntagonist(EntityUid? user)
- {
- return user != null && _mind.TryGetMind(user.Value, out var mindId, out _) && _role.MindIsAntagonist(mindId);
- }
-
/// <summary>
/// Gets the sound path for a specific note.
/// </summary>