## Summary Phase 3.1 of the message-interpolation optimization series. Fixes 9 of the 28 sites flagged in the Phase 2 audit (PR #2435): | File | Fix | |---|---| | `Commands/StaffAccess.cs:88,99` | Drop redundant `.ToString()` on enum holes | | `Commands/Handlers.cs:102` | `builder.ToString()` -> `builder.AsSpan()` | | `World Saves/SaveCommands.cs:71-75` | Merge 3 concatenated `$"..."` into one literal | | `Server/Items/Item.cs:4213` | Hoist nested ternary `$"..."` to if/else | | `Engines/Factions/Mobiles/Guards/BaseFactionGuard.cs:140-150` | Convert switch expression to switch statement | | `Mobiles/Monsters/LBR/Jukas/JukaLord.cs:85` | Restructure `string.Format(toSay.RandomElement(), ...)` into switch | | `Misc/AttackMessage.cs:30-41` | Inline `AggressorFormat`/`AggressedFormat` constants | No functional changes. Each site emits identical text; the only difference is that the message string is now built into a pooled char buffer instead of being allocated as a `string` first.
101 lines
3.4 KiB
C#
101 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.CompilerServices;
|
|
using Server.Accounting;
|
|
using Server.Mobiles;
|
|
|
|
namespace Server.Commands;
|
|
|
|
public static class StaffAccess
|
|
{
|
|
private static readonly Dictionary<string, AccessLevel> _accessLevelByString = new();
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
private static string AccountTag(Serial serial) => $"OriginalStaffAccess:{serial}";
|
|
|
|
public static void Configure()
|
|
{
|
|
CommandSystem.Register("StaffAccess", AccessLevel.Player, StaffAccess_OnCommand);
|
|
|
|
foreach (var accessLevel in Enum.GetValues<AccessLevel>())
|
|
{
|
|
_accessLevelByString[accessLevel.ToString().ToLower()] = accessLevel;
|
|
}
|
|
|
|
_accessLevelByString["gm"] = AccessLevel.GameMaster;
|
|
_accessLevelByString["dev"] = AccessLevel.Developer;
|
|
_accessLevelByString["admin"] = AccessLevel.Administrator;
|
|
}
|
|
|
|
public static void ResetStaffAccess(this PlayerMobile m)
|
|
{
|
|
if (m.Account is not Account account)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var accountTag = AccountTag(m.Serial);
|
|
var originalAccessLevelString = account.GetTag(accountTag);
|
|
if (originalAccessLevelString == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var accessLevel = _accessLevelByString[originalAccessLevelString];
|
|
account.RemoveTag(accountTag);
|
|
m.AccessLevel = accessLevel;
|
|
}
|
|
|
|
[Usage("StaffAccess <access level>")]
|
|
[Description("Changes your access level. Only access levels at or below your current access level can be set. Use the same access level to reset.")]
|
|
public static void StaffAccess_OnCommand(CommandEventArgs e)
|
|
{
|
|
var m = e.Mobile;
|
|
if (m.Account is not Account account)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var accountTag = AccountTag(m.Serial);
|
|
var originalAccessLevelString = account.GetTag(accountTag);
|
|
AccessLevel? originalAccessLevel = originalAccessLevelString != null ? _accessLevelByString[originalAccessLevelString] : null;
|
|
if (originalAccessLevel == null && m.AccessLevel == AccessLevel.Player)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var accessLevelArgument = e.GetString(0)?.Trim().ToLower();
|
|
var newAccessLevel = AccessLevel.Player;
|
|
var validAccessLevel = !string.IsNullOrEmpty(accessLevelArgument) &&
|
|
_accessLevelByString.TryGetValue(accessLevelArgument, out newAccessLevel);
|
|
|
|
if (!validAccessLevel && originalAccessLevel == null)
|
|
{
|
|
m.SendMessage("Invalid access level specified.");
|
|
m.SendMessage("Usage: [staffaccess <access level>.");
|
|
return;
|
|
}
|
|
|
|
if (originalAccessLevel != null && (!validAccessLevel || newAccessLevel == originalAccessLevel))
|
|
{
|
|
account.RemoveTag(accountTag);
|
|
newAccessLevel = originalAccessLevel.Value;
|
|
m.SendMessage("Restoring original staff access...");
|
|
}
|
|
|
|
if ((originalAccessLevel ?? m.AccessLevel) < newAccessLevel)
|
|
{
|
|
m.SendMessage($"You cannot set your staff access to {newAccessLevel}.");
|
|
return;
|
|
}
|
|
|
|
if (originalAccessLevel == null)
|
|
{
|
|
// Save the original access level
|
|
account.AddTag(accountTag, m.AccessLevel.ToString().ToLower());
|
|
}
|
|
|
|
m.AccessLevel = newAccessLevel;
|
|
m.SendMessage($"Staff access set to {newAccessLevel}.");
|
|
}
|
|
}
|