private void OnRecvBuyMarketItem(IChannel channel, Message message)
        {
            SBuyMarketItem msg = message as SBuyMarketItem;

            World.Instance.MarketItems.Remove(msg.item.ditem.item_id);
            if (msg.item.costConf.costType == CostType.Gold)
            {
                World.Instance.fPlayer.gold -= msg.item.costConf.cost;
            }
            else
            {
                World.Instance.fPlayer.silver -= msg.item.costConf.cost;
            }
            World.Instance.fPlayer.inventory.Add(msg.item.ditem.item_id, FrontEnd.Item.FItem.FromDItem(msg.item.ditem));
            GameObject.FindObjectOfType <MarketBuyViewUI>().RefreshItems();
        }
        private void OnRecvBuyMarketItem(IChannel channel, Message message)
        {
            CBuyMarketItem request = message as CBuyMarketItem;
            var            player  = (Player)channel.GetContent();

            using (var conn = GameDataBase.GetConnection())
            {
                using (var trans = conn.BeginTransaction())
                {
                    int market_id = 0;
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Select market_id From Market Where item_id=@item_id And valid=true;";
                        cmd.Parameters.AddWithValue("item_id", request.item.ditem.item_id);
                        var res = cmd.ExecuteScalar();
                        if (res == null)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy]");
                            return;
                        }
                        market_id = (int)res;
                    }
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Select player_id From Player Where player_id=@player_id And items_count<40 And gold>=@gold And silver>=@silver;";
                        cmd.Parameters.AddWithValue("player_id", player.player_id);
                        cmd.Parameters.AddWithValue("gold", request.item.costConf.costType == CostType.Gold ? request.item.costConf.cost : 0);
                        cmd.Parameters.AddWithValue("silver", request.item.costConf.costType == CostType.Gold ? 0 : request.item.costConf.cost);
                        var res = cmd.ExecuteScalar();
                        if (res == null)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy1]");
                            return;
                        }
                    }
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Update Market Set valid=false, buyer_id=@player_id Where market_id=@market_id;";
                        cmd.Parameters.AddWithValue("market_id", market_id);
                        cmd.Parameters.AddWithValue("player_id", player.player_id);
                        var res = cmd.ExecuteNonQuery();
                        if (res != 1)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy2]");
                            return;
                        }
                    }
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Update Item Set player_id=@player_id, status='Storing' Where item_id=@item_id";
                        cmd.Parameters.AddWithValue("player_id", player.player_id);
                        cmd.Parameters.AddWithValue("item_id", request.item.ditem.item_id);
                        var res = cmd.ExecuteNonQuery();
                        if (res != 1)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy3]");
                            return;
                        }
                    }
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Update Player Set items_count=items_count+1, gold=gold-@gold, silver=silver-@silver Where player_id=@player_id;";
                        cmd.Parameters.AddWithValue("gold", request.item.costConf.costType == CostType.Gold ? request.item.costConf.cost : 0);
                        cmd.Parameters.AddWithValue("silver", request.item.costConf.costType == CostType.Gold ? 0 : request.item.costConf.cost);
                        cmd.Parameters.AddWithValue("player_id", player.player_id);
                        var res = cmd.ExecuteNonQuery();
                        if (res != 1)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy4]");
                            return;
                        }
                    }
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "Update Player Set gold=gold+@gold, silver=silver+@silver Where player_id=@player_id";
                        cmd.Parameters.AddWithValue("gold", request.item.costConf.costType == CostType.Gold ? request.item.costConf.cost : 0);
                        cmd.Parameters.AddWithValue("silver", request.item.costConf.costType == CostType.Gold ? 0 : request.item.costConf.cost);
                        cmd.Parameters.AddWithValue("player_id", request.item.owner_id);
                        var res = cmd.ExecuteNonQuery();
                        if (res != 1)
                        {
                            trans.Rollback();
                            ClientTipInfo(channel, "Error! Try again.[Buy5]");
                            return;
                        }
                    }
                    trans.Commit();
                }
            }
            SBuyMarketItem response = new SBuyMarketItem();

            response.item = request.item;
            channel.Send(response);
            player.inventory.Add(request.item.ditem.item_id, request.item.ditem);
        }