summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt4
-rw-r--r--conf-tmpl/atcommand_athena.conf4
-rw-r--r--src/map/atcommand.c75
-rw-r--r--src/map/clif.c10
4 files changed, 58 insertions, 35 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index e6410a1bb..3e5f2bb8d 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,10 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/04/05
+ * Cleaned @whogm. It will display the name of all gms online. If their GM
+ level is above your own, it will only display their name, otherwise level,
+ position, and party/guild info is displayed. GM's using gm-hide will not
+ appear on this list.
* Corrected song/dances/encores reducing SP at the incorrect intervals
(either never, or every second).
2007/04/04
diff --git a/conf-tmpl/atcommand_athena.conf b/conf-tmpl/atcommand_athena.conf
index 83d5783b7..0f2f43c7d 100644
--- a/conf-tmpl/atcommand_athena.conf
+++ b/conf-tmpl/atcommand_athena.conf
@@ -229,7 +229,9 @@ whomap2: 20
// Returns list of logged in characters with their party/guild in a specifical map.
whomap3: 20
-// Like @who+@who2+who3, but only for GM.
+// Displays GMs online. For those who are higher GM level than yourself,
+// only the name is shown, for the rest, it displays the same info of
+// @who+@who2+who3
whogm: 20
// Displays a sorted list of the ammount of zeny each conected player has at hand.
diff --git a/src/map/atcommand.c b/src/map/atcommand.c
index 15057e75e..f77d04044 100644
--- a/src/map/atcommand.c
+++ b/src/map/atcommand.c
@@ -1877,25 +1877,21 @@ int atcommand_whomap(const int fd, struct map_session_data* sd, const char* comm
*/
int atcommand_whogm(const int fd, struct map_session_data* sd, const char* command, const char* message)
{
- char temp0[100];
- char temp1[100];
struct map_session_data *pl_sd, **pl_allsd;
int i, j, count, users;
int pl_GM_level, GM_level;
- char match_text[100];
+ char match_text[200];
char player_name[NAME_LENGTH];
struct guild *g;
struct party_data *p;
nullpo_retr(-1, sd);
- memset(temp0, '\0', sizeof(temp0));
- memset(temp1, '\0', sizeof(temp1));
memset(atcmd_output, '\0', sizeof(atcmd_output));
memset(match_text, '\0', sizeof(match_text));
memset(player_name, '\0', sizeof(player_name));
- if (sscanf(message, "%99[^\n]", match_text) < 1)
+ if (sscanf(message, "%199[^\n]", match_text) < 1)
strcpy(match_text, "");
for (j = 0; match_text[j]; j++)
match_text[j] = TOLOWER(match_text[j]);
@@ -1904,35 +1900,46 @@ int atcommand_whogm(const int fd, struct map_session_data* sd, const char* comma
GM_level = pc_isGM(sd);
pl_allsd = map_getallusers(&users);
for (i = 0; i < users; i++) {
- if ((pl_sd = pl_allsd[i])) {
- pl_GM_level = pc_isGM(pl_sd);
- if (pl_GM_level > 0) {
- if (!((battle_config.hide_GM_session || (pl_sd->sc.option & OPTION_INVISIBLE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level
- memcpy(player_name, pl_sd->status.name, NAME_LENGTH);
- for (j = 0; player_name[j]; j++)
- player_name[j] = TOLOWER(player_name[j]);
- if (strstr(player_name, match_text) != NULL) { // search with no case sensitive
- sprintf(atcmd_output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y);
- clif_displaymessage(fd, atcmd_output);
- sprintf(atcmd_output, " BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.base_level, job_name(pl_sd->status.class_), pl_sd->status.job_level);
- clif_displaymessage(fd, atcmd_output);
- g = guild_search(pl_sd->status.guild_id);
- if (g == NULL)
- sprintf(temp1, "None");
- else
- sprintf(temp1, "%s", g->name);
- p = party_search(pl_sd->status.party_id);
- if (p == NULL)
- sprintf(temp0, "None");
- else
- sprintf(temp0, "%s", p->party.name);
- sprintf(atcmd_output, " Party: '%s' | Guild: '%s'", temp0, temp1);
- clif_displaymessage(fd, atcmd_output);
- count++;
- }
- }
- }
+ pl_sd = pl_allsd[i];
+ pl_GM_level = pc_isGM(pl_sd);
+ if (!pl_GM_level)
+ continue;
+ if (pl_sd->sc.option & OPTION_INVISIBLE)
+ continue;
+
+ if (match_text[0])
+ {
+ memcpy(player_name, pl_sd->status.name, NAME_LENGTH);
+ for (j = 0; player_name[j]; j++)
+ player_name[j] = TOLOWER(player_name[j]);
+ // search with no case sensitive
+ if (strstr(player_name, match_text) == NULL)
+ continue;
}
+ if (pl_GM_level > GM_level) {
+ sprintf(atcmd_output, "Name: %s (GM)", pl_sd->status.name);
+ clif_displaymessage(fd, atcmd_output);
+ continue;
+ }
+
+ sprintf(atcmd_output, "Name: %s (GM:%d) | Location: %s %d %d",
+ pl_sd->status.name, pl_GM_level,
+ mapindex_id2name(pl_sd->mapindex), pl_sd->bl.x, pl_sd->bl.y);
+ clif_displaymessage(fd, atcmd_output);
+
+ sprintf(atcmd_output, " BLvl: %d | Job: %s (Lvl: %d)",
+ pl_sd->status.base_level,
+ job_name(pl_sd->status.class_), pl_sd->status.job_level);
+ clif_displaymessage(fd, atcmd_output);
+
+ p = party_search(pl_sd->status.party_id);
+ g = guild_search(pl_sd->status.guild_id);
+
+ sprintf(atcmd_output," Party: '%s' | Guild: '%s'",
+ p?p->party.name:"None", g?g->name:"None");
+
+ clif_displaymessage(fd, atcmd_output);
+ count++;
}
if (count == 0)
diff --git a/src/map/clif.c b/src/map/clif.c
index 4844f0ac5..366fdbec9 100644
--- a/src/map/clif.c
+++ b/src/map/clif.c
@@ -941,18 +941,28 @@ static int clif_set0078(struct block_list *bl, struct view_data *vd, unsigned ch
}
WBUFW(buf,14)=vd->class_;
WBUFW(buf,16)=vd->hair_style; //Required for pets.
+ //18W: Weapon
WBUFW(buf,20)=vd->head_bottom; //Pet armor
if (bl->type == BL_NPC && vd->class_ == FLAG_CLASS)
{ //The hell, why flags work like this?
WBUFL(buf,22)=emblem_id;
WBUFL(buf,26)=guild_id;
}
+ //22W: shield
+ //24W: Head top
+ //26W: Head mid
+ //28W: Hair color
+ //30W: Clothes color
WBUFW(buf,32)=dir;
WBUFL(buf,34)=guild_id;
WBUFL(buf,38)=emblem_id;
+ //42W: Manner
+ //44B: Karma
+ //45B: Sex
WBUFPOS(buf,46,bl->x,bl->y,dir);
WBUFB(buf,49)=5;
WBUFB(buf,50)=5;
+ //51BL Sit/Stand
WBUFW(buf,52)=clif_setlevel(lv);
return packet_len(0x78);
}