Files
abysmal-isle/Scripts/Items/Addons/SHTeleporter.cs
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

509 lines
16 KiB
C#

using System;
using Server.Commands;
namespace Server.Items
{
public class SHTeleComponent : AddonComponent
{
private bool m_Active;
private SHTeleComponent m_TeleDest;
private Point3D m_TeleOffset;
[Constructable]
public SHTeleComponent()
: this(0x1775)
{
}
[Constructable]
public SHTeleComponent(int itemID)
: this(itemID, new Point3D(0, 0, 0))
{
}
[Constructable]
public SHTeleComponent(int itemID, Point3D offset)
: base(itemID)
{
this.Movable = false;
this.Hue = 1;
this.m_Active = true;
this.m_TeleOffset = offset;
}
public SHTeleComponent(Serial serial)
: base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public bool Active
{
get
{
return this.m_Active;
}
set
{
this.m_Active = value;
SHTeleporter sourceAddon = this.Addon as SHTeleporter;
if (sourceAddon != null)
sourceAddon.ChangeActive(value);
}
}
[CommandProperty(AccessLevel.GameMaster)]
public Point3D TeleOffset
{
get
{
return this.m_TeleOffset;
}
set
{
this.m_TeleOffset = value;
}
}
[CommandProperty(AccessLevel.Counselor)]
public Point3D TelePoint
{
get
{
return new Point3D(this.Location.X + this.TeleOffset.X, this.Location.Y + this.TeleOffset.Y, this.Location.Z + this.TeleOffset.Z);
}
set
{
this.m_TeleOffset = new Point3D(value.X - this.Location.X, value.Y - this.Location.Y, value.Z - this.Location.Z);
}
}
[CommandProperty(AccessLevel.GameMaster)]
public SHTeleComponent TeleDest
{
get
{
return this.m_TeleDest;
}
set
{
this.m_TeleDest = value;
SHTeleporter sourceAddon = this.Addon as SHTeleporter;
if (sourceAddon != null)
sourceAddon.ChangeDest(value);
}
}
public override string DefaultName
{
get
{
return "a hole";
}
}
public override void OnDoubleClick(Mobile m)
{
if (!this.m_Active || this.m_TeleDest == null || this.m_TeleDest.Deleted || this.m_TeleDest.Map == Map.Internal)
return;
if (Server.Engines.CityLoyalty.CityTradeSystem.HasTrade(m))
{
m.SendLocalizedMessage(1151733); // You cannot do that while carrying a Trade Order.
return;
}
if (m.InRange(this, 3))
{
Map map = this.m_TeleDest.Map;
Point3D p = this.m_TeleDest.TelePoint;
Server.Mobiles.BaseCreature.TeleportPets(m, p, map);
m.MoveToWorld(p, map);
}
else
{
m.SendLocalizedMessage(1019045); // I can't reach that.
}
}
public override void OnDoubleClickDead(Mobile m)
{
this.OnDoubleClick(m);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(this.m_Active);
writer.Write(this.m_TeleDest);
writer.Write(this.m_TeleOffset);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
this.m_Active = reader.ReadBool();
this.m_TeleDest = reader.ReadItem() as SHTeleComponent;
this.m_TeleOffset = reader.ReadPoint3D();
}
}
public class SHTeleporter : BaseAddon
{
private bool m_External;
private SHTeleComponent m_UpTele;
private SHTeleComponent m_RightTele;
private SHTeleComponent m_DownTele;
private SHTeleComponent m_LeftTele;
private bool m_Changing;
[Constructable]
public SHTeleporter()
: this(true)
{
}
[Constructable]
public SHTeleporter(bool external)
{
this.m_Changing = false;
this.m_External = external;
if (external)
{
this.AddComponent(new AddonComponent(0x549), -1, -1, 0);
this.AddComponent(new AddonComponent(0x54D), 0, -1, 0);
this.AddComponent(new AddonComponent(0x54E), 1, -1, 0);
this.AddComponent(new AddonComponent(0x548), 2, -1, 0);
this.AddComponent(new AddonComponent(0x54B), -1, 0, 0);
this.AddComponent(new AddonComponent(0x53B), 0, 0, 0);
this.AddComponent(new AddonComponent(0x53B), 1, 0, 0);
this.AddComponent(new AddonComponent(0x544), 2, 0, 0);
this.AddComponent(new AddonComponent(0x54C), -1, 1, 0);
this.AddComponent(new AddonComponent(0x53B), 0, 1, 0);
this.AddComponent(new AddonComponent(0x53B), 1, 1, 0);
this.AddComponent(new AddonComponent(0x545), 2, 1, 0);
this.AddComponent(new AddonComponent(0x547), -1, 2, 0);
this.AddComponent(new AddonComponent(0x541), 0, 2, 0);
this.AddComponent(new AddonComponent(0x543), 1, 2, 0);
this.AddComponent(new AddonComponent(0x540), 2, 2, 0);
}
Point3D upOS = external ? new Point3D(-1, 0, 0) : new Point3D(-2, -1, 0);
this.m_UpTele = new SHTeleComponent(external ? 0x1775 : 0x495, upOS);
this.AddComponent(this.m_UpTele, 0, 0, 0);
Point3D rightOS = external ? new Point3D(-2, 0, 0) : new Point3D(2, -1, 0);
this.m_RightTele = new SHTeleComponent(external ? 0x1775 : 0x495, rightOS);
this.AddComponent(this.m_RightTele, 1, 0, 0);
Point3D downOS = external ? new Point3D(-2, -1, 0) : new Point3D(2, 2, 0);
this.m_DownTele = new SHTeleComponent(external ? 0x1776 : 0x495, downOS);
this.AddComponent(this.m_DownTele, 1, 1, 0);
Point3D leftOS = external ? new Point3D(-1, -1, 0) : new Point3D(-1, 2, 0);
this.m_LeftTele = new SHTeleComponent(external ? 0x1775 : 0x495, leftOS);
this.AddComponent(this.m_LeftTele, 0, 1, 0);
}
public SHTeleporter(Serial serial)
: base(serial)
{
this.m_Changing = false;
}
[CommandProperty(AccessLevel.GameMaster)]
public bool External
{
get
{
return this.m_External;
}
}
public SHTeleComponent UpTele
{
get
{
return this.m_UpTele;
}
}
public SHTeleComponent RightTele
{
get
{
return this.m_RightTele;
}
}
public SHTeleComponent DownTele
{
get
{
return this.m_DownTele;
}
}
public SHTeleComponent LeftTele
{
get
{
return this.m_LeftTele;
}
}
public override bool ShareHue
{
get
{
return false;
}
}
public static void Initialize()
{
CommandSystem.Register("SHTelGen", AccessLevel.Administrator, new CommandEventHandler(SHTelGen_OnCommand));
}
[Usage("SHTelGen")]
[Description("Generates solen hives teleporters.")]
public static void SHTelGen_OnCommand(CommandEventArgs e)
{
World.Broadcast(0x35, true, "Solen hives teleporters are being generated, please wait.");
DateTime startTime = DateTime.UtcNow;
int count = new SHTeleporterCreator().CreateSHTeleporters();
DateTime endTime = DateTime.UtcNow;
World.Broadcast(0x35, true, "{0} solen hives teleporters have been created. The entire process took {1:F1} seconds.", count, (endTime - startTime).TotalSeconds);
}
public void ChangeActive(bool active)
{
if (this.m_Changing)
return;
this.m_Changing = true;
this.m_UpTele.Active = active;
this.m_RightTele.Active = active;
this.m_DownTele.Active = active;
this.m_LeftTele.Active = active;
this.m_Changing = false;
}
public void ChangeDest(SHTeleComponent dest)
{
if (this.m_Changing)
return;
this.m_Changing = true;
if (dest == null || !(dest.Addon is SHTeleporter))
{
this.m_UpTele.TeleDest = dest;
this.m_RightTele.TeleDest = dest;
this.m_DownTele.TeleDest = dest;
this.m_LeftTele.TeleDest = dest;
}
else
{
SHTeleporter destAddon = (SHTeleporter)dest.Addon;
this.m_UpTele.TeleDest = destAddon.UpTele;
this.m_RightTele.TeleDest = destAddon.RightTele;
this.m_DownTele.TeleDest = destAddon.DownTele;
this.m_LeftTele.TeleDest = destAddon.LeftTele;
}
this.m_Changing = false;
}
public void ChangeDest(SHTeleporter destAddon)
{
if (this.m_Changing)
return;
this.m_Changing = true;
if (destAddon != null)
{
this.m_UpTele.TeleDest = destAddon.UpTele;
this.m_RightTele.TeleDest = destAddon.RightTele;
this.m_DownTele.TeleDest = destAddon.DownTele;
this.m_LeftTele.TeleDest = destAddon.LeftTele;
}
else
{
this.m_UpTele.TeleDest = null;
this.m_RightTele.TeleDest = null;
this.m_DownTele.TeleDest = null;
this.m_LeftTele.TeleDest = null;
}
this.m_Changing = false;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0); // version
writer.Write(this.m_External);
writer.Write(this.m_UpTele);
writer.Write(this.m_RightTele);
writer.Write(this.m_DownTele);
writer.Write(this.m_LeftTele);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
this.m_External = reader.ReadBool();
this.m_UpTele = (SHTeleComponent)reader.ReadItem();
this.m_RightTele = (SHTeleComponent)reader.ReadItem();
this.m_DownTele = (SHTeleComponent)reader.ReadItem();
this.m_LeftTele = (SHTeleComponent)reader.ReadItem();
}
public class SHTeleporterCreator
{
private int m_Count;
public SHTeleporterCreator()
{
this.m_Count = 0;
}
public static SHTeleporter FindSHTeleporter(Map map, Point3D p)
{
IPooledEnumerable eable = map.GetItemsInRange(p, 0);
foreach (Item item in eable)
{
if (item is SHTeleporter && item.Z == p.Z)
{
eable.Free();
return (SHTeleporter)item;
}
}
eable.Free();
return null;
}
public static void Link(SHTeleporter tele1, SHTeleporter tele2)
{
tele1.ChangeDest(tele2);
tele2.ChangeDest(tele1);
}
public SHTeleporter AddSHT(Map map, bool ext, int x, int y, int z)
{
Point3D p = new Point3D(x, y, z);
SHTeleporter tele = FindSHTeleporter(map, p);
if (tele == null)
{
tele = new SHTeleporter(ext);
tele.MoveToWorld(p, map);
this.m_Count++;
}
return tele;
}
public void AddSHTCouple(Map map, bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2)
{
SHTeleporter tele1 = this.AddSHT(map, ext1, x1, y1, z1);
SHTeleporter tele2 = this.AddSHT(map, ext2, x2, y2, z2);
Link(tele1, tele2);
}
public void AddSHTCouple(bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2)
{
this.AddSHTCouple(Map.Trammel, ext1, x1, y1, z1, ext2, x2, y2, z2);
this.AddSHTCouple(Map.Felucca, ext1, x1, y1, z1, ext2, x2, y2, z2);
}
public int CreateSHTeleporters()
{
SHTeleporter tele1, tele2;
this.AddSHTCouple(true, 2608, 763, 0, false, 5918, 1794, 0);
this.AddSHTCouple(false, 5897, 1877, 0, false, 5871, 1867, 0);
this.AddSHTCouple(false, 5852, 1848, 0, false, 5771, 1867, 0);
tele1 = this.AddSHT(Map.Trammel, false, 5747, 1895, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Trammel, false, 5658, 1898, 0);
Link(tele1, tele2);
tele1 = this.AddSHT(Map.Felucca, false, 5747, 1895, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Felucca, false, 5658, 1898, 0);
Link(tele1, tele2);
this.AddSHTCouple(false, 5727, 1894, 0, false, 5756, 1794, 0);
this.AddSHTCouple(false, 5784, 1929, 0, false, 5700, 1929, 0);
tele1 = this.AddSHT(Map.Trammel, false, 5711, 1952, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Trammel, false, 5657, 1954, 0);
Link(tele1, tele2);
tele1 = this.AddSHT(Map.Felucca, false, 5711, 1952, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Felucca, false, 5657, 1954, 0);
Link(tele1, tele2);
tele1 = this.AddSHT(Map.Trammel, false, 5655, 2018, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Trammel, true, 1690, 2789, 0);
Link(tele1, tele2);
tele1 = this.AddSHT(Map.Felucca, false, 5655, 2018, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Felucca, true, 1690, 2789, 0);
Link(tele1, tele2);
this.AddSHTCouple(false, 5809, 1905, 0, false, 5876, 1891, 0);
tele1 = this.AddSHT(Map.Trammel, false, 5814, 2015, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Trammel, false, 5913, 1893, 0);
Link(tele1, tele2);
tele1 = this.AddSHT(Map.Felucca, false, 5814, 2015, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = this.AddSHT(Map.Felucca, false, 5913, 1893, 0);
Link(tele1, tele2);
this.AddSHTCouple(false, 5919, 2021, 0, true, 1724, 814, 0);
tele1 = this.AddSHT(Map.Trammel, false, 5654, 1791, 0);
tele2 = this.AddSHT(Map.Trammel, true, 730, 1451, 0);
Link(tele1, tele2);
this.AddSHT(Map.Trammel, false, 5734, 1859, 0).ChangeDest(tele2);
tele1 = this.AddSHT(Map.Felucca, false, 5654, 1791, 0);
tele2 = this.AddSHT(Map.Felucca, true, 730, 1451, 0);
Link(tele1, tele2);
this.AddSHT(Map.Felucca, false, 5734, 1859, 0).ChangeDest(tele2);
return this.m_Count;
}
}
}
}