/// <summary> /// Searches in the market with the specified arguments. /// </summary> /// <param name="cpkt"></param> private void CM_MARKET_SEARCH(CMSG_MARKETSEARCH cpkt) { //GENERATE MARKET SEARCH QUERY MarketSearchArgument Argument = new MarketSearchArgument(); Argument.item_cat = cpkt.ItemType; Argument.item_class = cpkt.ItemClass; Argument.max_clvl = cpkt.MaxCLv; Argument.min_clvl = cpkt.MinCLv; Argument.searchstring = cpkt.SearchString; Argument.searchType = cpkt.GetSearchMode; Argument.SortBy = cpkt.Unknown2; Argument.index = cpkt.Unknown; //SEND ALL FOUND ITEMS GIVEN BY THE SEARCH QUERY SMSG_MARKETSEARCH spkt = new SMSG_MARKETSEARCH(); spkt.SessionId = this.character.id; spkt.Unknown = 1; byte i = 0; foreach (MarketItemArgument args in Singleton.Database.SearchMarket(Argument)) { spkt.Count = ++i; spkt.Add(args); } this.Send((byte[])spkt); }
/// <summary> /// Search market /// </summary> /// <param name="Argument"></param> /// <returns></returns> public IEnumerable<MarketItemArgument> SearchMarket(MarketSearchArgument Argument) { return InternalDatabaseProvider.SearchMarket(Argument); }
/// <summary> /// Search market /// </summary> /// <param name="Argument"></param> /// <returns></returns> public IEnumerable<MarketItemArgument> SearchMarket(MarketSearchArgument Argument) { StringBuilder mysqlcommand = new StringBuilder("SELECT * FROM `auction` WHERE "); mysqlcommand.AppendFormat("Categorie={0} ", Argument.item_cat); if (Argument.min_clvl > 0) mysqlcommand.AppendFormat("AND ReqClvl >= {0} ", Argument.min_clvl); if (Argument.max_clvl > 0) mysqlcommand.AppendFormat("AND ReqClvl <= {0} ", Argument.max_clvl); if (Argument.searchType > 0) mysqlcommand.AppendFormat("AND `{0}` LIKE '%{1}%' ", (Argument.searchType == 2) ? "CharName" : "ItemName", Argument.searchstring); if (Argument.item_class > 0) mysqlcommand.AppendFormat("AND Grade = {0} ", Argument.max_clvl); switch (Argument.SortBy) { case 0: mysqlcommand.AppendFormat("ORDER BY ItemName ASC ", Argument.max_clvl); break; case 1: mysqlcommand.AppendFormat("ORDER BY ItemName DESC ", Argument.max_clvl); break; case 2: mysqlcommand.AppendFormat("ORDER BY CharName ASC ", Argument.max_clvl); break; case 3: mysqlcommand.AppendFormat("ORDER BY CharName DESC ", Argument.max_clvl); break; case 4: mysqlcommand.AppendFormat("ORDER BY Price ASC ", Argument.max_clvl); break; case 5: mysqlcommand.AppendFormat("ORDER BY Price DESC ", Argument.max_clvl); break; case 6: mysqlcommand.AppendFormat("ORDER BY ReqClvl ASC ", Argument.max_clvl); break; case 7: mysqlcommand.AppendFormat("ORDER BY ReqClvl DESC ", Argument.max_clvl); break; default: mysqlcommand.AppendFormat("ORDER BY CharName ASC ", Argument.max_clvl); break; } mysqlcommand.AppendFormat("LIMIT {0}, 36", Argument.index * 36); MySqlConnection connection = ConnectionPool.Request(); MySqlCommand command = new MySqlCommand(mysqlcommand.ToString(), connection); MySqlDataReader reader = null; try { reader = command.ExecuteReader(); while (reader.Read()) { byte[] buffer = new byte[67]; MarketItemArgument item = new MarketItemArgument(); item.id = reader.GetUInt32(0); item.sender = reader.GetString(4); item.price = reader.GetUInt32(7); item.expires = reader.GetMySqlDateTime(9).GetDateTime(); reader.GetBytes(8, 0, buffer, 0, 67); Rag2Item.Deserialize(out item.item, buffer, 0); yield return item; } } finally { if (reader != null) reader.Close(); ConnectionPool.Release(connection); } }