[CODE] A newbie implementor wonders about AFK...

From: Tony Robbins (tonyr@NWPACLINK.COM)
Date: 07/29/97


Hi, I have decided to make a MUD and now that I have my box on T1, I'm
starting to prepare.  My first question for this mailing list is:

Has anyone used the AFK code from the CircleMUD snippets site (Great
one, Alex!) which allows the player to leave a message when AFK?  If so,
you may have encountered the same bug as I.

When a player goes AFK it's fine, when they come back it's fine, but if
they go AFK again, BUG!!!  MUD crash.  I'm not great with coding, I'm
just trying to get something going that my friends and I and others can
enjoy.

Here is the code, perhaps some of you can help me?

---  BEGIN SNIPPET ---
Date: Sun, 16 Feb 1997 18:17:49 -0800 (PST)
From: Rasdan <thomajam@ucs.orst.edu>
To: CircleMUD List <circle@cspo.queensu.ca>
Subject: [Code] New AFK command

Hey all,

   Here is my version of an AFK command.

   FEATURES:
        * Allows you to set an afk message.
        * Allows a message to be displayed to whoever is telling to you
          that you are afk, and what that message is.
        * Displays to the room your message when you are afk, and
informs
          everyone in the room when you are back from AFK.

Here it is:
In structs.h,

#define PRF_AFK         (1 << ##)       /* Player is AFK */
   where ## is whatever is next on your PRF listing.

In char_player_data, add:
   char *afk_message;  /* PC / NPC's AFK MESSAGE                */

In char_file_u, add:
   char afk_message[POOF_LENGTH + 1];


------------------------ NOTE: THIS WILL CORRUPT YOUR PFILE!
---------------
With the function prototypes at the top of utils.h, add:
void    set_afk(struct char_data *ch, char *afk_message);

 with the POOFIN(ch) defines, put
#define GET_AFK(ch)     ((ch)->player.afk_message)

If you want it to save in pfile, you will need to modify the character
saving/loading functions in db.c


In limits.c, add:

void set_afk(struct char_data * ch, char *afk_message)
{

if (strlen(afk_message) > POOF_LENGTH)
        afk_message[POOF_LENGTH] = '\0';

        if (GET_AFK(ch) != NULL)
                free(GET_AFK(ch));

        GET_AFK(ch) = str_dup(afk_message);
}


In act.other.c, put this:

ACMD(do_afk)
{
        long result;

        if (IS_NPC(ch))
                return;

        skip_spaces(&argument);

        if (!*argument)
        {
           result = PRF_TOG_CHK(ch, PRF_AFK);
           GET_AFK(ch) = "I am AFK!";
        }
else
        {
           result = PRF_TOG_CHK(ch, PRF_AFK);
           set_afk(ch, argument);
        }

           if (result)
           {
             sprintf(buf, "%s has just gone AFK: %s\r\n", GET_NAME(ch),
                        GET_AFK(ch));
             send_to_room(buf, ch->in_room);
           }
  else
          {
             sprintf(buf, "%s is back from AFK!\r\n", GET_NAME(ch));
             send_to_room(buf, ch->in_room);
          }


        return;
}

In act.comm.c, in ACMD(do_tell)

after
  else if (PRF_FLAGGED(vict, PRF_NOTELL) || ROOM_FLAGGED(vict->in_room,
ROOM_SOUNDPROOF))
    act("$E can't hear you.", FALSE, ch, 0, vict, TO_CHAR | TO_SLEEP);

add:

  else
  {
  if (PRF_FLAGGED(vict, PRF_AFK)) {
        sprintf(buf, "%s is AFK and may not hear your tell.\r\n",
GET_NAME(vict));
        send_to_char(buf, ch);
        sprintf(buf, "MESSAGE: %s\r\n", GET_AFK(vict));
        send_to_char(buf, ch);

       }


In act.informative.c, in list_one_char, after:

  if (PLR_FLAGGED(i, PLR_WRITING))
    strcat(buf, " [COMPOSING]");  <---- I think it's (Composing) in
stock Circle

add:

  if (PRF_FLAGGED(i, PRF_AFK))
    strcat(buf, " [AFK]");


In do_who after
      if (PRF_FLAGGED(tch, PRF_NOTELL))
        strcat(buf, " [NO-TELLS]");  <---- Think it is (No-Tell) in
stock Circle

      if (PRF_FLAGGED(tch, PRF_AFK))
        strcat(buf, " [AFK]");


In comm.c, in make_prompt,


before:

    if (PRF_FLAGGED(d->character, PRF_DISPHP))
      sprintf(prompt, "%s%s<%dhp ", prompt,
                CBBLU(d->character,C_SPR),GET_HIT(d->character));

add:

    if (PRF_FLAGGED(d->character, PRF_AFK))
      sprintf(prompt, "%s%s[AFK]%s", prompt, CBCYN(d->character, C_SPR),

                CCNRM(d->character, C_SPR));


That should be it!

As always, if you have any questions at all, contact me at:

thomajam@ucs.orst.edu

Rasdan


         =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
                           James C. Thomas Jr.

--- END SNIPPET ---
I'd appreciate help and I'm glad to be on the mailing list!
-Tony Robbins A.K.A. Belgarath


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST