ModernUO/Projects/UOContent/Commands/SignExporter.cs

100 lines
3.8 KiB
C#

using System;
using System.IO;
using System.Linq;
using Server;
using Server.Items;
using Server.Commands;
namespace Server.Commands
{
public static class SignExporter
{
// The complete list of sign graphics pulled directly from AddSign.cs
private static readonly int[] _SignIDs = {
2965, 2966, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990,
2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001, 3002, 3003, 3004,
3005, 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018,
3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, 3031, 3032,
3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, 3045, 3046,
3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3059, 3060,
3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 3072, 3073, 3074,
3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 7976, 7977
};
public static void Configure()
{
CommandSystem.Register("SignExport", AccessLevel.Developer, SignExport_OnCommand);
}
[Usage("SignExport")]
[Description("Scans the world for signs and exports them to Data/signs_export.cfg")]
public static void SignExport_OnCommand(CommandEventArgs c)
{
Export(c.Mobile);
}
public static void Export(Mobile from)
{
string filePath = Path.Combine(Core.BaseDirectory, "Data/signs_export.cfg");
int count = 0;
from.SendMessage("Scanning world for signs, please wait...");
using (StreamWriter op = new StreamWriter(filePath))
{
foreach (Item item in World.Items.Values)
{
if (item.Map == null || item.Map == Map.Internal)
continue;
int mapIndex = GetMapIndex(item.Map);
if (mapIndex == -1)
continue;
string text = "";
// Target 1: Programmed Sign objects (like those generated by SignGen)
if (item is Sign sign)
{
if (sign is LocalizedSign locSign)
text = "#" + locSign.Number;
else
text = sign.Name;
}
// Target 2: Generic Statics manually placed by builders using the GM Tool
else if (item is Static staticItem && _SignIDs.Contains(staticItem.ItemID))
{
text = staticItem.Name;
}
else
{
continue;
}
// Skip signs without custom names. A blank name will crash the importer later.
if (string.IsNullOrWhiteSpace(text) || text.Equals("Static", StringComparison.OrdinalIgnoreCase))
continue;
text = text.Replace("\n", " ").Replace("\r", "");
op.WriteLine($"{mapIndex} {item.ItemID} {item.X} {item.Y} {item.Z} {text}");
count++;
}
}
from.SendMessage($"Sign export complete. {count} signs saved to Data/signs_export.cfg");
}
private static int GetMapIndex(Map map)
{
if (map == Map.Felucca) return 1;
if (map == Map.Trammel) return 2;
if (map == Map.Ilshenar) return 3;
if (map == Map.Malas) return 4;
if (map == Map.Tokuno) return 5;
return -1;
}
}
}