public void Freeze( [NotNull] Player player, bool announce, bool raiseEvents )
{
if ( player == null )
throw new ArgumentNullException( "player" );
// Check if player is trying to freeze self
if ( player.Info == this ) {
PlayerOpException.ThrowCannotTargetSelf( player, this, "freeze" );
}
lock ( actionLock ) {
// Check if player can freeze in general
if ( !player.Can( Permission.Freeze ) ) {
PlayerOpException.ThrowPermissionMissing( player, this, "freeze", Permission.Freeze );
}
// Check if player has sufficient rank permissions
if ( !player.Can( Permission.Freeze, Rank ) ) {
PlayerOpException.ThrowPermissionLimit( player, this, "freeze", Permission.Freeze );
}
// Check if target is already frozen
if ( IsFrozen ) {
string msg = String.Format( "Player {0} is already frozen (by {1}).", Name, FrozenBy );
string colorMsg = String.Format( "&SPlayer {0}&S is already frozen (by {1}&S).", ClassyName, FrozenByClassy );
throw new PlayerOpException( player, this, PlayerOpExceptionCode.NoActionNeeded, msg, colorMsg );
}
// Raise PlayerInfo.FreezeChanging event
if ( raiseEvents && RaiseFreezeChangingEvent( this, player, false, announce ) ) {
PlayerOpException.ThrowCancelled( player, this );
}
// Actually freeze
IsFrozen = true;
IsHidden = false;
FrozenOn = DateTime.UtcNow;
FrozenBy = player.Name;
LastModified = DateTime.UtcNow;
// Apply side effects
Player target = PlayerObject;
if ( target != null )
target.IsDeaf = false;
// Log and announce
Logger.Log( LogType.UserActivity,
"{0} froze {1}",
player.Name, Name );
if ( announce ) {
if ( target != null ) {
target.Message( "&WYou were frozen by {0}", player.ClassyName );
}
Server.Message( target, "&SPlayer {0}&S was frozen by {1}",
ClassyName, player.ClassyName );
}
// Raise PlayerInfo.FreezeChanged event
if ( raiseEvents )
RaiseFreezeChangedEvent( this, player, false, announce );
}
}