Crossfire Server  1.75.0
party.cpp
Go to the documentation of this file.
1 /*
2  * Crossfire -- cooperative multi-player graphical RPG and adventure game
3  *
4  * Copyright (c) 1999-2014 Mark Wedel and the Crossfire Development Team
5  * Copyright (c) 1992 Frank Tore Johansen
6  *
7  * Crossfire is free software and comes with ABSOLUTELY NO WARRANTY. You are
8  * welcome to redistribute it under certain conditions. For details, please
9  * see COPYING and LICENSE.
10  *
11  * The authors can be reached via e-mail at <crossfire@metalforge.org>.
12  */
13 
19 #include "global.h"
20 
21 #include <stdlib.h>
22 #include <string.h>
23 
24 #include "sproto.h"
25 
26 static partylist *firstparty = NULL;
27 static partylist *lastparty = NULL;
40 partylist *party_form(object *op, const char *partyname) {
41  partylist *party;
42  char buf[MAX_BUF];
43 
44  strlcpy(buf, partyname, sizeof(buf));
46 
47  if (party_find(buf) != NULL)
48  return NULL;
49 
50  party_leave(op);
51  party = (partylist *)malloc(sizeof(partylist));
52  party->partyname = strdup_local(buf);
53 #ifdef PARTY_KILL_LOG
54  party->total_exp = 0;
55  party->kills = 0;
56 #endif
57  party->passwd[0] = '\0';
58  party->next = NULL;
59  party->partyleader = strdup_local(op->name);
61  "You have formed party: %s",
62  party->partyname);
63  op->contr->party = party;
64 
65  if (lastparty) {
66  lastparty->next = party;
67  lastparty = lastparty->next;
68  } else {
69  firstparty = party;
70  lastparty = firstparty;
71  }
72 
73  return party;
74 }
75 
85 void party_join(object *op, partylist *party) {
86  char buf[MAX_BUF];
87 
88  if (op->contr->party == party) {
90  "You are already a member of party: %s",
91  party->partyname);
92  return;
93  }
94 
95  party_leave(op);
96 
97  op->contr->party = party;
99  "You have joined party: %s\n",
100  party->partyname);
101  snprintf(buf, MAX_BUF, "%s joins party %s", op->name, party->partyname);
102  party_send_message(op, buf);
103 }
104 
108 static void remove_if_unused(partylist *party) {
109  for (player *pl = first_player; pl != NULL; pl = pl->next) {
110  if (pl->party == party)
111  return;
112  }
113  party_remove(party);
114 }
115 
123 void party_leave(object *op) {
124  char buf[MAX_BUF];
125 
126  partylist *party = op->contr->party;
127  if (party == NULL) {
128  return;
129  }
130 
132  "You leave party %s.",
133  party->partyname);
134  snprintf(buf, sizeof(buf), "%s leaves party %s.", op->name, party->partyname);
135  party_send_message(op, buf);
136  op->contr->party = NULL;
137  remove_if_unused(party);
138 }
139 
148 partylist *party_find(const char *partyname) {
149  partylist *party;
150 
151  for (party = firstparty; party; party = party->next) {
152  if (strcmp(party->partyname, partyname) == 0)
153  return party;
154  }
155  return NULL;
156 }
157 
164 void party_remove(partylist *party) {
165  partylist *previousparty;
166  partylist **walk;
167  player *pl;
168 
169  previousparty = NULL;
170  for (walk = &firstparty; *walk != NULL; walk = &(*walk)->next) {
171  if (*walk == party) {
172  if (party == lastparty)
173  lastparty = previousparty;
174  *walk = party->next;
175  for (pl = first_player; pl != NULL; pl = pl->next) {
176  if (pl->party == party)
177  pl->party = NULL;
178  }
179  free(party->partyleader);
180  free(party->partyname);
181  free(party);
182  return;
183  }
184  previousparty = *walk;
185  }
186  LOG(llevError, "party_remove: I was asked to remove party %s, but it could not be found.\n",
187  party->partyname);
188 }
189 
197  return firstparty;
198 }
199 
209  return party->next;
210 }
211 
216  partylist *party;
217  partylist *next;
218  for (party = firstparty; party != NULL; party = next) {
219  next = party->next;
220  remove_if_unused(party);
221  }
222 }
223 
232 const char *party_get_password(const partylist *party) {
233  return party->passwd;
234 }
235 
244 void party_set_password(partylist *party, const char *password) {
245  strlcpy(party->passwd, password, sizeof(party->passwd));
247 }
248 
259 int party_confirm_password(const partylist *party, const char *password) {
260  return strcmp(party->passwd, password) == 0;
261 }
262 
274 void party_send_message(object *op, const char *message) {
275  player * const self = op->contr;
276  partylist * const party = self->party;
277 
278  for (player *pl = first_player; pl != NULL; pl = pl->next)
279  if (pl->party == party && pl != self)
281  message);
282 }
283 
292 const char *party_get_leader(const partylist *party) {
293  return party->partyleader;
294 }
295 
296 #ifdef PARTY_KILL_LOG
297 
309 void party_add_kill(partylist *party, const char *killer, const char *dead, long exp) {
310  int i, pos;
311 
312  if (party->kills >= PARTY_KILL_LOG) {
313  pos = PARTY_KILL_LOG-1;
314  for (i = 0; i < PARTY_KILL_LOG-1; i++)
315  memcpy(&(party->party_kills[i]), &(party->party_kills[i+1]), sizeof(party->party_kills[0]));
316  } else
317  pos = party->kills;
318  party->kills++;
319  party->total_exp += exp;
320  party->party_kills[pos].exp = exp;
321  strncpy(party->party_kills[pos].killer, killer, MAX_NAME);
322  strncpy(party->party_kills[pos].dead, dead, MAX_NAME);
323  party->party_kills[pos].killer[MAX_NAME] = 0;
324  party->party_kills[pos].dead[MAX_NAME] = 0;
325 }
326 #endif
Error, serious thing.
Definition: logger.h:11
const char * party_get_leader(const partylist *party)
Returns the name of the party&#39;s leader.
Definition: party.cpp:292
partylist * next
Next party in list.
Definition: party.h:13
void party_leave(object *op)
Makes a player leave his party.
Definition: party.cpp:123
void party_join(object *op, partylist *party)
Makes a player join a party.
Definition: party.cpp:85
void LOG(LogLevel logLevel, const char *format,...)
Logs a message to stderr, or to file.
Definition: logger.cpp:58
#define NDI_WHITE
Definition: newclient.h:247
#define strdup_local
Definition: compat.h:29
void draw_ext_info_format(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *format,...) PRINTF_ARGS(6
player * first_player
First player.
Definition: init.cpp:106
partylist * party
Party this player is part of.
Definition: player.h:205
static partylist * lastparty
Keeps track of last party in list.
Definition: party.cpp:27
Global type definitions and header inclusions.
struct player * contr
Pointer to the player which control this object.
Definition: object.h:284
void draw_ext_info(int flags, int pri, const object *pl, uint8_t type, uint8_t subtype, const char *message)
Sends message to player(s).
Definition: main.cpp:308
player * next
Pointer to next player, NULL if this is last.
Definition: player.h:108
One party.
Definition: party.h:10
#define MSG_TYPE_COMMAND
Responses to commands, eg, who.
Definition: newclient.h:420
#define MSG_TYPE_COMMAND_SUCCESS
Successful result from command.
Definition: newclient.h:551
#define MSG_TYPE_COMMAND_ERROR
Bad syntax/can&#39;t use command.
Definition: newclient.h:550
char * partyleader
Who is the leader.
Definition: party.h:11
char passwd[9]
Party password.
Definition: party.h:12
#define MSG_TYPE_COMMUNICATION
Communication between players.
Definition: newclient.h:427
char * partyname
Party name.
Definition: party.h:14
partylist * party_form(object *op, const char *partyname)
Forms the party struct for a party called &#39;partyname&#39;.
Definition: party.cpp:40
partylist * party_get_first(void)
Returns the first party from the list of all parties.
Definition: party.cpp:196
static partylist * firstparty
Keeps track of first party in list.
Definition: party.cpp:26
#define MAX_BUF
Used for all kinds of things.
Definition: define.h:35
void replace_unprintable_chars(char *buf)
Replaces any unprintable character in the given buffer with a space.
Definition: utils.cpp:447
size_t strlcpy(char *dst, const char *src, size_t size)
Portable implementation of strlcpy(3).
Definition: porting.cpp:222
void party_send_message(object *op, const char *message)
Send a message to all party members except the speaker.
Definition: party.cpp:274
partylist * party_find(const char *partyname)
Find a party by name.
Definition: party.cpp:148
static void remove_if_unused(partylist *party)
Remove party if it has no players.
Definition: party.cpp:108
sstring name
The name of the object, obviously...
Definition: object.h:319
void party_obsolete_parties(void)
Remove unused parties (no players).
Definition: party.cpp:215
void party_remove(partylist *party)
Removes and frees a party.
Definition: party.cpp:164
#define NDI_UNIQUE
Print immediately, don&#39;t buffer.
Definition: newclient.h:270
partylist * party_get_next(const partylist *party)
Returns the next party from the list of all parties.
Definition: party.cpp:208
One player.
Definition: player.h:107
#define MAX_NAME
Definition: define.h:41
StringBuffer * buf
Definition: readable.cpp:1563
const char * party_get_password(const partylist *party)
Returns the party&#39;s password.
Definition: party.cpp:232
void party_set_password(partylist *party, const char *password)
Sets a party&#39;s password.
Definition: party.cpp:244
int party_confirm_password(const partylist *party, const char *password)
Checks whether a given password matches the party&#39;s password.
Definition: party.cpp:259
#define MSG_TYPE_COMMUNICATION_PARTY
Party message.
Definition: newclient.h:663