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.21 by root, Sat Dec 16 03:08:26 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 * ns, int color, const char *str)
54{ 49{
55 char buf[HUGE_BUF]; 50 ns->send_packet_printf ("drawinfo %d %s", color, str);
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);
64 }
65
66/* LOG(llevDebug,"sending %s to socket, len=%d\n", buf, strlen(buf));*/
67 Write_String_To_Socket (ns, buf, strlen (buf));
68} 51}
69 52
70/** 53/**
71 * Draws an extended message on the client. 54 * Draws an extended message on the client.
72 * ns the socket to send message to 55 * ns the socket to send message to
75 * subtype type and subtype of text message 58 * subtype type and subtype of text message
76 * intro Intro message to send with main message if client does not support the message type 59 * intro Intro message to send with main message if client does not support the message type
77 * message The main message 60 * message The main message
78 */ 61 */
79static void 62static void
80esrv_print_ext_msg (NewSocket * ns, int color, uint8 type, uint8 subtype, const char *message) 63esrv_print_ext_msg (client * ns, int color, uint8 type, uint8 subtype, const char *message)
81{ 64{
82 char buf[HUGE_BUF];
83
84 snprintf (buf, HUGE_BUF, "drawextinfo %d %hhu %hhu %s", color, type, subtype, message); 65 ns->send_packet_printf ("drawextinfo %d %hhu %hhu %s", color, type, subtype, message);
85 Write_String_To_Socket (ns, buf, strlen (buf));
86
87/* LOG(llevDebug,"sending %s to socket, len=%d", buf, strlen(buf));*/
88
89} 66}
90 67
91/** 68/**
92 * Frontend for esrv_print_msg 69 * Frontend for esrv_print_msg
93 * \param colr message color 70 * \param colr message color
101 78
102static void 79static void
103print_message (int colr, const object *pl, const char *tmp) 80print_message (int colr, const object *pl, const char *tmp)
104{ 81{
105 82
106 if (tmp == (char *) NULL) 83 if (!tmp)
107 {
108 tmp = "[NULL]"; 84 tmp = "[NULL]";
109 }
110 85
111 if (!pl || (pl->type == PLAYER && pl->contr == NULL)) 86 if (!pl || (pl->type == PLAYER && pl->contr == NULL))
112 return; 87 return;
113 88
114 if (pl->type == PLAYER) 89 if (pl->type == PLAYER)
115 {
116 esrv_print_msg (&pl->contr->socket, colr, (char *) tmp); 90 esrv_print_msg (pl->contr->socket, colr, (char *) tmp);
117 return;
118 }
119} 91}
120
121 92
122/** 93/**
123 * Prints out the contents of specified buffer structures, 94 * Prints out the contents of specified buffer structures,
124 * and clears the string. 95 * and clears the string.
125 */ 96 */
222{ 193{
223 194
224 if (flags & NDI_ALL) 195 if (flags & NDI_ALL)
225 { 196 {
226 player *tmppl; 197 player *tmppl;
227 int i;
228 198
229 for (tmppl = first_player; tmppl != NULL; tmppl = tmppl->next) 199 for (tmppl = first_player; tmppl != NULL; tmppl = tmppl->next)
230 new_draw_info ((flags & ~NDI_ALL), pri, tmppl->ob, buf); 200 new_draw_info ((flags & ~NDI_ALL), pri, tmppl->ob, buf);
231 201
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; 202 return;
243 } 203 }
204
244 if (!pl || (pl->type == PLAYER && pl->contr == NULL)) 205 if (!pl || (pl->type == PLAYER && pl->contr == NULL))
245 { 206 {
246 /* Write to the socket? */ 207 /* Write to the socket? */
247 print_message (0, NULL, buf); 208 print_message (0, NULL, buf);
248 return; 209 return;
249 } 210 }
211
250 if (pl->type != PLAYER) 212 if (pl->type != PLAYER)
251 return; 213 return;
214
252 if (pri >= pl->contr->listening) 215 if (pri >= pl->contr->listening)
253 return; 216 return;
254 217
255 if ((flags & NDI_COLOR_MASK) == NDI_BLACK && !(flags & NDI_UNIQUE)) 218 if ((flags & NDI_COLOR_MASK) == NDI_BLACK && !(flags & NDI_UNIQUE))
256 {
257 /* following prints stuff out, as appropriate */ 219 /* following prints stuff out, as appropriate */
258 check_output_buffers (pl, buf); 220 check_output_buffers (pl, buf);
259 }
260 else 221 else
261 {
262 print_message (flags & NDI_COLOR_MASK, pl, buf); 222 print_message (flags & NDI_COLOR_MASK, pl, buf);
263 }
264} 223}
265 224
266/** 225/**
267 * Wrapper for new_draw_info printf-like. 226 * Wrapper for new_draw_info printf-like.
268 * 227 *
296 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL)) 255 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL))
297 return; 256 return;
298 257
299 if (pri >= pl->contr->listening) 258 if (pri >= pl->contr->listening)
300 return; 259 return;
260
301 if (!CLIENT_SUPPORT_READABLES (&pl->contr->socket, type)) 261 if (!CLIENT_SUPPORT_READABLES (pl->contr->socket, type))
302 { 262 {
303 char *buf = (char *) malloc (strlen (oldmessage == NULL ? message : oldmessage) + 1); 263 char *buf = (char *) malloc (strlen (oldmessage == NULL ? message : oldmessage) + 1);
304 264
305 if (buf == NULL) 265 if (buf == NULL)
306 LOG (llevError, "info::draw_ext_info -> Out of memory!"); 266 LOG (llevError, "info::draw_ext_info -> Out of memory!");
311 new_draw_info (flags, pri, pl, buf); 271 new_draw_info (flags, pri, pl, buf);
312 free (buf); 272 free (buf);
313 } 273 }
314 } 274 }
315 else 275 else
316 {
317 esrv_print_ext_msg (&pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, message); 276 esrv_print_ext_msg (pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, message);
318 }
319} 277}
320 278
321void 279void
322draw_ext_info_format (int flags, int pri, const object *pl, uint8 type, uint8 subtype, const char *old_format, char *new_format, ...) 280draw_ext_info_format (int flags, int pri, const object *pl, uint8 type, uint8 subtype, const char *old_format, char *new_format, ...)
323{ 281{
327 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL)) 285 if (!pl || (pl->type != PLAYER) || (pl->contr == NULL))
328 return; 286 return;
329 287
330 if (pri >= pl->contr->listening) 288 if (pri >= pl->contr->listening)
331 return; 289 return;
290
332 if (!CLIENT_SUPPORT_READABLES (&pl->contr->socket, type)) 291 if (!CLIENT_SUPPORT_READABLES (pl->contr->socket, type))
333 { 292 {
334 va_list ap; 293 va_list ap;
335 294
336 LOG (llevDebug, "Non supported extension text type for client.\n"); 295 LOG (llevDebug, "Non supported extension text type for client.\n");
337 va_start (ap, new_format); 296 va_start (ap, new_format);
346 305
347 va_start (ap, new_format); 306 va_start (ap, new_format);
348 vsnprintf (buf, HUGE_BUF, new_format, ap); 307 vsnprintf (buf, HUGE_BUF, new_format, ap);
349 va_end (ap); 308 va_end (ap);
350 strip_media_tag (buf); 309 strip_media_tag (buf);
351 esrv_print_ext_msg (&pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, buf); 310 esrv_print_ext_msg (pl->contr->socket, flags & NDI_COLOR_MASK, type, subtype, buf);
352 } 311 }
353} 312}
354 313
355/** 314/**
356 * Writes to everyone on the map *except* op. This is useful for emotions. 315 * Writes to everyone on the map *except* op. This is useful for emotions.
357 */ 316 */
358 317
359void 318void
360new_info_map_except (int color, mapstruct *map, object *op, const char *str) 319new_info_map_except (int color, maptile * map, object *op, const char *str)
361{ 320{
362 player *pl; 321 player *pl;
363 322
364 for (pl = first_player; pl != NULL; pl = pl->next) 323 for (pl = first_player; pl != NULL; pl = pl->next)
365 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op) 324 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op)
371/** 330/**
372 * Writes to everyone on the map except op1 and op2 331 * Writes to everyone on the map except op1 and op2
373 */ 332 */
374 333
375void 334void
376new_info_map_except2 (int color, mapstruct *map, object *op1, object *op2, const char *str) 335new_info_map_except2 (int color, maptile * map, object *op1, object *op2, const char *str)
377{ 336{
378 player *pl; 337 player *pl;
379 338
380 for (pl = first_player; pl != NULL; pl = pl->next) 339 for (pl = first_player; pl != NULL; pl = pl->next)
381 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op1 && pl->ob != op2) 340 if (pl->ob != NULL && pl->ob->map == map && pl->ob != op1 && pl->ob != op2)
387/** 346/**
388 * Writes to everyone on the specified map 347 * Writes to everyone on the specified map
389 */ 348 */
390 349
391void 350void
392new_info_map (int color, mapstruct *map, const char *str) 351new_info_map (int color, maptile * map, const char *str)
393{ 352{
394 player *pl; 353 player *pl;
395 354
396 for (pl = first_player; pl != NULL; pl = pl->next) 355 for (pl = first_player; pl != NULL; pl = pl->next)
397 if (pl->ob != NULL && pl->ob->map == map) 356 if (pl->ob != NULL && pl->ob->map == map)
417void 376void
418rangetostring (object *pl, char *obuf) 377rangetostring (object *pl, char *obuf)
419{ 378{
420 switch (pl->contr->shoottype) 379 switch (pl->contr->shoottype)
421 { 380 {
422 case range_none: 381 case range_none:
423 strcpy (obuf, "Range: nothing"); 382 strcpy (obuf, "Range: nothing");
424 break; 383 break;
425 384
426 case range_bow: 385 case range_bow:
386 {
387 object *op;
388
389 for (op = pl->inv; op; op = op->below)
390 if (op->type == BOW && QUERY_FLAG (op, FLAG_APPLIED))
391 break;
392
393 if (op == NULL)
394 break;
395
396 sprintf (obuf, "Range: %s (%s)", query_base_name (op, 0), op->race ? (const char *) op->race : "nothing");
397 }
398 break;
399
400 case range_magic:
401 if (settings.casting_time == TRUE)
427 { 402 {
428 object *op; 403 if (pl->casting_time > -1)
429 404 {
430 for (op = pl->inv; op; op = op->below) 405 if (pl->casting_time == 0)
431 if (op->type == BOW && QUERY_FLAG (op, FLAG_APPLIED)) 406 sprintf (obuf, "Range: Holding spell (%s)", &pl->spell->name);
432 break; 407 else
433 if (op == NULL) 408 sprintf (obuf, "Range: Casting spell (%s)", &pl->spell->name);
434 break; 409 }
435 410 else
436 sprintf (obuf, "Range: %s (%s)", query_base_name (op, 0), op->race ? (const char *) op->race : "nothing"); 411 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name);
437 } 412 }
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 413 else
454 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name); 414 sprintf (obuf, "Range: spell (%s)", &pl->contr->ranges[range_magic]->name);
455 break; 415 break;
456 416
457 case range_misc: 417 case range_misc:
458 sprintf (obuf, "Range: %s", pl->contr->ranges[range_misc] ? query_base_name (pl->contr->ranges[range_misc], 0) : "none"); 418 sprintf (obuf, "Range: %s", pl->contr->ranges[range_misc] ? query_base_name (pl->contr->ranges[range_misc], 0) : "none");
459 break; 419 break;
460 420
461 /* range_scroll is only used for controlling golems. If the 421 /* range_scroll is only used for controlling golems. If the
462 * the player does not have a golem, reset some things. 422 * the player does not have a golem, reset some things.
463 */ 423 */
464 case range_golem: 424 case range_golem:
465 if (pl->contr->ranges[range_golem] != NULL) 425 if (pl->contr->ranges[range_golem] != NULL)
466 sprintf (obuf, "Range: golem (%s)", &pl->contr->ranges[range_golem]->name); 426 sprintf (obuf, "Range: golem (%s)", &pl->contr->ranges[range_golem]->name);
467 else 427 else
468 { 428 {
469 pl->contr->shoottype = range_none; 429 pl->contr->shoottype = range_none;
470 strcpy (obuf, "Range: nothing"); 430 strcpy (obuf, "Range: nothing");
471 } 431 }
472 break; 432 break;
473 433
474 case range_skill: 434 case range_skill:
475 sprintf (obuf, "Skill: %s", pl->chosen_skill != NULL ? (const char *) pl->chosen_skill->name : "none"); 435 sprintf (obuf, "Skill: %s", pl->chosen_skill != NULL ? (const char *) pl->chosen_skill->name : "none");
476 break; 436 break;
477 437
478 case range_builder: 438 case range_builder:
479 sprintf (obuf, "Builder: %s", query_base_name (pl->contr->ranges[range_builder], 0)); 439 sprintf (obuf, "Builder: %s", query_base_name (pl->contr->ranges[range_builder], 0));
480 break; 440 break;
481 441
482 default: 442 default:
483 strcpy (obuf, "Range: illegal"); 443 strcpy (obuf, "Range: illegal");
484 } 444 }
485} 445}
486 446
487/** 447/**
488 * Sets player title. 448 * Sets player title.
512static void 472static void
513magic_mapping_mark_recursive (object *pl, char *map_mark, int px, int py) 473magic_mapping_mark_recursive (object *pl, char *map_mark, int px, int py)
514{ 474{
515 int x, y, dx, dy, mflags; 475 int x, y, dx, dy, mflags;
516 sint16 nx, ny; 476 sint16 nx, ny;
517 mapstruct *mp; 477 maptile *mp;
518 New_Face *f; 478 New_Face *f;
519 479
520 for (dx = -1; dx <= 1; dx++) 480 for (dx = -1; dx <= 1; dx++)
521 { 481 {
522 for (dy = -1; dy <= 1; dy++) 482 for (dy = -1; dy <= 1; dy++)
578void 538void
579magic_mapping_mark (object *pl, char *map_mark, int strength) 539magic_mapping_mark (object *pl, char *map_mark, int strength)
580{ 540{
581 int x, y, mflags; 541 int x, y, mflags;
582 sint16 nx, ny; 542 sint16 nx, ny;
583 mapstruct *mp; 543 maptile *mp;
584 New_Face *f; 544 New_Face *f;
585 545
586 for (x = -strength; x < strength; x++) 546 for (x = -strength; x < strength; x++)
587 { 547 {
588 for (y = -strength; y < strength; y++) 548 for (y = -strength; y < strength; y++)
624 */ 584 */
625 585
626void 586void
627draw_magic_map (object *pl) 587draw_magic_map (object *pl)
628{ 588{
629 int x, y;
630 char *map_mark = (char *) calloc (MAGIC_MAP_SIZE * MAGIC_MAP_SIZE, 1); 589 char *map_mark = (char *)calloc (MAGIC_MAP_SIZE * MAGIC_MAP_SIZE, 1);
631 int xmin, xmax, ymin, ymax; 590 int xmin, xmax, ymin, ymax;
632 SockList sl;
633 591
634 if (pl->type != PLAYER) 592 if (pl->type != PLAYER)
635 { 593 {
636 LOG (llevError, "Non player object called draw_map.\n"); 594 LOG (llevError, "Non player object called draw_map.\n");
637 return; 595 return;
647 */ 605 */
648 xmin = MAGIC_MAP_SIZE; 606 xmin = MAGIC_MAP_SIZE;
649 ymin = MAGIC_MAP_SIZE; 607 ymin = MAGIC_MAP_SIZE;
650 xmax = 0; 608 xmax = 0;
651 ymax = 0; 609 ymax = 0;
610
652 for (x = 0; x < MAGIC_MAP_SIZE; x++) 611 for (int x = 0; x < MAGIC_MAP_SIZE; x++)
653 {
654 for (y = 0; y < MAGIC_MAP_SIZE; y++) 612 for (int y = 0; y < MAGIC_MAP_SIZE; y++)
655 {
656 if (map_mark[x + MAP_WIDTH (pl->map) * y] | FACE_FLOOR) 613 if (map_mark[x + MAP_WIDTH (pl->map) * y] | FACE_FLOOR)
657 { 614 {
658 xmin = x < xmin ? x : xmin; 615 xmin = x < xmin ? x : xmin;
659 xmax = x > xmax ? x : xmax; 616 xmax = x > xmax ? x : xmax;
660 ymin = y < ymin ? y : ymin; 617 ymin = y < ymin ? y : ymin;
661 ymax = y > ymax ? y : ymax; 618 ymax = y > ymax ? y : ymax;
662 } 619 }
663 }
664 }
665 620
666 sl.buf = (unsigned char *) malloc (MAXSOCKBUF); 621 packet sl;
667 snprintf ((char *) sl.buf, MAXSOCKBUF, "magicmap %d %d %d %d ", (xmax - xmin + 1), (ymax - ymin + 1), 622 sl.printf ("magicmap %d %d %d %d ", (xmax - xmin + 1), (ymax - ymin + 1),
668 MAGIC_MAP_HALF - xmin, MAGIC_MAP_HALF - ymin); 623 MAGIC_MAP_HALF - xmin, MAGIC_MAP_HALF - ymin);
669 sl.len = strlen ((char *) sl.buf);
670 624
671 for (y = ymin; y <= ymax; y++) 625 for (int y = ymin; y <= ymax; y++)
672 {
673 for (x = xmin; x <= xmax; x++) 626 for (int x = xmin; x <= xmax; x++)
674 {
675 sl.buf[sl.len++] = map_mark[x + MAGIC_MAP_SIZE * y] & ~FACE_FLOOR; 627 sl << uint8 (map_mark[x + MAGIC_MAP_SIZE * y] & ~FACE_FLOOR);
676 } /* x loop */
677 } /* y loop */
678 628
679 Send_With_Handling (&pl->contr->socket, &sl); 629 pl->contr->socket->send_packet (sl);
680 free (sl.buf); 630
681 free (map_mark); 631 free (map_mark);
682} 632}
683 633
684 634
685/** 635/**
687 */ 637 */
688 638
689void 639void
690Log_Kill (const char *Who, const char *What, int WhatType, const char *With, int WithType) 640Log_Kill (const char *Who, const char *What, int WhatType, const char *With, int WithType)
691{ 641{
692 int i;
693 size_t len; 642 size_t len;
694 char buf[MAX_BUF]; 643 char buf[MAX_BUF];
695 644
696 if (With != NULL) 645 if (With != NULL)
697 {
698 snprintf (buf, MAX_BUF, "%s\t%s\t%d\t%s\t%d\n", Who, What, WhatType, With, WithType); 646 snprintf (buf, MAX_BUF, "%s\t%s\t%d\t%s\t%d\n", Who, What, WhatType, With, WithType);
699 }
700 else 647 else
701 {
702 snprintf (buf, MAX_BUF, "%s\t%s\t%d\n", Who, What, WhatType); 648 snprintf (buf, MAX_BUF, "%s\t%s\t%d\n", Who, What, WhatType);
703 } 649
704 len = strlen (buf); 650 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} 651}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines