Files
abysmal-isle/Scripts/Items/Internal/DespiseTeleporter.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

347 lines
9.0 KiB
C#

using Server;
using System;
using Server.Mobiles;
using Server.Engines.Despise;
using System.Collections.Generic;
using System.Linq;
namespace Server.Items
{
public class DespiseTeleporter : Teleporter
{
[Constructable]
public DespiseTeleporter()
{
}
public override bool CanTeleport(Mobile m)
{
if (m is DespiseCreature)
return false;
return base.CanTeleport(m);
}
public override void DoTeleport(Mobile m)
{
Map map = MapDest;
if (map == null || map == Map.Internal)
map = m.Map;
Point3D p = PointDest;
if (p == Point3D.Zero)
p = m.Location;
TeleportPets(m, p, map);
bool sendEffect = (!m.Hidden || m.AccessLevel == AccessLevel.Player);
if (SourceEffect && sendEffect)
Effects.SendLocationEffect(m.Location, m.Map, 0x3728, 10, 10);
m.MoveToWorld(p, map);
if (DestEffect && sendEffect)
Effects.SendLocationEffect(m.Location, m.Map, 0x3728, 10, 10);
if (SoundID > 0 && sendEffect)
Effects.PlaySound(m.Location, m.Map, SoundID);
}
public static void TeleportPets(Mobile master, Point3D loc, Map map)
{
var move = new List<Mobile>();
IPooledEnumerable eable = master.GetMobilesInRange(3);
foreach (Mobile m in eable)
{
if (m is BaseCreature && !(m is DespiseCreature))
{
BaseCreature pet = (BaseCreature)m;
if (pet.Controlled && pet.ControlMaster == master)
{
if (pet.ControlOrder == OrderType.Guard || pet.ControlOrder == OrderType.Follow ||
pet.ControlOrder == OrderType.Come)
{
move.Add(pet);
}
}
}
}
eable.Free();
foreach (Mobile m in move)
{
m.MoveToWorld(loc, map);
}
move.Clear();
move.TrimExcess();
}
public DespiseTeleporter(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
public class GateTeleporter : Item
{
private Point3D _Destination;
private Map _DestinationMap;
[CommandProperty(AccessLevel.GameMaster)]
public Point3D Destination
{
get { return _Destination; }
set
{
if (_Destination != value)
{
_Destination = value;
AssignDestination(value);
}
}
}
[CommandProperty(AccessLevel.GameMaster)]
public Map DestinationMap
{
get { return _DestinationMap; }
set
{
if (DestinationMap != value)
{
_DestinationMap = value;
AssignMap(value);
}
}
}
public List<InternalTeleporter> Teleporters { get; set; }
[Constructable]
public GateTeleporter()
: this(19343, 0, Point3D.Zero, null)
{
}
public GateTeleporter(int id, int hue, Point3D destination, Map destinationMap)
: base(id)
{
Hue = hue;
Movable = false;
_Destination = destination;
_DestinationMap = destinationMap;
AssignTeleporters();
}
private void AssignTeleporters()
{
if (Teleporters != null)
{
foreach (var tele in Teleporters.Where(t => t != null && !t.Deleted))
{
tele.Delete();
}
ColUtility.Free(Teleporters);
}
Teleporters = new List<InternalTeleporter>();
for (int i = 0; i <= 7; i++)
{
Direction offset = (Direction)i;
var tele = new InternalTeleporter(this, _Destination, _DestinationMap);
int x = this.X;
int y = this.Y;
int z = this.Z;
Movement.Movement.Offset(offset, ref x, ref y);
tele.MoveToWorld(new Point3D(x, y, z), this.Map);
Teleporters.Add(tele);
}
}
public void AssignDestination(Point3D p)
{
if (Teleporters == null)
{
AssignTeleporters();
}
else
{
Teleporters.ForEach(t => t.PointDest = p);
}
}
public void AssignMap(Map map)
{
if (Teleporters == null)
{
AssignTeleporters();
}
else
{
Teleporters.ForEach(t => t.MapDest = map);
}
}
public override void OnMapChange()
{
if (Teleporters != null)
{
Teleporters.ForEach(t => t.Map = Map);
}
}
public override void OnLocationChange(Point3D old)
{
if (Teleporters != null)
{
Teleporters.ForEach(t =>
{
t.Location = new Point3D(X + (t.X - old.X), Y + (t.Y - old.Y), Z + (t.Z - old.Z));
});
}
}
public override void Delete()
{
base.Delete();
if (Teleporters != null)
{
Teleporters.ForEach(t => t.Delete());
ColUtility.Free(Teleporters);
}
}
public GateTeleporter(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
writer.Write(_Destination);
writer.Write(_DestinationMap);
writer.Write(Teleporters == null ? 0 : Teleporters.Count);
if (Teleporters != null)
{
Teleporters.ForEach(t => writer.Write(t));
}
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
_Destination = reader.ReadPoint3D();
_DestinationMap = reader.ReadMap();
int count = reader.ReadInt();
for (int i = 0; i < count; i++)
{
if (Teleporters == null)
Teleporters = new List<InternalTeleporter>();
var tele = reader.ReadItem() as InternalTeleporter;
if (tele != null)
{
Teleporters.Add(tele);
tele.Master = this;
}
}
}
public class InternalTeleporter : Teleporter
{
[CommandProperty(AccessLevel.GameMaster)]
public GateTeleporter Master { get; set; }
public InternalTeleporter(GateTeleporter master, Point3D dest, Map destMap)
: base(dest, destMap, true)
{
Master = master;
}
public override bool OnMoveOver(Mobile m)
{
return true;
}
public override bool HandlesOnMovement { get { return Master != null && Utility.InRange(Master.Location, Location, 1) && this.Map == Master.Map; } }
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (Master == null || Master.Destination == Point3D.Zero || Master.Map == null || Master.Map == Map.Internal)
return;
if (m.Location == Location)
{
var eable = Map.GetItemsInRange(oldLocation, 0);
foreach (Item item in eable)
{
if (item is InternalTeleporter || item == Master)
{
eable.Free();
return;
}
}
base.OnMoveOver(m);
}
}
public InternalTeleporter(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((int)0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int v = reader.ReadInt();
}
}
}
}