summaryrefslogtreecommitdiff
path: root/src/map/map.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/map.c')
-rw-r--r--src/map/map.c72
1 files changed, 43 insertions, 29 deletions
diff --git a/src/map/map.c b/src/map/map.c
index cc8de1a3a..c02a896a9 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -1703,39 +1703,51 @@ struct map_session_data* map_charid2sd(int charid)
*------------------------------------------*/
struct map_session_data * map_nick2sd(const char *nick)
{
- int i, users;
- struct map_session_data *pl_sd = NULL, **pl_allsd;
+ struct map_session_data* sd;
+ struct map_session_data* found_sd;
+ struct s_mapiterator* iter;
+ size_t nicklen;
- if (nick == NULL)
+ if( nick == NULL )
return NULL;
- pl_allsd = map_getallusers(&users);
- if (battle_config.partial_name_scan)
+ nicklen = strlen(nick);
+ iter = mapit_getallusers();
+
+ found_sd = NULL;
+ for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) )
{
- int qty = 0, nicklen = strlen(nick);
- struct map_session_data *sd = NULL;
- for (i = 0; i < users; i++) {
- pl_sd = pl_allsd[i];
- // Without case sensitive check (increase the number of similar character names found)
- if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) {
- // Strict comparison (if found, we finish the function immediatly with correct value)
- if (strcmp(pl_sd->status.name, nick) == 0)
- return pl_sd;
- qty++;
- sd = pl_sd;
+ if( battle_config.partial_name_scan )
+ {// partial name search
+ if( strnicmp(sd->status.name, nick, nicklen) == 0 )
+ {
+ if( strcmp(sd->status.name, nick) == 0 )
+ {// perfect match found
+ found_sd = sd;
+ break;
+ }
+ if( found_sd != NULL )
+ {// collision
+ found_sd = NULL;
+ break;
+ }
+
+ found_sd = sd;
}
}
- // We return the found index of a similar account ONLY if there is 1 similar character
- if (qty == 1)
- return sd;
- } else { //Exact Search
- for (i = 0; i < users; i++) {
- if (strcasecmp(pl_allsd[i]->status.name, nick) == 0)
- return pl_allsd[i];
+ else
+ {// exact search only
+ if( strcasecmp(sd->status.name, nick) == 0 )
+ {
+ found_sd = sd;
+ break;
+ }
}
}
- //Not found.
- return NULL;
+
+ mapit_free(iter);
+
+ return found_sd;
}
/*==========================================
@@ -3134,7 +3146,8 @@ static int cleanup_db_subpc(DBKey key,void *data,va_list va)
void do_final(void)
{
int i, j;
- struct map_session_data **pl_allsd;
+ struct map_session_data* sd;
+ struct s_mapiterator* iter;
ShowStatus("Terminating...\n");
@@ -3143,9 +3156,10 @@ void do_final(void)
map_foreachinmap(cleanup_sub, i, BL_ALL);
//Scan any remaining players (between maps?) to kick them out. [Skotlex]
- pl_allsd = map_getallusers(&j);
- for (i = 0; i < j; i++)
- map_quit(pl_allsd[i]);
+ iter = mapit_getallusers();
+ for( sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter) )
+ map_quit(sd);
+ mapit_free(iter);
id_db->foreach(id_db,cleanup_db_sub);
chrif_char_reset_offline();