130 lines
4.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|