public ResponseStruct BuyRegularItem(string SeasonID, string ItemName, string ItemCountString, string BalanceType)
        {
            ResponseStruct Result;

            int ItemCount;
            LauncherClientInformations aClient;

            if (!OverallInformations.Clients.TryGetValue(SeasonID, out aClient))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Client không tồn tại." }, Broadcast = new List<string>() { "Khởi động lại Client." } };
            }
            else if (string.IsNullOrWhiteSpace(aClient.UserName))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Chưa đăng nhập." }, Broadcast = new List<string>() { "Đăng nhập để tiếp tục sử dụng." } };
            }
            else if (string.IsNullOrWhiteSpace(ItemName))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tên item trống rỗng." }, Broadcast = new List<string>() { "Chọn đúng item được cung cấp." } };
            }
            else if (!int.TryParse(ItemCountString, out ItemCount))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng item có kích thước hoặc định dạng không hợp lệ." }, Broadcast = new List<string>() { "Chỉnh lại cho phù hợp: Chỉ chứa mỗi các kí tự số." } };
            }
            else if (ItemCount <= 0 || ItemCount > 999)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng Item không hợp lệ." }, Broadcast = new List<string>() { "Chỉnh lại cho phù hợp: 0 < Số lượng < Max Stack." } };
            }
            else if (string.IsNullOrWhiteSpace(BalanceType))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Currency không đúng chủng loại." }, Broadcast = new List<string>() { "Lựa chọn theo đúng danh sách có sẵn." } };
            }
            else
            {
                string UserName = aClient.UserName;
                string PlayerName;

                if (IsAnUserPlayingOnTShock(UserName, out PlayerName))
                {

                    #region Get item informations
                    MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TradingSystemDBConnectionString);
                    DBConnection.Open();

                    string SQLQuery = "SELECT * FROM shop_items WHERE ItemName=@ItemName";
                    MySqlCommand DBCommand = new MySqlCommand(SQLQuery, DBConnection);
                    DBCommand.Prepare();
                    DBCommand.Parameters.Add("@ItemName", MySqlDbType.Text).Value = ItemName;
                    MySqlDataReader DBReader = DBCommand.ExecuteReader();

                    List<ShopItemInformations> ItemList = new List<ShopItemInformations>();

                    while (DBReader.Read())
                    {
                        ShopItemInformations item = new ShopItemInformations();
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemID")))
                        {
                            item.ItemID = DBReader.GetInt32("ItemID");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemName")))
                        {
                            item.ItemName = DBReader.GetString("ItemName");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemType")))
                        {
                            item.ItemType = DBReader.GetString("ItemType");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("MaxStack")))
                        {
                            item.MaxStack = DBReader.GetInt32("MaxStack");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                        {
                            item.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                        {
                            item.StandardPrice = DBReader.GetInt32("StandardPrice");
                        }
                        ItemList.Add(item);
                    }

                    DBReader.Close();
                    #endregion

                    if (ItemList.Count <= 0)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không tìm thấy Item." }, Broadcast = new List<string>() { "Lựa chọn Item cho chính xác." } };
                    }
                    else if (ItemList.Count > 1)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Item bị trùng lặp." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (String.IsNullOrWhiteSpace(ItemList[0].ItemName) || ItemList[0].MaxStack <= 0)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Thông tin của Item có sai sót." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (ItemList[0].StandardPrice == -1 && BalanceType == "Standard Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Item không thể mua với Standard Balance." }, Broadcast = new List<string>() { "Vui lòng chọn cách thanh toán khác nếu có thể." } };
                    }
                    else if (ItemList[0].PremiumPrice == -1 && BalanceType == "Premium Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Item không thể mua với Premium Balance." }, Broadcast = new List<string>() { "Vui lòng chọn cách thanh toán khác nếu có thể." } };
                    }
                    else
                    {
                        ShopItemInformations item = ItemList[0];
                        if (ItemCount <= item.MaxStack && ItemCount > 0)
                        {
                            if (BalanceType == "Standard Balance")
                            {
                                #region Pay with Standard Account
                                long Balance;
                                if (!Int64.TryParse(Convert.ToString(GetBalance(aClient.SeasonID, "Standard Balance").Content), out Balance))
                                {
                                    Balance = 0;
                                }
                                long CalcPrice = item.StandardPrice * ItemCount;
                                if (CalcPrice > Balance)
                                {
                                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Chưa đủ sức mạnh." }, Broadcast = new List<string>() { "Tài khoản người chơi chưa đủ chi trả.", "Nếu người chơi chắc chắn rằng tài khoản có đủ thì Trading System chưa lấy được thông tin Balance của người dùng, vui lòng thực hiện lại sau giây lát." } };
                                }
                                else
                                {
                                    string GiveItemResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "GiveItem", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { PlayerName, ItemName, ItemCount.ToString(), "0" } }, out GiveItemResponse))
                                    {
                                        ResponseStruct GiveItemResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(GiveItemResponse);
                                        if (GiveItemResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            string SubtractPlayerResponse;
                                            if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SubtractPlayerBalance", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { PlayerName, CalcPrice.ToString(), String.Format("Buy {0}", ItemName) } }, out SubtractPlayerResponse))
                                            {
                                                ResponseStruct SubtractPlayerBalanceResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(SubtractPlayerResponse);
                                                if (SubtractPlayerBalanceResponseContent.Status == ResponseStatusType.Done)
                                                {
                                                    Result = new ResponseStruct() { Status = ResponseStatusType.Done, Broadcast = new List<string>() { String.Format("{0}:{1} vừa mua {2} {3}.\nChi phí: {4} Credits {5}.", UserName, PlayerName, ItemCount, ItemName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                    LogWriter(UserName: UserName, Task: "Buy Regular Item - Standard Balance", Details: String.Join("\n", Result.Broadcast));
                                                }
                                                else if (SubtractPlayerBalanceResponseContent.Status == ResponseStatusType.Fail)
                                                {
                                                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = SubtractPlayerBalanceResponseContent.Error, Broadcast = new List<string>() { String.Format("{0}:{1} vừa mua {2} {3}.\nChi phí: {4} Credits {5}.", UserName, PlayerName, ItemCount, ItemName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                    LogWriter(UserName: UserName, Task: "Pending Transaction", Details: String.Join("\n", String.Join("\n", Result.Error), String.Join("\n", Result.Broadcast)));
                                                }
                                                else
                                                {
                                                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không rõ dữ liệu trả về từ Server." }, Broadcast = new List<string>() { String.Format("{0}:{1} vừa mua {2} {3}.\nChi phí: {4} Credits {5}.", UserName, PlayerName, ItemCount, ItemName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                    LogWriter(UserName: UserName, Task: "Pending Transaction", Details: String.Join("\n", String.Join("\n", Result.Error), String.Join("\n", Result.Broadcast)));
                                                }
                                            }
                                            else
                                            {
                                                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Server không đáp ứng." }, Broadcast = new List<string>() { String.Format("{0}:{1} vừa mua {2} {3}.\nChi phí: {4} Credits {5}.", UserName, PlayerName, ItemCount, ItemName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                LogWriter(UserName: UserName, Task: "Pending Transaction", Details: String.Join("\n", String.Join("\n", Result.Error), String.Join("\n", Result.Broadcast)));
                                            }
                                        }
                                        else if (GiveItemResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = GiveItemResponseContent.Error, Broadcast = GiveItemResponseContent.Broadcast };
                                        }
                                        else
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không rõ dữ liệu trả về từ Server." }, Broadcast = new List<string>() { "Báo cáo với Admin nếu có thể." } };
                                        }
                                    }
                                    else
                                    {
                                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Server không đáp ứng." }, Broadcast = new List<string>() { "Báo cáo với Admin nếu có thể." } };
                                    }
                                }
                                #endregion
                            }
                            else if (BalanceType == "Premium Balance")
                            {
                                #region Pay with Premium Account
                                long Balance;
                                if (!Int64.TryParse(Convert.ToString(GetBalance(aClient.SeasonID, "Premium Balance").Content), out Balance))
                                {
                                    Balance = 0;
                                }
                                long CalcPrice = item.PremiumPrice * ItemCount;
                                if (CalcPrice > Balance)
                                {
                                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Chưa đủ sức mạnh." }, Broadcast = new List<string>() { "Liên hệ Admin để nạp thêm sức mạnh bằng cách Donate." } };
                                }
                                else
                                {
                                    string GiveItemResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "GiveItem", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { PlayerName, ItemName, ItemCount.ToString(), "0" } }, out GiveItemResponse))
                                    {
                                        ResponseStruct GiveItemResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(GiveItemResponse);
                                        if (GiveItemResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            SQLQuery = "UPDATE shop_accounts SET Balance=@Balance WHERE UserName=@UserName";
                                            DBCommand = new MySqlCommand(SQLQuery, DBConnection);
                                            DBCommand.Prepare();
                                            DBCommand.Parameters.Add("@Balance", MySqlDbType.Int32).Value = int.Parse((Balance - CalcPrice).ToString());
                                            DBCommand.Parameters.Add("@UserName", MySqlDbType.VarChar).Value = aClient.UserName;
                                            DBCommand.ExecuteNonQuery();

                                            Result = new ResponseStruct() { Status = ResponseStatusType.Done, Broadcast = new List<string>() { String.Format("{0}:{1} vừa mua {2} {3}.\nChi phí: {4} Credits {5}.", UserName, PlayerName, ItemCount, ItemName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };

                                            LogWriter(UserName, "Buy Regular Item - Premium Balance", String.Join("\n", Result.Broadcast));
                                        }
                                        else if (GiveItemResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = GiveItemResponseContent.Error, Broadcast = GiveItemResponseContent.Broadcast };
                                        }
                                        else
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không rõ dữ liệu trả về từ Server." }, Broadcast = new List<string>() { "Thông báo cho Admin nếu có thể." } };
                                        }
                                    }
                                    else
                                    {
                                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Server không đáp ứng." }, Broadcast = new List<string>() { "Báo cáo với Admin nếu có thể." } };
                                    }
                                }
                                #endregion
                            }
                            else
                            {
                                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Credit không theo chuẩn." }, Broadcast = new List<string>() { "Lựa chọn theo đúng danh sách có sẵn." } };
                            }
                        }
                        else
                        {
                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng item không hợp lệ." }, Broadcast = new List<string>() { "Chỉnh lại cho phù hợp: 0 < Số lượng < Max Stack." } };
                        }
                    }
                    DBReader.Dispose();
                    DBCommand.Dispose();
                    DBConnection.Dispose();
                }
                else
                {
                    Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không tìm thấy Player trong Server." }, Broadcast = new List<string>() { "Player phải có mặt trong Server để tiếp tục." } };
                }
            }
            return Result;
        }
        public ResponseStruct GetItemsByType(string SeasonID, string ItemType)
        {
            ResponseStruct Result;
            List<ShopItemInformations> ItemList = new List<ShopItemInformations>();
            LauncherClientInformations aClient;

            if (!OverallInformations.Clients.TryGetValue(SeasonID, out aClient))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Client không tồn tại." }, Broadcast = new List<string>() { "Khởi động lại Client" } };
            }
            else if (string.IsNullOrWhiteSpace(aClient.UserName))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Chưa đăng nhập." }, Broadcast = new List<string>() { "Tiến hành đăng nhập để sử dụng Shop." } };
            }
            else
            {
                MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TradingSystemDBConnectionString);
                DBConnection.Open();

                string SQLQuery;
                if (ItemType == "Uncategorized")
                {
                    SQLQuery = "SELECT * FROM shop_items WHERE ItemType IS NULL OR ItemType = '' ORDER BY ItemName ASC";
                }
                else
                {
                    SQLQuery = "SELECT * FROM shop_items WHERE ItemType=@ItemType ORDER BY ItemName ASC";
                }

                MySqlCommand DBCommand = new MySqlCommand(SQLQuery, DBConnection);
                DBCommand.Prepare();

                if (ItemType == "Uncategorized")
                {

                }
                else
                {
                    DBCommand.Parameters.Add("@ItemType", MySqlDbType.Text).Value = ItemType;
                }

                MySqlDataReader DBReader = DBCommand.ExecuteReader();

                while (DBReader.Read())
                {
                    ShopItemInformations item = new ShopItemInformations();
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemID")))
                    {
                        item.ItemID = DBReader.GetInt32("ItemID");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemName")))
                    {
                        item.ItemName = DBReader.GetString("ItemName");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("ItemType")))
                    {
                        item.ItemType = DBReader.GetString("ItemType");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("MaxStack")))
                    {
                        item.MaxStack = DBReader.GetInt32("MaxStack");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                    {
                        item.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                    {
                        item.StandardPrice = DBReader.GetInt32("StandardPrice");
                    }
                    ItemList.Add(item);
                }

                Result = new ResponseStruct() { Status = ResponseStatusType.Done, Content = Newtonsoft.Json.JsonConvert.SerializeObject(ItemList) };

                DBReader.Dispose();
                DBCommand.Dispose();
                DBConnection.Dispose();
            }

            return Result;
        }