private 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 );
}
}