fCraft.StandardCommands.ChangeClass C# (CSharp) Method

ChangeClass() private method

private ChangeClass ( Player player, Command cmd ) : void
player Player
cmd Command
return void
        void ChangeClass( Player player, Command cmd ) {
            string name = cmd.Next();
            string newClassName = cmd.Next();
            if( name == null || newClassName == null ) {
                player.Message( "Usage: " + Color.Help + "/user PlayerName ClassName" );
                player.Message( "To see a list of classes and permissions, use " + Color.Help + "/class" );
                return;
            }

            Player target = world.FindPlayer( name );
            if( target == null ) {
                world.NoPlayerMessage( player, name );
                return;
            }

            PlayerClass newClass = world.classes.FindClass( newClassName );
            if( newClass == null ) {
                player.Message( "Unrecognized player class: " + newClassName );
                return;
            }

            if( target.info.playerClass == newClass ) {
                player.Message( target.name + "'s class is already " + newClass.color + newClass.name );
                return;
            }

            bool promote = target.info.playerClass.rank < newClass.rank;

            if( (promote && !player.Can( Permissions.Promote )) || !promote && !player.Can( Permissions.Demote ) ) {
                world.NoAccessMessage( player );
                return;
            }

            if( promote && !player.info.playerClass.CanPromote(newClass) ) {
                PlayerClass maxRank = player.info.playerClass.maxPromote;
                if( maxRank == null ) {
                    player.Message( "You can only promote players up to " + player.info.playerClass.color + player.info.playerClass.name );
                } else {
                    player.Message( "You can only promote players up to " + maxRank.color + maxRank.name );
                }
                return;
            } else if( !promote && !player.info.playerClass.CanDemote(target.info.playerClass) ) {
                PlayerClass maxRank = player.info.playerClass.maxDemote;
                if( maxRank == null ) {
                    player.Message( "You can only demote players that are " + player.info.playerClass.color + player.info.playerClass.name + Color.Sys + " or lower." );
                } else {
                    player.Message( "You can only demote players that are " + maxRank.color + maxRank.name + Color.Sys + " or lower." );
                }
                return;
            }

            if( promote && target.info.playerClass.rank < newClass.rank ||
                target.info.playerClass.rank > newClass.rank ) {
                world.log.Log( "{0} changed the class of {1} from {2} to {3}.", LogType.UserActivity, 
                            player.name, target.info.name, target.info.playerClass.name, newClass.name );
                target.info.playerClass = newClass;
                target.info.classChangeDate = DateTime.Now;
                target.info.classChangedBy = player.name;

                target.Send( PacketWriter.MakeSetPermission( target ) );

                if( promote ) {
                    player.Message( "You promoted " + target.name + " to " + newClass.color + newClass.name + "." );
                    target.Message( "You have been promoted to " + newClass.color + newClass.name + Color.Sys + " by " + player.name + "!" );
                } else {
                    player.Message( "You demoted " + target.name + " to " + newClass.color + newClass.name + "." );
                    target.Message( "You have been demoted to " + newClass.color + newClass.name + Color.Sys + " by " + player.name + "!" );
                }
                if( world.config.GetBool( "ClassPrefixesInList" ) || world.config.GetBool( "ClassColorsInChat" ) ) {// TODO: colors in player names
                    world.UpdatePlayer( target );
                }
                target.mode = BlockPlacementMode.Normal;
            } else {
                if( promote ) {
                    player.Message( target.name + " is already same or lower rank than " + newClass.name );
                } else {
                    player.Message( target.name + " is already same or higher rank than " + newClass.name );
                }
            }
        }