RunUO/Scripts/Items/Houses/GenStaticHouses.cs

104 lines
4.1 KiB
C#

using System;
using System.IO;
using Server;
using Server.Items;
using Server.Multis;
using Server.Commands;
namespace Server.Custom.StaticHousing
{
public class GenStaticHouses
{
public static void Initialize()
{
CommandSystem.Register("GenStaticHouses", AccessLevel.Administrator, new CommandEventHandler(GenStaticHouses_OnCommand));
}
[Usage("GenStaticHouses")]
[Description("Generates Static House signs from a configuration file.")]
public static void GenStaticHouses_OnCommand(CommandEventArgs e)
{
string filePath = Path.Combine(Core.BaseDirectory, "Data", "Config", "statichouses.cfg");
if (!File.Exists(filePath))
{
e.Mobile.SendMessage(33, "Error: Data/Config/statichouses.cfg not found!");
return;
}
int count = 0;
using (StreamReader ip = new StreamReader(filePath))
{
string line;
while ((line = ip.ReadLine()) != null)
{
line = line.Trim();
if (line.Length == 0 || line.StartsWith("#")) continue;
string[] split = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (split.Length >= 13)
{
try
{
Map map = Map.Parse(split[0]);
Point3D signLoc = new Point3D(int.Parse(split[1]), int.Parse(split[2]), int.Parse(split[3]));
Point2D start = new Point2D(int.Parse(split[4]), int.Parse(split[5]));
Point2D end = new Point2D(start.X + int.Parse(split[6]), start.Y + int.Parse(split[7]));
Rectangle2D area = new Rectangle2D(start, end);
int minZ = int.Parse(split[8]);
int maxZ = int.Parse(split[9]);
int price = int.Parse(split[10]);
int locks = int.Parse(split[11]);
int secures = int.Parse(split[12]);
// --- NEW ITEM ID PARSING ---
int itemID = 0xC0B; // Defaults to the East-facing sign
if (split.Length >= 14)
{
if (split[13].StartsWith("0x", StringComparison.OrdinalIgnoreCase))
itemID = Convert.ToInt32(split[13], 16);
else
itemID = int.Parse(split[13]);
}
if (map != null && !CheckForExistingHouse(map, signLoc))
{
// Pass the parsed itemID into the new sign!
StaticHouseSign sign = new StaticHouseSign(itemID, area, minZ, maxZ, price, locks, secures);
sign.MoveToWorld(signLoc, map);
count++;
}
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing statichouses.cfg line: {line}\n{ex.Message}");
}
}
}
}
e.Mobile.SendMessage(68, $"Generation complete. {count} new Static House signs were spawned.");
}
private static bool CheckForExistingHouse(Map map, Point3D loc)
{
bool exists = false;
IPooledEnumerable eable = map.GetItemsInRange(loc, 0);
foreach (Item item in eable)
{
if (item is StaticHouseSign || item is HouseSign)
{
exists = true;
break;
}
}
eable.Free();
return exists;
}
}
}