public void Unfreeze( [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, "unfreeze" );
}
lock ( actionLock ) {
// Check if player can freeze in general
if ( !player.Can( Permission.Freeze ) ) {
PlayerOpException.ThrowPermissionMissing( player, this, "unfreeze", Permission.Freeze );
}
// Check if target is already frozen
if ( !IsFrozen ) {
string msg = String.Format( "Player {0} is not currently frozen.", Name );
string colorMsg = String.Format( "&SPlayer {0}&S is not currently frozen.", ClassyName );
throw new PlayerOpException( player, this, PlayerOpExceptionCode.NoActionNeeded, msg, colorMsg );
}
// Check if player has sufficient rank permissions
if ( !player.Can( Permission.Freeze, Rank ) ) {
PlayerOpException.ThrowPermissionLimit( player, this, "unfreeze", Permission.Freeze );
}
// Raise PlayerInfo.FreezeChanging event
if ( raiseEvents && RaiseFreezeChangingEvent( this, player, true, announce ) ) {
PlayerOpException.ThrowCancelled( player, this );
}
// Actually unfreeze
Unfreeze();
// Log and announce unfreeze
Logger.Log( LogType.UserActivity,
"{0} unfroze {1}",
player.Name, Name );
if ( announce ) {
Player target = PlayerObject;
if ( target != null ) {
target.Message( "&WYou were unfrozen by {0}", player.ClassyName );
}
Server.Message( target, "&SPlayer {0}&S was unfrozen by {1}",
ClassyName, player.ClassyName );
}
// Raise PlayerInfo.FreezeChanged event
if ( raiseEvents )
RaiseFreezeChangedEvent( this, player, true, announce );
}
}