Mojira Archive
MC-91245

One character namespaces are treated as "minecraft:"

Apparently Minecraft treats one character long namespaces as "minecraft:"

How to reproduce

  1. /give @p a:stone
    Works
  2. /give @p aa:stone
    Does not work
  1. /effect @p a:instant_health
    Works
  2. /effect @p aa:instant_health
    Does not work
  1. /advancement grant/revoke only a:root
    Works, affects minecraft:root
  2. /advancement grant/revoke only aa:root
    Doesn't work, unless you created a custom advancement with aa namespace
  1. Create a:test function
  2. /function @p a:test
    Doesn't work
  3. Create minecraft:test function and repeat step 2
    Works
  • (same can be done with advancements)

Code analysis

The following is based on a decompiled version of Minecraft 1.9 using MCP 9.24 beta.

The reason why this happens is because the method net.minecraft.util.ResourceLocation.splitObjectName(String) only uses the provided namespace if the index of the colon (":") is higher than 1. Instead it should probably test if it is higher then 0 because only if it is 0 the String starts with the colon.

protected static String[] splitObjectName(String toSplit)
{
    String[] astring = new String[] {"minecraft", toSplit};
    int i = toSplit.indexOf(58);

    if (i >= 0)
    {
        astring[1] = toSplit.substring(i + 1, toSplit.length());

        // Replaced this
        //if (i > 1)
        if (i > 0)
        {
            astring[0] = toSplit.substring(0, i);
        }
    }

    return astring;
}