Fixes mob and item atcommand sorting issues (#7058)

* Fixes #7055.
* Fixes several atcommands used for mob and item information were not properly accounting for order.
* Resolves an issue where YAML databases were not properly utilizing the cache feature.
* Increased MAX_SEARCH to 10 by default as in renewal there are many more items with duplicated names.
Thanks to @Playtester!
Co-authored-by: Playtester <Kenji.Ito@gmx.de>
This commit is contained in:
Aleos 2022-06-24 09:53:31 -04:00 committed by GitHub
parent 563a7012ff
commit 256735a136
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 62 additions and 22 deletions

View File

@ -166,6 +166,10 @@ public:
} }
} }
std::vector<std::shared_ptr<datatype>> getCache() {
return this->cache;
}
virtual size_t calculateCacheKey( keytype key ){ virtual size_t calculateCacheKey( keytype key ){
return key; return key;
} }

View File

@ -365,6 +365,8 @@ void AchievementDatabase::loadingFinished(){
ach->dependent_ids.shrink_to_fit(); ach->dependent_ids.shrink_to_fit();
} }
TypesafeYamlDatabase::loadingFinished();
} }
AchievementDatabase achievement_db; AchievementDatabase achievement_db;

View File

@ -3912,7 +3912,7 @@ ACMD_FUNC(mapexit)
ACMD_FUNC(idsearch) ACMD_FUNC(idsearch)
{ {
char item_name[100]; char item_name[100];
unsigned int i, match; uint16 i, match;
struct item_data *item_array[MAX_SEARCH]; struct item_data *item_array[MAX_SEARCH];
nullpo_retr(-1, sd); nullpo_retr(-1, sd);
@ -7613,8 +7613,7 @@ ACMD_FUNC(mobinfo)
unsigned char melement[ELE_ALL][8] = { "Neutral", "Water", "Earth", "Fire", "Wind", "Poison", "Holy", "Dark", "Ghost", "Undead" }; unsigned char melement[ELE_ALL][8] = { "Neutral", "Water", "Earth", "Fire", "Wind", "Poison", "Holy", "Dark", "Ghost", "Undead" };
char atcmd_output2[CHAT_SIZE_MAX]; char atcmd_output2[CHAT_SIZE_MAX];
struct item_data *item_data; struct item_data *item_data;
uint16 mob_ids[MAX_SEARCH]; uint16 mob_ids[MAX_SEARCH], count;
int count;
int i, k; int i, k;
memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(atcmd_output, '\0', sizeof(atcmd_output));
@ -8151,7 +8150,7 @@ ACMD_FUNC(homshuffle)
ACMD_FUNC(iteminfo) ACMD_FUNC(iteminfo)
{ {
struct item_data *item_array[MAX_SEARCH]; struct item_data *item_array[MAX_SEARCH];
int i, count = 1; uint16 i, count = 1;
if (!message || !*message) { if (!message || !*message) {
clif_displaymessage(fd, msg_txt(sd,1276)); // Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>). clif_displaymessage(fd, msg_txt(sd,1276)); // Please enter an item name/ID (usage: @ii/@iteminfo <item name/ID>).
@ -8202,7 +8201,7 @@ ACMD_FUNC(iteminfo)
ACMD_FUNC(whodrops) ACMD_FUNC(whodrops)
{ {
struct item_data *item_data, *item_array[MAX_SEARCH]; struct item_data *item_data, *item_array[MAX_SEARCH];
int i,j, count = 1; uint16 i, j, count = 1;
if (!message || !*message) { if (!message || !*message) {
clif_displaymessage(fd, msg_txt(sd,1284)); // Please enter item name/ID (usage: @whodrops <item name/ID>). clif_displaymessage(fd, msg_txt(sd,1284)); // Please enter item name/ID (usage: @whodrops <item name/ID>).
@ -8257,8 +8256,7 @@ ACMD_FUNC(whodrops)
ACMD_FUNC(whereis) ACMD_FUNC(whereis)
{ {
uint16 mob_ids[MAX_SEARCH] = {0}; uint16 mob_ids[MAX_SEARCH] = {0}, count;
int count = 0;
if (!message || !*message) { if (!message || !*message) {
clif_displaymessage(fd, msg_txt(sd,1288)); // Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>). clif_displaymessage(fd, msg_txt(sd,1288)); // Please enter a monster name/ID (usage: @whereis <monster_name_or_monster_ID>).

View File

@ -1168,6 +1168,8 @@ void ItemDatabase::loadingFinished(){
item_db.put( ITEMID_DUMMY, dummy_item ); item_db.put( ITEMID_DUMMY, dummy_item );
} }
TypesafeCachedYamlDatabase::loadingFinished();
} }
/** /**
@ -1668,14 +1670,17 @@ LaphineUpgradeDatabase laphine_upgrade_db;
* @param str * @param str
* @return Number of matches item * @return Number of matches item
*------------------------------------------*/ *------------------------------------------*/
int itemdb_searchname_array(struct item_data** data, int size, const char *str) uint16 itemdb_searchname_array(struct item_data** data, uint16 size, const char *str)
{ {
int count = 0; uint16 count = 0;
const auto &item_list = item_db.getCache();
for (const auto &it : item_db) { for (const auto &item : item_list) {
if (item == nullptr)
continue;
if (count < size) { if (count < size) {
if (stristr(it.second->name.c_str(), str) != nullptr || stristr(it.second->ename.c_str(), str) != nullptr || strcmpi(it.second->ename.c_str(), str) == 0) if (stristr(item->name.c_str(), str) != nullptr || stristr(item->ename.c_str(), str) != nullptr || strcmpi(item->ename.c_str(), str) == 0)
data[count++] = it.second.get(); data[count++] = item.get();
} else } else
break; break;
} }
@ -2351,6 +2356,8 @@ void ItemGroupDatabase::loadingFinished() {
} }
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
/** Read item forbidden by mapflag (can't equip item) /** Read item forbidden by mapflag (can't equip item)
@ -2527,6 +2534,8 @@ void ComboDatabase::loadingFinished() {
it->combos.push_back(combo.second); it->combos.push_back(combo.second);
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
/** /**
@ -3115,6 +3124,8 @@ void RandomOptionDatabase::loadingFinished(){
script_set_constant( name.c_str(), pair.first, false, false ); script_set_constant( name.c_str(), pair.first, false, false );
} }
TypesafeYamlDatabase::loadingFinished();
} }
RandomOptionDatabase random_option_db; RandomOptionDatabase random_option_db;

View File

@ -22,7 +22,9 @@ const t_itemid UNKNOWN_ITEM_ID = 512;
/// The maximum number of item delays /// The maximum number of item delays
#define MAX_ITEMDELAYS 10 #define MAX_ITEMDELAYS 10
///Designed for search functions, species max number of matches to display. ///Designed for search functions, species max number of matches to display.
#define MAX_SEARCH 5 #ifndef MAX_SEARCH
#define MAX_SEARCH 10
#endif
#define MAX_ROULETTE_LEVEL 7 /** client-defined value **/ #define MAX_ROULETTE_LEVEL 7 /** client-defined value **/
#define MAX_ROULETTE_COLUMNS 9 /** client-defined value **/ #define MAX_ROULETTE_COLUMNS 9 /** client-defined value **/
@ -1360,7 +1362,7 @@ public:
extern LaphineUpgradeDatabase laphine_upgrade_db; extern LaphineUpgradeDatabase laphine_upgrade_db;
int itemdb_searchname_array(struct item_data** data, int size, const char *str); uint16 itemdb_searchname_array(struct item_data** data, uint16 size, const char *str);
struct item_data* itemdb_search(t_itemid nameid); struct item_data* itemdb_search(t_itemid nameid);
struct item_data* itemdb_exists(t_itemid nameid); struct item_data* itemdb_exists(t_itemid nameid);
#define itemdb_name(n) itemdb_search(n)->name.c_str() #define itemdb_name(n) itemdb_search(n)->name.c_str()

View File

@ -315,14 +315,17 @@ std::shared_ptr<s_mob_db> mobdb_search_aegisname( const char* str ){
/*========================================== /*==========================================
* Founds up to N matches. Returns number of matches [Skotlex] * Founds up to N matches. Returns number of matches [Skotlex]
*------------------------------------------*/ *------------------------------------------*/
int mobdb_searchname_array_(const char *str, uint16 * out, int size, bool full_cmp) uint16 mobdb_searchname_array_(const char *str, uint16 * out, uint16 size, bool full_cmp)
{ {
unsigned short count = 0; uint16 count = 0;
for( auto const &mobdb_pair : mob_db ) { const auto &mob_list = mob_db.getCache();
const uint16 mob_id = mobdb_pair.first;
if( mobdb_searchname_sub(mob_id, str, full_cmp) ) { for( const auto &mob : mob_list ) {
if (mob == nullptr)
continue;
if( mobdb_searchname_sub(mob->id, str, full_cmp) ) {
if( count < size ) if( count < size )
out[count] = mob_id; out[count] = mob->id;
count++; count++;
} }
} }
@ -330,7 +333,7 @@ int mobdb_searchname_array_(const char *str, uint16 * out, int size, bool full_c
return count; return count;
} }
int mobdb_searchname_array(const char *str, uint16 * out, int size) uint16 mobdb_searchname_array(const char *str, uint16 * out, uint16 size)
{ {
return mobdb_searchname_array_(str, out, size, false); return mobdb_searchname_array_(str, out, size, false);
} }
@ -4974,6 +4977,8 @@ void MobDatabase::loadingFinished() {
mob->status.hp = mob->status.max_hp; mob->status.hp = mob->status.max_hp;
mob->status.sp = mob->status.max_sp; mob->status.sp = mob->status.max_sp;
} }
TypesafeCachedYamlDatabase::loadingFinished();
} }
MobDatabase mob_db; MobDatabase mob_db;

View File

@ -447,7 +447,7 @@ struct item_drop_list {
uint16 mobdb_searchname(const char * const str); uint16 mobdb_searchname(const char * const str);
std::shared_ptr<s_mob_db> mobdb_search_aegisname( const char* str ); std::shared_ptr<s_mob_db> mobdb_search_aegisname( const char* str );
int mobdb_searchname_array(const char *str, uint16 * out, int size); uint16 mobdb_searchname_array(const char *str, uint16 * out, uint16 size);
int mobdb_checkid(const int id); int mobdb_checkid(const int id);
struct view_data* mob_get_viewdata(int mob_id); struct view_data* mob_get_viewdata(int mob_id);
void mob_set_dynamic_viewdata( struct mob_data* md ); void mob_set_dynamic_viewdata( struct mob_data* md );

View File

@ -833,6 +833,8 @@ void BarterDatabase::loadingFinished(){
} }
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
BarterDatabase barter_db; BarterDatabase barter_db;

View File

@ -357,6 +357,8 @@ void PenaltyDatabase::loadingFinished(){
} }
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
PenaltyDatabase penalty_db; PenaltyDatabase penalty_db;
@ -12990,6 +12992,8 @@ void SkillTreeDatabase::loadingFinished() {
} }
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
/** /**
@ -13546,6 +13550,8 @@ void JobDatabase::loadingFinished() {
} }
} }
} }
TypesafeCachedYamlDatabase::loadingFinished();
} }
/** /**
@ -13708,6 +13714,8 @@ void PlayerStatPointDatabase::loadingFinished(){
// Store it for next iteration // Store it for next iteration
last_level = entry; last_level = entry;
} }
TypesafeCachedYamlDatabase::loadingFinished();
} }
/*========================================== /*==========================================

View File

@ -304,6 +304,8 @@ void PlayerGroupDatabase::loadingFinished(){
// Initialize command cache // Initialize command cache
atcommand_db_load_groups(); atcommand_db_load_groups();
TypesafeYamlDatabase::loadingFinished();
} }
PlayerGroupDatabase player_group_db; PlayerGroupDatabase player_group_db;

View File

@ -24022,6 +24022,8 @@ void SkillDatabase::loadingFinished(){
if( this->skill_num > MAX_SKILL ){ if( this->skill_num > MAX_SKILL ){
ShowError( "There are more skills defined in the skill database (%d) than the MAX_SKILL (%d) define. Please increase it and recompile.\n", this->skill_num, MAX_SKILL ); ShowError( "There are more skills defined in the skill database (%d) than the MAX_SKILL (%d) define. Please increase it and recompile.\n", this->skill_num, MAX_SKILL );
} }
TypesafeYamlDatabase::loadingFinished();
} }
/** /**

View File

@ -933,6 +933,8 @@ void EnchantgradeDatabase::loadingFinished(){
} }
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
EnchantgradeDatabase enchantgrade_db; EnchantgradeDatabase enchantgrade_db;
@ -15542,6 +15544,8 @@ void StatusDatabase::loadingFinished(){
this->StatusRelevantBLTypes[status->icon] = BL_PC; this->StatusRelevantBLTypes[status->icon] = BL_PC;
} }
} }
TypesafeYamlDatabase::loadingFinished();
} }
StatusDatabase status_db; StatusDatabase status_db;