static void Player_Moved(object sender, Events.PlayerMovedEventArgs e)
{
try {
if (e.Player.PortalsEnabled)
{
lock (e.Player.PortalLock) {
if (e.Player.CanUsePortal)
{
if ((e.OldPosition.X != e.NewPosition.X) || (e.OldPosition.Y != e.NewPosition.Y) || (e.OldPosition.Z != (e.NewPosition.Z)))
{
if (e.Player.Can(Permission.UsePortal))
{
if (PortalHandler.GetInstance().GetPortal(e.Player) != null && !e.Player.StandingInPortal)
{
if (e.Player.LastUsedPortal != null && (DateTime.UtcNow - e.Player.LastUsedPortal).TotalSeconds < 4)
{
// To prevent portal loops
if (e.Player.LastWarnedPortal == null || (DateTime.UtcNow - e.Player.LastWarnedPortal).TotalSeconds > 2)
{
e.Player.LastWarnedPortal = DateTime.UtcNow;
e.Player.Message("You cannot use portals for another {0} seconds.", 4 - (DateTime.UtcNow - e.Player.LastUsedPortal).Seconds);
}
return;
}
// Make sure this method isn't called twice
e.Player.CanUsePortal = false;
e.Player.StandingInPortal = true;
Portal portal = PortalHandler.GetInstance().GetPortal(e.Player);
World world = WorldManager.FindWorldExact(portal.World);
if (world == null)
{
return;
}
// Teleport player, portal protection
switch (world.AccessSecurity.CheckDetailed(e.Player.Info))
{
case SecurityCheckResult.Allowed:
case SecurityCheckResult.WhiteListed:
if (world.IsFull)
{
e.Player.Message("Cannot join {0}&S: world is full.", world.ClassyName);
return;
}
e.Player.StopSpectating();
if (portal.World == e.Player.World.Name)
{
if (!portal.HasDesiredOutput)
{
e.Player.TeleportTo(e.Player.World.Map.Spawn);
}
else
{
e.Player.TeleportTo(new Position((short)portal.DesiredOutputX, (short)portal.DesiredOutputY, (short)portal.DesiredOutputZ, portal.DesiredOutputR, portal.DesiredOutputL));
}
e.Player.LastWarnedPortal = DateTime.UtcNow;
e.Player.StandingInPortal = false;
e.Player.CanUsePortal = true;
e.Player.LastUsedPortal = DateTime.UtcNow;
}
else
{
if (!portal.HasDesiredOutput)
{
e.Player.JoinWorld(WorldManager.FindWorldExact(portal.World), WorldChangeReason.Portal);
}
else
{
e.Player.JoinWorld(WorldManager.FindWorldExact(portal.World), WorldChangeReason.Portal, new Position(( short )portal.DesiredOutputX, ( short )portal.DesiredOutputY, ( short )portal.DesiredOutputZ, portal.DesiredOutputR, portal.DesiredOutputL));
}
}
e.Player.Message("You used portal: " + portal.Name);
break;
case SecurityCheckResult.BlackListed:
e.Player.Message("Cannot join world {0}&S: you are blacklisted.",
world.ClassyName);
break;
case SecurityCheckResult.RankTooLow:
e.Player.Message("Cannot join world {0}&S: must be {1}+",
world.ClassyName, world.AccessSecurity.MinRank.ClassyName);
break;
}
}
else
{
e.Player.StandingInPortal = false;
}
}
}
}
}
}
} catch (Exception ex) {
Logger.Log(LogType.Error, "PortalHandler.Player_Moved: " + ex);
}
}