From 3b1dd44c88484af3585bcfea0e94994330383019 Mon Sep 17 00:00:00 2001 From: FlavioJS Date: Tue, 13 Jan 2009 12:53:11 +0000 Subject: * Cleaned up command @users/#users: - displays everything on the target user (self for @users) - uses a static array instead of a temporary DBMap - displays percentages with precision of 0.01% - uses safesnprintf instead of sprintf git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13446 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 6 ++++++ src/common/mapindex.c | 2 -- src/common/mapindex.h | 2 ++ src/map/atcommand.c | 53 +++++++++++++++++++++++---------------------------- 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index c4a488f88..4b2338e26 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -3,6 +3,12 @@ Date Added AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. +2009/01/13 + * Cleaned up command @users/#users: [FlavioJS] + - displays everything on the target user (self for @users) + - uses a static array instead of a temporary DBMap + - displays percentages with precision of 0.01% + - uses safesnprintf instead of sprintf 2009/01/12 * Mobs with nonzero spawn time can now be cached as well (bugreport:1197) * Fixed dynamic mobs being unloaded without stopping their respawn timer diff --git a/src/common/mapindex.c b/src/common/mapindex.c index b76a838be..4aef69574 100644 --- a/src/common/mapindex.c +++ b/src/common/mapindex.c @@ -11,8 +11,6 @@ #include #include -#define MAX_MAPINDEX 2000 - struct _indexes { char name[MAP_NAME_LENGTH]; //Stores map name } indexes[MAX_MAPINDEX]; diff --git a/src/common/mapindex.h b/src/common/mapindex.h index 3a9ff3537..cd4c09d37 100644 --- a/src/common/mapindex.h +++ b/src/common/mapindex.h @@ -10,6 +10,8 @@ extern char mapindex_cfgfile[80]; //whether to enable auto-adding of maps during run. Not so secure as the map indexes will vary! //#define MAPINDEX_AUTOADD +#define MAX_MAPINDEX 2000 + //Some definitions for the mayor city maps. #define MAP_PRONTERA "prontera" #define MAP_GEFFEN "geffen" diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 4fa21908b..15364ec82 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -6463,53 +6463,48 @@ int atcommand_pettalk(const int fd, struct map_session_data* sd, const char* com return 0; } -/*========================================== - * @users - displays the number of players present on each map (percentage) - *------------------------------------------*/ +/// @users - displays the number of players present on each map (and percentage) +/// #users displays on the target user instead of self int atcommand_users(const int fd, struct map_session_data* sd, const char* command, const char* message) { char buf[256]; - DBMap* users_db; // unsigned int mapindex -> int users + int i; + int users[MAX_MAPINDEX]; int users_all; + struct s_mapiterator* iter; - users_db = uidb_alloc(DB_OPT_BASE); + memset(users, 0, sizeof(users)); users_all = 0; // count users on each map + iter = mapit_getallusers(); + while( true ) { - struct s_mapiterator* iter; - struct map_session_data* sd; + struct map_session_data* sd2 = (struct map_session_data*)mapit_next(iter); + if( sd2 == NULL ) + break;// no more users - iter = mapit_getallusers(); - for( sd = (struct map_session_data*)mapit_first(iter); mapit_exists(iter); sd = (struct map_session_data*)mapit_next(iter) ) - { - int users = (int)uidb_get(users_db,sd->mapindex) + 1; - uidb_put(users_db,(unsigned int)sd->mapindex,(void *)users); - users_all++; - } - mapit_free(iter); + if( sd2->mapindex >= MAX_MAPINDEX ) + continue;// invalid mapindex + + if( users[sd2->mapindex] < INT_MAX ) ++users[sd2->mapindex]; + if( users_all < INT_MAX ) ++users_all; } + mapit_free(iter); // display results for each map + for( i = 0; i < MAX_MAPINDEX; ++i ) { - DBIterator* iter; - DBKey index; - int users; + if( users[i] == 0 ) + continue;// empty - iter = users_db->iterator(users_db); - for( users = (int)iter->first(iter,&index); iter->exists(iter); users = (int)iter->next(iter,&index) ) - { - sprintf(buf,"%s: %d (%d%%)",mapindex_id2name(index.i),users,users * 100 / users_all); - clif_displaymessage(sd->fd,buf); - } - iter->destroy(iter); + safesnprintf(buf, sizeof(buf), "%s: %d (%.2f%%)", mapindex_id2name(i), users[i], (float)(100.0f*users[i]/users_all)); + clif_displaymessage(sd->fd, buf); } // display overall count - sprintf(buf,"all: %d",users_all); - clif_displaymessage(fd,buf); - - users_db->destroy(users_db,NULL); + safesnprintf(buf, sizeof(buf), "all: %d", users_all); + clif_displaymessage(sd->fd, buf); return 0; } -- cgit v1.2.3-70-g09d2