140 lines
5.3 KiB
C#
140 lines
5.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Custom.InnRooms; // Ensure it can find our InnDoor!
|
|
|
|
namespace Server.Commands
|
|
{
|
|
public class GenInnDoors
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
CommandSystem.Register("InnGen", AccessLevel.Administrator, new CommandEventHandler(GenInnDoors_OnCommand));
|
|
}
|
|
|
|
[Usage("InnGen")]
|
|
[Description("Generates Inn Doors from a configuration file.")]
|
|
public static void GenInnDoors_OnCommand(CommandEventArgs e)
|
|
{
|
|
e.Mobile.SendMessage("Generating Inn Doors from config, please wait.");
|
|
|
|
int count = new InnDoorCreator().CreateDoors();
|
|
|
|
e.Mobile.SendMessage("Inn Door generation complete. {0} doors were generated.", count);
|
|
}
|
|
|
|
public class InnDoorCreator
|
|
{
|
|
private int m_Count;
|
|
private static Queue m_Queue = new Queue();
|
|
|
|
// Finds and deletes existing InnDoors at the target location to prevent stacking
|
|
public static bool FindExistingDoor(Map map, Point3D p)
|
|
{
|
|
IPooledEnumerable eable = map.GetItemsInRange(p, 0);
|
|
|
|
foreach (Item item in eable)
|
|
{
|
|
if (item is InnDoor)
|
|
{
|
|
int delta = item.Z - p.Z;
|
|
|
|
if (delta >= -12 && delta <= 12) // Uses your existing Z-delta logic
|
|
m_Queue.Enqueue(item);
|
|
}
|
|
}
|
|
|
|
eable.Free();
|
|
|
|
while (m_Queue.Count > 0)
|
|
((Item)m_Queue.Dequeue()).Delete();
|
|
|
|
return false;
|
|
}
|
|
|
|
public void CreateDoor(Point3D loc, Map mapLoc, Point3D roomLoc, Map roomMap, int itemID)
|
|
{
|
|
if (!FindExistingDoor(mapLoc, loc))
|
|
{
|
|
m_Count++;
|
|
|
|
// Uses our new parameterized constructor for custom facings!
|
|
InnDoor door = new InnDoor(itemID);
|
|
|
|
// Wire up the void room coordinates automatically
|
|
door.RoomLocation = roomLoc;
|
|
door.RoomMap = roomMap;
|
|
|
|
door.MoveToWorld(loc, mapLoc);
|
|
}
|
|
}
|
|
|
|
public int CreateDoors()
|
|
{
|
|
// Reads from the same Decoration directory[cite: 3]
|
|
string filePath = Path.Combine(Core.BaseDirectory, "Data", "Decoration", "inndoors.cfg");
|
|
|
|
if (!File.Exists(filePath))
|
|
{
|
|
Console.WriteLine("Warning: {0} not found. No Inn Doors generated.", filePath);
|
|
return 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);
|
|
|
|
// We need at least 8 arguments (Door Map/X/Y/Z and Room Map/X/Y/Z)
|
|
if (split.Length >= 8)
|
|
{
|
|
try
|
|
{
|
|
Map mapLoc = Map.Parse(split[0]);
|
|
int xLoc = int.Parse(split[1]);
|
|
int yLoc = int.Parse(split[2]);
|
|
int zLoc = int.Parse(split[3]);
|
|
|
|
Map mapRoom = Map.Parse(split[4]);
|
|
int xRoom = int.Parse(split[5]);
|
|
int yRoom = int.Parse(split[6]);
|
|
int zRoom = int.Parse(split[7]);
|
|
|
|
// Optional 9th argument: ItemID for custom facings! Defaults to 0x6E5 (1765) if missing.
|
|
int itemID = 1765;
|
|
if (split.Length >= 9)
|
|
{
|
|
// Handles both hex (0x6F3) and integer (1779) formats
|
|
if (split[8].StartsWith("0x", StringComparison.OrdinalIgnoreCase))
|
|
itemID = Convert.ToInt32(split[8], 16);
|
|
else
|
|
itemID = int.Parse(split[8]);
|
|
}
|
|
|
|
if (mapLoc != null && mapRoom != null)
|
|
{
|
|
CreateDoor(new Point3D(xLoc, yLoc, zLoc), mapLoc, new Point3D(xRoom, yRoom, zRoom), mapRoom, itemID);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error parsing Inn Door config line: {0}\n{1}", line, ex.Message);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return m_Count;
|
|
}
|
|
}
|
|
}
|
|
}
|