package net.minecraft.server;

import java.util.Iterator;

public class CommandDispatcher extends CommandHandler implements ICommandDispatcher {

    private final MinecraftServer a;

    public CommandDispatcher(MinecraftServer minecraftserver) {
        this.a = minecraftserver;
        this.a((ICommand) (new CommandTime()));
        this.a((ICommand) (new CommandGamemode()));
        this.a((ICommand) (new CommandDifficulty()));
        this.a((ICommand) (new CommandGamemodeDefault()));
        this.a((ICommand) (new CommandKill()));
        this.a((ICommand) (new CommandToggleDownfall()));
        this.a((ICommand) (new CommandWeather()));
        this.a((ICommand) (new CommandXp()));
        this.a((ICommand) (new CommandTp()));
        this.a((ICommand) (new CommandTeleport()));
        this.a((ICommand) (new CommandGive()));
        this.a((ICommand) (new CommandReplaceItem()));
        this.a((ICommand) (new CommandStats()));
        this.a((ICommand) (new CommandEffect()));
        this.a((ICommand) (new CommandEnchant()));
        this.a((ICommand) (new CommandParticle()));
        this.a((ICommand) (new CommandMe()));
        this.a((ICommand) (new CommandSeed()));
        this.a((ICommand) (new CommandHelp()));
        this.a((ICommand) (new CommandDebug()));
        this.a((ICommand) (new CommandTell()));
        this.a((ICommand) (new CommandSay()));
        this.a((ICommand) (new CommandSpawnpoint()));
        this.a((ICommand) (new CommandSetWorldSpawn()));
        this.a((ICommand) (new CommandGamerule()));
        this.a((ICommand) (new CommandClear()));
        this.a((ICommand) (new CommandTestFor()));
        this.a((ICommand) (new CommandSpreadPlayers()));
        this.a((ICommand) (new CommandPlaySound()));
        this.a((ICommand) (new CommandScoreboard()));
        this.a((ICommand) (new CommandExecute()));
        this.a((ICommand) (new CommandTrigger()));
        this.a((ICommand) (new CommandAdvancement()));
        this.a((ICommand) (new CommandRecipe()));
        this.a((ICommand) (new CommandSummon()));
        this.a((ICommand) (new CommandSetBlock()));
        this.a((ICommand) (new CommandFill()));
        this.a((ICommand) (new CommandClone()));
        this.a((ICommand) (new CommandTestForBlocks()));
        this.a((ICommand) (new CommandBlockData()));
        this.a((ICommand) (new CommandTestForBlock()));
        this.a((ICommand) (new CommandTellRaw()));
        this.a((ICommand) (new CommandWorldBorder()));
        this.a((ICommand) (new CommandTitle()));
        this.a((ICommand) (new CommandEntityData()));
        this.a((ICommand) (new CommandStopSound()));
        this.a((ICommand) (new CommandLocate()));
        this.a((ICommand) (new CommandReload()));
        this.a((ICommand) (new CommandFunction()));
        if (minecraftserver.aa()) {
            this.a((ICommand) (new CommandOp()));
            this.a((ICommand) (new CommandDeop()));
            this.a((ICommand) (new CommandStop()));
            this.a((ICommand) (new CommandSaveAll()));
            this.a((ICommand) (new CommandSaveOff()));
            this.a((ICommand) (new CommandSaveOn()));
            this.a((ICommand) (new CommandBanIp()));
            this.a((ICommand) (new CommandPardonIP()));
            this.a((ICommand) (new CommandBan()));
            this.a((ICommand) (new CommandBanList()));
            this.a((ICommand) (new CommandPardon()));
            this.a((ICommand) (new CommandKick()));
            this.a((ICommand) (new CommandList()));
            this.a((ICommand) (new CommandWhitelist()));
            this.a((ICommand) (new CommandIdleTimeout()));
        } else {
            this.a((ICommand) (new CommandPublish()));
        }

        CommandAbstract.a((ICommandDispatcher) this);
    }

    public void a(ICommandListener icommandlistener, ICommand icommand, int i, String s, Object... aobject) {
        boolean flag = true;
        MinecraftServer minecraftserver = this.a;

        if (!icommandlistener.getSendCommandFeedback()) {
            flag = false;
        }

        ChatMessage chatmessage = new ChatMessage("chat.type.admin", new Object[] { icommandlistener.getName(), new ChatMessage(s, aobject)});

        chatmessage.getChatModifier().setColor(EnumChatFormat.GRAY);
        chatmessage.getChatModifier().setItalic(Boolean.valueOf(true));
        if (flag) {
            Iterator iterator = minecraftserver.getPlayerList().v().iterator();

            while (iterator.hasNext()) {
                EntityHuman entityhuman = (EntityHuman) iterator.next();

                if (entityhuman != icommandlistener && minecraftserver.getPlayerList().isOp(entityhuman.getProfile()) && icommand.canUse(this.a, icommandlistener)) {
                    boolean flag1 = icommandlistener instanceof MinecraftServer && this.a.s();
                    boolean flag2 = icommandlistener instanceof RemoteControlCommandListener && this.a.r();

                    if (flag1 || flag2 || !(icommandlistener instanceof RemoteControlCommandListener) && !(icommandlistener instanceof MinecraftServer)) {
                        entityhuman.sendMessage(chatmessage);
                    }
                }
            }
        }

        if (icommandlistener != minecraftserver && minecraftserver.worldServer[0].getGameRules().getBoolean("logAdminCommands")) {
            minecraftserver.sendMessage(chatmessage);
        }

        boolean flag3 = minecraftserver.worldServer[0].getGameRules().getBoolean("sendCommandFeedback");

        if (icommandlistener instanceof CommandBlockListenerAbstract) {
            flag3 = ((CommandBlockListenerAbstract) icommandlistener).n();
        }

        if ((i & 1) != 1 && flag3 || icommandlistener instanceof MinecraftServer) {
            icommandlistener.sendMessage(new ChatMessage(s, aobject));
        }

    }

    protected MinecraftServer a() {
        return this.a;
    }
}
