public ResponseStruct BuyNpc(string SeasonID, string NpcIdString, string NpcCountString, string BalanceType)
        {
            ResponseStruct Result;

            int NpcID;
            int NpcCount;

            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(NpcIdString))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "ID NPC trống rỗng." }, Broadcast = new List<string>() { "Chọn đúng NPC được cung cấp." } };
            }
            else if (!int.TryParse(NpcIdString, out NpcID))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "ID NPC không hợp lệ." }, Broadcast = new List<string>() { "Chọn đúng ID NPC được cung cấp." } };
            }
            else if (!int.TryParse(NpcCountString, out NpcCount))
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng NPC 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 (NpcCount <= 0 || NpcCount > 200)
            {
                Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Số lượng NPC 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 NPC informations
                    MySqlConnection DBConnection = new MySqlConnection(OverallInformations.TradingSystemDBConnectionString);
                    DBConnection.Open();

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

                    List<ShopNpcInformations> NpcList = new List<ShopNpcInformations>();

                    while (DBReader.Read())
                    {
                        ShopNpcInformations npc = new ShopNpcInformations() { NpcID = -1, NpcName = "", NpcType = "", StandardPrice = 0, PremiumPrice = 0 };
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcID")))
                        {
                            npc.NpcID = DBReader.GetInt32("NpcID");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcName")))
                        {
                            npc.NpcName = DBReader.GetString("NpcName");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcType")))
                        {
                            npc.NpcType = DBReader.GetString("NpcType");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                        {
                            npc.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                        }
                        if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                        {
                            npc.StandardPrice = DBReader.GetInt32("StandardPrice");
                        }
                        NpcList.Add(npc);
                    }

                    DBReader.Close();
                    #endregion

                    if (NpcList.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 (NpcList.Count > 1)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "NPC bị trùng lặp." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (NpcList[0].NpcID == -1)
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "Thông tin của NPC có sai sót." }, Broadcast = new List<string>() { "Báo với Admin nếu có thể." } };
                    }
                    else if (NpcList[0].StandardPrice == -1 && BalanceType == "Standard Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "NPC 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 (NpcList[0].PremiumPrice == -1 && BalanceType == "Premium Balance")
                    {
                        Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = new List<string>() { "NPC 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
                    {
                        ShopNpcInformations npc = NpcList[0];
                        if (NpcCount <= 200 && NpcCount > 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 = npc.StandardPrice * NpcCount;
                                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 SpawnMobResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SpawnMob", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { Convert.ToString(NpcID), Convert.ToString(NpcCount), PlayerName } }, out SpawnMobResponse))
                                    {
                                        ResponseStruct SpawnMobResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(SpawnMobResponse);
                                        if (SpawnMobResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            NpcCount = Convert.ToInt32(SpawnMobResponseContent.Content);
                                            CalcPrice = npc.StandardPrice * NpcCount;

                                            string SubtractPlayerResponse;
                                            if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SubtractPlayerBalance", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { PlayerName, Convert.ToString(CalcPrice), String.Format("Buy {0}", npc.NpcName) } }, 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(NpcCount), npc.NpcName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };
                                                    LogWriter(UserName: UserName, Task: "Buy Mob - 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(NpcCount), npc.NpcName, 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(NpcCount), npc.NpcName, 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(NpcCount), npc.NpcName, 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 (SpawnMobResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = SpawnMobResponseContent.Error, Broadcast = SpawnMobResponseContent.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 = npc.PremiumPrice * NpcCount;
                                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 SpawnMobResponse;
                                    if (LauncherServerSendRequestToTShockInstance.SendRequest(new Request02() { RequestType = "SpawnMob", AuthCode = OverallInformations.AuthCode, Parameters = new List<string>() { Convert.ToString(npc.NpcID), Convert.ToString(NpcCount), PlayerName } }, out SpawnMobResponse))
                                    {
                                        ResponseStruct SpawnMobResponseContent = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseStruct>(SpawnMobResponse);
                                        if (SpawnMobResponseContent.Status == ResponseStatusType.Done)
                                        {
                                            NpcCount = Convert.ToInt32(SpawnMobResponseContent.Content);
                                            CalcPrice = npc.PremiumPrice * NpcCount;

                                            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(NpcCount), npc.NpcName, string.Format(CultureInfo.InvariantCulture, "{0:#,#0}", CalcPrice), BalanceType) } };

                                            LogWriter(UserName, "Buy Mob - Premium Balance", String.Join("\n", Result.Broadcast));
                                        }
                                        else if (SpawnMobResponseContent.Status == ResponseStatusType.Fail)
                                        {
                                            Result = new ResponseStruct() { Status = ResponseStatusType.Fail, Error = SpawnMobResponseContent.Error, Broadcast = SpawnMobResponseContent.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 NPC 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 GetNpcsByType(string SeasonID, string NpcType)
        {
            ResponseStruct Result;
            List<ShopNpcInformations> NpcList = new List<ShopNpcInformations>();
            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 (NpcType == "Uncategorized")
                {
                    SQLQuery = "SELECT * FROM shop_npcs WHERE NpcType IS NULL OR NpcType = '' ORDER BY NpcName ASC";
                }
                else
                {
                    SQLQuery = "SELECT * FROM shop_npcs WHERE NpcType=@NpcType ORDER BY NpcName ASC";
                }

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

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

                MySqlDataReader DBReader = DBCommand.ExecuteReader();

                while (DBReader.Read())
                {
                    ShopNpcInformations npc = new ShopNpcInformations();
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcID")))
                    {
                        npc.NpcID = DBReader.GetInt32("NpcID");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcName")))
                    {
                        npc.NpcName = DBReader.GetString("NpcName");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("NpcType")))
                    {
                        npc.NpcType = DBReader.GetString("NpcType");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("PremiumPrice")))
                    {
                        npc.PremiumPrice = DBReader.GetInt32("PremiumPrice");
                    }
                    if (!DBReader.IsDBNull(DBReader.GetOrdinal("StandardPrice")))
                    {
                        npc.StandardPrice = DBReader.GetInt32("StandardPrice");
                    }
                    NpcList.Add(npc);
                }

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

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