mirror of
https://github.com/modernuo/ModernUO
synced 2026-08-11 22:23:06 -04:00
197 lines
6.7 KiB
C#
197 lines
6.7 KiB
C#
using ModernUO.CodeGeneratedEvents;
|
|
using Server.Mobiles;
|
|
|
|
namespace Server.Misc
|
|
{
|
|
public static class Strandedness
|
|
{
|
|
private static readonly Point2D[] m_Felucca =
|
|
{
|
|
new(2528, 3568), new(2376, 3400), new(2528, 3896),
|
|
new(2168, 3904), new(1136, 3416), new(1432, 3648),
|
|
new(1416, 4000), new(4512, 3936), new(4440, 3120),
|
|
new(4192, 3672), new(4720, 3472), new(3744, 2768),
|
|
new(3480, 2432), new(3560, 2136), new(3792, 2112),
|
|
new(2800, 2296), new(2736, 2016), new(4576, 1456),
|
|
new(4680, 1152), new(4304, 1104), new(4496, 984),
|
|
new(4248, 696), new(4040, 616), new(3896, 248),
|
|
new(4176, 384), new(3672, 1104), new(3520, 1152),
|
|
new(3720, 1360), new(2184, 2152), new(1952, 2088),
|
|
new(2056, 1936), new(1720, 1992), new(472, 2064),
|
|
new(656, 2096), new(3008, 3592), new(2784, 3472),
|
|
new(5456, 2400), new(5976, 2424), new(5328, 3112),
|
|
new(5792, 3152), new(2120, 3616), new(2136, 3128),
|
|
new(1632, 3528), new(1328, 3160), new(1072, 3136),
|
|
new(1128, 2976), new(960, 2576), new(752, 1832),
|
|
new(184, 1488), new(592, 1440), new(368, 1216),
|
|
new(232, 752), new(696, 744), new(304, 1000),
|
|
new(840, 376), new(1192, 624), new(1200, 192),
|
|
new(1512, 240), new(1336, 456), new(1536, 648),
|
|
new(1104, 952), new(1864, 264), new(2136, 200),
|
|
new(2160, 528), new(1904, 512), new(2240, 784),
|
|
new(2536, 776), new(2488, 216), new(2336, 72),
|
|
new(2648, 288), new(2680, 576), new(2896, 88),
|
|
new(2840, 344), new(3136, 72), new(2968, 520),
|
|
new(3192, 328), new(3448, 208), new(3432, 608),
|
|
new(3184, 752), new(2800, 704), new(2768, 1016),
|
|
new(2448, 1232), new(2272, 920), new(2072, 1080),
|
|
new(2048, 1264), new(1808, 1528), new(1496, 1880),
|
|
new(1656, 2168), new(2096, 2320), new(1816, 2528),
|
|
new(1840, 2640), new(1928, 2952), new(2120, 2712)
|
|
};
|
|
|
|
private static readonly Point2D[] m_Trammel = m_Felucca;
|
|
|
|
private static readonly Point2D[] m_Ilshenar =
|
|
{
|
|
new(1252, 1180), new(1562, 1090), new(1444, 1016),
|
|
new(1324, 968), new(1418, 806), new(1722, 874),
|
|
new(1456, 684), new(1036, 866), new(612, 476),
|
|
new(1476, 372), new(762, 472), new(812, 1162),
|
|
new(1422, 1144), new(1254, 1066), new(1598, 870),
|
|
new(1358, 866), new(510, 302), new(510, 392)
|
|
};
|
|
|
|
private static readonly Point2D[] m_Tokuno =
|
|
{
|
|
// Makoto-Jima
|
|
new(837, 1351), new(941, 1241), new(959, 1185),
|
|
new(923, 1091), new(904, 983), new(845, 944),
|
|
new(829, 896), new(794, 852), new(766, 821),
|
|
new(695, 814), new(576, 835), new(518, 840),
|
|
new(519, 902), new(502, 950), new(503, 1045),
|
|
new(547, 1131), new(518, 1204), new(506, 1243),
|
|
new(526, 1271), new(562, 1295), new(616, 1335),
|
|
new(789, 1347), new(712, 1359),
|
|
|
|
// Homare-Jima
|
|
new(202, 498), new(116, 600), new(107, 699),
|
|
new(162, 799), new(158, 889), new(169, 989),
|
|
new(194, 1101), new(250, 1163), new(295, 1176),
|
|
new(280, 1194), new(286, 1102), new(250, 1000),
|
|
new(260, 906), new(360, 838), new(389, 763),
|
|
new(415, 662), new(500, 597), new(570, 572),
|
|
new(631, 577), new(692, 500), new(723, 445),
|
|
new(672, 379), new(626, 332), new(494, 291),
|
|
new(371, 336), new(324, 334), new(270, 362),
|
|
|
|
// Isamu-Jima
|
|
new(1240, 1076), new(1189, 1115), new(1046, 1039),
|
|
new(1025, 885), new(907, 809), new(840, 506),
|
|
new(799, 396), new(720, 258), new(744, 158),
|
|
new(904, 37), new(974, 91), new(1020, 187),
|
|
new(1035, 288), new(1104, 395), new(1215, 462),
|
|
new(1275, 488), new(1348, 611), new(1363, 739),
|
|
new(1364, 765), new(1364, 876), new(1300, 936),
|
|
new(1240, 1003)
|
|
};
|
|
|
|
private static bool IsStranded(Mobile from)
|
|
{
|
|
var map = from.Map;
|
|
|
|
if (map == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
var surface = map.GetTopSurface(from.Location);
|
|
|
|
if (surface is LandTile tile)
|
|
{
|
|
var id = tile.ID;
|
|
|
|
return id >= 168 && id <= 171
|
|
|| id >= 310 && id <= 311;
|
|
}
|
|
|
|
if (surface is StaticTile staticTile)
|
|
{
|
|
var id = staticTile.ID;
|
|
|
|
return id >= 0x1796 && id <= 0x17B2;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
[OnEvent(nameof(PlayerMobile.PlayerLoginEvent))]
|
|
public static void OnLogin(PlayerMobile from)
|
|
{
|
|
if (!IsStranded(from))
|
|
{
|
|
return;
|
|
}
|
|
|
|
var map = from.Map;
|
|
|
|
Point2D[] list;
|
|
|
|
if (map == Map.Felucca)
|
|
{
|
|
list = m_Felucca;
|
|
}
|
|
else if (map == Map.Trammel)
|
|
{
|
|
list = m_Trammel;
|
|
}
|
|
else if (map == Map.Ilshenar)
|
|
{
|
|
list = m_Ilshenar;
|
|
}
|
|
else if (map == Map.Tokuno)
|
|
{
|
|
list = m_Tokuno;
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
}
|
|
|
|
var p = Point2D.Zero;
|
|
var pdist = double.MaxValue;
|
|
|
|
for (var i = 0; i < list.Length; ++i)
|
|
{
|
|
var dist = from.GetDistanceToSqrt(list[i]);
|
|
|
|
if (dist < pdist)
|
|
{
|
|
p = list[i];
|
|
pdist = dist;
|
|
}
|
|
}
|
|
|
|
int x = p.X, y = p.Y;
|
|
int z;
|
|
bool canFit;
|
|
|
|
z = map.GetAverageZ(x, y);
|
|
canFit = map.CanSpawnMobile(x, y, z);
|
|
|
|
for (var i = 1; !canFit && i <= 40; i += 2)
|
|
{
|
|
for (var xo = -1; !canFit && xo <= 1; ++xo)
|
|
{
|
|
for (var yo = -1; !canFit && yo <= 1; ++yo)
|
|
{
|
|
if (xo == 0 && yo == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
x = p.X + xo * i;
|
|
y = p.Y + yo * i;
|
|
z = map.GetAverageZ(x, y);
|
|
canFit = map.CanSpawnMobile(x, y, z);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (canFit)
|
|
{
|
|
from.Location = new Point3D(x, y, z);
|
|
}
|
|
}
|
|
}
|
|
}
|