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

Comparing deliantra/server/server/plugins.C (file contents):
Revision 1.23 by root, Wed Dec 13 03:28:42 2006 UTC vs.
Revision 1.46 by root, Mon May 28 21:28:36 2007 UTC

1/*****************************************************************************/ 1/*
2/* CrossFire, A Multiplayer game for X-windows */ 2 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3/* */ 3 *
4/* Copyright (C) 2000 Mark Wedel */ 4 * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5/* Copyright (C) 1992 Frank Tore Johansen */ 5 * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6/* */ 6 * Copyright (©) 1992,2007 Frank Tore Johansen
7 *
7/* This program is free software; you can redistribute it and/or modify */ 8 * Crossfire TRT is free software; you can redistribute it and/or modify it
8/* it under the terms of the GNU General Public License as published by */ 9 * under the terms of the GNU General Public License as published by the Free
9/* the Free Software Foundation; either version 2 of the License, or */ 10 * Software Foundation; either version 2 of the License, or (at your option)
10/* (at your option) any later version. */ 11 * 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, but
13/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ 15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15/* GNU General Public License for more details. */ 16 * 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 along
18/* along with this program; if not, write to the Free Software */ 19 * with Crossfire TRT; if not, write to the Free Software Foundation, Inc. 51
19/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ 20 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20/* */ 21 *
22 * The authors can be reached via e-mail to <crossfire@schmorp.de>
23 */
24
21/*****************************************************************************/ 25/*****************************************************************************/
22/* This is the server-side plugin management part. */ 26/* This is the server-side plugin management part. */
23/*****************************************************************************/ 27/*****************************************************************************/
24/* Original code by Yann Chachkoff (yann.chachkoff@mailandnews.com). */ 28/* Original code by Yann Chachkoff (yann.chachkoff@mailandnews.com). */
25/* Special thanks to: */ 29/* Special thanks to: */
26/* David Delbecq (david.delbecq@mailandnews.com); */ 30/* David Delbecq (david.delbecq@mailandnews.com); */
27/* Joris Bontje (jbontje@suespammers.org); */ 31/* Joris Bontje (jbontje@suespammers.org); */
28/* Philip Currlin (?); */ 32/* Philip Currlin (?); */
29/*****************************************************************************/ 33/*****************************************************************************/
34
30/*****************************************************************************/ 35/*****************************************************************************/
31/* First, the headers. We only include plugin.h, because all other includes */ 36/* First, the headers. We only include plugin.h, because all other includes */
32/* are done into it, and plugproto.h (which is used only by this file). */ 37/* are done into it, and plugproto.h (which is used only by this file). */
33/*****************************************************************************/ 38/*****************************************************************************/
34 39
43static const hook_entry plug_hooks[NR_OF_HOOKS] = { 48static const hook_entry plug_hooks[NR_OF_HOOKS] = {
44 {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"}, 49 {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"},
45 {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"}, 50 {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"},
46 {cfapi_system_check_path, 4, "cfapi_system_check_path"}, 51 {cfapi_system_check_path, 4, "cfapi_system_check_path"},
47 {NULL, 5, "cfapi_system_re_cmp"}, 52 {NULL, 5, "cfapi_system_re_cmp"},
48 {cfapi_system_strdup_local, 6, "cfapi_system_strdup_local"}, 53 {cfapi_system_strdup, 6, "cfapi_system_strdup"},
49 {cfapi_system_directory, 7, "cfapi_system_directory"}, 54 {cfapi_system_directory, 7, "cfapi_system_directory"},
50 {cfapi_system_find_animation, 8, "cfapi_system_find_animation"}, 55 {cfapi_system_find_animation, 8, "cfapi_system_find_animation"},
51 {cfapi_object_clean_object, 9, "cfapi_object_clean_object"}, 56 {cfapi_object_clean_object, 9, "cfapi_object_clean_object"},
52 {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"}, 57 {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"},
53 {cfapi_object_get_key, 11, "cfapi_object_get_key"}, 58 {cfapi_object_get_key, 11, "cfapi_object_get_key"},
122/* NEW PLUGIN STUFF STARTS HERE */ 127/* NEW PLUGIN STUFF STARTS HERE */
123 128
124/*****************************************************************************/ 129/*****************************************************************************/
125 130
126/** 131/**
127 * Notify clients about a changed object.
128 *
129 * @param op the object that has changed
130 */
131static void
132send_changed_object (object *op)
133{
134 object *tmp;
135 player *pl;
136
137 if (op->env != NULL)
138 {
139 tmp = is_player_inv (op->env);
140 if (!tmp)
141 {
142 for (pl = first_player; pl; pl = pl->next)
143 if (pl->ob->container == op->env)
144 break;
145 if (pl)
146 tmp = pl->ob;
147 else
148 tmp = NULL;
149 }
150 if (tmp)
151 esrv_send_item (tmp, op);
152 }
153 else
154 {
155 for (tmp = op->above; tmp != NULL; tmp = tmp->above)
156 if (tmp->type == PLAYER)
157 esrv_send_item (tmp, op);
158 }
159}
160
161/**
162 * Notify clients about a removed object. 132 * Notify clients about a removed object.
163 * 133 *
164 * @param op the object about to be removed from its environment; it must still 134 * @param op the object about to be removed from its environment; it must still
165 * be present in its environment 135 * be present in its environment
166 */ 136 */
167static void 137static void
168send_removed_object (object *op) 138send_removed_object (object *op)
169{ 139{
170 object *tmp; 140 object *tmp;
171 player *pl;
172 141
173 if (op->env == NULL) 142 if (op->env == NULL)
174 { 143 {
175 /* no action necessary: remove_ob() notifies the client */ 144 /* no action necessary: remove_ob() notifies the client */
176 return; 145 return;
177 } 146 }
178 147
179 tmp = is_player_inv (op->env); 148 tmp = op->in_player ();
180 if (!tmp) 149 if (!tmp)
181 { 150 {
182 for (pl = first_player; pl; pl = pl->next) 151 for_all_players (pl)
183 if (pl->ob->container == op->env) 152 if (pl->ob->container == op->env)
153 {
154 tmp = pl->ob;
184 break; 155 break;
185 if (pl) 156 }
186 tmp = pl->ob;
187 else
188 tmp = NULL;
189 } 157 }
158
190 if (tmp) 159 if (tmp)
191 esrv_del_item (tmp->contr, op->count); 160 esrv_del_item (tmp->contr, op->count);
192} 161}
193 162
194extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr); 163extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr);
482 *type = CFAPI_INT; 451 *type = CFAPI_INT;
483 return &rv; 452 return &rv;
484} 453}
485 454
486void * 455void *
487cfapi_system_strdup_local (int *type, ...) 456cfapi_system_strdup (int *type, ...)
488{ 457{
489 va_list args; 458 va_list args;
490 char *txt; 459 char *txt;
491 460
492 va_start (args, type); 461 va_start (args, type);
493 txt = va_arg (args, char *); 462 txt = va_arg (args, char *);
494 463
495 va_end (args); 464 va_end (args);
496 *type = CFAPI_STRING; 465 *type = CFAPI_STRING;
497 return strdup_local (txt); 466 return strdup (txt);
498} 467}
499 468
500void * 469void *
501cfapi_system_register_global_event (int *type, ...) 470cfapi_system_register_global_event (int *type, ...)
502{ 471{
572 *type = CFAPI_STRING; 541 *type = CFAPI_STRING;
573 542
574 switch (dirtype) 543 switch (dirtype)
575 { 544 {
576 case 0: 545 case 0:
577 return settings.mapdir; 546 return (char *)settings.mapdir;
578 break; 547 break;
579 548
580 case 1: 549 case 1:
581 return settings.uniquedir; 550 return (char *)settings.uniquedir;
582 break; 551 break;
583 552
584 case 2: 553 case 2:
585 return settings.tmpdir; 554 return (char *)settings.tmpdir;
586 break; 555 break;
587 556
588 case 3: 557 case 3:
589 return settings.confdir; 558 return (char *)settings.confdir;
590 break; 559 break;
591 560
592 case 4: 561 case 4:
593 return settings.localdir; 562 return (char *)settings.localdir;
594 break; 563 break;
595 564
596 case 5: 565 case 5:
597 return settings.playerdir; 566 return (char *)settings.playerdir;
598 break; 567 break;
599 568
600 case 6: 569 case 6:
601 return settings.datadir; 570 return (char *)settings.datadir;
602 break; 571 break;
603 } 572 }
604 573
605 *type = CFAPI_NONE; 574 *type = CFAPI_NONE;
606 return NULL; 575 return NULL;
610/* MAP RELATED HOOKS */ 579/* MAP RELATED HOOKS */
611 580
612void * 581void *
613cfapi_map_get_map (int *type, ...) 582cfapi_map_get_map (int *type, ...)
614{ 583{
615 va_list args; 584 abort ();
616 maptile *rv;
617 int ctype;
618 int x, y;
619 sint16 nx, ny;
620 char *name;
621 maptile *m;
622
623 va_start (args, type);
624
625 ctype = va_arg (args, int);
626
627 switch (ctype)
628 {
629 case 0:
630 x = va_arg (args, int);
631 y = va_arg (args, int);
632
633 rv = get_empty_map (x, y);
634 break;
635
636 case 1:
637 name = va_arg (args, char *);
638 x = va_arg (args, int);
639
640 rv = ready_map_name (name, x);
641 break;
642
643 case 2:
644 m = va_arg (args, maptile *);
645 nx = va_arg (args, int);
646 ny = va_arg (args, int);
647
648 rv = get_map_from_coord (m, &nx, &ny);
649 break;
650
651 case 3:
652 rv = first_map;
653 break;
654
655 default:
656 *type = CFAPI_NONE;
657 va_end (args);
658 return NULL;
659 break;
660 }
661 va_end (args);
662 *type = CFAPI_PMAP;
663 return rv;
664} 585}
665 586
666void * 587void *
667cfapi_map_has_been_loaded (int *type, ...) 588cfapi_map_has_been_loaded (int *type, ...)
668{ 589{
669 va_list args; 590 abort ();
670 maptile *map;
671 char *string;
672
673 va_start (args, type);
674 string = va_arg (args, char *);
675
676 map = has_been_loaded (string);
677 va_end (args);
678 *type = CFAPI_PMAP;
679 return map;
680} 591}
681 592
682void * 593void *
683cfapi_map_create_path (int *type, ...) 594cfapi_map_create_path (int *type, ...)
684{ 595{
685 va_list args; 596 abort ();
686 int ctype;
687 const char *str;
688 char *rv;
689
690 va_start (args, type);
691
692 ctype = va_arg (args, int);
693 str = va_arg (args, char *);
694
695 *type = CFAPI_STRING;
696
697 switch (ctype)
698 {
699 case 0:
700 rv = (char *) create_pathname (str);
701 break;
702
703 case 1:
704 rv = (char *) create_overlay_pathname (str);
705 break;
706
707 /*case 2:
708 rv = create_items_path(str);
709 break; */
710
711 default:
712 rv = NULL;
713 *type = CFAPI_NONE;
714 break;
715 }
716 va_end (args);
717 return rv;
718} 597}
719 598
720void * 599void *
721cfapi_map_get_map_property (int *type, ...) 600cfapi_map_get_map_property (int *type, ...)
722{ 601{
723 va_list args; 602 abort ();
724 int x, y;
725 sint16 nx, ny;
726 maptile *map;
727 maptile *newmap;
728 static int rv;
729 int property;
730 char *buf;
731
732 va_start (args, type);
733
734 property = va_arg (args, int);
735
736 switch (property)
737 {
738 case CFAPI_MAP_PROP_FLAGS:
739 map = va_arg (args, maptile *);
740 newmap = va_arg (args, maptile *);
741 x = va_arg (args, int);
742 y = va_arg (args, int);
743 nx = va_arg (args, int);
744 ny = va_arg (args, int);
745
746 rv = get_map_flags (map, &newmap, x, y, &nx, &ny);
747 va_end (args);
748 *type = CFAPI_INT;
749 return &rv;
750 break;
751
752 case CFAPI_MAP_PROP_DIFFICULTY:
753 map = va_arg (args, maptile *);
754
755 rv = calculate_difficulty (map);
756 va_end (args);
757 *type = CFAPI_INT;
758 return &rv;
759 break;
760
761 case CFAPI_MAP_PROP_PATH:
762 map = va_arg (args, maptile *);
763
764 buf = map->path;
765 *type = CFAPI_STRING;
766 va_end (args);
767 return buf;
768 break;
769
770 case CFAPI_MAP_PROP_TMPNAME:
771 map = va_arg (args, maptile *);
772
773 buf = map->tmpname;
774 *type = CFAPI_STRING;
775 va_end (args);
776 return buf;
777 break;
778
779 case CFAPI_MAP_PROP_NAME:
780 map = va_arg (args, maptile *);
781
782 buf = map->name;
783 *type = CFAPI_STRING;
784 va_end (args);
785 return buf;
786 break;
787
788 case CFAPI_MAP_PROP_RESET_TIME:
789 map = va_arg (args, maptile *);
790
791 rv = map->reset_time;
792 *type = CFAPI_INT;
793 va_end (args);
794 return &rv;
795 break;
796
797 case CFAPI_MAP_PROP_RESET_TIMEOUT:
798 map = va_arg (args, maptile *);
799
800 rv = map->reset_timeout;
801 *type = CFAPI_INT;
802 va_end (args);
803 return &rv;
804 break;
805
806 case CFAPI_MAP_PROP_PLAYERS:
807 map = va_arg (args, maptile *);
808
809 rv = map->players;
810 *type = CFAPI_INT;
811 va_end (args);
812 return &rv;
813 break;
814
815 case CFAPI_MAP_PROP_DARKNESS:
816 map = va_arg (args, maptile *);
817
818 rv = map->darkness;
819 *type = CFAPI_INT;
820 va_end (args);
821 return &rv;
822 break;
823
824 case CFAPI_MAP_PROP_WIDTH:
825 map = va_arg (args, maptile *);
826
827 rv = map->width;
828 *type = CFAPI_INT;
829 va_end (args);
830 return &rv;
831 break;
832
833 case CFAPI_MAP_PROP_HEIGHT:
834 map = va_arg (args, maptile *);
835
836 rv = map->height;
837 *type = CFAPI_INT;
838 va_end (args);
839 return &rv;
840 break;
841
842 case CFAPI_MAP_PROP_ENTER_X:
843 map = va_arg (args, maptile *);
844
845 rv = map->enter_x;
846 *type = CFAPI_INT;
847 va_end (args);
848 return &rv;
849 break;
850
851 case CFAPI_MAP_PROP_ENTER_Y:
852 map = va_arg (args, maptile *);
853
854 rv = map->enter_y;
855 *type = CFAPI_INT;
856 va_end (args);
857 return &rv;
858 break;
859
860 case CFAPI_MAP_PROP_TEMPERATURE:
861 map = va_arg (args, maptile *);
862
863 rv = map->temp;
864 *type = CFAPI_INT;
865 va_end (args);
866 return &rv;
867 break;
868
869 case CFAPI_MAP_PROP_PRESSURE:
870 map = va_arg (args, maptile *);
871
872 rv = map->pressure;
873 *type = CFAPI_INT;
874 va_end (args);
875 return &rv;
876 break;
877
878 case CFAPI_MAP_PROP_HUMIDITY:
879 map = va_arg (args, maptile *);
880
881 rv = map->humid;
882 *type = CFAPI_INT;
883 va_end (args);
884 return &rv;
885 break;
886
887 case CFAPI_MAP_PROP_WINDSPEED:
888 map = va_arg (args, maptile *);
889
890 rv = map->windspeed;
891 *type = CFAPI_INT;
892 va_end (args);
893 return &rv;
894 break;
895
896 case CFAPI_MAP_PROP_WINDDIR:
897 map = va_arg (args, maptile *);
898
899 rv = map->winddir;
900 *type = CFAPI_INT;
901 va_end (args);
902 return &rv;
903 break;
904
905 case CFAPI_MAP_PROP_SKY:
906 map = va_arg (args, maptile *);
907
908 rv = map->sky;
909 *type = CFAPI_INT;
910 va_end (args);
911 return &rv;
912 break;
913
914 case CFAPI_MAP_PROP_WPARTX:
915 map = va_arg (args, maptile *);
916
917 rv = map->wpartx;
918 *type = CFAPI_INT;
919 va_end (args);
920 return &rv;
921 break;
922
923 case CFAPI_MAP_PROP_WPARTY:
924 map = va_arg (args, maptile *);
925
926 rv = map->wparty;
927 *type = CFAPI_INT;
928 va_end (args);
929 return &rv;
930 break;
931
932 case CFAPI_MAP_PROP_MESSAGE:
933 map = va_arg (args, maptile *);
934
935 buf = map->msg;
936 *type = CFAPI_STRING;
937 va_end (args);
938 return buf;
939 break;
940
941 case CFAPI_MAP_PROP_NEXT:
942 map = va_arg (args, maptile *);
943
944 *type = CFAPI_PMAP;
945 va_end (args);
946 return map->next;
947 break;
948
949 case CFAPI_MAP_PROP_REGION:
950 map = va_arg (args, maptile *);
951
952 *type = CFAPI_PREGION;
953 va_end (args);
954 return get_region_by_map (map);
955 break;
956
957 default:
958 *type = CFAPI_NONE;
959 va_end (args);
960 return NULL;
961 break;
962 }
963} 603}
964 604
965void * 605void *
966cfapi_map_set_map_property (int *type, ...) 606cfapi_map_set_map_property (int *type, ...)
967{ 607{
968 va_list args; 608 abort ();
969 static int rv;
970 maptile *map;
971 int val;
972 int property;
973
974 va_start (args, type);
975
976 property = va_arg (args, int);
977
978 switch (property)
979 {
980 case CFAPI_MAP_PROP_LIGHT:
981 map = va_arg (args, maptile *);
982 val = va_arg (args, int);
983
984 rv = change_map_light (map, val);
985 *type = CFAPI_INT;
986 va_end (args);
987 return &rv;
988 break;
989
990 case CFAPI_MAP_PROP_RESET_TIME:
991 map = va_arg (args, maptile *);
992
993 *type = CFAPI_NONE;
994 va_end (args);
995 return NULL;
996 break;
997
998 default:
999 *type = CFAPI_NONE;
1000 va_end (args);
1001 return NULL;
1002 break;
1003 }
1004} 609}
610
1005void * 611void *
1006cfapi_map_out_of_map (int *type, ...) 612cfapi_map_out_of_map (int *type, ...)
1007{ 613{
614 abort ();
615}
616
617void *
618cfapi_map_update_position (int *type, ...)
619{
1008 va_list args; 620 va_list args;
1009 static int rv;
1010 maptile *map; 621 maptile *map;
1011 int x, y; 622 int x, y;
1012 623
1013 va_start (args, type); 624 va_start (args, type);
625
1014 map = va_arg (args, maptile *); 626 map = va_arg (args, maptile *);
1015 x = va_arg (args, int); 627 x = va_arg (args, int);
1016 y = va_arg (args, int); 628 y = va_arg (args, int);
1017 629
1018 rv = out_of_map (map, x, y); 630 map->at (x, y).flags_ &= ~P_UPTODATE;
631
1019 va_end (args); 632 va_end (args);
1020 *type = CFAPI_INT; 633 *type = CFAPI_NONE;
1021 return &rv; 634 return NULL;
1022} 635}
1023 636
1024void * 637void *
1025cfapi_map_update_position (int *type, ...) 638cfapi_map_delete_map (int *type, ...)
639{
640 abort ();
641}
642
643void *
644cfapi_map_message (int *type, ...)
645{
646 va_list args;
647 maptile *map;
648 char *string;
649 int color;
650
651 va_start (args, type);
652 map = va_arg (args, maptile *);
653 string = va_arg (args, char *);
654 color = va_arg (args, int);
655
656 va_end (args);
657
658 new_info_map (color, map, string);
659 *type = CFAPI_NONE;
660 return NULL;
661}
662
663void *
664cfapi_map_get_object_at (int *type, ...)
1026{ 665{
1027 va_list args; 666 va_list args;
1028 maptile *map; 667 maptile *map;
1029 int x, y; 668 int x, y;
669 object *rv;
1030 670
1031 va_start (args, type); 671 va_start (args, type);
1032
1033 map = va_arg (args, maptile *); 672 map = va_arg (args, maptile *);
1034 x = va_arg (args, int); 673 x = va_arg (args, int);
1035 y = va_arg (args, int); 674 y = va_arg (args, int);
1036 675
1037 update_position (map, x, y);
1038 va_end (args); 676 va_end (args);
1039 *type = CFAPI_NONE;
1040 return NULL;
1041}
1042 677
1043void * 678 rv = GET_MAP_OB (map, x, y);
1044cfapi_map_delete_map (int *type, ...)
1045{
1046 va_list args;
1047 maptile *map;
1048
1049 va_start (args, type);
1050
1051 map = va_arg (args, maptile *);
1052
1053 delete_map (map);
1054
1055 va_end (args);
1056 *type = CFAPI_NONE;
1057 return NULL;
1058}
1059
1060void *
1061cfapi_map_message (int *type, ...)
1062{
1063 va_list args;
1064 maptile *map;
1065 char *string;
1066 int color;
1067
1068 va_start (args, type);
1069 map = va_arg (args, maptile *);
1070 string = va_arg (args, char *);
1071 color = va_arg (args, int);
1072
1073 va_end (args);
1074
1075 new_info_map (color, map, string);
1076 *type = CFAPI_NONE;
1077 return NULL;
1078}
1079
1080void *
1081cfapi_map_get_object_at (int *type, ...)
1082{
1083 va_list args;
1084 maptile *map;
1085 int x, y;
1086 object *rv;
1087
1088 va_start (args, type);
1089 map = va_arg (args, maptile *);
1090 x = va_arg (args, int);
1091 y = va_arg (args, int);
1092
1093 va_end (args);
1094
1095 rv = get_map_ob (map, x, y);
1096 *type = CFAPI_POBJECT; 679 *type = CFAPI_POBJECT;
1097 return rv; 680 return rv;
1098} 681}
1099 682
1100void * 683void *
1226} 809}
1227 810
1228void * 811void *
1229cfapi_object_get_property (int *type, ...) 812cfapi_object_get_property (int *type, ...)
1230{ 813{
1231 va_list args; 814 abort ();
1232 int property;
1233 object *op;
1234 void *rv;
1235 static int ri;
1236
1237 va_start (args, type);
1238
1239 op = va_arg (args, object *);
1240 property = va_arg (args, int);
1241
1242 rv = NULL;
1243 if (op != NULL)
1244 {
1245 switch (property)
1246 {
1247 case CFAPI_OBJECT_PROP_OB_ABOVE:
1248 rv = op->above;
1249 *type = CFAPI_POBJECT;
1250 break;
1251
1252 case CFAPI_OBJECT_PROP_OB_BELOW:
1253 rv = op->below;
1254 *type = CFAPI_POBJECT;
1255 break;
1256
1257 case CFAPI_OBJECT_PROP_NEXT_ACTIVE_OB:
1258 rv = op->active_next;
1259 *type = CFAPI_POBJECT;
1260 break;
1261
1262 case CFAPI_OBJECT_PROP_PREV_ACTIVE_OB:
1263 rv = op->active_prev;
1264 *type = CFAPI_POBJECT;
1265 break;
1266
1267 case CFAPI_OBJECT_PROP_INVENTORY:
1268 rv = op->inv;
1269 *type = CFAPI_POBJECT;
1270 break;
1271
1272 case CFAPI_OBJECT_PROP_ENVIRONMENT:
1273 rv = op->env;
1274 *type = CFAPI_POBJECT;
1275 break;
1276
1277 case CFAPI_OBJECT_PROP_HEAD:
1278 rv = op->head;
1279 *type = CFAPI_POBJECT;
1280 break;
1281
1282 case CFAPI_OBJECT_PROP_CONTAINER:
1283 rv = op->container;
1284 *type = CFAPI_POBJECT;
1285 break;
1286
1287 case CFAPI_OBJECT_PROP_MAP:
1288 rv = op->map;
1289 *type = CFAPI_PMAP;
1290 break;
1291
1292 case CFAPI_OBJECT_PROP_COUNT:
1293 ri = op->count;
1294 rv = &ri;
1295 *type = CFAPI_INT;
1296 break;
1297
1298 case CFAPI_OBJECT_PROP_REFCOUNT:
1299 abort ();
1300 break;
1301
1302 case CFAPI_OBJECT_PROP_NAME:
1303 rv = query_name (op);
1304 *type = CFAPI_STRING;
1305 break;
1306
1307 case CFAPI_OBJECT_PROP_NAME_PLURAL:
1308 rv = (char *) &op->name_pl;
1309 *type = CFAPI_STRING;
1310 break;
1311
1312 case CFAPI_OBJECT_PROP_TITLE:
1313 rv = (char *) &op->title;
1314 *type = CFAPI_STRING;
1315 break;
1316
1317 case CFAPI_OBJECT_PROP_RACE:
1318 rv = (char *) &op->race;
1319 *type = CFAPI_STRING;
1320 break;
1321
1322 case CFAPI_OBJECT_PROP_SLAYING:
1323 rv = (char *) &op->slaying;
1324 *type = CFAPI_STRING;
1325 break;
1326
1327 case CFAPI_OBJECT_PROP_SKILL:
1328 rv = (char *) &op->skill;
1329 *type = CFAPI_STRING;
1330 break;
1331
1332 case CFAPI_OBJECT_PROP_MESSAGE:
1333 rv = (char *) &op->msg;
1334 if (rv == NULL)
1335 rv = (void *) "";
1336 *type = CFAPI_STRING;
1337 break;
1338
1339 case CFAPI_OBJECT_PROP_LORE:
1340 rv = (char *) &op->lore;
1341 *type = CFAPI_STRING;
1342 break;
1343
1344 case CFAPI_OBJECT_PROP_X:
1345 ri = op->x;
1346 rv = &ri;
1347 *type = CFAPI_INT;
1348 break;
1349
1350 case CFAPI_OBJECT_PROP_Y:
1351 ri = op->y;
1352 rv = &ri;
1353 *type = CFAPI_INT;
1354 break;
1355
1356 case CFAPI_OBJECT_PROP_SPEED:
1357 rv = &op->speed;
1358 *type = CFAPI_DOUBLE;
1359 break;
1360
1361 case CFAPI_OBJECT_PROP_SPEED_LEFT:
1362 rv = &op->speed_left;
1363 *type = CFAPI_DOUBLE;
1364 break;
1365
1366 case CFAPI_OBJECT_PROP_NROF:
1367 ri = op->nrof;
1368 rv = &ri;
1369 *type = CFAPI_INT;
1370 break;
1371
1372 case CFAPI_OBJECT_PROP_DIRECTION:
1373 ri = op->direction;
1374 rv = &ri;
1375 *type = CFAPI_INT;
1376 break;
1377
1378 case CFAPI_OBJECT_PROP_FACING:
1379 ri = op->facing;
1380 rv = &ri;
1381 *type = CFAPI_INT;
1382 break;
1383
1384 case CFAPI_OBJECT_PROP_TYPE:
1385 ri = op->type;
1386 rv = &ri;
1387 *type = CFAPI_INT;
1388 break;
1389
1390 case CFAPI_OBJECT_PROP_SUBTYPE:
1391 ri = op->subtype;
1392 rv = &ri;
1393 *type = CFAPI_INT;
1394 break;
1395
1396 case CFAPI_OBJECT_PROP_CLIENT_TYPE:
1397 ri = op->client_type;
1398 rv = &ri;
1399 *type = CFAPI_INT;
1400 break;
1401
1402 case CFAPI_OBJECT_PROP_RESIST:
1403 {
1404 int idx;
1405 idx = va_arg (args, int);
1406
1407 ri = op->resist[idx];
1408 rv = &ri;
1409 }
1410 *type = CFAPI_INT;
1411 break;
1412
1413 case CFAPI_OBJECT_PROP_ATTACK_TYPE:
1414 ri = op->attacktype;
1415 rv = &ri;
1416 *type = CFAPI_INT;
1417 break;
1418
1419 case CFAPI_OBJECT_PROP_PATH_ATTUNED:
1420 ri = op->path_attuned;
1421 rv = &ri;
1422 *type = CFAPI_INT;
1423 break;
1424
1425 case CFAPI_OBJECT_PROP_PATH_REPELLED:
1426 ri = op->path_repelled;
1427 rv = &ri;
1428 *type = CFAPI_INT;
1429 break;
1430
1431 case CFAPI_OBJECT_PROP_PATH_DENIED:
1432 ri = op->path_denied;
1433 rv = &ri;
1434 *type = CFAPI_INT;
1435 break;
1436
1437 case CFAPI_OBJECT_PROP_MATERIAL:
1438 ri = op->material;
1439 rv = &ri;
1440 *type = CFAPI_INT;
1441 break;
1442
1443 case CFAPI_OBJECT_PROP_MAGIC:
1444 ri = op->magic;
1445 rv = &ri;
1446 *type = CFAPI_INT;
1447 break;
1448
1449 case CFAPI_OBJECT_PROP_VALUE:
1450 ri = op->value;
1451 rv = &ri;
1452 *type = CFAPI_INT;
1453 break;
1454
1455 case CFAPI_OBJECT_PROP_LEVEL:
1456 ri = op->level;
1457 rv = &ri;
1458 *type = CFAPI_INT;
1459 break;
1460
1461 case CFAPI_OBJECT_PROP_LAST_HEAL:
1462 ri = op->last_heal;
1463 rv = &ri;
1464 *type = CFAPI_INT;
1465 break;
1466
1467 case CFAPI_OBJECT_PROP_LAST_SP:
1468 ri = op->last_sp;
1469 rv = &ri;
1470 *type = CFAPI_INT;
1471 break;
1472
1473 case CFAPI_OBJECT_PROP_LAST_GRACE:
1474 ri = op->last_grace;
1475 rv = &ri;
1476 *type = CFAPI_INT;
1477 break;
1478
1479 case CFAPI_OBJECT_PROP_LAST_EAT:
1480 ri = op->last_eat;
1481 rv = &ri;
1482 *type = CFAPI_INT;
1483 break;
1484
1485 case CFAPI_OBJECT_PROP_INVISIBLE_TIME:
1486 ri = op->invisible;
1487 rv = &ri;
1488 *type = CFAPI_INT;
1489 break;
1490
1491 case CFAPI_OBJECT_PROP_PICK_UP:
1492 ri = op->pick_up;
1493 rv = &ri;
1494 *type = CFAPI_INT;
1495 break;
1496
1497 case CFAPI_OBJECT_PROP_ITEM_POWER:
1498 ri = op->item_power;
1499 rv = &ri;
1500 *type = CFAPI_INT;
1501 break;
1502
1503 case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR:
1504 ri = op->gen_sp_armour;
1505 rv = &ri;
1506 *type = CFAPI_INT;
1507 break;
1508
1509 case CFAPI_OBJECT_PROP_WEIGHT:
1510 ri = op->weight;
1511 rv = &ri;
1512 *type = CFAPI_INT;
1513 break;
1514
1515 case CFAPI_OBJECT_PROP_WEIGHT_LIMIT:
1516 ri = op->weight_limit;
1517 rv = &ri;
1518 *type = CFAPI_INT;
1519 break;
1520
1521 case CFAPI_OBJECT_PROP_CARRYING:
1522 ri = op->carrying;
1523 rv = &ri;
1524 *type = CFAPI_INT;
1525 break;
1526
1527 case CFAPI_OBJECT_PROP_GLOW_RADIUS:
1528 ri = op->glow_radius;
1529 rv = &ri;
1530 *type = CFAPI_INT;
1531 break;
1532
1533 case CFAPI_OBJECT_PROP_PERM_EXP:
1534 rv = &op->perm_exp;
1535 *type = CFAPI_LONG;
1536 break;
1537
1538 case CFAPI_OBJECT_PROP_CURRENT_WEAPON:
1539 rv = op->current_weapon;
1540 *type = CFAPI_POBJECT;
1541 break;
1542
1543 case CFAPI_OBJECT_PROP_ENEMY:
1544 rv = op->enemy;
1545 *type = CFAPI_POBJECT;
1546 break;
1547
1548 case CFAPI_OBJECT_PROP_ATTACKED_BY:
1549 rv = op->attacked_by;
1550 *type = CFAPI_POBJECT;
1551 break;
1552
1553 case CFAPI_OBJECT_PROP_RUN_AWAY:
1554 ri = op->run_away;
1555 rv = &ri;
1556 *type = CFAPI_INT;
1557 break;
1558
1559 case CFAPI_OBJECT_PROP_CHOSEN_SKILL:
1560 rv = op->chosen_skill;
1561 *type = CFAPI_POBJECT;
1562 break;
1563
1564 case CFAPI_OBJECT_PROP_HIDDEN:
1565 ri = op->hide;
1566 rv = &ri;
1567 *type = CFAPI_INT;
1568 break;
1569
1570 case CFAPI_OBJECT_PROP_MOVE_STATUS:
1571 ri = op->move_status;
1572 rv = &ri;
1573 *type = CFAPI_INT;
1574 break;
1575
1576 case CFAPI_OBJECT_PROP_MOVE_TYPE:
1577 ri = op->attack_movement;
1578 rv = &ri;
1579 *type = CFAPI_INT;
1580 break;
1581
1582 case CFAPI_OBJECT_PROP_SPELL_ITEM:
1583 rv = op->spellitem;
1584 *type = CFAPI_POBJECT;
1585 break;
1586
1587 case CFAPI_OBJECT_PROP_EXP_MULTIPLIER:
1588 rv = &op->expmul;
1589 *type = CFAPI_DOUBLE;
1590 break;
1591
1592 case CFAPI_OBJECT_PROP_ARCHETYPE:
1593 rv = op->arch;
1594 *type = CFAPI_PARCH;
1595 break;
1596
1597 case CFAPI_OBJECT_PROP_OTHER_ARCH:
1598 rv = op->other_arch;
1599 *type = CFAPI_PARCH;
1600 break;
1601
1602 case CFAPI_OBJECT_PROP_ANIM_SPEED:
1603 ri = op->anim_speed;
1604 rv = &ri;
1605 *type = CFAPI_INT;
1606 break;
1607
1608 case CFAPI_OBJECT_PROP_FRIENDLY:
1609 ri = is_friendly (op);
1610 rv = &ri;
1611 *type = CFAPI_INT;
1612 break;
1613
1614 case CFAPI_OBJECT_PROP_BASE_NAME:
1615 {
1616 int i;
1617 i = va_arg (args, int);
1618
1619 rv = (char *) query_base_name (op, i);
1620 *type = CFAPI_STRING;
1621 }
1622 break;
1623
1624 case CFAPI_OBJECT_PROP_MAGICAL:
1625 ri = is_magical (op);
1626 rv = &ri;
1627 *type = CFAPI_INT;
1628 break;
1629
1630 case CFAPI_OBJECT_PROP_LUCK:
1631 ri = op->stats.luck;
1632 rv = &ri;
1633 *type = CFAPI_INT;
1634 break;
1635
1636 case CFAPI_OBJECT_PROP_EXP:
1637 rv = &op->stats.exp;
1638 *type = CFAPI_LONG;
1639 break;
1640
1641 case CFAPI_OBJECT_PROP_OWNER:
1642 rv = op->owner;
1643 *type = CFAPI_POBJECT;
1644 break;
1645
1646 case CFAPI_OBJECT_PROP_PRESENT:
1647 {
1648 int stype;
1649
1650 rv = 0;
1651 stype = va_arg (args, int);
1652
1653 switch (stype)
1654 {
1655
1656 unsigned char ptype;
1657 char *buf;
1658 archetype *at;
1659
1660 case 0: /* present_in_ob */
1661 ptype = (unsigned char) (va_arg (args, int));
1662
1663 rv = present_in_ob (ptype, op);
1664 break;
1665
1666 case 1: /* present_in_ob_by_name */
1667 ptype = (unsigned char) (va_arg (args, int));
1668 buf = va_arg (args, char *);
1669
1670 rv = present_in_ob_by_name (ptype, buf, op);
1671 break;
1672
1673 case 2: /* present_arch_in_ob */
1674 at = va_arg (args, archetype *);
1675
1676 rv = present_arch_in_ob (at, op);
1677 break;
1678 }
1679 }
1680 *type = CFAPI_POBJECT;
1681 break;
1682
1683 case CFAPI_OBJECT_PROP_CHEATER:
1684 ri = (QUERY_FLAG (op, FLAG_WAS_WIZ));
1685 rv = &ri;
1686 *type = CFAPI_INT;
1687 break;
1688
1689 case CFAPI_OBJECT_PROP_MERGEABLE:
1690 {
1691 object *op2;
1692 op2 = va_arg (args, object *);
1693
1694 ri = object::can_merge_slow (op, op2);
1695 rv = &ri;
1696 }
1697 *type = CFAPI_INT;
1698 break;
1699
1700 case CFAPI_OBJECT_PROP_PICKABLE:
1701 {
1702 object *op2;
1703
1704 rv = 0;
1705 op2 = va_arg (args, object *);
1706
1707 ri = can_pick (op2, op);
1708 rv = &ri;
1709 }
1710 *type = CFAPI_INT;
1711 break;
1712
1713 case CFAPI_OBJECT_PROP_FLAGS:
1714 {
1715 int fl;
1716
1717 ri = 0;
1718 fl = va_arg (args, int);
1719
1720 ri = QUERY_FLAG (op, fl);
1721 rv = &ri;
1722 }
1723 *type = CFAPI_INT;
1724 break;
1725
1726 case CFAPI_OBJECT_PROP_STR:
1727 ri = op->stats.Str;
1728 rv = &ri;
1729 *type = CFAPI_INT;
1730 break;
1731
1732 case CFAPI_OBJECT_PROP_DEX:
1733 ri = op->stats.Dex;
1734 rv = &ri;
1735 *type = CFAPI_INT;
1736 break;
1737
1738 case CFAPI_OBJECT_PROP_CON:
1739 ri = op->stats.Con;
1740 rv = &ri;
1741 *type = CFAPI_INT;
1742 break;
1743
1744 case CFAPI_OBJECT_PROP_WIS:
1745 ri = op->stats.Wis;
1746 rv = &ri;
1747 *type = CFAPI_INT;
1748 break;
1749
1750 case CFAPI_OBJECT_PROP_INT:
1751 ri = op->stats.Int;
1752 rv = &ri;
1753 *type = CFAPI_INT;
1754 break;
1755
1756 case CFAPI_OBJECT_PROP_POW:
1757 ri = op->stats.Pow;
1758 rv = &ri;
1759 *type = CFAPI_INT;
1760 break;
1761
1762 case CFAPI_OBJECT_PROP_CHA:
1763 ri = op->stats.Cha;
1764 rv = &ri;
1765 *type = CFAPI_INT;
1766 break;
1767
1768 case CFAPI_OBJECT_PROP_WC:
1769 ri = op->stats.wc;
1770 rv = &ri;
1771 *type = CFAPI_INT;
1772 break;
1773
1774 case CFAPI_OBJECT_PROP_AC:
1775 ri = op->stats.ac;
1776 rv = &ri;
1777 *type = CFAPI_INT;
1778 break;
1779
1780 case CFAPI_OBJECT_PROP_HP:
1781 ri = op->stats.hp;
1782 rv = &ri;
1783 *type = CFAPI_INT;
1784 break;
1785
1786 case CFAPI_OBJECT_PROP_SP:
1787 ri = op->stats.sp;
1788 rv = &ri;
1789 *type = CFAPI_INT;
1790 break;
1791
1792 case CFAPI_OBJECT_PROP_GP:
1793 ri = op->stats.grace;
1794 rv = &ri;
1795 *type = CFAPI_INT;
1796 break;
1797
1798 case CFAPI_OBJECT_PROP_FP:
1799 ri = op->stats.food;
1800 rv = &ri;
1801 *type = CFAPI_INT;
1802 break;
1803
1804 case CFAPI_OBJECT_PROP_MAXHP:
1805 ri = op->stats.maxhp;
1806 rv = &ri;
1807 *type = CFAPI_INT;
1808 break;
1809
1810 case CFAPI_OBJECT_PROP_MAXSP:
1811 ri = op->stats.maxsp;
1812 rv = &ri;
1813 *type = CFAPI_INT;
1814 break;
1815
1816 case CFAPI_OBJECT_PROP_MAXGP:
1817 ri = op->stats.maxgrace;
1818 rv = &ri;
1819 *type = CFAPI_INT;
1820 break;
1821
1822 case CFAPI_OBJECT_PROP_DAM:
1823 ri = op->stats.dam;
1824 rv = &ri;
1825 *type = CFAPI_INT;
1826 break;
1827
1828 case CFAPI_OBJECT_PROP_GOD:
1829 rv = (char *) determine_god (op);
1830 *type = CFAPI_STRING;
1831 break;
1832
1833 case CFAPI_OBJECT_PROP_ARCH_NAME:
1834 rv = (char *) &op->arch->name;
1835 *type = CFAPI_STRING;
1836 break;
1837
1838 case CFAPI_OBJECT_PROP_INVISIBLE:
1839 ri = op->invisible;
1840 rv = &ri;
1841 *type = CFAPI_INT;
1842 break;
1843
1844 case CFAPI_OBJECT_PROP_FACE:
1845 ri = op->animation_id;
1846 rv = &ri;
1847 *type = CFAPI_INT;
1848 break;
1849
1850 case CFAPI_PLAYER_PROP_IP:
1851 rv = op->contr->socket.host;
1852 *type = CFAPI_STRING;
1853 break;
1854
1855 case CFAPI_PLAYER_PROP_MARKED_ITEM:
1856 rv = find_marked_object (op);
1857 *type = CFAPI_POBJECT;
1858 break;
1859
1860 case CFAPI_PLAYER_PROP_PARTY:
1861 rv = (op->contr ? op->contr->party : NULL);
1862 *type = CFAPI_PPARTY;
1863 break;
1864 default:
1865 *type = CFAPI_NONE;
1866 break;
1867 }
1868 }
1869 va_end (args);
1870 return rv;
1871} 815}
1872 816
1873void * 817void *
1874cfapi_object_set_property (int *type, ...) 818cfapi_object_set_property (int *type, ...)
1875{ 819{
1876 va_list args; 820 abort ();
1877 int iarg;
1878 long larg;
1879 char *sarg;
1880 double darg;
1881 object *oparg;
1882 object *op;
1883 int property;
1884 void *rv;
1885 partylist *partyarg;
1886
1887 va_start (args, type);
1888
1889 op = va_arg (args, object *);
1890 property = va_arg (args, int);
1891
1892 rv = NULL;
1893
1894 if (op != NULL && (!op->arch || (op != &op->arch->clone)))
1895 {
1896 switch (property)
1897 {
1898 case CFAPI_OBJECT_PROP_NAME:
1899 sarg = va_arg (args, char *);
1900
1901#define FREE_AND_COPY(a,b) (a) = (b) // TODO: remove, but plugins.C is considered zombie code
1902 FREE_AND_COPY (op->name, sarg);
1903 send_changed_object (op);
1904 break;
1905
1906 case CFAPI_OBJECT_PROP_NAME_PLURAL:
1907 sarg = va_arg (args, char *);
1908
1909 FREE_AND_COPY (op->name_pl, sarg);
1910 send_changed_object (op);
1911 break;
1912
1913 case CFAPI_OBJECT_PROP_TITLE:
1914 sarg = va_arg (args, char *);
1915
1916 FREE_AND_COPY (op->title, sarg);
1917 break;
1918
1919 case CFAPI_OBJECT_PROP_RACE:
1920 sarg = va_arg (args, char *);
1921
1922 FREE_AND_COPY (op->race, sarg);
1923 break;
1924
1925 case CFAPI_OBJECT_PROP_SLAYING:
1926 sarg = va_arg (args, char *);
1927
1928 FREE_AND_COPY (op->slaying, sarg);
1929 break;
1930
1931 case CFAPI_OBJECT_PROP_SKILL:
1932 sarg = va_arg (args, char *);
1933
1934 FREE_AND_COPY (op->skill, sarg);
1935 break;
1936
1937 case CFAPI_OBJECT_PROP_MESSAGE:
1938 sarg = va_arg (args, char *);
1939
1940 FREE_AND_COPY (op->msg, sarg);
1941 break;
1942
1943 case CFAPI_OBJECT_PROP_LORE:
1944 sarg = va_arg (args, char *);
1945
1946 FREE_AND_COPY (op->lore, sarg);
1947 break;
1948
1949 case CFAPI_OBJECT_PROP_SPEED:
1950 darg = va_arg (args, double);
1951
1952 op->speed = darg;
1953 break;
1954
1955 case CFAPI_OBJECT_PROP_SPEED_LEFT:
1956 darg = va_arg (args, double);
1957
1958 op->speed_left = darg;
1959 break;
1960
1961 case CFAPI_OBJECT_PROP_NROF:
1962 iarg = va_arg (args, int);
1963
1964 if (iarg < 0)
1965 iarg = 0;
1966 if (op->nrof > (uint32) iarg)
1967 decrease_ob_nr (op, op->nrof - iarg);
1968 else if (op->nrof < (uint32) iarg)
1969 {
1970 object *tmp;
1971 player *pl;
1972
1973 op->nrof = iarg;
1974 if (op->env != NULL)
1975 {
1976 tmp = is_player_inv (op->env);
1977 if (!tmp)
1978 {
1979 for (pl = first_player; pl; pl = pl->next)
1980 if (pl->ob->container == op->env)
1981 break;
1982 if (pl)
1983 tmp = pl->ob;
1984 else
1985 tmp = NULL;
1986 }
1987 else
1988 {
1989 sum_weight (tmp);
1990 fix_player (tmp);
1991 }
1992 if (tmp)
1993 esrv_send_item (tmp, op);
1994 }
1995 else
1996 {
1997 object *above = op->above;
1998
1999 for (tmp = above; tmp != NULL; tmp = tmp->above)
2000 if (tmp->type == PLAYER)
2001 esrv_send_item (tmp, op);
2002 }
2003 }
2004 break;
2005
2006 case CFAPI_OBJECT_PROP_DIRECTION:
2007 iarg = va_arg (args, int);
2008
2009 op->direction = iarg;
2010 break;
2011
2012 case CFAPI_OBJECT_PROP_FACING:
2013 iarg = va_arg (args, int);
2014
2015 op->facing = iarg;
2016 break;
2017
2018 case CFAPI_OBJECT_PROP_RESIST:
2019 {
2020 int iargbis = va_arg (args, int);
2021 iarg = va_arg (args, int);
2022
2023 op->resist[iargbis] = iarg;
2024 }
2025 break;
2026
2027 case CFAPI_OBJECT_PROP_ATTACK_TYPE:
2028 iarg = va_arg (args, int);
2029
2030 op->attacktype = iarg;
2031 break;
2032
2033 case CFAPI_OBJECT_PROP_PATH_ATTUNED:
2034 iarg = va_arg (args, int);
2035
2036 op->path_attuned = iarg;
2037 break;
2038
2039 case CFAPI_OBJECT_PROP_PATH_REPELLED:
2040 iarg = va_arg (args, int);
2041
2042 op->path_repelled = iarg;
2043 break;
2044
2045 case CFAPI_OBJECT_PROP_PATH_DENIED:
2046 iarg = va_arg (args, int);
2047
2048 op->path_denied = iarg;
2049 break;
2050
2051 case CFAPI_OBJECT_PROP_MATERIAL:
2052 iarg = va_arg (args, int);
2053
2054 op->material = iarg;
2055 break;
2056
2057 case CFAPI_OBJECT_PROP_MATERIAL_NAME:
2058 break;
2059
2060 case CFAPI_OBJECT_PROP_MAGIC:
2061 iarg = va_arg (args, int);
2062
2063 op->magic = iarg;
2064 break;
2065
2066 case CFAPI_OBJECT_PROP_VALUE:
2067 iarg = va_arg (args, int);
2068
2069 op->value = iarg;
2070 break;
2071
2072 case CFAPI_OBJECT_PROP_LEVEL:
2073 iarg = va_arg (args, int);
2074
2075 op->level = iarg;
2076 break;
2077
2078 case CFAPI_OBJECT_PROP_LAST_HEAL:
2079 iarg = va_arg (args, int);
2080
2081 op->last_heal = iarg;
2082 break;
2083
2084 case CFAPI_OBJECT_PROP_LAST_SP:
2085 iarg = va_arg (args, int);
2086
2087 op->last_sp = iarg;
2088 break;
2089
2090 case CFAPI_OBJECT_PROP_LAST_GRACE:
2091 iarg = va_arg (args, int);
2092
2093 op->last_grace = iarg;
2094 break;
2095
2096 case CFAPI_OBJECT_PROP_LAST_EAT:
2097 iarg = va_arg (args, int);
2098
2099 op->last_eat = iarg;
2100 break;
2101
2102 case CFAPI_OBJECT_PROP_INVISIBLE_TIME:
2103 iarg = va_arg (args, int);
2104
2105 op->invisible = iarg;
2106 break;
2107
2108 case CFAPI_OBJECT_PROP_PICK_UP:
2109 iarg = va_arg (args, int);
2110
2111 op->pick_up = iarg;
2112 break;
2113
2114 case CFAPI_OBJECT_PROP_ITEM_POWER:
2115 iarg = va_arg (args, int);
2116
2117 op->item_power = iarg;
2118 break;
2119
2120 case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR:
2121 iarg = va_arg (args, int);
2122
2123 op->gen_sp_armour = iarg;
2124 break;
2125
2126 case CFAPI_OBJECT_PROP_WEIGHT:
2127 iarg = va_arg (args, int);
2128
2129 if (op->weight != iarg)
2130 {
2131 object *tmp;
2132 player *pl;
2133
2134 op->weight = iarg;
2135 if (op->env != NULL)
2136 {
2137 tmp = is_player_inv (op->env);
2138 if (!tmp)
2139 {
2140 for (pl = first_player; pl; pl = pl->next)
2141 if (pl->ob->container == op->env)
2142 break;
2143 if (pl)
2144 tmp = pl->ob;
2145 else
2146 tmp = NULL;
2147 }
2148 else
2149 {
2150 sum_weight (tmp);
2151 fix_player (tmp);
2152 }
2153 if (tmp)
2154 esrv_send_item (tmp, op);
2155 }
2156 else
2157 {
2158 object *above = op->above;
2159
2160 for (tmp = above; tmp != NULL; tmp = tmp->above)
2161 if (tmp->type == PLAYER)
2162 esrv_send_item (tmp, op);
2163 }
2164 }
2165 break;
2166
2167 case CFAPI_OBJECT_PROP_WEIGHT_LIMIT:
2168 iarg = va_arg (args, int);
2169
2170 op->weight_limit = iarg;
2171 break;
2172
2173 case CFAPI_OBJECT_PROP_GLOW_RADIUS:
2174 iarg = va_arg (args, int);
2175
2176 op->glow_radius = iarg;
2177 break;
2178
2179 case CFAPI_OBJECT_PROP_PERM_EXP:
2180 larg = va_arg (args, long);
2181
2182 op->perm_exp = larg;
2183 break;
2184
2185 case CFAPI_OBJECT_PROP_ENEMY:
2186 oparg = va_arg (args, object *);
2187
2188 op->enemy = oparg;
2189 break;
2190
2191 case CFAPI_OBJECT_PROP_RUN_AWAY:
2192 iarg = va_arg (args, int);
2193
2194 op->run_away = iarg;
2195 break;
2196
2197 case CFAPI_OBJECT_PROP_CHOSEN_SKILL:
2198 oparg = va_arg (args, object *);
2199
2200 op->chosen_skill = oparg;
2201 break;
2202
2203 case CFAPI_OBJECT_PROP_HIDDEN:
2204 iarg = va_arg (args, int);
2205
2206 op->hide = iarg;
2207 break;
2208
2209 case CFAPI_OBJECT_PROP_MOVE_STATUS:
2210 iarg = va_arg (args, int);
2211
2212 op->move_status = iarg;
2213 break;
2214
2215 case CFAPI_OBJECT_PROP_MOVE_TYPE:
2216 iarg = va_arg (args, int);
2217
2218 op->attack_movement = iarg;
2219 break;
2220
2221 case CFAPI_OBJECT_PROP_SPELL_ITEM:
2222 oparg = va_arg (args, object *);
2223
2224 op->spellitem = oparg;
2225 break;
2226
2227 case CFAPI_OBJECT_PROP_EXP_MULTIPLIER:
2228 darg = va_arg (args, double);
2229
2230 op->expmul = darg;
2231 break;
2232
2233 case CFAPI_OBJECT_PROP_CUSTOM_NAME:
2234 sarg = va_arg (args, char *);
2235
2236 FREE_AND_COPY (op->custom_name, sarg);
2237 send_changed_object (op);
2238 break;
2239
2240 case CFAPI_OBJECT_PROP_ANIM_SPEED:
2241 iarg = va_arg (args, int);
2242
2243 op->anim_speed = iarg;
2244 break;
2245
2246 case CFAPI_OBJECT_PROP_FRIENDLY:
2247 iarg = va_arg (args, int);
2248
2249 if (iarg == 1 && is_friendly (op) == 0)
2250 add_friendly_object (op);
2251 else if (iarg == 0 && is_friendly (op) == 1)
2252 remove_friendly_object (op);
2253 break;
2254
2255 case CFAPI_OBJECT_PROP_LUCK:
2256 iarg = va_arg (args, int);
2257
2258 op->stats.luck = iarg;
2259 break;
2260
2261 case CFAPI_OBJECT_PROP_EXP:
2262 {
2263 char *skillname;
2264
2265 larg = va_arg (args, long);
2266 skillname = va_arg (args, char *);
2267 iarg = va_arg (args, int);
2268
2269 change_exp (op, larg, skillname, iarg);
2270 }
2271 break;
2272
2273 case CFAPI_OBJECT_PROP_OWNER:
2274 oparg = va_arg (args, object *);
2275
2276 op->set_owner (oparg);
2277 break;
2278
2279 case CFAPI_OBJECT_PROP_CHEATER:
2280 set_cheat (op);
2281 break;
2282
2283 case CFAPI_OBJECT_PROP_FLAGS:
2284 {
2285 int iargbis;
2286 iarg = va_arg (args, int);
2287 iargbis = va_arg (args, int);
2288
2289 if (iargbis == 1)
2290 SET_FLAG (op, iarg);
2291 else
2292 CLEAR_FLAG (op, iarg);
2293 }
2294 break;
2295
2296 case CFAPI_OBJECT_PROP_STR:
2297 iarg = va_arg (args, int);
2298
2299 op->stats.Str = iarg;
2300 break;
2301
2302 case CFAPI_OBJECT_PROP_DEX:
2303 iarg = va_arg (args, int);
2304
2305 op->stats.Dex = iarg;
2306 break;
2307
2308 case CFAPI_OBJECT_PROP_CON:
2309 iarg = va_arg (args, int);
2310
2311 op->stats.Con = iarg;
2312 break;
2313
2314 case CFAPI_OBJECT_PROP_WIS:
2315 iarg = va_arg (args, int);
2316
2317 op->stats.Wis = iarg;
2318 break;
2319
2320 case CFAPI_OBJECT_PROP_INT:
2321 iarg = va_arg (args, int);
2322
2323 op->stats.Int = iarg;
2324 break;
2325
2326 case CFAPI_OBJECT_PROP_POW:
2327 iarg = va_arg (args, int);
2328
2329 op->stats.Pow = iarg;
2330 break;
2331
2332 case CFAPI_OBJECT_PROP_CHA:
2333 iarg = va_arg (args, int);
2334
2335 op->stats.Cha = iarg;
2336 break;
2337
2338 case CFAPI_OBJECT_PROP_WC:
2339 iarg = va_arg (args, int);
2340
2341 op->stats.wc = iarg;
2342 break;
2343
2344 case CFAPI_OBJECT_PROP_AC:
2345 iarg = va_arg (args, int);
2346
2347 op->stats.ac = iarg;
2348 break;
2349
2350 case CFAPI_OBJECT_PROP_HP:
2351 iarg = va_arg (args, int);
2352
2353 op->stats.hp = iarg;
2354 break;
2355
2356 case CFAPI_OBJECT_PROP_SP:
2357 iarg = va_arg (args, int);
2358
2359 op->stats.sp = iarg;
2360 break;
2361
2362 case CFAPI_OBJECT_PROP_GP:
2363 iarg = va_arg (args, int);
2364
2365 op->stats.grace = iarg;
2366 break;
2367
2368 case CFAPI_OBJECT_PROP_FP:
2369 iarg = va_arg (args, int);
2370
2371 op->stats.food = iarg;
2372 break;
2373
2374 case CFAPI_OBJECT_PROP_MAXHP:
2375 iarg = va_arg (args, int);
2376
2377 op->stats.maxhp = iarg;
2378 break;
2379
2380 case CFAPI_OBJECT_PROP_MAXSP:
2381 iarg = va_arg (args, int);
2382
2383 op->stats.maxsp = iarg;
2384 break;
2385
2386 case CFAPI_OBJECT_PROP_MAXGP:
2387 iarg = va_arg (args, int);
2388
2389 op->stats.maxgrace = iarg;
2390 break;
2391
2392 case CFAPI_OBJECT_PROP_DAM:
2393 iarg = va_arg (args, int);
2394
2395 op->stats.dam = iarg;
2396 break;
2397
2398 case CFAPI_OBJECT_PROP_FACE:
2399 iarg = va_arg (args, int);
2400
2401 op->animation_id = iarg;
2402 update_object (op, UP_OBJ_FACE);
2403 break;
2404
2405 case CFAPI_OBJECT_ANIMATION:
2406 iarg = va_arg (args, int);
2407
2408 if (iarg != -1)
2409 {
2410 SET_ANIMATION (op, iarg);
2411 }
2412 update_object (op, UP_OBJ_FACE);
2413 break;
2414
2415 case CFAPI_PLAYER_PROP_MARKED_ITEM:
2416 if (op->contr)
2417 {
2418 oparg = va_arg (args, object *);
2419
2420 op->contr->mark = oparg;
2421 }
2422 break;
2423
2424 case CFAPI_PLAYER_PROP_PARTY:
2425 if (op->contr)
2426 {
2427 partyarg = va_arg (args, partylist *);
2428
2429 op->contr->party = partyarg;
2430 }
2431 break;
2432
2433 default:
2434 *type = CFAPI_NONE;
2435 break;
2436 }
2437 }
2438 va_end (args);
2439
2440 *type = CFAPI_NONE;
2441 return NULL;
2442} 821}
2443 822
2444void * 823void *
2445cfapi_object_apply_below (int *type, ...) 824cfapi_object_apply_below (int *type, ...)
2446{ 825{
2510 owner = va_arg (args, object *); 889 owner = va_arg (args, object *);
2511 890
2512 va_end (args); 891 va_end (args);
2513 892
2514 *type = CFAPI_STRING; 893 *type = CFAPI_STRING;
2515 return describe_item (op, owner); 894 return (char *)describe_item (op, owner);
2516} 895}
2517 896
2518void * 897void *
2519cfapi_object_drain (int *type, ...) 898cfapi_object_drain (int *type, ...)
2520{ 899{
2521 va_list args; 900 abort ();
2522
2523 object *op;
2524 int ds;
2525
2526 va_start (args, type);
2527
2528 op = va_arg (args, object *);
2529 ds = va_arg (args, int);
2530
2531 va_end (args);
2532
2533 drain_specific_stat (op, ds);
2534
2535 *type = CFAPI_NONE;
2536 return NULL;
2537} 901}
2538 902
2539void * 903void *
2540cfapi_object_fix (int *type, ...) 904cfapi_object_fix (int *type, ...)
2541{ 905{
2546 910
2547 op = va_arg (args, object *); 911 op = va_arg (args, object *);
2548 912
2549 va_end (args); 913 va_end (args);
2550 914
2551 fix_player (op); 915 op->update_stats ();
2552 916
2553 *type = CFAPI_NONE; 917 *type = CFAPI_NONE;
2554 return NULL; 918 return NULL;
2555} 919}
2556 920
2694 break; 1058 break;
2695 1059
2696 case 3: 1060 case 3:
2697 op = va_arg (args, object *); 1061 op = va_arg (args, object *);
2698 1062
2699 rv = is_player_inv (op); 1063 rv = op->in_player ();
2700 break; 1064 break;
2701 1065
2702 default: 1066 default:
2703 rv = NULL; 1067 rv = NULL;
2704 *type = CFAPI_NONE; 1068 *type = CFAPI_NONE;
2733 object *op; 1097 object *op;
2734 sval = va_arg (args, char *); 1098 sval = va_arg (args, char *);
2735 1099
2736 op = get_archetype_by_object_name (sval); 1100 op = get_archetype_by_object_name (sval);
2737 1101
2738 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 1102 if (strcmp (query_name (op), ARCH_SINGULARITY) == 0)
2739 { 1103 {
2740 op->destroy (); 1104 op->destroy ();
2741 /* Try with archetype names... */ 1105 /* Try with archetype names... */
2742 op = get_archetype (sval); 1106 op = get_archetype (sval);
2743 if (strncmp (query_name (op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) 1107 if (strcmp (query_name (op), ARCH_SINGULARITY) == 0)
2744 { 1108 {
2745 op->destroy (); 1109 op->destroy ();
2746 *type = CFAPI_NONE; 1110 *type = CFAPI_NONE;
2747 va_end (args); 1111 va_end (args);
2748 return NULL; 1112 return NULL;
2900} 1264}
2901 1265
2902void * 1266void *
2903cfapi_object_clear (int *type, ...) 1267cfapi_object_clear (int *type, ...)
2904{ 1268{
2905 va_list args; 1269 abort ();
2906 object *op;
2907
2908 va_start (args, type);
2909
2910 op = va_arg (args, object *);
2911
2912 va_end (args);
2913
2914 op->clear ();
2915 *type = CFAPI_NONE;
2916 return NULL;
2917} 1270}
2918 1271
2919void * 1272void *
2920cfapi_object_reset (int *type, ...) 1273cfapi_object_reset (int *type, ...)
2921{ 1274{
2954} 1307}
2955 1308
2956void * 1309void *
2957cfapi_object_clean_object (int *type, ...) 1310cfapi_object_clean_object (int *type, ...)
2958{ 1311{
2959 va_list args; 1312 abort ();
2960 object *op;
2961
2962 va_start (args, type);
2963 op = va_arg (args, object *);
2964
2965 clean_object (op);
2966 va_end (args);
2967 *type = CFAPI_NONE;
2968 return NULL;
2969} 1313}
2970 1314
2971void * 1315void *
2972cfapi_object_on_same_map (int *type, ...) 1316cfapi_object_on_same_map (int *type, ...)
2973{ 1317{
3220 y = map->enter_y; 1564 y = map->enter_y;
3221 } 1565 }
3222 1566
3223/* 1567/*
3224 originator = object::create(); 1568 originator = object::create();
3225 EXIT_PATH(originator) = add_string(map->path); 1569 EXIT_PATH(originator) = map->path;
3226 EXIT_X(originator) = x; 1570 EXIT_X(originator) = x;
3227 EXIT_Y(originator) = y; 1571 EXIT_Y(originator) = y;
3228 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/ 1572 printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/
3229 /*enter_exit(op, originator); */ 1573 /*enter_exit(op, originator); */
3230 insert_ob_in_map_at (op, map, NULL, 0, x, y); 1574 insert_ob_in_map_at (op, map, NULL, 0, x, y);
3310 drop (author, op); 1654 drop (author, op);
3311 1655
3312 if (author->type == PLAYER) 1656 if (author->type == PLAYER)
3313 { 1657 {
3314 author->contr->count = 0; 1658 author->contr->count = 0;
3315 author->contr->socket.update_look = 1; 1659 author->contr->ns->floorbox_update ();
3316 } 1660 }
3317 1661
3318 *type = CFAPI_NONE; 1662 *type = CFAPI_NONE;
3319 return NULL; 1663 return NULL;
3320} 1664}
3351 1695
3352/* PLAYER SUBCLASS */ 1696/* PLAYER SUBCLASS */
3353void * 1697void *
3354cfapi_player_find (int *type, ...) 1698cfapi_player_find (int *type, ...)
3355{ 1699{
3356 va_list args; 1700 abort ();
3357 void *rv;
3358 char *sval;
3359
3360 va_start (args, type);
3361
3362 sval = va_arg (args, char *);
3363
3364 va_end (args);
3365
3366 rv = find_player (sval);
3367
3368 *type = CFAPI_PPLAYER;
3369 return rv;
3370} 1701}
3371 1702
3372void * 1703void *
3373cfapi_player_message (int *type, ...) 1704cfapi_player_message (int *type, ...)
3374{ 1705{
3521 1852
3522/* Party-related functions */ 1853/* Party-related functions */
3523void * 1854void *
3524cfapi_party_get_property (int *type, ...) 1855cfapi_party_get_property (int *type, ...)
3525{ 1856{
3526 partylist *party; 1857 abort ();
3527 int prop;
3528 va_list args;
3529 void *rv;
3530 object *obarg;
3531 player *pl;
3532
3533 va_start (args, type);
3534 party = va_arg (args, partylist *);
3535 prop = va_arg (args, int);
3536
3537 switch (prop)
3538 {
3539 case CFAPI_PARTY_PROP_NAME:
3540 *type = CFAPI_STRING;
3541 rv = (void *) party->partyname;
3542 break;
3543
3544 case CFAPI_PARTY_PROP_NEXT:
3545 *type = CFAPI_PPARTY;
3546 rv = (party ? party->next : get_firstparty ());
3547 break;
3548
3549 case CFAPI_PARTY_PROP_PASSWORD:
3550 *type = CFAPI_STRING;
3551 rv = (void *) party->passwd;
3552 break;
3553
3554 case CFAPI_PARTY_PROP_PLAYER:
3555 *type = CFAPI_PPLAYER;
3556 obarg = va_arg (args, object *);
3557
3558 pl = (obarg ? obarg->contr : first_player);
3559 rv = NULL;
3560 for (; pl != NULL; pl = pl->next)
3561 if (pl->ob->contr->party == party)
3562 {
3563 rv = (void *) pl;
3564 break;
3565 }
3566 break;
3567
3568 default:
3569 *type = CFAPI_NONE;
3570 rv = NULL;
3571 break;
3572 }
3573 va_end (args);
3574 return rv;
3575} 1858}
3576 1859
3577/* Regions-related functions */ 1860/* Regions-related functions */
3578void * 1861void *
3579cfapi_region_get_property (int *type, ...) 1862cfapi_region_get_property (int *type, ...)
3580{ 1863{
3581 region *reg; 1864 abort ();
3582 int prop;
3583 va_list args;
3584 void *rv;
3585
3586 va_start (args, type);
3587 reg = va_arg (args, region *);
3588 prop = va_arg (args, int);
3589
3590 switch (prop)
3591 {
3592 case CFAPI_REGION_PROP_NAME:
3593 *type = CFAPI_STRING;
3594 rv = (void *) reg->name;
3595 break;
3596
3597 case CFAPI_REGION_PROP_NEXT:
3598 *type = CFAPI_PREGION;
3599 rv = (reg ? reg->next : first_region);
3600 break;
3601
3602 case CFAPI_REGION_PROP_PARENT:
3603 *type = CFAPI_PREGION;
3604 rv = (void *) reg->parent;
3605 break;
3606
3607 case CFAPI_REGION_PROP_LONGNAME:
3608 *type = CFAPI_STRING;
3609 rv = (void *) reg->longname;
3610 break;
3611
3612 case CFAPI_REGION_PROP_MESSAGE:
3613 *type = CFAPI_STRING;
3614 rv = (void *) reg->msg;
3615 break;
3616
3617 default:
3618 *type = CFAPI_NONE;
3619 rv = NULL;
3620 break;
3621 }
3622 va_end (args);
3623 return rv;
3624} 1865}
3625 1866
3626/*****************************************************************************/ 1867/*****************************************************************************/
3627 1868
3628/* NEW PLUGIN STUFF ENDS HERE */ 1869/* NEW PLUGIN STUFF ENDS HERE */
3658 return NULL; 1899 return NULL;
3659} 1900}
3660 1901
3661/*****************************************************************************/ 1902/*****************************************************************************/
3662 1903
3663/* Plugins initialization. Browses the plugins directory and call */ 1904/* Plugins initialisation. Browses the plugins directory and call */
3664 1905
3665/* initOnePlugin for each file found. */ 1906/* initOnePlugin for each file found. */
3666 1907
3667/* Returns 0 if at least one plugin was successfully loaded, -1 if not */ 1908/* Returns 0 if at least one plugin was successfully loaded, -1 if not */
3668 1909
3675 size_t l; 1916 size_t l;
3676 char buf[MAX_BUF]; 1917 char buf[MAX_BUF];
3677 char buf2[MAX_BUF]; 1918 char buf2[MAX_BUF];
3678 int result; 1919 int result;
3679 1920
3680 LOG (llevInfo, "Initializing plugins\n"); 1921 LOG (llevInfo, "Initialising plugins\n");
3681 strcpy (buf, LIBDIR); 1922 strcpy (buf, LIBDIR);
3682 strcat (buf, "/plugins/"); 1923 strcat (buf, "/plugins/");
3683 LOG (llevInfo, "Plugins directory is %s\n", buf); 1924 LOG (llevInfo, "Plugins directory is %s\n", buf);
3684 1925
3685 plugins_init_perl (); 1926 plugins_init_perl ();

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines