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

Comparing deliantra/server/server/c_object.C (file contents):
Revision 1.25 by root, Tue Dec 12 21:39:57 2006 UTC vs.
Revision 1.37 by pippijn, Mon Jan 15 21:06:19 2007 UTC

1/* 1/*
2 CrossFire, A Multiplayer game for X-windows 2 * CrossFire, A Multiplayer game for X-windows
3 3 *
4 * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
4 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
5 Copyright (C) 1992 Frank Tore Johansen 6 * Copyright (C) 1992 Frank Tore Johansen
6 7 *
7 This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 11 * (at your option) any later version.
11 12 *
12 This program is distributed in the hope that it will be useful, 13 * This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details. 16 * GNU General Public License for more details.
16 17 *
17 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
18 along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 21 *
21 The author can be reached via e-mail to <crossfire@schmorp.de> 22 * The author can be reached via e-mail to <crossfire@schmorp.de>
23 *
24 */
22 25
26/*
23 Object (handling) commands 27 * Object (handling) commands
24*/ 28 */
25 29
26#include <global.h> 30#include <global.h>
27#include <loader.h> 31#include <loader.h>
28#include <skills.h> 32#include <skills.h>
29#ifndef __CEXTRACT__
30# include <sproto.h> 33#include <sproto.h>
31#endif
32#include <living.h> 34#include <living.h>
33#include <math.h> 35#include <math.h>
34 36
35/* 37/*
36 * Object id parsing functions 38 * Object id parsing functions
259 /* IF the player is flying & trying to take the item out of a container 261 /* IF the player is flying & trying to take the item out of a container
260 * that is in his inventory, let him. tmp->env points to the container 262 * that is in his inventory, let him. tmp->env points to the container
261 * (sack, luggage, etc), tmp->env->env then points to the player (nested 263 * (sack, luggage, etc), tmp->env->env then points to the player (nested
262 * containers not allowed as of now) 264 * containers not allowed as of now)
263 */ 265 */
264 if ((pl->move_type & MOVE_FLYING) && !QUERY_FLAG (pl, FLAG_WIZ) && is_player_inv (tmp) != pl) 266 if ((pl->move_type & MOVE_FLYING) && !QUERY_FLAG (pl, FLAG_WIZ) && tmp->in_player () != pl)
265 { 267 {
266 new_draw_info (NDI_UNIQUE, 0, pl, "You are levitating, you can't reach the ground!"); 268 new_draw_info (NDI_UNIQUE, 0, pl, "You are levitating, you can't reach the ground!");
267 return; 269 return;
268 } 270 }
269 271
510 if (tmp->invisible) 512 if (tmp->invisible)
511 { 513 {
512 tmp = next; 514 tmp = next;
513 continue; 515 continue;
514 } 516 }
517
515 /* This following two if and else if could be merged into line 518 /* This following two if and else if could be merged into line
516 * but that probably will make it more difficult to read, and 519 * but that probably will make it more difficult to read, and
517 * not make it any more efficient 520 * not make it any more efficient
518 */ 521 */
519 if (params && item_matched_string (op, tmp, params)) 522 if (params && item_matched_string (op, tmp, params))
520 {
521 pick_up (op, tmp); 523 pick_up (op, tmp);
522 }
523 else if (can_pick (op, tmp) && !params) 524 else if (can_pick (op, tmp) && !params)
524 { 525 {
525 pick_up (op, tmp); 526 pick_up (op, tmp);
526 break; 527 break;
527 } 528 }
529
528 tmp = next; 530 tmp = next;
529 /* Might as well just skip over the player immediately -
530 * we know it can't be picked up
531 */
532 if (tmp == op)
533 tmp = tmp->below;
534 } 531 }
532
535 if (!params && !tmp) 533 if (!params && !tmp)
536 { 534 {
537 for (tmp = op->below; tmp != NULL; tmp = tmp->next) 535 for (tmp = op->below; tmp; tmp = tmp->below)
538 if (!tmp->invisible) 536 if (!tmp->invisible)
539 { 537 {
540 char buf[MAX_BUF]; 538 char buf[MAX_BUF];
541 539
542 sprintf (buf, "You can't pick up a %s.", &tmp->name); 540 sprintf (buf, "You can't pick up a %s.", &tmp->name);
543 new_draw_info (NDI_UNIQUE, 0, op, buf); 541 new_draw_info (NDI_UNIQUE, 0, op, buf);
544 break; 542 break;
545 } 543 }
544
546 if (!tmp) 545 if (!tmp)
547 new_draw_info (NDI_UNIQUE, 0, op, "There is nothing to pick up."); 546 new_draw_info (NDI_UNIQUE, 0, op, "There is nothing to pick up.");
548 } 547 }
548
549 return 0; 549 return 0;
550} 550}
551 551
552 552
553/* 553/*
633 else 633 else
634 tmp->remove (); 634 tmp->remove ();
635 635
636 new_draw_info_format (NDI_UNIQUE, 0, op, "You put the %s in %s.", query_name (tmp), query_name (sack)); 636 new_draw_info_format (NDI_UNIQUE, 0, op, "You put the %s in %s.", query_name (tmp), query_name (sack));
637 tmp2 = insert_ob_in_ob (tmp, sack); 637 tmp2 = insert_ob_in_ob (tmp, sack);
638 fix_player (op); /* This is overkill, fix_player() is called somewhere */ 638 op->update_stats (); /* This is overkill, fix_player() is called somewhere */
639 /* in object.c */ 639 /* in object.c */
640 640
641 /* If an object merged (and thus, different object), we need to 641 /* If an object merged (and thus, different object), we need to
642 * delete the original. 642 * delete the original.
643 */ 643 */
702 if (QUERY_FLAG (tmp, FLAG_STARTEQUIP)) 702 if (QUERY_FLAG (tmp, FLAG_STARTEQUIP))
703 { 703 {
704 sprintf (buf, "You drop the %s.", query_name (tmp)); 704 sprintf (buf, "You drop the %s.", query_name (tmp));
705 new_draw_info (NDI_UNIQUE, 0, op, buf); 705 new_draw_info (NDI_UNIQUE, 0, op, buf);
706 new_draw_info (NDI_UNIQUE, 0, op, "The gods who lent it to you retrieves it."); 706 new_draw_info (NDI_UNIQUE, 0, op, "The gods who lent it to you retrieves it.");
707
707 if (op->type == PLAYER) 708 if (op->type == PLAYER)
708 esrv_del_item (op->contr, tmp->count); 709 esrv_del_item (op->contr, tmp->count);
710
709 tmp->destroy (); 711 tmp->destroy ();
710 fix_player (op); 712 op->update_stats ();
711 return; 713 return;
712 } 714 }
713
714/* If SAVE_INTERVAL is commented out, we never want to save
715 * the player here.
716 */
717#ifdef SAVE_INTERVAL
718 /* I'm not sure why there is a value check - since the save
719 * is done every SAVE_INTERVAL seconds, why care the value
720 * of what he is dropping?
721 */
722 if (op->type == PLAYER && !QUERY_FLAG (tmp, FLAG_UNPAID) &&
723 (tmp->nrof ? tmp->value * tmp->nrof : tmp->value > 2000) && (op->contr->last_save_time + SAVE_INTERVAL) <= time (NULL))
724 {
725 save_player (op, 1);
726 op->contr->last_save_time = time (NULL);
727 }
728#endif /* SAVE_INTERVAL */
729 715
730 if (op->type == PLAYER) 716 if (op->type == PLAYER)
731 esrv_del_item (op->contr, tmp->count); 717 esrv_del_item (op->contr, tmp->count);
732 718
733 /* Call this before we update the various windows/players. At least 719 /* Call this before we update the various windows/players. At least
734 * that we, we know the weight is correct. 720 * that we, we know the weight is correct.
735 */ 721 */
736 fix_player (op); /* This is overkill, fix_player() is called somewhere */ 722 op->update_stats (); /* This is overkill, fix_player() is called somewhere */
737 /* in object.c */ 723 /* in object.c */
738 724
739 if (op->type == PLAYER) 725 if (op->type == PLAYER)
740 { 726 {
741 op->contr->socket.update_look = 1;
742 /* Need to update the weight for the player */ 727 /* Need to update the weight for the player */
743 esrv_send_item (op, op); 728 esrv_send_item (op, op);
729 op->contr->ns->floorbox_update ();
744 } 730 }
745 731
746 for (floor = get_map_ob (op->map, op->x, op->y); floor; floor = floor->above) 732 for (floor = GET_MAP_OB (op->map, op->x, op->y); floor; floor = floor->above)
747 if (INVOKE_OBJECT (DROP_ON, floor, ARG_OBJECT (tmp), ARG_OBJECT (op))) 733 if (INVOKE_OBJECT (DROP_ON, floor, ARG_OBJECT (tmp), ARG_OBJECT (op)))
748 return; 734 return;
749 735
750 if (is_in_shop (op) && !QUERY_FLAG (tmp, FLAG_UNPAID) && tmp->type != MONEY) 736 if (is_in_shop (op) && !QUERY_FLAG (tmp, FLAG_UNPAID) && tmp->type != MONEY)
751 sell_item (tmp, op); 737 sell_item (tmp, op);
800 new_draw_info (NDI_UNIQUE, 0, op, "This item can't be dropped."); 786 new_draw_info (NDI_UNIQUE, 0, op, "This item can't be dropped.");
801#endif 787#endif
802 return; 788 return;
803 } 789 }
804 790
805 if (op->type == PLAYER) 791 if (op->type == PLAYER && op->contr->last_used == tmp)
806 { 792 op->contr->last_used = tmp->below ? tmp->below
807 if (op->contr->last_used == tmp && op->contr->last_used_id == tmp->count) 793 : tmp->above ? tmp->above
808 { 794 : 0;
809 object *n = NULL;
810
811 if (tmp->below != NULL)
812 n = tmp->below;
813 else if (tmp->above != NULL)
814 n = tmp->above;
815 op->contr->last_used = n;
816 if (n != NULL)
817 op->contr->last_used_id = n->count;
818 else
819 op->contr->last_used_id = 0;
820 }
821 };
822 795
823 if (op->container) 796 if (op->container)
824 { 797 {
825 if (op->type == PLAYER) 798 if (op->type == PLAYER)
826 {
827 put_object_in_sack (op, op->container, tmp, op->contr->count); 799 put_object_in_sack (op, op->container, tmp, op->contr->count);
828 }
829 else 800 else
830 {
831 put_object_in_sack (op, op->container, tmp, 0); 801 put_object_in_sack (op, op->container, tmp, 0);
832 };
833 } 802 }
834 else 803 else
835 { 804 {
836 if (op->type == PLAYER) 805 if (op->type == PLAYER)
837 {
838 drop_object (op, tmp, op->contr->count); 806 drop_object (op, tmp, op->contr->count);
839 }
840 else 807 else
841 {
842 drop_object (op, tmp, 0); 808 drop_object (op, tmp, 0);
843 };
844 } 809 }
810
845 if (op->type == PLAYER) 811 if (op->type == PLAYER)
846 op->contr->count = 0; 812 op->contr->count = 0;
847} 813}
848 814
849 815
957 } 923 }
958 } 924 }
959 curinv = nextinv; 925 curinv = nextinv;
960 } 926 }
961 } 927 }
962 op->contr->socket.update_look = 1; 928
929 op->contr->ns->floorbox_update ();
963 930
964/* draw_look(op);*/ 931/* draw_look(op);*/
965 return 0; 932 return 0;
966} 933}
967 934
997 new_draw_info (NDI_UNIQUE, 0, op, "Nothing to drop."); 964 new_draw_info (NDI_UNIQUE, 0, op, "Nothing to drop.");
998 } 965 }
999 if (op->type == PLAYER) 966 if (op->type == PLAYER)
1000 { 967 {
1001 op->contr->count = 0; 968 op->contr->count = 0;
1002 op->contr->socket.update_look = 1; 969 op->contr->ns->floorbox_update ();
1003 }; 970 };
1004 971
1005/* draw_look(op);*/ 972/* draw_look(op);*/
1006 return 0; 973 return 0;
1007} 974}
1011{ 978{
1012 if (!params) 979 if (!params)
1013 { 980 {
1014 object *tmp = op->below; 981 object *tmp = op->below;
1015 982
1016 while (tmp && !LOOK_OBJ (tmp)) 983 while (tmp && !tmp->client_visible ())
1017 tmp = tmp->below; 984 tmp = tmp->below;
1018 if (tmp) 985 if (tmp)
1019 examine (op, tmp); 986 examine (op, tmp);
1020 } 987 }
1021 else 988 else
1578 new_draw_info (NDI_UNIQUE, 0, op, "items containing the word 'magic+1'."); 1545 new_draw_info (NDI_UNIQUE, 0, op, "items containing the word 'magic+1'.");
1579 return 1; 1546 return 1;
1580 } 1547 }
1581 op->contr->search_str[0] = '\0'; 1548 op->contr->search_str[0] = '\0';
1582 new_draw_info (NDI_UNIQUE, 0, op, "Search mode turned off."); 1549 new_draw_info (NDI_UNIQUE, 0, op, "Search mode turned off.");
1583 fix_player (op); 1550 op->update_stats ();
1584 return 1; 1551 return 1;
1585 } 1552 }
1586 if ((int) strlen (params) >= MAX_BUF) 1553 if ((int) strlen (params) >= MAX_BUF)
1587 { 1554 {
1588 new_draw_info (NDI_UNIQUE, 0, op, "Search string too long."); 1555 new_draw_info (NDI_UNIQUE, 0, op, "Search string too long.");
1589 return 1; 1556 return 1;
1590 } 1557 }
1591 strcpy (op->contr->search_str, params); 1558 strcpy (op->contr->search_str, params);
1592 sprintf (buf, "Searching for '%s'.", op->contr->search_str); 1559 sprintf (buf, "Searching for '%s'.", op->contr->search_str);
1593 new_draw_info (NDI_UNIQUE, 0, op, buf); 1560 new_draw_info (NDI_UNIQUE, 0, op, buf);
1594 fix_player (op); 1561 op->update_stats ();
1595 return 1; 1562 return 1;
1596} 1563}
1597 1564

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines