On Thu, 7 Feb 2002, Daniel A. Koepke wrote:
>On Fri, 8 Feb 2002, Kras Kresh wrote:
>
>> > if (!ch->desc || IS_NPC(ch))
>> > return (FALSE);
>> >
>> > if (!cmd && !number(0, 5)) {
>> > do_action(recep, NULL, find_command(action_table[number(0, 8)]), 0);
>> > return (FALSE);
>> > }
>>
>> Ooo... I see now... The first check made it impossible to complete the
>> second.
>
>I'm obviously not seeing what you are. The first check leaves the
>special procedure if the person calling it is an NPC or linkdead PC (as
>is the case with NPC/forced commands, or NPC activity calls); the second
>checks if the special procedure has been invoked by something other than
>a command or NPC activity (i.e., fighting).
I was a little confused too so I investigated:
Situation 1: Somebody typed a command.
!ch->desc -> passes (as in: we continue the function)
IS_NPC(ch) -> passes
!cmd -> fails (as in: we don't do anything/abort the function)
So nothing gets done there.
Situation 2: Random mobile activity.
!ch->desc -> fails
IS_NPC(ch) -> fails
Why? Because a random mobile activity uses the mobile itself for the
victim (mobact.c):
/* Examine call for special procedure */
if (MOB_FLAGGED(ch, MOB_SPEC) && !no_specials) {
if (mob_index[GET_MOB_RNUM(ch)].func == NULL) {
log("SYSERR: %s (#%d): Attempting to call non-existing mob function.",
GET_NAME(ch), GET_MOB_VNUM(ch));
REMOVE_BIT(MOB_FLAGS(ch), MOB_SPEC);
} else {
char actbuf[MAX_INPUT_LENGTH] = "";
if ((mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, actbuf))
continue; /* go to next char */
}
}
--
George Greer
greerga@circlemud.org
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT