Added xwho, xmwho, xwhoid, xmwhoid, lwhoid, mwhoid, and nwho
authornveid <nveid@cobramush.org>
Mon, 9 Apr 2007 06:06:05 +0000 (06:06 +0000)
committerAri Johnson <ari@theari.com>
Thu, 24 Mar 2011 15:58:45 +0000 (15:58 +0000)
(cherry picked from commit e5185aeec361f5823d1a2921481d1fc24e6cfd01)

game/txt/changes/0.73
game/txt/hlp/cobra_func.hlp
src/bsd.c
src/console.c
src/function.c
win32/funs.h

index 2c7e9e71ca9016df6bab46b8b5ff8c1cf1e7c92b..7ce81afb316f9df325cc3d506dc517a9fb1c17ff 100644 (file)
@@ -181,4 +181,6 @@ CobraMUSH Version 0.73
    * Add Speak(). [RLB]
    * Added namelist(). [RLB]
    * Added stringsecs(). [RLB]
+   * Added nwho(), xwho(), xmwho(), xwhoid(), xmwhoid(). [RLB]
+   * Added mwhoid(), lwhoid(). [RLB]
 
index e6da2e573db514a09f1cf48699d85a6716510fdb..dbc52f2fc9b914d5caaa768c754b1dfa6686ced4 100644 (file)
   connection as indicated by WHO. 
 
   The caller can use the function on himself, but using on any other
-  player requires privileged power such as Wizard, Royalty or SEE_ALL.
+  player requires special powers.
 
   See also: Connection Functions
 & SENT()
@@ -2237,16 +2237,21 @@ for an object named "Test", preferring a thing over other types.
   function.
 & LWHO()
   lwho()
+  lwho(<viewer>)
+  lwhoid(<viewer>)
 
-  This returns a list of the dbref numbers for all currently-connected
+  lwho() returns a list of the dbref numbers for all currently-connected
   players. When mortals use this function, the dbref numbers of DARK
-  directors or royalty do NOT appear on the dbref list.
+  privileged players do NOT appear on the dbref list.
 
   If lwho() is given an argument, and used by an object that can see
   DARK and Hidden players, lwho() returns the output of lwho() from
   <viewer>'s point of view.
 
-  See also: mwho()
+  lwohid() returns a list of objid's instead.
+
+See also: mwho(), xwho()
+
 & MAP()
   map([<object>/]<attribute>,<list>[,<delim>][, <osep>])
   
@@ -2506,11 +2511,15 @@ for an object named "Test", preferring a thing over other types.
   See also: anonymous attributes
 & MWHO()
   mwho()
+  mwhoid()
 
   This returns a list of the dbref numbers for all current-connected,
   non-hidden players. It's exactly the same as lwho() used by a
   mortal, and is suitable for use on privileged global objects who
   need an unprivileged who-list.
+
+  mwhoid() gives a list of objids instead of dbrefs.
+
 & ALIAS()
   alias(<player>[,<new alias>])
 
@@ -2644,6 +2653,14 @@ for an object named "Test", preferring a thing over other types.
 
   Returns the dbref number of the object, which must be in the same 
   room as the object executing num.
+& NWHO()
+  nwho()
+
+  This returns a count of all currently-connected players. When
+  mortals use this function, DARK privileged players are NOT counted.
+
+See also: lwho(), nmwho(), xwho()
+
 & OBJ()
   obj(<object>)
 
@@ -4563,6 +4580,25 @@ See also: timestring(), etimefmt()
   inputs is equivalent to true(1).  See BOOLEAN VALUES.
 
   See also: and(), or(), not(), nor()
+& XWHO()
+  xwho(<start>, <count>)
+  xmwho(<start>, <count>)
+  xwhoid(<start>, <count>)
+  xmwhoid(<start>, <count>)
+
+  xwho() fetches <count> or fewer player dbrefs from the list of connected
+  players. It is useful when the number of players connected causes lwho()
+  or pemits in +who $-commands to exceed buffer limits.
+
+  It is equivalent to extract(lwho(),<start>,<count>).
+
+  xmwho() is identical, except it is limited to non-DARK and non-HIDE
+  players.
+
+  xwhoid() and xmwhoid() return objids instead of dbrefs.
+
+See also: lwho(), mwho(), nwho()
+
 & ZEMIT()
   zemit(<zone>, <message>)
   nszemit(<zone>, <message>)
index 39a3f0176d13efa7fb4543b86158212194aa25a4..cf2efce3dc6838d1d3a7e9ed51ac821017e10250 100644 (file)
--- a/src/bsd.c
+++ b/src/bsd.c
@@ -3860,15 +3860,31 @@ visible_short_page(dbref player, const char *match)
 
 /* LWHO() function - really belongs elsewhere but needs stuff declared here */
 
+FUNCTION(fun_nwho) {
+  DESC *d;
+  int count = 0;
+  int powered = (*(called_as + 1) != 'M') && Priv_Who(executor);
+
+  DESC_ITER_CONN(d) {
+    if (!Hidden(d) || (powered && CanSee(executor, d->player)))
+      count++;
+  }
+  safe_integer(count, buff, bp);
+}
+
 /* ARGSUSED */
 FUNCTION(fun_lwho)
 {
   DESC *d;
   dbref victim;
-  int first, powered = (*called_as == 'L') && Priv_Who(executor);
+  int first;
+  int start, count;
+  int powered = !(strchr(called_as, 'M') != NULL) && Priv_Who(executor);
+  int xwho = *called_as == 'X';
+  int objid = strchr(called_as, 'D') != NULL;
 
   first = 1;
-  if(nargs && args[0] && *args[0]) {
+  if(!xwho && nargs && args[0] && *args[0]) {
     if(!powered) {
       safe_str(T(e_perm), buff, bp);
       return;
@@ -3885,14 +3901,41 @@ FUNCTION(fun_lwho)
     if(!Priv_Who(victim))
       powered = 0;
   } else victim = executor;
-  
+  if(xwho) {
+      if (!is_strict_integer(args[0]) || !is_strict_integer(args[1])) {
+       safe_str(T(e_int), buff, bp);
+       return;
+      }
+
+    start = parse_integer(args[0]) - 1;
+    count = parse_integer(args[1]);
+    /* Reset values to be in range if they're not */
+    if(start < 0)
+      start = 0;
+    if(count < 1)
+      count = 1;
+  }
+
   DESC_ITER_CONN(d) {
     if (!Hidden(d) || (powered && CanSee(victim,d->player))) {
+      if(xwho && start) {
+       start--;
+       continue;
+      } else if(xwho && !count)
+       break;
+      else if(xwho && count)
+       count--;
+
       if (first)
        first = 0;
       else
        safe_chr(' ', buff, bp);
       safe_dbref(d->player, buff, bp);
+      if(objid) {
+       safe_chr(':', buff, bp);
+       safe_integer(CreTime(d->player), buff, bp);
+      }
     }
   }
 }
index f521202af2339b6e2b2c545601323b563d13fa62..07c95882ee545ffafbbc54ab7c4898fa96042e22 100644 (file)
@@ -3143,6 +3143,9 @@ visible_short_page(dbref player, const char *match)
 
 /* LWHO() function - really belongs elsewhere but needs stuff declared here */
 
+FUNCTION(fun_nwho) {
+}
+
 /* ARGSUSED */
 FUNCTION(fun_lwho)
 {
index 398f04063784043685c94c069e5e3945f20d8567..9a20512299af0f636a13a29928a7ce8a0f9d0b13 100644 (file)
@@ -467,6 +467,7 @@ FUNTAB flist[] = {
   {"LVPLAYERS", fun_dbwalker, 1, 1, FN_REG},
   {"LVTHINGS", fun_dbwalker, 1, 1, FN_REG},
   {"LWHO", fun_lwho, 0, 1, FN_REG},
+  {"LWHOID", fun_lwho, 0, 1, FN_REG},
   {"MAIL", fun_mail, 0, 2, FN_REG},
   {"MAILFROM", fun_mailfrom, 1, 2, FN_REG},
   {"MAILSTATS", fun_mailstats, 1, 1, FN_REG},
@@ -494,6 +495,7 @@ FUNTAB flist[] = {
   {"MUL", fun_mul, 2, INT_MAX, FN_REG},
   {"MUNGE", fun_munge, 3, 5, FN_REG},
   {"MWHO", fun_lwho, 0, 0, FN_REG},
+  {"MWHOID", fun_lwho, 0, 0, FN_REG},
   {"NAME", fun_name, 0, 2, FN_REG},
   {"NAMEGRAB", fun_namegrab, 2, 3, FN_REG},
   {"NAMEGRABALL", fun_namegraball, 2, 3, FN_REG},
@@ -526,6 +528,8 @@ FUNTAB flist[] = {
   {"NSPEMIT", fun_pemit, 2, -2, FN_REG},
   {"NSREMIT", fun_remit, 2, -2, FN_REG},
   {"NSZEMIT", fun_zemit, 2, -2, FN_REG},
+  {"NWHO", fun_nwho, 0, 0, FN_REG},
+  {"NMWHO", fun_nwho, 0, 0, FN_REG},
   {"NUM", fun_num, 1, 1, FN_REG},
   {"NULL", fun_null, 1, INT_MAX, FN_REG},
   {"OBJ", fun_obj, 1, 1, FN_REG},
@@ -693,6 +697,10 @@ FUNTAB flist[] = {
   {"XVEXITS", fun_dbwalker, 3, 3, FN_REG},
   {"XVPLAYERS", fun_dbwalker, 3, 3, FN_REG},
   {"XVTHINGS", fun_dbwalker, 3, 3, FN_REG},
+  {"XWHO", fun_lwho, 2, 2, FN_REG},
+  {"XWHOID", fun_lwho, 2, 2, FN_REG},
+  {"XMWHO", fun_lwho, 2, 2, FN_REG},
+  {"XMWHOID", fun_lwho, 2, 2, FN_REG},
   {"ZEMIT", fun_zemit, 2, -2, FN_REG},
   {"ZFUN", fun_zfun, 1, 11, FN_REG},
   {"ZONE", fun_zone, 1, 2, FN_REG},
index 591c3290485ee05c7ab07fa8015dff5c0dfbf0dc..8f2cfb36b9a6becdcc8af033b745287d10640707 100644 (file)
@@ -227,6 +227,7 @@ FUNCTION_PROTO(fun_nor);
 FUNCTION_PROTO(fun_not);
 FUNCTION_PROTO(fun_null);
 FUNCTION_PROTO(fun_num);
+FUNCTION_PROTO(fun_nwho);
 FUNCTION_PROTO(fun_obj);
 FUNCTION_PROTO(fun_objeval);
 FUNCTION_PROTO(fun_objid);