public override void onCommand(string cmd, string[] args, ICmdSource cmdSource)
        {
            if (cmdSource is IPlayer && (IPlayer)cmdSource != null)
            {
                IPlayer   player    = (IPlayer)cmdSource;
                DigPlayer digPlayer = DigPlayer.FromPlayer(player);

                AddUnsavedPlayer(player);

                switch (cmd)
                {
                case "dynamite":
                {
                    ItemDynamite dynamite = new ItemDynamite();
                    dynamite.Placer = digPlayer;
                    if (digPlayer.Inventory.RemoveItem(dynamite, 1) || player.IsGod)
                    {
                        bot.ChatSayer.Say(player.Name + " has placed a big barrel of dynamite! Hide!!");
                        bot.Room.setBlock(player.BlockX, player.BlockY, new NormalBlock(163, 0));
                        dynamites.Add(
                            new Pair <BlockPos, ItemDynamite>(new BlockPos(0, player.BlockX, player.BlockY), dynamite)
                            );
                    }
                    else
                    {
                        player.Reply("You have no dynamite! Buy it at the shop.");
                    }
                }
                break;

                case "dig":
                case "help":
                case "commands":
                case "digcommands":
                    player.Reply("Here are the commands: !xp, !level, !inventory, !xpleft, !buy, !sell, !money, !levelforores, !save");
                    break;

                case "levelforores":
                {
                    string total = "";
                    foreach (Ore ore in ItemManager.GetOres())
                    {
                        total += ore.Name + ": " + ore.LevelRequired + (ItemManager.GetOres().Last().Name.Equals(ore.Name) ? "" : ", ");
                    }
                    player.Reply(total);
                }
                break;

                case "generate":
                    if (player.IsOp)
                    {
                        int seed = -1;

                        if (args.Length >= 1)
                        {
                            Int32.TryParse(args[0], out seed);
                        }
                        if (seed == -1)
                        {
                            seed = random.Next();
                        }

                        bot.ChatSayer.Say("Generating new map with seed " + seed + ".");
                        digHardness = new float[bot.Room.Width, bot.Room.Height];
                        Generate(bot.Room.Width, bot.Room.Height, seed);
                    }
                    break;

                case "worm":
                    if (player.IsOp)
                    {
                        zombies.SpawnZombie(player.BlockX, player.BlockY);
                        player.Reply("Worm spawned.");
                    }
                    break;

                case "givexp":
                    if (player.IsOp && args.Length >= 2)
                    {
                        IPlayer receiver = bot.Room.getPlayer(args[0]);
                        if (receiver != null)
                        {
                            int xp = Int32.Parse(args[1]);
                            if (!receiver.HasMetadata("digplayer"))
                            {
                                receiver.SetMetadata("digplayer", new DigPlayer(receiver));
                            }
                            DigPlayer receiverDigPlayer = (DigPlayer)receiver.GetMetadata("digplayer");
                            receiverDigPlayer.digXp += xp;
                            AddUnsavedPlayer(receiver);
                        }
                        else
                        {
                            player.Reply("That player doesn't exist.");
                        }
                    }
                    else
                    {
                        player.Reply("Usage: !givexp <player> <xp>");
                    }
                    break;

                case "setxp":
                    if (player.IsOp && args.Length >= 2)
                    {
                        IPlayer receiver = bot.Room.getPlayer(args[0]);
                        if (receiver != null)
                        {
                            int xp = Int32.Parse(args[1]);
                            if (!receiver.HasMetadata("digplayer"))
                            {
                                receiver.SetMetadata("digplayer", new DigPlayer(receiver));
                            }
                            DigPlayer receiverDigPlayer = (DigPlayer)receiver.GetMetadata("digplayer");
                            receiverDigPlayer.digXp = xp;
                            AddUnsavedPlayer(receiver);
                        }
                        else
                        {
                            player.Reply("That player doesn't exist.");
                        }
                    }
                    else
                    {
                        player.Reply("Usage: !setxp <player> <xp>");
                    }
                    break;

                case "givemoney":
                    if (player.IsOp && args.Length >= 2)
                    {
                        IPlayer receiver = bot.Room.getPlayer(args[0]);
                        if (receiver != null)
                        {
                            int money = Int32.Parse(args[1]);
                            if (!receiver.HasMetadata("digplayer"))
                            {
                                receiver.SetMetadata("digplayer", new DigPlayer(receiver));
                            }
                            DigPlayer receiverDigPlayer = (DigPlayer)receiver.GetMetadata("digplayer");
                            receiverDigPlayer.digMoney += money;
                            AddUnsavedPlayer(receiver);
                        }
                        else
                        {
                            player.Reply("That player doesn't exist.");
                        }
                    }
                    else
                    {
                        player.Reply("Usage: !givemoney <player> <money>");
                    }
                    break;

                case "setmoney":
                    if (player.IsOp && args.Length >= 2)
                    {
                        IPlayer receiver = bot.Room.getPlayer(args[0]);
                        if (receiver != null)
                        {
                            int money = Int32.Parse(args[1]);
                            if (!receiver.HasMetadata("digplayer"))
                            {
                                receiver.SetMetadata("digplayer", new DigPlayer(receiver));
                            }
                            DigPlayer receiverDigPlayer = (DigPlayer)receiver.GetMetadata("digplayer");
                            receiverDigPlayer.digMoney = money;
                            AddUnsavedPlayer(receiver);
                        }
                        else
                        {
                            player.Reply("That player doesn't exist.");
                        }
                    }
                    else
                    {
                        player.Reply("Usage: !setmoney <player> <money>");
                    }
                    break;

                case "xp":
                    player.Reply("XP: " + digPlayer.digXp);
                    break;

                case "xpleft":
                    player.Reply("You need " + (digPlayer.xpRequired_ - digPlayer.digXp).ToString() + " XP for level " + (digPlayer.digLevel + 1).ToString());
                    break;

                case "level":
                    player.Reply("Level: " + digPlayer.digLevel);
                    break;

                case "inventory":
                    player.Reply(digPlayer.Inventory.ToString());
                    break;

                case "save":
                    player.Reply("Saved!");
                    digPlayer.Save();
                    break;

                case "setshop":
                    if (player.IsOp)
                    {
                        Shop.SetLocation(player.BlockX, player.BlockY);
                        player.Reply("Shop set at X:" + player.BlockX + " Y:" + player.BlockY);
                    }
                    break;

                case "money":
                    player.Reply("Money: " + digPlayer.digMoney);
                    break;

                case "buy":
                    if (Shop.IsPlayerClose(player))
                    {
                        if (args.Length >= 1)
                        {
                            string itemName = args[0].ToLower();
                            int    amount   = 1;

                            if (args.Length >= 2)
                            {
                                if (!int.TryParse(args[1], out amount))
                                {
                                    amount = 1;
                                }
                            }

                            if (amount < 1)
                            {
                                player.Reply("You can't buy a negative amount of items.");
                                break;
                            }

                            Shop.BuyItem(digPlayer, itemName, amount);
                        }
                        else
                        {
                            player.Reply("Usage: !buy <item> [amount=1]");
                            Shop.BuyItem(digPlayer, "", 0);
                        }
                    }
                    else
                    {
                        player.Reply("You aren't near the shop.");
                    }
                    break;

                case "sell":
                    if (Shop.IsPlayerClose(player))
                    {
                        if (args.Length >= 1)
                        {
                            string itemName = args[0].ToLower();
                            int    amount   = 1;

                            if (args.Length >= 2)
                            {
                                if (!int.TryParse(args[1], out amount))
                                {
                                    amount = 1;
                                }
                            }

                            if (amount < 1)
                            {
                                player.Reply("You can't buy a negative amount of items.");
                                break;
                            }

                            Shop.SellItem(digPlayer, itemName, amount);
                        }
                        else
                        {
                            player.Reply("Usage: !sell <item> [amount=1]");
                            Shop.SellItem(digPlayer, "", 0);
                        }
                    }
                    else
                    {
                        player.Reply("You aren't near the shop.");
                    }
                    break;
                }
            }
        }