RunUO/Scripts/Commands/GenTeleporter.cs

130 lines
4.8 KiB
C#

using System;
using System.IO;
using System.Collections;
using Server;
using Server.Items;
namespace Server.Commands
{
public class GenTeleporter
{
public static void Initialize()
{
CommandSystem.Register("TelGen", AccessLevel.Administrator, new CommandEventHandler(GenTeleporter_OnCommand));
}
[Usage("TelGen")]
[Description("Generates world/dungeon teleporters from a configuration file.")]
public static void GenTeleporter_OnCommand(CommandEventArgs e)
{
e.Mobile.SendMessage("Generating teleporters from config, please wait.");
int count = new TeleportersCreator().CreateTeleporters();
e.Mobile.SendMessage("Teleporter generating complete. {0} teleporters were generated.", count);
}
public class TeleportersCreator
{
private int m_Count;
private static Queue m_Queue = new Queue();
public static bool FindTeleporter(Map map, Point3D p)
{
IPooledEnumerable eable = map.GetItemsInRange(p, 0);
foreach (Item item in eable)
{
if (item is Teleporter && !(item is KeywordTeleporter) && !(item is SkillTeleporter))
{
int delta = item.Z - p.Z;
if (delta >= -12 && delta <= 12)
m_Queue.Enqueue(item);
}
}
eable.Free();
while (m_Queue.Count > 0)
((Item)m_Queue.Dequeue()).Delete();
return false;
}
public void CreateTeleporter(Point3D pointLocation, Point3D pointDestination, Map mapLocation, Map mapDestination, bool back)
{
if (!FindTeleporter(mapLocation, pointLocation))
{
m_Count++;
Teleporter tel = new Teleporter(pointDestination, mapDestination);
tel.MoveToWorld(pointLocation, mapLocation);
}
if (back && !FindTeleporter(mapDestination, pointDestination))
{
m_Count++;
Teleporter telBack = new Teleporter(pointLocation, mapLocation);
telBack.MoveToWorld(pointDestination, mapDestination);
}
}
public int CreateTeleporters()
{
string filePath = Path.Combine(Core.BaseDirectory, "Data", "Decoration", "teleporters.cfg");
if (!File.Exists(filePath))
{
Console.WriteLine("Warning: {0} not found. No teleporters generated.", filePath);
return 0;
}
using (StreamReader ip = new StreamReader(filePath))
{
string line;
while ((line = ip.ReadLine()) != null)
{
line = line.Trim();
// Skip empty lines or comments starting with '#'
if (line.Length == 0 || line.StartsWith("#"))
continue;
// Split by spaces or tabs
string[] split = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
// Ensure we have exactly 9 arguments: MapLoc, X, Y, Z, MapDest, X, Y, Z, TwoWay
if (split.Length >= 9)
{
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 mapDest = Map.Parse(split[4]);
int xDest = int.Parse(split[5]);
int yDest = int.Parse(split[6]);
int zDest = int.Parse(split[7]);
bool back = bool.Parse(split[8]);
if (mapLoc != null && mapDest != null)
{
CreateTeleporter(new Point3D(xLoc, yLoc, zLoc), new Point3D(xDest, yDest, zDest), mapLoc, mapDest, back);
}
}
catch (Exception ex)
{
Console.WriteLine("Error parsing teleporter config line: {0}\n{1}", line, ex.Message);
}
}
}
}
return m_Count;
}
}
}
}