static bool RaiseFreezeChangingEvent( [NotNull] PlayerInfo target, [NotNull] Player freezer, bool unfreezing, bool announce ) { var h = FreezeChanging; if( h == null ) return false; var e = new PlayerInfoFrozenChangingEventArgs( target, freezer, unfreezing, announce ); h( null, e ); return e.Cancel; }
/// <summary> Unfreezes this player. Throws PlayerOpException on problems. </summary> /// <param name="player"> Player who is doing the unfreezing. </param> /// <param name="announce"> Whether to announce freezing publicly on the server. </param> /// <param name="raiseEvents"> Whether to raise PlayerInfo.FreezeChanging and PlayerInfo.FreezeChanged events. </param> 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( syncRoot ) { // 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 ){ var e = new PlayerInfoFrozenChangingEventArgs( this, player, true, announce ); RaiseFreezeChangingEvent( e ); if( e.Cancel ) PlayerOpException.ThrowCanceled( player, this ); announce = e.Announce; } // 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 ); } }