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

Comparing deliantra/server/socket/item.C (file contents):
Revision 1.45 by root, Mon May 28 21:22:26 2007 UTC vs.
Revision 1.51 by root, Tue Jul 24 04:55:35 2007 UTC

1/* 1/*
2 * This file is part of Crossfire TRT, the Multiplayer Online Role Playing Game. 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 * 3 *
4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6 * Copyright (©) 1992,2007 Frank Tore Johansen 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 * 7 *
8 * Crossfire TRT is free software; you can redistribute it and/or modify it 8 * Crossfire TRT is free software: you can redistribute it and/or modify
9 * under the terms of the GNU General Public License as published by the Free 9 * it under the terms of the GNU General Public License as published by
10 * Software Foundation; either version 2 of the License, or (at your option) 10 * the Free Software Foundation, either version 3 of the License, or
11 * any later version. 11 * (at your option) any later version.
12 * 12 *
13 * This program is distributed in the hope that it will be useful, but 13 * This program is distributed in the hope that it will be useful,
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * for more details. 16 * GNU General Public License for more details.
17 * 17 *
18 * You should have received a copy of the GNU General Public License along 18 * You should have received a copy of the GNU General Public License
19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 * 20 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de> 21 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */ 22 */
24 23
25/** 24/**
264 263
265 flags = query_flags (head); 264 flags = query_flags (head);
266 if (QUERY_FLAG (head, FLAG_NO_PICK)) 265 if (QUERY_FLAG (head, FLAG_NO_PICK))
267 flags |= F_NOPICK; 266 flags |= F_NOPICK;
268 267
269 ns.send_face (head->face); 268 ns.send_face (head->face, -50);
270 ns.flush_fx (); 269 ns.flush_fx ();
271 270
272 if (QUERY_FLAG (head, FLAG_ANIMATE) && !ns.anims_sent[head->animation_id]) 271 if (QUERY_FLAG (head, FLAG_ANIMATE) && !ns.anims_sent[head->animation_id])
273 ns.send_animation (head->animation_id); 272 ns.send_animation (head->animation_id);
274 273
331 * Send the look window. Don't need to do animations here 330 * Send the look window. Don't need to do animations here
332 * This sends all the faces to the client, not just updates. This is 331 * This sends all the faces to the client, not just updates. This is
333 * because object ordering would otherwise be inconsistent. 332 * because object ordering would otherwise be inconsistent.
334 */ 333 */
335void 334void
336esrv_draw_look (object *pl) 335esrv_draw_look (player *pl)
337{ 336{
338 int got_one = 0, start_look = 0, end_look = 0; 337 int got_one = 0, start_look = 0, end_look = 0;
339 338
339 object *ob = pl->ob;
340
340 if (!pl->contr->ns->update_look) 341 if (!pl->ns->update_look)
341 { 342 {
342 LOG (llevDebug, "esrv_draw_look called when update_look was not set (player %s)\n", &pl->name); 343 LOG (llevDebug, "esrv_draw_look called when update_look was not set (player %s)\n", &ob->name);
343 return; 344 return;
344 } 345 }
345 else 346 else
346 pl->contr->ns->update_look = 0; 347 pl->ns->update_look = 0;
347 348
348 if (QUERY_FLAG (pl, FLAG_REMOVED) 349 if (QUERY_FLAG (ob, FLAG_REMOVED)
349 || !pl->map 350 || !ob->map
350 || pl->map->in_memory != MAP_IN_MEMORY 351 || ob->map->in_memory != MAP_IN_MEMORY
351 || out_of_map (pl->map, pl->x, pl->y)) 352 || out_of_map (ob->map, ob->x, ob->y))
352 return; 353 return;
353 354
354 pl->contr->ns->send_packet ("delinv 0"); 355 pl->ns->send_packet ("delinv 0");
355 356
356 packet sl; 357 packet sl;
357 sl.printf ("item%d ", pl->contr->ns->itemcmd); 358 sl.printf ("item%d ", pl->ns->itemcmd);
358 359
359 sl << uint32 (0); 360 sl << uint32 (0);
360 361
361 pl->contr->ns->send_face (empty_face); 362 pl->ns->send_face (empty_face, -50);
362 pl->contr->ns->flush_fx (); 363 pl->ns->flush_fx ();
363 364
364 if (pl->contr->ns->look_position) 365 if (pl->ns->look_position)
365 { 366 {
366 char buf[80]; 367 char buf[80];
367 snprintf (buf, 80, "Apply this to see %d previous items", FLOORBOX_PAGESIZE); 368 snprintf (buf, 80, "Apply this to see %d previous items", FLOORBOX_PAGESIZE);
368 369
369 sl << uint32 (0x80000000 | (pl->contr->ns->look_position - FLOORBOX_PAGESIZE)) 370 sl << uint32 (0x80000000 | (pl->ns->look_position - FLOORBOX_PAGESIZE))
370 << uint32 (0) 371 << uint32 (0)
371 << sint32 (-1) 372 << sint32 (-1)
372 << uint32 (empty_face) 373 << uint32 (empty_face)
373 << data8 (buf) 374 << data8 (buf)
374 << uint16 (0) 375 << uint16 (0)
375 << uint8 (0) 376 << uint8 (0)
376 << uint32 (0); 377 << uint32 (0);
377 378
378 if (pl->contr->ns->itemcmd == 2) 379 if (pl->ns->itemcmd == 2)
379 sl << uint16 (0); 380 sl << uint16 (0);
380 } 381 }
381 382
382 object *tmp = pl->ms ().top; 383 object *tmp = ob->ms ().top;
383 for (object *last = 0; tmp != last; tmp = tmp->below) 384 for (object *last = 0; tmp != last; tmp = tmp->below)
384 { 385 {
385 object *head; 386 object *head;
386 387
387 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) && !last) 388 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) && !last)
391 last = last->below; 392 last = last->below;
392 } 393 }
393 394
394 if (tmp->client_visible ()) 395 if (tmp->client_visible ())
395 { 396 {
396 if (++start_look < pl->contr->ns->look_position) 397 if (++start_look < pl->ns->look_position)
397 continue; 398 continue;
398 399
399 end_look++; 400 end_look++;
400 401
401 if (end_look > FLOORBOX_PAGESIZE) 402 if (end_look > FLOORBOX_PAGESIZE)
402 { 403 {
403 /* What we basically do is make a 'fake' object - when the user applies it, 404 /* What we basically do is make a 'fake' object - when the user applies it,
404 * we notice the special tag the object has, and act accordingly. 405 * we notice the special tag the object has, and act accordingly.
405 */ 406 */
406 sl << uint32 (0x80000000 | (pl->contr->ns->look_position + FLOORBOX_PAGESIZE)) 407 sl << uint32 (0x80000000 | (pl->ns->look_position + FLOORBOX_PAGESIZE))
407 << uint32 (0) 408 << uint32 (0)
408 << uint32 ((uint32) - 1) 409 << uint32 ((uint32) - 1)
409 << uint32 (empty_face) 410 << uint32 (empty_face)
410 << data8 ("Apply this to see next group of items") 411 << data8 ("Apply this to see next group of items")
411 << uint16 (0) 412 << uint16 (0)
412 << uint8 (0) 413 << uint8 (0)
413 << uint32 (0); 414 << uint32 (0);
414 415
415 if (pl->contr->ns->itemcmd == 2) 416 if (pl->ns->itemcmd == 2)
416 sl << uint16 (0); 417 sl << uint16 (0);
417 418
418 break; 419 break;
419 } 420 }
420 421
421 if (tmp->head) 422 if (tmp->head)
422 head = tmp->head; 423 head = tmp->head;
423 else 424 else
424 head = tmp; 425 head = tmp;
425 426
426 add_object_to_socklist (*pl->contr->ns, sl, head); 427 add_object_to_socklist (*pl->ns, sl, head);
427 got_one++; 428 got_one++;
428 429
429 if (sl.length () >= (MAXSOCKBUF - MAXITEMLEN)) 430 if (sl.length () >= (MAXSOCKBUF - MAXITEMLEN))
430 { 431 {
431 pl->contr->ns->send_packet (sl); 432 pl->ns->send_packet (sl);
432 433
433 sl.reset (); 434 sl.reset ();
434 sl.printf ("item%d ", pl->contr->ns->itemcmd); 435 sl.printf ("item%d ", pl->ns->itemcmd);
435 sl << uint32 (0); 436 sl << uint32 (0);
436 got_one = 0; 437 got_one = 0;
437 } 438 }
438 } 439 }
439 } 440 }
440 441
441 if (got_one) 442 if (got_one)
442 pl->contr->ns->send_packet (sl); 443 pl->ns->send_packet (sl);
443 444
444} 445}
445 446
446/** 447/**
447 * Sends whole inventory. 448 * Sends whole inventory.
555 ns->last_weight = weight; 556 ns->last_weight = weight;
556 } 557 }
557 558
558 if (flags & UPD_FACE) 559 if (flags & UPD_FACE)
559 { 560 {
560 ns->send_face (op->face); 561 ns->send_face (op->face, -50);
561 ns->flush_fx (); 562 ns->flush_fx ();
562 sl << uint32 (op->face); 563 sl << uint32 (op->face);
563 } 564 }
564 565
565 if (flags & UPD_NAME) 566 if (flags & UPD_NAME)
834 * look_at prints items on the specified square. 835 * look_at prints items on the specified square.
835 * 836 *
836 * [ removed EARTHWALL check and added check for containers inventory. 837 * [ removed EARTHWALL check and added check for containers inventory.
837 * Tero.Haatanen@lut.fi ] 838 * Tero.Haatanen@lut.fi ]
838 */ 839 */
839void 840static void
840look_at (object *op, int dx, int dy) 841look_at (player *pl, int dx, int dy)
841{ 842{
842 object *tmp; 843 object *ob = pl->ob;
843 int flag = 0;
844 sint16 x, y;
845 maptile *m;
846 844
847 x = op->x + dx; 845 maptile *m = pl->observe->map;
848 y = op->y + dy; 846 sint16 x = pl->observe->x + dx;
847 sint16 y = pl->observe->y + dy;
849 848
850 if (out_of_map (op->map, x, y))
851 return;
852
853 m = get_map_from_coord (op->map, &x, &y);
854 if (!m) 849 if (!m)
855 return; 850 return;
856 851
857 for (tmp = GET_MAP_OB (m, x, y); tmp && tmp->above; tmp = tmp->above) 852 if (!xy_normalise (m, x, y))
858 ; 853 {
859 854 new_draw_info (NDI_UNIQUE, 0, ob, "You see nothing there.");
860 for (; tmp; tmp = tmp->below) 855 return;
861 { 856 }
857
858 int flag = 0;
859
860 for (object *tmp = m->at (x, y).top; tmp; tmp = tmp->below)
861 {
862 if (tmp->invisible && !QUERY_FLAG (op, FLAG_WIZ)) 862 if (tmp->invisible && !QUERY_FLAG (ob, FLAG_WIZ))
863 continue; 863 continue;
864 864
865 if (!flag) 865 if (!flag)
866 { 866 {
867 if (dx || dy) 867 if (dx || dy)
868 new_draw_info (NDI_UNIQUE, 0, op, "There you see:"); 868 new_draw_info (NDI_UNIQUE, 0, ob, "There you see:");
869 else 869 else
870 {
871 clear_win_info (op);
872 new_draw_info (NDI_UNIQUE, 0, op, "You see:"); 870 new_draw_info (NDI_UNIQUE, 0, ob, "You see:");
873 } 871
874 flag = 1; 872 flag = 1;
875 } 873 }
876 874
877 if (QUERY_FLAG (op, FLAG_WIZ)) 875 if (QUERY_FLAG (ob, FLAG_WIZ))
878 new_draw_info_format (NDI_UNIQUE, 0, op, "- %s (%d).", query_name (tmp), tmp->count); 876 new_draw_info_format (NDI_UNIQUE, 0, ob, "- %s (%d).", query_name (tmp), tmp->count);
879 else 877 else
880 new_draw_info_format (NDI_UNIQUE, 0, op, "- %s.", query_name (tmp)); 878 new_draw_info_format (NDI_UNIQUE, 0, ob, "- %s.", query_name (tmp));
881 879
882 if (((tmp->inv != NULL || (tmp->head && tmp->head->inv)) && 880 if (((tmp->inv != NULL || (tmp->head && tmp->head->inv)) &&
883 (tmp->type != CONTAINER && tmp->type != FLESH)) || QUERY_FLAG (op, FLAG_WIZ)) 881 (tmp->type != CONTAINER && tmp->type != FLESH)) || QUERY_FLAG (ob, FLAG_WIZ))
884 inventory (op, tmp->head == NULL ? tmp : tmp->head); 882 inventory (ob, tmp->head == NULL ? tmp : tmp->head);
885 883
886 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) && !QUERY_FLAG (op, FLAG_WIZ)) /* don't continue under the floor */ 884 if (QUERY_FLAG (tmp, FLAG_IS_FLOOR) && !QUERY_FLAG (ob, FLAG_WIZ)) /* don't continue under the floor */
887 break; 885 break;
888 } 886 }
889 887
890 if (!flag) 888 if (!flag)
891 { 889 {
892 if (dx || dy) 890 if (dx || dy)
893 new_draw_info (NDI_UNIQUE, 0, op, "You see nothing there."); 891 new_draw_info (NDI_UNIQUE, 0, ob, "You see nothing there.");
894 else 892 else
895 new_draw_info (NDI_UNIQUE, 0, op, "You see nothing."); 893 new_draw_info (NDI_UNIQUE, 0, ob, "You see nothing.");
896 } 894 }
897} 895}
898 896
899/** Client wants to look at some object. Lets do so. */ 897/** Client wants to look at some object. Lets do so. */
900void 898void
901LookAt (char *buf, int len, player *pl) 899LookAt (char *buf, int len, player *pl)
902{ 900{
903 int dx, dy;
904 char *cp; 901 char *cp;
905 902
906 dx = atoi (buf); 903 int dx = atoi (buf);
907 if (!(cp = strchr (buf, ' '))) 904 if (!(cp = strchr (buf, ' ')))
908 return; 905 return;
909 906
910 dy = atoi (cp); 907 int dy = atoi (cp);
908
909 if (player *opl = pl->observe->contr)
910 if (client *ns = opl->ns)
911 {
911 if (fabs (dx) > pl->ns->mapx / 2 || fabs (dy) > pl->ns->mapy / 2) 912 if (fabs (dx) > ns->mapx / 2 || fabs (dy) > ns->mapy / 2)
912 return; 913 return;
913 914
914 if (pl->blocked_los[dx + pl->ns->mapx / 2][dy + pl->ns->mapy / 2]) 915 if (opl->blocked_los[dx + ns->mapx / 2][dy + ns->mapy / 2])
915 return; 916 return;
917 }
916 918
917 look_at (pl->ob, dx, dy); 919 look_at (pl, dx, dy);
918} 920}
919 921
920/** Move an object to a new location */ 922/** Move an object to a new location */
921void 923void
922esrv_move_object (object *pl, tag_t to, tag_t tag, long nrof) 924esrv_move_object (object *pl, tag_t to, tag_t tag, long nrof)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines