Crossfire Server, Branch 1.12  R12190
c_party.c
Go to the documentation of this file.
00001 /*
00002  * static char *rcsid_c_party_c =
00003  *   "$Id: c_party.c 11876 2009-06-14 19:42:19Z akirschbaum $";
00004  */
00005 
00006 /*
00007     CrossFire, A Multiplayer game for X-windows
00008 
00009     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
00010     Copyright (C) 1992 Frank Tore Johansen
00011 
00012     This program is free software; you can redistribute it and/or modify
00013     it under the terms of the GNU General Public License as published by
00014     the Free Software Foundation; either version 2 of the License, or
00015     (at your option) any later version.
00016 
00017     This program is distributed in the hope that it will be useful,
00018     but WITHOUT ANY WARRANTY; without even the implied warranty of
00019     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020     GNU General Public License for more details.
00021 
00022     You should have received a copy of the GNU General Public License
00023     along with this program; if not, write to the Free Software
00024     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00025 
00026     The authors can be reached via e-mail at crossfire-devel@real-time.com
00027 */
00028 
00034 #include <global.h>
00035 #ifndef __CEXTRACT__
00036 #include <sproto.h>
00037 #endif
00038 #include <spells.h>
00039 
00040 static partylist *firstparty = NULL; 
00041 static partylist *lastparty = NULL;  
00048 partylist *get_firstparty(void) {
00049     return firstparty;
00050 }
00051 
00052 void remove_party(partylist *target_party);
00053 
00065 partylist *form_party(object *op, const char *params) {
00066     partylist *newparty;
00067 
00068     if (op->contr->party != NULL) {
00069         char buf[MAX_BUF];
00070 
00071         snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, op->contr->party->partyname);
00072         send_party_message(op, buf);
00073     }
00074     newparty = (partylist *)malloc(sizeof(partylist));
00075     newparty->partyname = strdup_local(params);
00076     replace_unprintable_chars(newparty->partyname);
00077     newparty->total_exp = 0;
00078     newparty->kills = 0;
00079     newparty->passwd[0] = '\0';
00080     newparty->next = NULL;
00081     newparty->partyleader = strdup_local(op->name);
00082     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00083                          "You have formed party: %s",
00084                          "You have formed party: %s",
00085                          newparty->partyname);
00086     op->contr->party = newparty;
00087 
00088     if (lastparty) {
00089         lastparty->next = newparty;
00090         lastparty = lastparty->next;
00091     } else {
00092         firstparty = newparty;
00093         lastparty = firstparty;
00094     }
00095 
00096     return newparty;
00097 }
00098 
00106 void remove_party(partylist *target_party) {
00107     partylist *tmpparty;
00108     partylist *previousparty;
00109     partylist *nextparty;
00110     player *pl;
00111 
00112     if (firstparty == NULL) {
00113         LOG(llevError, "remove_party(): I was asked to remove party %s, but no parties are defined\n",
00114             target_party->partyname);
00115         return;
00116     }
00117     for (pl = first_player; pl != NULL; pl = pl->next)
00118         if (pl->party == target_party)
00119             pl->party = NULL;
00120 
00121     /* special case-ism for parties at the beginning and end of the list */
00122     if (target_party == firstparty) {
00123         if (lastparty == target_party)
00124             lastparty = NULL;
00125         firstparty = firstparty->next;
00126         if (target_party->partyleader)
00127             free(target_party->partyleader);
00128         if (target_party->partyname)
00129             free(target_party->partyname);
00130         free(target_party);
00131         return;
00132     } else if (target_party == lastparty) {
00133         for (tmpparty = firstparty; tmpparty->next != NULL; tmpparty = tmpparty->next) {
00134             if (tmpparty->next == target_party) {
00135                 lastparty = tmpparty;
00136                 if (target_party->partyleader)
00137                     free(target_party->partyleader);
00138                 if (target_party->partyname)
00139                     free(target_party->partyname);
00140                 free(target_party);
00141                 lastparty->next = NULL;
00142                 return;
00143             }
00144         }
00145     }
00146     for (tmpparty = firstparty; tmpparty->next != NULL; tmpparty = tmpparty->next)
00147         if (tmpparty->next == target_party) {
00148             previousparty = tmpparty;
00149             nextparty = tmpparty->next->next;
00150             /* this should be safe, because we already dealt with the lastparty case */
00151 
00152             previousparty->next = nextparty;
00153             if (target_party->partyleader)
00154                 free(target_party->partyleader);
00155             if (target_party->partyname)
00156                 free(target_party->partyname);
00157             free(target_party);
00158             return;
00159         }
00160 }
00161 
00165 void obsolete_parties(void) {
00166     int player_count;
00167     player *pl;
00168     partylist *party;
00169     partylist *next = NULL;
00170 
00171     if (!firstparty)
00172         return; /* we can't obsolete parties if there aren't any */
00173     for (party = firstparty; party != NULL; party = next) {
00174         next = party->next;
00175         player_count = 0;
00176         for (pl = first_player; pl != NULL; pl = pl->next)
00177             if (pl->party == party)
00178                 player_count++;
00179         if (player_count == 0)
00180             remove_party(party);
00181     }
00182 }
00183 
00184 #ifdef PARTY_KILL_LOG
00185 
00197 void add_kill_to_party(partylist *party, const char *killer, const char *dead, long exp) {
00198     int i, pos;
00199 
00200     if (party == NULL)
00201         return;
00202     if (party->kills >= PARTY_KILL_LOG) {
00203         pos = PARTY_KILL_LOG-1;
00204         for (i = 0; i < PARTY_KILL_LOG-1; i++)
00205             memcpy(&(party->party_kills[i]), &(party->party_kills[i+1]), sizeof(party->party_kills[0]));
00206     } else
00207         pos = party->kills;
00208     party->kills++;
00209     party->total_exp += exp;
00210     party->party_kills[pos].exp = exp;
00211     strncpy(party->party_kills[pos].killer, killer, MAX_NAME);
00212     strncpy(party->party_kills[pos].dead, dead, MAX_NAME);
00213     party->party_kills[pos].killer[MAX_NAME] = 0;
00214     party->party_kills[pos].dead[MAX_NAME] = 0;
00215 }
00216 #endif
00217 
00228 int confirm_party_password(object *op) {
00229     partylist *tmppartylist;
00230 
00231     for (tmppartylist = firstparty; tmppartylist != NULL; tmppartylist = tmppartylist->next) {
00232         if (!strcmp(op->contr->party_to_join->partyname, tmppartylist->partyname)) {
00233             if (strcmp(op->contr->write_buf+1, tmppartylist->passwd) == 0)
00234                 return 0;
00235             else
00236                 return 1;
00237         }
00238     }
00239     return 1;
00240 }
00241 
00248 void receive_party_password(object *op) {
00249 
00250     if (confirm_party_password(op) == 0) {
00251         partylist *joined_party = op->contr->party_to_join;
00252         char buf[MAX_BUF];
00253 
00254         if (op->contr->party != NULL) {
00255             snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, op->contr->party->partyname);
00256             send_party_message(op, buf);
00257         }
00258         op->contr->party = op->contr->party_to_join;
00259         op->contr->party_to_join = NULL;
00260         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00261                              "You have joined party: %s\n",
00262                              "You have joined party: %s\n",
00263                              joined_party->partyname);
00264         snprintf(buf, MAX_BUF, "%s joins party %s", op->name, joined_party->partyname);
00265         send_party_message(op, buf);
00266         op->contr->state = ST_PLAYING;
00267         return;
00268     } else {
00269         draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00270                       "You entered the wrong password", NULL);
00271         op->contr->party_to_join = NULL;
00272         op->contr->state = ST_PLAYING;
00273         return;
00274     }
00275 }
00276 
00285 void send_party_message(object *op, char *msg) {
00286     player *pl;
00287 
00288     for (pl = first_player; pl != NULL; pl = pl->next)
00289         if (pl->ob->contr->party == op->contr->party && pl->ob != op)
00290             draw_ext_info(NDI_WHITE, 0, pl->ob, MSG_TYPE_COMMUNICATION, MSG_TYPE_COMMUNICATION_PARTY,
00291                           msg, NULL);
00292 }
00293 
00304 int command_gsay(object *op, char *params) {
00305     char party_params[MAX_BUF];
00306 
00307     if (!params) {
00308         draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR, "Say what?", NULL);
00309         return 0;
00310     }
00311     strcpy(party_params, "say ");
00312     strcat(party_params, params);
00313     command_party(op, party_params);
00314     return 0;
00315 }
00316 
00323 static void party_help(object *op) {
00324     draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_HELP,
00325                   "To form a party type: party form <partyname>. "
00326                   "To join a party type: party join <partyname> "
00327                   "If the party has a passwd, it will you prompt you for it. "
00328                   "For a list of current parties type: party list. "
00329                   "To leave a party type: party leave "
00330                   "To change a passwd for a party type: party passwd <password> "
00331                   "There is an 8 character maximum password length. "
00332                   "To talk to party members type: party say <msg> "
00333                   "To see who is in your party: party who "
00334 #ifdef PARTY_KILL_LOG
00335                   "To see what you've killed, type: party kills"
00336 #endif
00337                   , NULL);
00338 }
00339 
00350 int command_party(object *op, char *params) {
00351     char buf[MAX_BUF];
00352     partylist *tmpparty, *oldparty;  /* For iterating over linked list */
00353     char *currentparty;   /* For iterating over linked list */
00354 
00355     if (params == NULL) {
00356         if (op->contr->party == NULL) {
00357             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00358                           "You are not a member of any party. "
00359                           "For help try: party help", NULL);
00360         } else {
00361             currentparty = op->contr->party->partyname;
00362             draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00363                                  "You are a member of party %s.",
00364                                  "You are a member of party %s.",
00365                                  currentparty);
00366         }
00367         return 1;
00368     }
00369     if (strcmp(params, "help") == 0) {
00370         party_help(op);
00371         return 1;
00372     }
00373 #ifdef PARTY_KILL_LOG
00374     if (!strncmp(params, "kills", 5)) {
00375         int i, max;
00376         char chr;
00377         char buffer[80];
00378         float exp;
00379 
00380         if (op->contr->party == NULL) {
00381             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00382                           "You are not a member of any party.", NULL);
00383             return 1;
00384         }
00385         tmpparty = op->contr->party;
00386         if (!tmpparty->kills) {
00387             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00388                           "You haven't killed anything yet.", NULL);
00389             return 1;
00390         }
00391         max = tmpparty->kills-1;
00392         if (max > PARTY_KILL_LOG-1)
00393             max = PARTY_KILL_LOG-1;
00394         draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00395                       "[fixed]Killed          |          Killer|     Exp\n----------------+----------------+--------"
00396                       "Killed          |          Killer|     Exp\n----------------+----------------+--------",
00397                       NULL);
00398 
00399 
00400         for (i = 0; i <= max; i++) {
00401             exp = tmpparty->party_kills[i].exp;
00402             chr = ' ';
00403             if (exp > 1000000) {
00404                 exp /= 1000000;
00405                 chr = 'M';
00406             } else if (exp > 1000) {
00407                 exp /= 1000;
00408                 chr = 'k';
00409             }
00410 
00411             draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00412                                  "[fixed]%16s|%16s|%6.1f%c",
00413                                  "%16s|%16s|%6.1f%c",
00414                                  tmpparty->party_kills[i].dead,
00415                                  tmpparty->party_kills[i].killer, exp, chr);
00416 
00417         }
00418         exp = tmpparty->total_exp;
00419         chr = ' ';
00420         if (exp > 1000000) {
00421             exp /= 1000000;
00422             chr = 'M';
00423         } else if (exp > 1000) {
00424             exp /= 1000;
00425             chr = 'k';
00426         }
00427 
00428         draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00429                       "[fixed]----------------+----------------+--------",
00430                       "----------------+----------------+--------");
00431         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00432                              "Totals: %d kills, %.1f%c exp", tmpparty->kills,
00433                              "Totals: %d kills, %.1f%c exp", tmpparty->kills,
00434                              exp, chr);
00435         return 1;
00436     }
00437 #endif /* PARTY_KILL_LOG */
00438     if (strncmp(params, "say ", 4) == 0) {
00439         if (op->contr->party == NULL) {
00440             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00441                           "You are not a member of any party.", NULL);
00442             return 1;
00443         }
00444         params += 4;
00445         currentparty = op->contr->party->partyname;
00446         snprintf(buf, MAX_BUF-1, "<%s> %s says: %s", currentparty, op->name, params);
00447         send_party_message(op, buf);
00448         draw_ext_info_format(NDI_WHITE, 0, op, MSG_TYPE_COMMUNICATION, MSG_TYPE_COMMUNICATION_PARTY,
00449                              "<%s> You say: %s",
00450                              "<%s> You say: %s",
00451                              currentparty, params);
00452         return 1;
00453     }
00454 
00455     if (strncmp(params, "form ", 5) == 0) {
00456         int player_count;
00457         player *pl;
00458 
00459         params += 5;
00460         if (op->contr->party)
00461             oldparty = op->contr->party;
00462         else
00463             oldparty = NULL;
00464 
00465         if (firstparty) {
00466             for (tmpparty = firstparty; tmpparty != NULL; tmpparty = tmpparty->next) {
00467                 if (!strcmp(tmpparty->partyname, params)) {
00468                     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00469                                          "The party %s already exists, pick another name",
00470                                          "The party %s already exists, pick another name",
00471                                          params);
00472                     return 1;
00473                 }
00474             }
00475             form_party(op, params);
00476         } else {
00477             form_party(op, params);
00478         }
00479         /*
00480          * The player might have previously been a member of a party, if so, he will be leaving
00481          * it, so check if there are any other members and if not, delete the party
00482          */
00483         player_count = 0;
00484         if (oldparty) {
00485             for (pl = first_player; pl->next != NULL; pl = pl->next) {
00486                 if (pl->party == oldparty)
00487                     player_count++;
00488             }
00489             if (player_count == 0)
00490                 remove_party(oldparty);
00491         }
00492         return 0;
00493     } /* form */
00494 
00495     if (strcmp(params, "leave") == 0) {
00496         if (op->contr->party == NULL) {
00497             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00498                           "You are not a member of any party.", NULL);
00499             return 1;
00500         }
00501         currentparty = op->contr->party->partyname;
00502         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00503                              "You leave party %s.",
00504                              "You leave party %s.",
00505                              currentparty);
00506         snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, currentparty);
00507         send_party_message(op, buf);
00508         op->contr->party = NULL;
00509         return 1;
00510     }
00511     if (strcmp(params, "who") == 0) {
00512         if (op->contr->party == NULL) {
00513             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00514                           "You are not a member of any party.", NULL);
00515             return 1;
00516         }
00517         list_players(op, NULL, op->contr->party);
00518         return 1;
00519     } /* leave */
00520 
00521     if (strncmp(params, "passwd ", 7) == 0) {
00522         partylist *tmplist;
00523 
00524         params += 7;
00525 
00526         if (op->contr->party == NULL) {
00527             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00528                           "You are not a member of a party", NULL);
00529             return 1;
00530         }
00531 
00532         if (strlen(params) > 8) {
00533             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00534                           "The password must not exceed 8 characters", NULL);
00535             return 1;
00536         }
00537 
00538         tmplist = firstparty;
00539         while (tmplist != NULL) {
00540             if (tmplist == op->contr->party) {
00541                 strcpy(tmplist->passwd, params);
00542                 replace_unprintable_chars(tmplist->passwd);
00543                 draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00544                                      "The password for party %s is %s",
00545                                      "The password for party %s is %s",
00546                                      tmplist->partyname, tmplist->passwd);
00547 
00548                 snprintf(buf, MAX_BUF, "Password for party %s is now %s, changed by %s",
00549                          tmplist->partyname, tmplist->passwd, op->name);
00550                 send_party_message(op, buf);
00551                 return 0;
00552             }
00553             tmplist = tmplist->next;
00554         }
00555         return 0;
00556     } /* passwd */
00557 
00558     if (strcmp(params, "list") == 0) {
00559         partylist *tmplist;
00560 
00561         tmplist = firstparty;
00562 
00563         if (firstparty == NULL) {
00564             draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00565                           "There are no parties active right now", NULL);
00566             return 1;
00567         }
00568 
00569         draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00570                       "[fixed]Party name                       Leader\n----------                       ------",
00571                       "Party name                       Leader\n----------                       ------");
00572 
00573         while (tmplist != NULL) {
00574             draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00575                                  "[fixed]%-32s %s",
00576                                  "%-32s %s",
00577                                  tmplist->partyname, tmplist->partyleader);
00578             tmplist = tmplist->next;
00579         }
00580         return 0;
00581     } /* list */
00582 
00583     if (strncmp(params, "join ", 5) == 0) {
00584         params += 5;
00585 
00586         /* Can't join a party cause non exist */
00587         if (firstparty == NULL) {
00588             draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00589                                  "Party: %s does not exist.  You must form it first",
00590                                  "Party: %s does not exist.  You must form it first",
00591                                  params);
00592             return 1;
00593         }
00594 
00595         /* Special case if thier is only one party */
00596         if (firstparty->next == NULL) {
00597             if (strcmp(firstparty->partyname, params) != 0) {
00598                 draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00599                                      "Party: %s does not exist. You must form it first",
00600                                      "Party: %s does not exist. You must form it first",
00601                                      params);
00602                 return 1;
00603             } else {
00604                 if (op->contr->party == firstparty) {
00605                     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00606                                          "You are already in party: %s",
00607                                          "You are already in party: %s",
00608                                          firstparty->partyname);
00609                     return 1;
00610                 }
00611                 /* found party player wants to join */
00612                 if (firstparty->passwd[0] == '\0') {
00613                     op->contr->party = firstparty;
00614                     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00615                                          "You have joined party: %s",
00616                                          "You have joined party: %s",
00617                                          firstparty->partyname);
00618                     snprintf(buf, MAX_BUF, "%s joins party %s", op->name, firstparty->partyname);
00619                     send_party_message(op, buf);
00620                     return 0;
00621                 } else {
00622                     get_party_password(op, firstparty);
00623                     return 0;
00624                 }
00625             }
00626         }
00627 
00628         tmpparty = firstparty;
00629         while (tmpparty != NULL) {
00630             if (strcmp(tmpparty->partyname, params) == 0) {
00631                 if (op->contr->party == tmpparty) {
00632                     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00633                                          "You are already a member of party: %s",
00634                                          "You are already a member of party: %s",
00635                                          tmpparty->partyname);
00636                     return 1;
00637                 } else {
00638                     if (tmpparty->passwd[0] == '\0') {
00639                         if (op->contr->party != NULL) {
00640                             snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, op->contr->party->partyname);
00641                             send_party_message(op, buf);
00642                         }
00643                         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00644                                              "You have joined party: %s",
00645                                              "You have joined party: %s",
00646                                              tmpparty->partyname);
00647                         op->contr->party = tmpparty;
00648                         snprintf(buf, MAX_BUF, "%s joins party %s", op->name, tmpparty->partyname);
00649                         send_party_message(op, buf);
00650                         return 0;
00651                     } else {
00652                         get_party_password(op, tmpparty);
00653                         return 0;
00654                     }
00655                 }
00656             } else
00657                 tmpparty = tmpparty->next;
00658         }
00659 
00660         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00661                              "Party %s does not exist.  You must form it first.",
00662                              "Party %s does not exist.  You must form it first.",
00663                              params);
00664         return 1;
00665     } /* join */
00666 
00667     party_help(op);
00668     return 1;
00669 }
00670 
00672 static const char *rejoin_modes[] = {
00673     "no",
00674     "if_exists",
00675     "always",
00676     NULL
00677 };
00678 
00688 int command_party_rejoin(object *op, char *params) {
00689     int mode;
00690 
00691     if (!params) {
00692         draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00693                              "party rejoin: %s", NULL, rejoin_modes[op->contr->rejoin_party]);
00694         return 1;
00695     }
00696     for (mode = 0; rejoin_modes[mode] != NULL; mode++) {
00697         if (strcmp(rejoin_modes[mode], params) == 0) {
00698             op->contr->rejoin_party = mode;
00699             draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_SUCCESS,
00700                                  "party rejoin is now: %s", NULL, rejoin_modes[op->contr->rejoin_party]);
00701             return 1;
00702         }
00703     }
00704     if (strlen(params) > 50)
00705         params[50] = '\0';
00706     draw_ext_info_format(NDI_UNIQUE, 0, op, MSG_TYPE_COMMAND, MSG_TYPE_COMMAND_ERROR,
00707                          "invalid mode: %s", NULL, params);
00708     return 1;
00709 }