using System; using System.Collections.Generic; using System.Text; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; namespace NominaOcculta { internal static class Util { internal static bool ContainsPlayerName(this SeString text, string name) { foreach (var payload in text.Payloads) { switch (payload) { case PlayerPayload pp: if (pp.PlayerName.Contains(name)) { return true; } break; case ITextProvider prov: if (prov.Text.Contains(name)) { return true; } break; } } return false; } internal static void ReplacePlayerName(this SeString text, string name, string replacement) { if (string.IsNullOrEmpty(name)) { return; } foreach (var payload in text.Payloads) { switch (payload) { case PlayerPayload pp: if (pp.PlayerName.Contains(name)) { pp.PlayerName = pp.PlayerName.Replace(name, replacement); } break; case TextPayload txt: txt.Text = txt.Text.Replace(name, replacement); break; } } } internal static byte[] Terminate(this byte[] bs) { var terminated = new byte[bs.Length + 1]; Array.Copy(bs, terminated, bs.Length); terminated[^1] = 0; return terminated; } internal static SeString ReadRawSeString(IntPtr ptr) { var bytes = ReadRawBytes(ptr); return SeString.Parse(bytes); } internal static string ReadRawString(IntPtr ptr) { var bytes = ReadRawBytes(ptr); return Encoding.UTF8.GetString(bytes); } internal static unsafe byte[] ReadRawBytes(IntPtr ptr) { if (ptr == IntPtr.Zero) { return Array.Empty(); } var bytes = new List(); var bytePtr = (byte*) ptr; while (*bytePtr != 0) { bytes.Add(*bytePtr); bytePtr += 1; } return bytes.ToArray(); } } }