Mojira Archive
MC-65034

Chat and commands run via chat trim excess whitespace

The bug

If you run a command from chat multiple consecutive spaces will be collapsed to a single space.

Reproductions steps

  1. Execute the following command in chat
    /tellraw @s "1              2"
    

    Only one space is shown between the two numbers

Code analysis

The following is based on decompiled version of Minecraft 1.9 using MCP 9.24 beta. All method and class names are the names used in the decompiled version.

The reason why this is happening is because the method net.minecraft.network.NetHandlerPlayServer.processChatMessage(CPacketChatMessage) removes multiple whitespaces before testing if the entered message is a command or not. The test whether or not the message contains the section character § is probably not needed for commands neither.

/**
 * Process chat messages (broadcast back to clients) and commands (executes)
 */
public void processChatMessage(CPacketChatMessage packetIn)
{
    PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.playerEntity.getServerForPlayer());

    if (this.playerEntity.getChatVisibility() == EntityPlayer.EnumChatVisibility.HIDDEN)
    {
        TextComponentTranslation textcomponenttranslation = new TextComponentTranslation("chat.cannotSend", new Object[0]);
        textcomponenttranslation.getChatStyle().setColor(TextFormatting.RED);
        this.sendPacket(new SPacketChat(textcomponenttranslation));
    }
    else
    {
        this.playerEntity.markPlayerActive();
        String s = packetIn.getMessage();
        // Removed this from here
        //s = StringUtils.normalizeSpace(s);
        //
        //for (int i = 0; i < s.length(); ++i)
        //{
        //    if (!ChatAllowedCharacters.isAllowedCharacter(s.charAt(i)))
        //    {
        //        this.kickPlayerFromServer("Illegal characters in chat");
        //        return;
        //    }
        //}

        if (s.startsWith("/"))
        {
            this.handleSlashCommand(s);
        }
        else
        {
            // Added this here
            s = StringUtils.normalizeSpace(s);

            for (int i = 0; i < s.length(); ++i)
            {
                if (!ChatAllowedCharacters.isAllowedCharacter(s.charAt(i)))
                {
                    this.kickPlayerFromServer("Illegal characters in chat");
                    return;
                }
            }
            
            ITextComponent itextcomponent = new TextComponentTranslation("chat.type.text", new Object[] {this.playerEntity.getDisplayName(), s});
            this.serverController.getPlayerList().sendChatMsgImpl(itextcomponent, false);
        }

        this.chatSpamThresholdCount += 20;

        if (this.chatSpamThresholdCount > 200 && !this.serverController.getPlayerList().canSendCommands(this.playerEntity.getGameProfile()))
        {
            this.kickPlayerFromServer("disconnect.spam");
        }
    }
}