public ResponseStruct BuyBoss(string SeasonID, string BossName, string BossCountString, string BalanceType)
        {
            ResponseStruct Result;

            int BossCount;
            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 Shop." } };
            }
            else if (string.IsNullOrWhiteSpace(BossName))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Tên Boss trống rỗng." }, Broadcast = new List<string>() { "Chọn đúng Boss được cung cấp." } };
            }
            else if (!int.TryParse(BossCountString, out BossCount))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng Boss 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 (BossCount <= 0 || BossCount > 200)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng Boss không hợp lệ." }, Broadcast = new List<string>() { "Chỉnh lại cho phù hợp: 0 < Số lượng <= 200." } };
            }
            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 Boss informations
                    MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TradingSystemDBConnectionString);
                    DBConnection.Open();

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

                    List<ShopBossInformations> BossList = new List<ShopBossInformations>();

                    while (DBReader.Read())
                    {
                        ShopBossInformations boss = new ShopBossInformations();
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("BossName")))
                        {
                            boss.BossName = DBReader.GetString("BossName");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("BossType")))
                        {
                            boss.BossType = DBReader.GetString("BossType");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                        {
                            boss.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                        {
                            boss.StandardPrice = DBReader.GetInt32("StandardPrice");
                        }
                        BossList.Add(boss);
                    }

                    DBReader.Close();
                    #endregion

                    if (BossList.Count <= 0)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Không tìm thấy Boss." }, Broadcast = new List<string>() { "Lựa chọn boss cho chính xác." } };
                    }
                    else if (BossList.Count > 1)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Boss bị trùng lặp." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (String.IsNullOrWhiteSpace(BossList[0].BossName))
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Thông tin của Boss có sai sót." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (BossList[0].StandardPrice == -1 && BalanceType == "Standard Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Boss 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 (BossList[0].PremiumPrice == -1 && BalanceType == "Premium Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Boss 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
                    {
                        ShopBossInformations boss = BossList[0];
                        if (BossCount <= 200 && BossCount > 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 = boss.StandardPrice * BossCount;
                                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 SpawnBossResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SpawnBoss", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { boss.BossName, Convert.ToString(BossCount), PlayerName } }, out SpawnBossResponse))
                                    {
                                        ResponseStruct SpawnBossResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(SpawnBossResponse);
                                        if (SpawnBossResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            BossCount = Convert.ToInt32(SpawnBossResponseContent.Content);
                                            CalcPrice = boss.StandardPrice * BossCount;
                                            string SubtractPlayerResponse;
                                            if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SubtractPlayerBalance", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { PlayerName, Convert.ToString(CalcPrice), String.Format("Buy {0}", boss.BossName) } }, 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, Convert.ToString(BossCount), boss.BossName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                    LogWriter(UserName: UserName, Task: "Buy Boss - 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, Convert.ToString(BossCount), boss.BossName, 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, Convert.ToString(BossCount), boss.BossName, 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, Convert.ToString(BossCount), boss.BossName, 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 (SpawnBossResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = SpawnBossResponseContent.Error, Broadcast = SpawnBossResponseContent.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 = boss.PremiumPrice * BossCount;
                                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 SpawnBossResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SpawnBoss", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { boss.BossName, Convert.ToString(BossCount), PlayerName } }, out SpawnBossResponse))
                                    {
                                        ResponseStruct SpawnBossResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(SpawnBossResponse);
                                        if (SpawnBossResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            BossCount = Convert.ToInt32(SpawnBossResponseContent.Content);
                                            CalcPrice = boss.PremiumPrice * BossCount;

                                            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, Convert.ToString(BossCount), boss.BossName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };

                                            LogWriter(UserName, "Buy Boss - Premium Balance", String.Join("\n", Result.Broadcast));
                                        }
                                        else if (SpawnBossResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = SpawnBossResponseContent.Error, Broadcast = SpawnBossResponseContent.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 Boss không hợp lệ." }, Broadcast = new List<string>() { "Chỉnh lại cho phù hợp: 0 < Số lượng <= 200." } };
                        }
                    }
                    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 GetBossesByType(string SeasonID, string BossType)
        {
            ResponseStruct Result;
            List<ShopBossInformations> BossList = new List<ShopBossInformations>();
            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 (BossType == "Uncategorized")
                {
                    SQLQuery = "SELECT * FROM shop_bosses WHERE BossType IS NULL OR BossType = '' ORDER BY BossName ASC";
                }
                else
                {
                    SQLQuery = "SELECT * FROM shop_bosses WHERE BossType=@BossType ORDER BY BossName ASC";
                }

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

                if (BossType == "Uncategorized")
                {
                    //
                }
                else
                {
                    DBCommand.Parameters.Add("@BossType", MySqlDbType.Text).Value = BossType;
                }

                MySqlDataReader DBReader = DBCommand.ExecuteReader();

                while (DBReader.Read())
                {
                    ShopBossInformations boss = new ShopBossInformations();
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("BossName")))
                    {
                        boss.BossName = DBReader.GetString("BossName");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("BossType")))
                    {
                        boss.BossType = DBReader.GetString("BossType");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                    {
                        boss.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                    {
                        boss.StandardPrice = DBReader.GetInt32("StandardPrice");
                    }
                    BossList.Add(boss);
                }

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

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