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