The official skip-block support was added in r1458-r1459.
Here's the diff (won't be applicable to 0.6xx).
The most notable change was rewroting CommandReader.NextBlock(), CommandReader.NextBlockWithParam(), and Map.GetBlockByName(). Previously they just took a string and a player name, and returned Block. Now they write result into an "out" variable, and return a bool. This allows me to distinguish between cases where "skip" block was given and when an unrecognized block name was given.
Code:
/// <summary> Finds Block corresponding to given blockName. </summary>
/// <param name="blockName"> Given block name to parse. </param>
/// <param name="allowNoneBlock"> Whether "none" block type is acceptible. </param>
/// <param name="block"> Block corresponding to given blockName;
/// Block.None if value could not be parsed. </param>
/// <returns> True if given blockName was parsed as an acceptible block type. </returns>
/// <exception cref="ArgumentNullException"> If blockName is null. </exception>
public static bool GetBlockByName( [NotNull] string blockName, bool allowNoneBlock, out Block block ) {...
So a typical usage before was...
Code:
Block block = cmd.NextBlock( Player );
if( block == Block.Undefined ){
// unrecognized block name
}else{
// normal blocktype given
}
...and now it became...
Code:
Block block;
if( !cmd.NextBlock( Player, true, out block ) ){
// unrecognized block name
}else if( block == Block.None ){
// "none" blocktype given
}else{
// normal blocktype given
}