119 lines
No EOL
3 KiB
C#
119 lines
No EOL
3 KiB
C#
using System;
|
|
using WingsEmu.Game.Helpers;
|
|
|
|
namespace WingsEmu.Game.Maps;
|
|
|
|
public static class MapExtensions
|
|
{
|
|
public static bool CanWalkAround(this IMapInstance mapInstance, int x, int y)
|
|
{
|
|
for (int dX = -1; dX <= 1; dX++)
|
|
{
|
|
for (int dY = -1; dY <= 1; dY++)
|
|
{
|
|
if (mapInstance.IsBlockedZone(x + dX, y + dY))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
public static bool IsBlockedZone(this IMapInstance mapInstance, int x, int y)
|
|
{
|
|
try
|
|
{
|
|
if (mapInstance.Grid == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return !mapInstance.Grid.IsWalkable(x, y, mapInstance.Width, mapInstance.Height);
|
|
}
|
|
catch
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public static bool PvpZone(this IMapInstance mapInstance, int x, int y)
|
|
{
|
|
try
|
|
{
|
|
return mapInstance.Grid != null && mapInstance.Grid.IsPvpZoneOff(x, y, mapInstance.Width, mapInstance.Height);
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool MateDollZone(this IMapInstance mapInstance, int x, int y)
|
|
{
|
|
try
|
|
{
|
|
return mapInstance.Grid != null && mapInstance.Grid.IsMateDollZone(x, y, mapInstance.Width, mapInstance.Height);
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool IsMonsterAggroDisabled(this IMapInstance mapInstance, int x, int y)
|
|
{
|
|
try
|
|
{
|
|
return mapInstance.Grid != null && mapInstance.Grid.IsMonsterAggroDisabled(x, y, mapInstance.Width, mapInstance.Height);
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool GetFreePosition(this IMapInstance mapInstance, IRandomGenerator randomGenerator, ref short firstX, ref short firstY, byte xpoint, byte ypoint)
|
|
{
|
|
short minX = (short)(-xpoint + firstX);
|
|
short maxX = (short)(xpoint + firstX);
|
|
|
|
short minY = (short)(-ypoint + firstY);
|
|
short maxY = (short)(ypoint + firstY);
|
|
|
|
short x = (short)randomGenerator.RandomNumber(minX, maxX + 1);
|
|
short y = (short)randomGenerator.RandomNumber(minY, maxY + 1);
|
|
|
|
if (mapInstance.IsPathBlocked(firstX, firstY, x, y))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
firstX = x;
|
|
firstY = y;
|
|
return true;
|
|
}
|
|
|
|
private static bool IsPathBlocked(this IMapInstance mapInstance, int firstX, int firstY, int mapX, int mapY)
|
|
{
|
|
for (int i = 1; i <= Math.Abs(mapX - firstX); i++)
|
|
{
|
|
if (mapInstance.IsBlockedZone(firstX + Math.Sign(mapX - firstX) * i, firstY))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
for (int i = 1; i <= Math.Abs(mapY - firstY); i++)
|
|
{
|
|
if (mapInstance.IsBlockedZone(firstX, firstY + Math.Sign(mapY - firstY) * i))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} |