ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/info.C
(Generate patch)

Comparing deliantra/server/socket/info.C (file contents):
Revision 1.5 by root, Sun Sep 10 13:43:33 2006 UTC vs.
Revision 1.18 by root, Thu Dec 14 05:09:32 2006 UTC

1
2/*
3 * static char *rcsid_sock_info_c =
4 * "$Id: info.C,v 1.5 2006/09/10 13:43:33 root Exp $";
5 */
6 1
7/* 2/*
8 CrossFire, A Multiplayer game for X-windows 3 CrossFire, A Multiplayer game for X-windows
9 4
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
22 17
23 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30/** 25/**
31 * \file 26 * \file
32 * Basic client output functions. 27 * Basic client output functions.
48 * much the same thing as the draw_info above, but takes a color 43 * much the same thing as the draw_info above, but takes a color
49 * parameter. the esrv_drawinfo functions should probably be 44 * parameter. the esrv_drawinfo functions should probably be
50 * replaced with this, just using black as the color. 45 * replaced with this, just using black as the color.
51 */ 46 */
52static void 47static void
53esrv_print_msg (NewSocket * ns, int color, const char *str) 48esrv_print_msg (client_socket * ns, int color, const char *str)
54{ 49{
55 char buf[HUGE_BUF]; 50 packet sl;
56
57 if (ns->status == Ns_Old)
58 {
59 snprintf (buf, HUGE_BUF, "%s\n", str);
60 }
61 else
62 {
63 snprintf (buf, HUGE_BUF, "drawinfo %d %s", color, str); 51 sl.printf ("drawinfo %d %s", color, str);
64 } 52 ns->send_packet (sl);
65
66/* LOG(llevDebug,"sending %s to socket, len=%d\n", buf, strlen(buf));*/
67 Write_String_To_Socket (ns, buf, strlen (buf));
68} 53}
69 54
70/** 55/**
71 * Draws an extended message on the client. 56 * Draws an extended message on the client.
72 * ns the socket to send message to 57 * ns the socket to send message to
75 * subtype type and subtype of text message 60 * subtype type and subtype of text message
76 * intro Intro message to send with main message if client does not support the message type 61 * intro Intro message to send with main message if client does not support the message type
77 * message The main message 62 * message The main message
78 */ 63 */
79static void 64static void
80esrv_print_ext_msg (NewSocket * ns, int color, uint8 type, uint8 subtype, const char *message) 65esrv_print_ext_msg (client_socket * ns, int color, uint8 type, uint8 subtype, const char *message)
81{ 66{
82 char buf[HUGE_BUF]; 67 packet sl;
83 68
84 snprintf (buf, HUGE_BUF, "drawextinfo %d %hhu %hhu %s", color, type, subtype, message); 69 sl.printf ("drawextinfo %d %hhu %hhu %s", color, type, subtype, message);
85 Write_String_To_Socket (ns, buf, strlen (buf)); 70 ns->send_packet (sl);
86
87/* LOG(llevDebug,"sending %s to socket, len=%d", buf, strlen(buf));*/
88
89} 71}
90 72
91/** 73/**
92 * Frontend for esrv_print_msg 74 * Frontend for esrv_print_msg
93 * \param colr message color 75 * \param colr message color
101 83
102static void 84static void
103print_message (int colr, const object *pl, const char *tmp) 85print_message (int colr, const object *pl, const char *tmp)
104{ 86{
105 87
106 if (tmp == (char *) NULL) 88 if (!tmp)
107 {
108 tmp = "[NULL]"; 89 tmp = "[NULL]";
109 }
110 90
111 if (!pl || (pl->type == PLAYER && pl->contr == NULL)) 91 if (!pl || (pl->type == PLAYER && pl->contr == NULL))
112 return; 92 return;
113 93
114 if (pl->type == PLAYER) 94 if (pl->type == PLAYER)
115 {
116 esrv_print_msg (&pl->contr->socket, colr, (char *) tmp); 95 esrv_print_msg (pl->contr->socket, colr, (char *) tmp);
117 return;
118 }
119} 96}
120
121 97
122/** 98/**
123 * Prints out the contents of specified buffer structures, 99 * Prints out the contents of specified buffer structures,
124 * and clears the string. 100 * and clears the string.
125 */ 101 */
222{ 198{
223 199
224 if (flags & NDI_ALL) 200 if (flags & NDI_ALL)
225 { 201 {
226 player *tmppl; 202 player *tmppl;
227 int i;
228 203
229 for (tmppl = first_player; tmppl != NULL; tmppl = tmppl->next) 204 for (tmppl = first_player; tmppl != NULL; tmppl = tmppl->next)
230 new_draw_info ((flags & ~NDI_ALL), pri, tmppl->ob, buf); 205 new_draw_info ((flags & ~NDI_ALL), pri, tmppl->ob, buf);
231 206
232 for (i = 1; i < socket_info.allocated_sockets; i++)
233 {
234 if (init_sockets[i].status == Ns_Old && init_sockets[i].old_mode != Old_Listen && pri < 10)
235 {
236 cs_write_string (&init_sockets[i], buf, strlen (buf));
237 /* Most messages don't have a newline, so add one */
238 cs_write_string (&init_sockets[i], "\n", 1);
239 }
240 }
241
242 return; 207 return;
243 } 208 }
209
244 if (!pl || (pl->type == PLAYER && pl->contr == NULL)) 210 if (!pl || (pl->type == PLAYER && pl->contr == NULL))
245 { 211 {
246 /* Write to the socket? */ 212 /* Write to the socket? */
247 print_message (0, NULL, buf); 213 print_message (0, NULL, buf);
248 return; 214 return;
249 } 215 }
216
250 if (pl->type != PLAYER) 217 if (pl->type != PLAYER)
251 return; 218 return;
219
252 if (pri >= pl->contr->listening) 220 if (pri >= pl->contr->listening)
253 return; 221 return;
254 222
255 if ((flags & NDI_COLOR_MASK) == NDI_BLACK && !(flags & NDI_UNIQUE)) 223 if ((flags & NDI_COLOR_MASK) == NDI_BLACK && !(flags & NDI_UNIQUE))
256 {
257 /* following prints stuff out, as appropriate */ 224 /* following prints stuff out, as appropriate */
258 check_output_buffers (pl, buf); 225 check_output_buffers (pl, buf);
259 }
260 else 226 else
261 {
262 print_message (flags & NDI_COLOR_MASK, pl, buf); 227 print_message (flags & NDI_COLOR_MASK, pl, buf);
263 }
264} 228}
265 229
266/** 230/**
267 * Wrapper for new_draw_info printf-like. 231 * Wrapper for new_draw_info printf-like.
268 * 232 *
296 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL)) 260 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL))
297 return; 261 return;
298 262
299 if (pri >= pl->contr->listening) 263 if (pri >= pl->contr->listening)
300 return; 264 return;
265
301 if (!CLIENT_SUPPORT_READABLES (&pl->contr->socket, type)) 266 if (!CLIENT_SUPPORT_READABLES (pl->contr->socket, type))
302 { 267 {
303 char *buf = (char *) malloc (strlen (oldmessage == NULL ? message : oldmessage) + 1); 268 char *buf = (char *) malloc (strlen (oldmessage == NULL ? message : oldmessage) + 1);
304 269
305 if (buf == NULL) 270 if (buf == NULL)
306 LOG (llevError, "info::draw_ext_info -> Out of memory!"); 271 LOG (llevError, "info::draw_ext_info -> Out of memory!");
311 new_draw_info (flags, pri, pl, buf); 276 new_draw_info (flags, pri, pl, buf);
312 free (buf); 277 free (buf);
313 } 278 }
314 } 279 }
315 else 280 else
316 {
317 esrv_print_ext_msg (&pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, message); 281 esrv_print_ext_msg (pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, message);
318 }
319} 282}
320 283
321void 284void
322draw_ext_info_format (int flags, int pri, const object *pl, uint8 type, uint8 subtype, const char *old_format, char *new_format, ...) 285draw_ext_info_format (int flags, int pri, const object *pl, uint8 type, uint8 subtype, const char *old_format, char *new_format, ...)
323{ 286{
327 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL)) 290 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL))
328 return; 291 return;
329 292
330 if (pri >= pl->contr->listening) 293 if (pri >= pl->contr->listening)
331 return; 294 return;
295
332 if (!CLIENT_SUPPORT_READABLES (&pl->contr->socket, type)) 296 if (!CLIENT_SUPPORT_READABLES (pl->contr->socket, type))
333 { 297 {
334 va_list ap; 298 va_list ap;
335 299
336 LOG (llevDebug, "Non supported extension text type for client.\n"); 300 LOG (llevDebug, "Non supported extension text type for client.\n");
337 va_start (ap, new_format); 301 va_start (ap, new_format);
346 310
347 va_start (ap, new_format); 311 va_start (ap, new_format);
348 vsnprintf (buf, HUGE_BUF, new_format, ap); 312 vsnprintf (buf, HUGE_BUF, new_format, ap);
349 va_end (ap); 313 va_end (ap);
350 strip_media_tag (buf); 314 strip_media_tag (buf);
351 esrv_print_ext_msg (&pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, buf); 315 esrv_print_ext_msg (pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, buf);
352 } 316 }
353} 317}
354 318
355/** 319/**
356 * Writes to everyone on the map *except* op. This is useful for emotions. 320 * Writes to everyone on the map *except* op. This is useful for emotions.
357 */ 321 */
358 322
359void 323void
360new_info_map_except (int color, mapstruct *map, object *op, const char *str) 324new_info_map_except (int color, maptile * map, object *op, const char *str)
361{ 325{
362 player *pl; 326 player *pl;
363 327
364 for (pl = first_player; pl != NULL; pl = pl->next) 328 for (pl = first_player; pl != NULL; pl = pl->next)
365 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op) 329 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op)
371/** 335/**
372 * Writes to everyone on the map except op1 and op2 336 * Writes to everyone on the map except op1 and op2
373 */ 337 */
374 338
375void 339void
376new_info_map_except2 (int color, mapstruct *map, object *op1, object *op2, const char *str) 340new_info_map_except2 (int color, maptile * map, object *op1, object *op2, const char *str)
377{ 341{
378 player *pl; 342 player *pl;
379 343
380 for (pl = first_player; pl != NULL; pl = pl->next) 344 for (pl = first_player; pl != NULL; pl = pl->next)
381 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op1 && pl->ob != op2) 345 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op1 && pl->ob != op2)
387/** 351/**
388 * Writes to everyone on the specified map 352 * Writes to everyone on the specified map
389 */ 353 */
390 354
391void 355void
392new_info_map (int color, mapstruct *map, const char *str) 356new_info_map (int color, maptile * map, const char *str)
393{ 357{
394 player *pl; 358 player *pl;
395 359
396 for (pl = first_player; pl != NULL; pl = pl->next) 360 for (pl = first_player; pl != NULL; pl = pl->next)
397 if (pl->ob != NULL && pl->ob->map == map) 361 if (pl->ob != NULL && pl->ob->map == map)
417void 381void
418rangetostring (object *pl, char *obuf) 382rangetostring (object *pl, char *obuf)
419{ 383{
420 switch (pl->contr->shoottype) 384 switch (pl->contr->shoottype)
421 { 385 {
422 case range_none: 386 case range_none:
423 strcpy (obuf, "Range: nothing"); 387 strcpy (obuf, "Range: nothing");
424 break; 388 break;
425 389
426 case range_bow: 390 case range_bow:
391 {
392 object *op;
393
394 for (op = pl->inv; op; op = op->below)
395 if (op->type == BOW && QUERY_FLAG (op, FLAG_APPLIED))
396 break;
397
398 if (op == NULL)
399 break;
400
401 sprintf (obuf, "Range: %s (%s)", query_base_name (op, 0), op->race ? (const char *) op->race : "nothing");
402 }
403 break;
404
405 case range_magic:
406 if (settings.casting_time == TRUE)
427 { 407 {
428 object *op; 408 if (pl->casting_time > -1)
429 409 {
430 for (op = pl->inv; op; op = op->below) 410 if (pl->casting_time == 0)
431 if (op->type == BOW && QUERY_FLAG (op, FLAG_APPLIED)) 411 sprintf (obuf, "Range: Holding spell (%s)", &pl->spell->name);
432 break; 412 else
433 if (op == NULL) 413 sprintf (obuf, "Range: Casting spell (%s)", &pl->spell->name);
434 break; 414 }
435 415 else
436 sprintf (obuf, "Range: %s (%s)", query_base_name (op, 0), op->race ? (const char *) op->race : "nothing"); 416 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name);
437 } 417 }
438 break;
439
440 case range_magic:
441 if (settings.casting_time == TRUE)
442 {
443 if (pl->casting_time > -1)
444 {
445 if (pl->casting_time == 0)
446 sprintf (obuf, "Range: Holding spell (%s)", (const char *) pl->spell->name);
447 else
448 sprintf (obuf, "Range: Casting spell (%s)", (const char *) pl->spell->name);
449 }
450 else
451 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name);
452 }
453 else 418 else
454 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name); 419 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name);
455 break; 420 break;
456 421
457 case range_misc: 422 case range_misc:
458 sprintf (obuf, "Range: %s", pl->contr->ranges[range_misc] ? query_base_name (pl->contr->ranges[range_misc], 0) : "none"); 423 sprintf (obuf, "Range: %s", pl->contr->ranges[range_misc] ? query_base_name (pl->contr->ranges[range_misc], 0) : "none");
459 break; 424 break;
460 425
461 /* range_scroll is only used for controlling golems. If the 426 /* range_scroll is only used for controlling golems. If the
462 * the player does not have a golem, reset some things. 427 * the player does not have a golem, reset some things.
463 */ 428 */
464 case range_golem: 429 case range_golem:
465 if (pl->contr->ranges[range_golem] != NULL) 430 if (pl->contr->ranges[range_golem] != NULL)
466 sprintf (obuf, "Range: golem (%s)", &pl->contr->ranges[range_golem]->name); 431 sprintf (obuf, "Range: golem (%s)", &pl->contr->ranges[range_golem]->name);
467 else 432 else
468 { 433 {
469 pl->contr->shoottype = range_none; 434 pl->contr->shoottype = range_none;
470 strcpy (obuf, "Range: nothing"); 435 strcpy (obuf, "Range: nothing");
471 } 436 }
472 break; 437 break;
473 438
474 case range_skill: 439 case range_skill:
475 sprintf (obuf, "Skill: %s", pl->chosen_skill != NULL ? (const char *) pl->chosen_skill->name : "none"); 440 sprintf (obuf, "Skill: %s", pl->chosen_skill != NULL ? (const char *) pl->chosen_skill->name : "none");
476 break; 441 break;
477 442
478 case range_builder: 443 case range_builder:
479 sprintf (obuf, "Builder: %s", query_base_name (pl->contr->ranges[range_builder], 0)); 444 sprintf (obuf, "Builder: %s", query_base_name (pl->contr->ranges[range_builder], 0));
480 break; 445 break;
481 446
482 default: 447 default:
483 strcpy (obuf, "Range: illegal"); 448 strcpy (obuf, "Range: illegal");
484 } 449 }
485} 450}
486 451
487/** 452/**
488 * Sets player title. 453 * Sets player title.
512static void 477static void
513magic_mapping_mark_recursive (object *pl, char *map_mark, int px, int py) 478magic_mapping_mark_recursive (object *pl, char *map_mark, int px, int py)
514{ 479{
515 int x, y, dx, dy, mflags; 480 int x, y, dx, dy, mflags;
516 sint16 nx, ny; 481 sint16 nx, ny;
517 mapstruct *mp; 482 maptile *mp;
518 New_Face *f; 483 New_Face *f;
519 484
520 for (dx = -1; dx <= 1; dx++) 485 for (dx = -1; dx <= 1; dx++)
521 { 486 {
522 for (dy = -1; dy <= 1; dy++) 487 for (dy = -1; dy <= 1; dy++)
578void 543void
579magic_mapping_mark (object *pl, char *map_mark, int strength) 544magic_mapping_mark (object *pl, char *map_mark, int strength)
580{ 545{
581 int x, y, mflags; 546 int x, y, mflags;
582 sint16 nx, ny; 547 sint16 nx, ny;
583 mapstruct *mp; 548 maptile *mp;
584 New_Face *f; 549 New_Face *f;
585 550
586 for (x = -strength; x < strength; x++) 551 for (x = -strength; x < strength; x++)
587 { 552 {
588 for (y = -strength; y < strength; y++) 553 for (y = -strength; y < strength; y++)
624 */ 589 */
625 590
626void 591void
627draw_magic_map (object *pl) 592draw_magic_map (object *pl)
628{ 593{
629 int x, y;
630 char *map_mark = (char *) calloc (MAGIC_MAP_SIZE * MAGIC_MAP_SIZE, 1); 594 char *map_mark = (char *)calloc (MAGIC_MAP_SIZE * MAGIC_MAP_SIZE, 1);
631 int xmin, xmax, ymin, ymax; 595 int xmin, xmax, ymin, ymax;
632 SockList sl;
633 596
634 if (pl->type != PLAYER) 597 if (pl->type != PLAYER)
635 { 598 {
636 LOG (llevError, "Non player object called draw_map.\n"); 599 LOG (llevError, "Non player object called draw_map.\n");
637 return; 600 return;
647 */ 610 */
648 xmin = MAGIC_MAP_SIZE; 611 xmin = MAGIC_MAP_SIZE;
649 ymin = MAGIC_MAP_SIZE; 612 ymin = MAGIC_MAP_SIZE;
650 xmax = 0; 613 xmax = 0;
651 ymax = 0; 614 ymax = 0;
615
652 for (x = 0; x < MAGIC_MAP_SIZE; x++) 616 for (int x = 0; x < MAGIC_MAP_SIZE; x++)
653 {
654 for (y = 0; y < MAGIC_MAP_SIZE; y++) 617 for (int y = 0; y < MAGIC_MAP_SIZE; y++)
655 {
656 if (map_mark[x + MAP_WIDTH (pl->map) * y] | FACE_FLOOR) 618 if (map_mark[x + MAP_WIDTH (pl->map) * y] | FACE_FLOOR)
657 { 619 {
658 xmin = x < xmin ? x : xmin; 620 xmin = x < xmin ? x : xmin;
659 xmax = x > xmax ? x : xmax; 621 xmax = x > xmax ? x : xmax;
660 ymin = y < ymin ? y : ymin; 622 ymin = y < ymin ? y : ymin;
661 ymax = y > ymax ? y : ymax; 623 ymax = y > ymax ? y : ymax;
662 } 624 }
663 }
664 }
665 625
666 sl.buf = (unsigned char *) malloc (MAXSOCKBUF); 626 packet sl;
667 snprintf ((char *) sl.buf, MAXSOCKBUF, "magicmap %d %d %d %d ", (xmax - xmin + 1), (ymax - ymin + 1), 627 sl.printf ("magicmap %d %d %d %d ", (xmax - xmin + 1), (ymax - ymin + 1),
668 MAGIC_MAP_HALF - xmin, MAGIC_MAP_HALF - ymin); 628 MAGIC_MAP_HALF - xmin, MAGIC_MAP_HALF - ymin);
669 sl.len = strlen ((char *) sl.buf);
670 629
671 for (y = ymin; y <= ymax; y++) 630 for (int y = ymin; y <= ymax; y++)
672 {
673 for (x = xmin; x <= xmax; x++) 631 for (int x = xmin; x <= xmax; x++)
674 {
675 sl.buf[sl.len++] = map_mark[x + MAGIC_MAP_SIZE * y] & ~FACE_FLOOR; 632 sl << uint8 (map_mark[x + MAGIC_MAP_SIZE * y] & ~FACE_FLOOR);
676 } /* x loop */
677 } /* y loop */
678 633
679 Send_With_Handling (&pl->contr->socket, &sl); 634 Send_With_Handling (pl->contr->socket, &sl);
680 free (sl.buf); 635
681 free (map_mark); 636 free (map_mark);
682} 637}
683 638
684 639
685/** 640/**
687 */ 642 */
688 643
689void 644void
690Log_Kill (const char *Who, const char *What, int WhatType, const char *With, int WithType) 645Log_Kill (const char *Who, const char *What, int WhatType, const char *With, int WithType)
691{ 646{
692 int i;
693 size_t len; 647 size_t len;
694 char buf[MAX_BUF]; 648 char buf[MAX_BUF];
695 649
696 if (With != NULL) 650 if (With != NULL)
697 {
698 snprintf (buf, MAX_BUF, "%s\t%s\t%d\t%s\t%d\n", Who, What, WhatType, With, WithType); 651 snprintf (buf, MAX_BUF, "%s\t%s\t%d\t%s\t%d\n", Who, What, WhatType, With, WithType);
699 }
700 else 652 else
701 {
702 snprintf (buf, MAX_BUF, "%s\t%s\t%d\n", Who, What, WhatType); 653 snprintf (buf, MAX_BUF, "%s\t%s\t%d\n", Who, What, WhatType);
703 } 654
704 len = strlen (buf); 655 len = strlen (buf);
705 for (i = 1; i < socket_info.allocated_sockets; i++)
706 {
707 if (init_sockets[i].old_mode == Old_Listen)
708 {
709 cs_write_string (&init_sockets[i], buf, len);
710 }
711 }
712} 656}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines