ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/plugins.C
Revision: 1.9
Committed: Sun Sep 3 00:18:42 2006 UTC (17 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.8: +13 -42 lines
Log Message:
THIS CODE WILL NOT COMPILE
use the STABLE tag instead.

- major changes in object lifetime and memory management
- replaced manual refcounting by shstr class
- removed quest system
- many optimisations
- major changes

File Contents

# User Rev Content
1 elmex 1.1 /*
2     * static char *rcsid_plugins_c =
3 root 1.9 * "$Id: plugins.C,v 1.8 2006-08-29 05:03:55 root Exp $";
4 elmex 1.1 */
5    
6     /*****************************************************************************/
7     /* CrossFire, A Multiplayer game for X-windows */
8     /* */
9     /* Copyright (C) 2000 Mark Wedel */
10     /* Copyright (C) 1992 Frank Tore Johansen */
11     /* */
12     /* This program is free software; you can redistribute it and/or modify */
13     /* it under the terms of the GNU General Public License as published by */
14     /* the Free Software Foundation; either version 2 of the License, or */
15     /* (at your option) any later version. */
16     /* */
17     /* This program is distributed in the hope that it will be useful, */
18     /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
19     /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
20     /* GNU General Public License for more details. */
21     /* */
22     /* You should have received a copy of the GNU General Public License */
23     /* along with this program; if not, write to the Free Software */
24     /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
25     /* */
26     /*****************************************************************************/
27     /* This is the server-side plugin management part. */
28     /*****************************************************************************/
29     /* Original code by Yann Chachkoff (yann.chachkoff@mailandnews.com). */
30     /* Special thanks to: */
31     /* David Delbecq (david.delbecq@mailandnews.com); */
32     /* Joris Bontje (jbontje@suespammers.org); */
33     /* Philip Currlin (?); */
34     /*****************************************************************************/
35    
36     /*****************************************************************************/
37     /* First, the headers. We only include plugin.h, because all other includes */
38     /* are done into it, and plugproto.h (which is used only by this file). */
39     /*****************************************************************************/
40     #include <plugin.h>
41    
42     #ifndef __CEXTRACT__
43     #include <sproto.h>
44     #endif
45    
46     #define NR_OF_HOOKS 74
47    
48     static const hook_entry plug_hooks[NR_OF_HOOKS] =
49     {
50     {cfapi_system_register_global_event, 1, "cfapi_system_register_global_event"},
51     {cfapi_system_unregister_global_event, 3, "cfapi_system_unregister_global_event"},
52     {cfapi_system_check_path, 4, "cfapi_system_check_path"},
53     {cfapi_system_re_cmp, 5, "cfapi_system_re_cmp"},
54     {cfapi_system_strdup_local, 6, "cfapi_system_strdup_local"},
55     {cfapi_system_directory, 7, "cfapi_system_directory"},
56     {cfapi_system_find_animation, 8, "cfapi_system_find_animation"},
57     {cfapi_object_clean_object, 9, "cfapi_object_clean_object"},
58     {cfapi_object_on_same_map, 10, "cfapi_object_on_same_map"},
59     {cfapi_object_get_key, 11, "cfapi_object_get_key"},
60     {cfapi_object_set_key, 12, "cfapi_object_set_key"},
61     {cfapi_object_get_property, 13, "cfapi_object_get_property"},
62     {cfapi_object_set_property, 14,"cfapi_object_set_property"},
63     {cfapi_object_apply, 15, "cfapi_object_apply"},
64     {cfapi_object_identify, 16, "cfapi_object_identify"},
65     {cfapi_object_describe, 17, "cfapi_object_describe"},
66     {cfapi_object_drain, 18, "cfapi_object_drain"},
67     {cfapi_object_fix, 19, "cfapi_object_fix"},
68     {cfapi_object_give_skill, 20, "cfapi_object_give_skill"},
69     {cfapi_object_transmute, 21, "cfapi_object_transmute"},
70     {cfapi_object_remove, 22, "cfapi_object_remove"},
71     {cfapi_object_delete, 23, "cfapi_object_delete"},
72     {cfapi_object_clone, 24, "cfapi_object_clone"},
73     {cfapi_object_find, 25, "cfapi_object_find"},
74     {cfapi_object_create, 26, "cfapi_object_create"},
75     {cfapi_object_insert, 27, "cfapi_object_insert"},
76     {cfapi_object_split, 28, "cfapi_object_split"},
77     {cfapi_object_merge, 29, "cfapi_object_merge"},
78     {cfapi_object_distance, 30, "cfapi_object_distance"},
79     {cfapi_object_update, 31, "cfapi_object_update"},
80     {cfapi_object_clear, 32, "cfapi_object_clear"},
81     {cfapi_object_reset, 33, "cfapi_object_reset"},
82     {cfapi_object_check_inventory, 34, "cfapi_object_check_inventory"},
83     {cfapi_object_spring_trap, 35, "cfapi_object_spring_trap"},
84     {cfapi_object_check_trigger, 36, "cfapi_object_check_trigger"},
85     {cfapi_object_query_cost, 37, "cfapi_object_query_cost"},
86     {cfapi_object_query_money, 38, "cfapi_object_query_money"},
87     {cfapi_object_cast, 39, "cfapi_object_cast"},
88     {cfapi_object_learn_spell, 40, "cfapi_object_learn_spell"},
89     {cfapi_object_forget_spell, 41, "cfapi_object_forget_spell"},
90     {cfapi_object_check_spell, 42, "cfapi_object_check_spell"},
91     {cfapi_object_pay_amount, 43, "cfapi_object_pay_amount"},
92     {cfapi_object_pay_item, 44, "cfapi_object_pay_item"},
93     {cfapi_object_transfer, 45, "cfapi_object_transfer"},
94     {cfapi_object_drop, 46, "cfapi_object_drop"},
95     {cfapi_object_take, 47, "cfapi_object_take"},
96     {cfapi_object_find_archetype_inside, 48, "cfapi_object_find_archetype_inside"},
97     {cfapi_object_say, 49, "cfapi_object_say"},
98     {cfapi_map_get_map, 50, "cfapi_map_get_map"},
99     {cfapi_map_has_been_loaded, 51, "cfapi_map_has_been_loaded"},
100     {cfapi_map_create_path, 52, "cfapi_map_create_path"},
101     {cfapi_map_get_map_property, 53, "cfapi_map_get_property"},
102     {cfapi_map_set_map_property, 54, "cfapi_map_set_property"},
103     {cfapi_map_out_of_map, 55, "cfapi_map_out_of_map"},
104     {cfapi_map_update_position, 56, "cfapi_map_update_position"},
105     {cfapi_map_delete_map, 57, "cfapi_map_delete_map"},
106     {cfapi_map_message, 58, "cfapi_map_message"},
107     {cfapi_map_get_object_at, 59, "cfapi_map_get_object_at"},
108     {cfapi_map_get_flags, 60, "cfapi_map_get_flags"},
109     {cfapi_map_present_arch_by_name,61, "cfapi_map_present_arch_by_name"},
110     {cfapi_player_find, 62, "cfapi_player_find"},
111     {cfapi_player_message, 63, "cfapi_player_message"},
112     {cfapi_player_send_inventory, 64, "cfapi_player_send_inventory"},
113     {cfapi_object_teleport, 65, "cfapi_object_teleport"},
114     {cfapi_object_speak, 66, "cfapi_object_speak"},
115     {cfapi_object_pickup, 67, "cfapi_object_pickup"},
116     {cfapi_object_move, 68, "cfapi_object_move"},
117     {cfapi_object_apply_below, 69, "cfapi_object_apply_below"},
118     {cfapi_archetype_get_first, 70, "cfapi_archetype_get_first"},
119     {cfapi_archetype_get_property, 71, "cfapi_archetype_get_property"},
120     {cfapi_party_get_property, 72, "cfapi_party_get_property"},
121     {cfapi_region_get_property, 73, "cfapi_region_get_property"},
122     };
123     int plugin_number = 0;
124     crossfire_plugin* plugins_list = NULL;
125    
126     /*****************************************************************************/
127     /* NEW PLUGIN STUFF STARTS HERE */
128     /*****************************************************************************/
129    
130     #ifdef WIN32
131     static const char *plugins_dlerror(void)
132     {
133     static char buf[256];
134     DWORD err;
135     char* p;
136     err = GetLastError();
137     if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buf, sizeof(buf), NULL) == 0)
138     snprintf(buf, sizeof(buf), "error %lu", err);
139     p = strchr(buf, '\0');
140     while (p > buf && (p[-1] == '\r' || p[-1] == '\n'))
141     p--;
142     *p = '\0';
143     return buf;
144     }
145     #endif /* WIN32 */
146    
147     /**
148     * Notify clients about a changed object.
149     *
150     * @param op the object that has changed
151     */
152     static void send_changed_object(object *op)
153     {
154     object* tmp;
155     player *pl;
156    
157     if (op->env != NULL) {
158     tmp = is_player_inv(op->env);
159     if (!tmp) {
160     for (pl = first_player; pl; pl = pl->next)
161     if (pl->ob->container == op->env)
162     break;
163     if (pl)
164     tmp = pl->ob;
165     else
166     tmp = NULL;
167     }
168     if (tmp)
169     esrv_send_item(tmp, op);
170     } else {
171     for (tmp = op->above; tmp != NULL; tmp = tmp->above)
172     if (tmp->type == PLAYER)
173     esrv_send_item(tmp, op);
174     }
175     }
176    
177     /**
178     * Notify clients about a removed object.
179     *
180     * @param op the object about to be removed from its environment; it must still
181     * be present in its environment
182     */
183     static void send_removed_object(object *op)
184     {
185     object* tmp;
186     player *pl;
187    
188     if (op->env == NULL) {
189     /* no action necessary: remove_ob() notifies the client */
190     return;
191     }
192    
193     tmp = is_player_inv(op->env);
194     if (!tmp) {
195     for (pl = first_player; pl; pl = pl->next)
196     if (pl->ob->container == op->env)
197     break;
198     if (pl)
199     tmp = pl->ob;
200     else
201     tmp = NULL;
202     }
203     if (tmp)
204     esrv_del_item(tmp->contr, op->count);
205     }
206    
207 root 1.2 extern "C" int cfperl_initPlugin (const char *iversion, f_plug_api gethooksptr);
208     extern "C" void *cfperl_getPluginProperty (int *type, ...);
209     extern "C" int cfperl_postInitPlugin ();
210     extern "C" int cfperl_closePlugin ();
211    
212 root 1.3 // this is a temporary hack till the old plugin stuff is removed
213 root 1.2 int plugins_init_perl()
214     {
215     f_plug_init initfunc;
216     f_plug_api propfunc;
217     f_plug_postinit postfunc;
218     f_plug_postinit closefunc;
219     int i;
220     crossfire_plugin* cp;
221     crossfire_plugin* ccp;
222    
223     initfunc = (f_plug_init)cfperl_initPlugin;
224     propfunc = (f_plug_api)cfperl_getPluginProperty;
225     postfunc = (f_plug_postinit)cfperl_postInitPlugin;
226     closefunc = (f_plug_postinit)cfperl_closePlugin;
227     i = initfunc("2.0", cfapi_get_hooks);
228     cp = (crossfire_plugin*) malloc(sizeof(crossfire_plugin));
229     for (i = 0; i < NR_EVENTS; i++)
230     cp->gevent[i] = NULL;
231 root 1.6 cp->eventfunc = 0;
232 root 1.2 cp->propfunc = propfunc;
233     cp->closefunc = closefunc;
234     cp->libptr = 0;
235     strcpy(cp->id, (const char*) propfunc(&i, "Identification"));
236     strcpy(cp->fullname, (const char*) propfunc(&i, "FullName"));
237     cp->next = NULL;
238     cp->prev = NULL;
239     if (plugins_list == NULL) {
240     plugins_list = cp;
241     } else {
242     for (ccp = plugins_list; ccp->next != NULL; ccp = ccp->next)
243     ;
244     ccp->next = cp;
245     cp->prev = ccp;
246     }
247     postfunc();
248     plugin_number++;
249     return 0;
250     }
251    
252 elmex 1.1 int plugins_init_plugin(const char* libfile)
253     {
254 root 1.7 return 0;
255    
256 elmex 1.1 LIBPTRTYPE ptr;
257     f_plug_init initfunc;
258     f_plug_api propfunc;
259     f_plug_api eventfunc;
260     f_plug_postinit postfunc;
261     f_plug_postinit closefunc;
262     int i;
263     crossfire_plugin* cp;
264     crossfire_plugin* ccp;
265    
266     /* Open the plugin lib and load the required functions */
267     ptr = plugins_dlopen(libfile);
268     if (ptr == NULL) {
269     LOG(llevError, "Error trying to load %s: %s\n", libfile, plugins_dlerror());
270     return -1;
271     }
272     initfunc = (f_plug_init)plugins_dlsym(ptr, "initPlugin");
273     if (initfunc == NULL) {
274     LOG(llevError, "Plugin error while requesting %s.initPlugin: %s\n",
275     libfile, plugins_dlerror());
276     plugins_dlclose(ptr);
277     return -1;
278     }
279     propfunc = (f_plug_api)plugins_dlsym(ptr, "getPluginProperty");
280     if (propfunc == NULL) {
281     LOG(llevError, "Plugin error while requesting %s.getPluginProperty: %s\n",
282     libfile, plugins_dlerror());
283     plugins_dlclose(ptr);
284     return -1;
285     }
286     eventfunc = (f_plug_api)plugins_dlsym(ptr, "eventListener");
287     if (eventfunc == NULL) {
288     LOG(llevError, "Plugin error while requesting %s.eventListener: %s\n",
289     libfile, plugins_dlerror());
290     plugins_dlclose(ptr);
291     return -1;
292     }
293     postfunc = (f_plug_postinit)plugins_dlsym(ptr, "postInitPlugin");
294     if (postfunc == NULL) {
295     LOG(llevError, "Plugin error while requesting %s.postInitPlugin: %s\n",
296     libfile, plugins_dlerror());
297     plugins_dlclose(ptr);
298     return -1;
299     }
300     closefunc = (f_plug_postinit)plugins_dlsym(ptr, "closePlugin");
301     if (postfunc == NULL) {
302     LOG(llevError, "Plugin error while requesting %s.closePlugin: %s\n",
303     libfile, plugins_dlerror());
304     plugins_dlclose(ptr);
305     return -1;
306     }
307     i = initfunc("2.0", cfapi_get_hooks);
308     cp = (crossfire_plugin*) malloc(sizeof(crossfire_plugin));
309     for (i = 0; i < NR_EVENTS; i++)
310     cp->gevent[i] = NULL;
311     cp->eventfunc = eventfunc;
312     cp->propfunc = propfunc;
313     cp->closefunc = closefunc;
314     cp->libptr = ptr;
315     strcpy(cp->id, (const char*) propfunc(&i, "Identification"));
316     strcpy(cp->fullname, (const char*) propfunc(&i, "FullName"));
317     cp->next = NULL;
318     cp->prev = NULL;
319     if (plugins_list == NULL) {
320     plugins_list = cp;
321     } else {
322     for (ccp = plugins_list; ccp->next != NULL; ccp = ccp->next)
323     ;
324     ccp->next = cp;
325     cp->prev = ccp;
326     }
327     postfunc();
328     plugin_number++;
329     return 0;
330     }
331    
332     void* cfapi_get_hooks(int* type, ...)
333     {
334     va_list args;
335     int request_type;
336     char* buf;
337     int fid;
338     f_plug_api rv;
339     int i;
340    
341     va_start(args, type);
342     request_type = va_arg(args, int);
343     if (request_type == 0) { /* By nr */
344     fid = va_arg(args, int);
345     if (fid < 0 || fid >= NR_OF_HOOKS) {
346     rv = NULL;
347     *type = CFAPI_NONE;
348     } else {
349     rv = plug_hooks[fid].func;
350     *type = CFAPI_FUNC;
351     }
352     } else { /* by name */
353     buf = va_arg(args, char*);
354     rv = NULL;
355     for (i = 0; i < NR_OF_HOOKS; i++) {
356     if (!strcmp(buf, plug_hooks[i].fname)) {
357     rv = plug_hooks[i].func;
358     *type = CFAPI_FUNC;
359     break;
360     }
361     }
362     if (rv == NULL) {
363     *type = CFAPI_NONE;
364     }
365     }
366     va_end(args);
367     return (void*)rv;
368     }
369    
370     int plugins_remove_plugin(const char* id)
371     {
372     crossfire_plugin* cp;
373    
374     if (plugins_list == NULL)
375     return -1;
376    
377     for (cp = plugins_list; cp != NULL; cp = cp->next) {
378 root 1.2 if (!strcmp(id, cp->id) && cp->libptr) {
379 elmex 1.1 crossfire_plugin* n;
380     crossfire_plugin* p;
381     n = cp->next;
382     p = cp->prev;
383     plugins_dlclose(cp->libptr);
384     if (n != NULL) {
385     if (p != NULL) {
386     n->prev = p;
387     p->next = n;
388     } else {
389     n->prev = NULL;
390     plugins_list = n;
391     }
392     } else {
393     if (p != NULL)
394     p->next = NULL;
395     else
396     plugins_list = NULL;
397     }
398     free(cp);
399     plugin_number --;
400     return 0;
401     }
402     }
403     return -1;
404     }
405    
406     crossfire_plugin* plugins_find_plugin(const char* id)
407     {
408     crossfire_plugin* cp;
409    
410     if (plugins_list == NULL)
411     return NULL;
412    
413     for (cp = plugins_list; cp != NULL; cp = cp->next) {
414     if (!strcmp(id, cp->id)) {
415     return cp;
416     }
417     }
418     return NULL;
419     }
420    
421     /*****************************************************************************/
422     /* Displays a list of loaded plugins (keystrings and description) in the */
423     /* game log window. */
424     /*****************************************************************************/
425     void plugins_display_list(object *op)
426     {
427     crossfire_plugin* cp;
428    
429     new_draw_info(NDI_UNIQUE, 0, op, "List of loaded plugins:");
430     new_draw_info(NDI_UNIQUE, 0, op, "-----------------------");
431    
432     if (plugins_list == NULL)
433     return;
434    
435     for (cp = plugins_list; cp != NULL; cp = cp->next) {
436     new_draw_info_format(NDI_UNIQUE, 0, op, "%s, %s", cp->id, cp->fullname);
437     }
438     }
439    
440     /* SYSTEM-RELATED HOOKS */
441    
442     void* cfapi_system_find_animation(int *type, ...)
443     {
444     va_list args;
445     static int rv;
446     char* anim;
447     va_start(args, type);
448     anim = va_arg(args, char*);
449     va_end(args);
450    
451     rv = find_animation(anim);
452     *type = CFAPI_INT;
453     return &rv;
454     }
455    
456     void* cfapi_system_strdup_local(int *type, ...)
457     {
458     va_list args;
459     char* txt;
460     va_start(args, type);
461     txt = va_arg(args, char*);
462     va_end(args);
463     *type = CFAPI_STRING;
464     return strdup_local(txt);
465     }
466    
467     void* cfapi_system_register_global_event(int *type, ...)
468     {
469     va_list args;
470     int eventcode;
471     char* pname;
472     f_plug_api hook;
473     crossfire_plugin* cp;
474    
475     va_start(args, type);
476     eventcode = va_arg(args, int);
477     pname = va_arg(args, char*);
478     hook = va_arg(args, f_plug_api);
479    
480     va_end(args);
481     cp = plugins_find_plugin(pname);
482     cp->gevent[eventcode] = hook;
483     return NULL;
484     }
485    
486     void* cfapi_system_unregister_global_event(int *type, ...)
487     {
488     va_list args;
489     int eventcode;
490     char* pname;
491     crossfire_plugin* cp;
492    
493     va_start(args, type);
494     eventcode = va_arg(args, int);
495     pname = va_arg(args, char*);
496    
497     cp = plugins_find_plugin(pname);
498     cp->gevent[eventcode] = NULL;
499    
500     va_end(args);
501     return NULL;
502     }
503    
504     void* cfapi_system_check_path(int* type, ...)
505     {
506     va_list args;
507     static int rv;
508     char* name;
509     int prepend_dir;
510    
511     va_start(args, type);
512    
513     name = va_arg(args, char*);
514     prepend_dir = va_arg(args, int);
515    
516     rv = check_path(name, prepend_dir);
517    
518     va_end(args);
519     *type = CFAPI_INT;
520     return &rv;
521     }
522    
523     void* cfapi_system_re_cmp(int* type, ...)
524     {
525     va_list args;
526     char* rv;
527     const char* str;
528     const char* regexp;
529    
530     va_start(args, type);
531    
532     str = va_arg(args, char*);
533     regexp = va_arg(args, char*);
534    
535     rv = (char*)re_cmp(str, regexp);
536    
537     va_end(args);
538     *type = CFAPI_STRING;
539     return rv;
540     }
541    
542     void* cfapi_system_directory(int* type, ...)
543     {
544     va_list args;
545     int dirtype;
546    
547     va_start(args, type);
548    
549     dirtype = va_arg(args, int);
550     va_end(args);
551    
552     *type = CFAPI_STRING;
553    
554     switch (dirtype)
555     {
556     case 0:
557     return settings.mapdir;
558     break;
559    
560     case 1:
561     return settings.uniquedir;
562     break;
563    
564     case 2:
565     return settings.tmpdir;
566     break;
567    
568     case 3:
569     return settings.confdir;
570     break;
571    
572     case 4:
573     return settings.localdir;
574     break;
575    
576     case 5:
577     return settings.playerdir;
578     break;
579    
580     case 6:
581     return settings.datadir;
582     break;
583     }
584    
585     *type = CFAPI_NONE;
586     return NULL;
587     }
588    
589    
590     /* MAP RELATED HOOKS */
591    
592     void* cfapi_map_get_map(int* type, ...)
593     {
594     va_list args;
595     mapstruct* rv;
596     int ctype;
597     int x, y;
598     sint16 nx, ny;
599     char* name;
600     mapstruct* m;
601    
602     va_start(args, type);
603    
604     ctype = va_arg(args, int);
605    
606     switch (ctype)
607     {
608     case 0:
609     x = va_arg(args, int);
610     y = va_arg(args, int);
611     rv = get_empty_map(x, y);
612     break;
613    
614     case 1:
615     name = va_arg(args, char*);
616     x = va_arg(args, int);
617     rv = ready_map_name(name, x);
618     break;
619    
620     case 2:
621     m = va_arg(args, mapstruct*);
622     nx = va_arg(args, int);
623     ny = va_arg(args, int);
624     rv = get_map_from_coord(m, &nx, &ny);
625     break;
626    
627     case 3:
628     rv = first_map;
629     break;
630    
631     default:
632     *type = CFAPI_NONE;
633     va_end(args);
634     return NULL;
635     break;
636     }
637     va_end(args);
638     *type = CFAPI_PMAP;
639     return rv;
640     }
641     void* cfapi_map_has_been_loaded(int* type, ...)
642     {
643     va_list args;
644     mapstruct* map;
645     char* string;
646    
647     va_start(args, type);
648     string = va_arg(args, char*);
649     map = has_been_loaded(string);
650     va_end(args);
651     *type = CFAPI_PMAP;
652     return map;
653     }
654     void* cfapi_map_create_path(int* type, ...)
655     {
656     va_list args;
657     int ctype;
658     const char* str;
659     char* rv;
660     va_start(args, type);
661    
662     ctype = va_arg(args, int);
663     str = va_arg(args, char*);
664     *type = CFAPI_STRING;
665    
666     switch (ctype)
667     {
668     case 0:
669     rv = (char*)create_pathname(str);
670     break;
671    
672     case 1:
673     rv = (char*)create_overlay_pathname(str);
674     break;
675    
676     /*case 2:
677     rv = create_items_path(str);
678     break;*/
679    
680     default:
681     rv = NULL;
682     *type = CFAPI_NONE;
683     break;
684     }
685     va_end(args);
686     return rv;
687     }
688     void* cfapi_map_get_map_property(int* type, ...)
689     {
690     va_list args;
691     int x, y;
692     sint16 nx, ny;
693     mapstruct* map;
694     mapstruct* newmap;
695     static int rv;
696     int property;
697     char* buf;
698    
699     va_start(args, type);
700    
701     property = va_arg(args, int);
702     switch (property)
703     {
704     case CFAPI_MAP_PROP_FLAGS:
705     map = va_arg(args, mapstruct*);
706     newmap = va_arg(args, mapstruct*);
707     x = va_arg(args, int);
708     y = va_arg(args, int);
709     nx = va_arg(args, int);
710     ny = va_arg(args, int);
711     rv = get_map_flags(map, &newmap, x, y, &nx, &ny);
712     va_end(args);
713     *type = CFAPI_INT;
714     return &rv;
715     break;
716    
717     case CFAPI_MAP_PROP_DIFFICULTY:
718     map = va_arg(args, mapstruct*);
719     rv = calculate_difficulty(map);
720     va_end(args);
721     *type = CFAPI_INT;
722     return &rv;
723     break;
724    
725     case CFAPI_MAP_PROP_PATH:
726     map = va_arg(args, mapstruct*);
727     buf = map->path;
728     *type = CFAPI_STRING;
729     va_end(args);
730     return buf;
731     break;
732    
733     case CFAPI_MAP_PROP_TMPNAME:
734     map = va_arg(args, mapstruct*);
735     buf = map->tmpname;
736     *type = CFAPI_STRING;
737     va_end(args);
738     return buf;
739     break;
740    
741     case CFAPI_MAP_PROP_NAME:
742     map = va_arg(args, mapstruct*);
743     buf = map->name;
744     *type = CFAPI_STRING;
745     va_end(args);
746     return buf;
747     break;
748    
749     case CFAPI_MAP_PROP_RESET_TIME:
750     map = va_arg(args, mapstruct*);
751     rv = map->reset_time;
752     *type = CFAPI_INT;
753     va_end(args);
754     return &rv;
755     break;
756    
757     case CFAPI_MAP_PROP_RESET_TIMEOUT:
758     map = va_arg(args, mapstruct*);
759     rv = map->reset_timeout;
760     *type = CFAPI_INT;
761     va_end(args);
762     return &rv;
763     break;
764    
765     case CFAPI_MAP_PROP_PLAYERS:
766     map = va_arg(args, mapstruct*);
767     rv = map->players;
768     *type = CFAPI_INT;
769     va_end(args);
770     return &rv;
771     break;
772    
773     case CFAPI_MAP_PROP_DARKNESS:
774     map = va_arg(args, mapstruct*);
775     rv = map->darkness;
776     *type = CFAPI_INT;
777     va_end(args);
778     return &rv;
779     break;
780    
781     case CFAPI_MAP_PROP_WIDTH:
782     map = va_arg(args, mapstruct*);
783     rv = map->width;
784     *type = CFAPI_INT;
785     va_end(args);
786     return &rv;
787     break;
788    
789     case CFAPI_MAP_PROP_HEIGHT:
790     map = va_arg(args, mapstruct*);
791     rv = map->height;
792     *type = CFAPI_INT;
793     va_end(args);
794     return &rv;
795     break;
796    
797     case CFAPI_MAP_PROP_ENTER_X:
798     map = va_arg(args, mapstruct*);
799     rv = map->enter_x;
800     *type = CFAPI_INT;
801     va_end(args);
802     return &rv;
803     break;
804    
805     case CFAPI_MAP_PROP_ENTER_Y:
806     map = va_arg(args, mapstruct*);
807     rv = map->enter_y;
808     *type = CFAPI_INT;
809     va_end(args);
810     return &rv;
811     break;
812    
813     case CFAPI_MAP_PROP_TEMPERATURE:
814     map = va_arg(args, mapstruct*);
815     rv = map->temp;
816     *type = CFAPI_INT;
817     va_end(args);
818     return &rv;
819     break;
820    
821     case CFAPI_MAP_PROP_PRESSURE:
822     map = va_arg(args, mapstruct*);
823     rv = map->pressure;
824     *type = CFAPI_INT;
825     va_end(args);
826     return &rv;
827     break;
828    
829     case CFAPI_MAP_PROP_HUMIDITY:
830     map = va_arg(args, mapstruct*);
831     rv = map->humid;
832     *type = CFAPI_INT;
833     va_end(args);
834     return &rv;
835     break;
836    
837     case CFAPI_MAP_PROP_WINDSPEED:
838     map = va_arg(args, mapstruct*);
839     rv = map->windspeed;
840     *type = CFAPI_INT;
841     va_end(args);
842     return &rv;
843     break;
844    
845     case CFAPI_MAP_PROP_WINDDIR:
846     map = va_arg(args, mapstruct*);
847     rv = map->winddir;
848     *type = CFAPI_INT;
849     va_end(args);
850     return &rv;
851     break;
852    
853     case CFAPI_MAP_PROP_SKY:
854     map = va_arg(args, mapstruct*);
855     rv = map->sky;
856     *type = CFAPI_INT;
857     va_end(args);
858     return &rv;
859     break;
860    
861     case CFAPI_MAP_PROP_WPARTX:
862     map = va_arg(args, mapstruct*);
863     rv = map->wpartx;
864     *type = CFAPI_INT;
865     va_end(args);
866     return &rv;
867     break;
868    
869     case CFAPI_MAP_PROP_WPARTY:
870     map = va_arg(args, mapstruct*);
871     rv = map->wparty;
872     *type = CFAPI_INT;
873     va_end(args);
874     return &rv;
875     break;
876    
877     case CFAPI_MAP_PROP_MESSAGE:
878     map = va_arg(args, mapstruct*);
879     buf = map->msg;
880     *type = CFAPI_STRING;
881     va_end(args);
882     return buf;
883     break;
884    
885     case CFAPI_MAP_PROP_NEXT:
886     map = va_arg(args, mapstruct*);
887     *type = CFAPI_PMAP;
888     va_end(args);
889     return map->next;
890     break;
891    
892     case CFAPI_MAP_PROP_REGION:
893     map = va_arg(args, mapstruct*);
894     *type = CFAPI_PREGION;
895     va_end(args);
896     return get_region_by_map(map);
897     break;
898    
899     default:
900     *type = CFAPI_NONE;
901     va_end(args);
902     return NULL;
903     break;
904     }
905     }
906    
907     void* cfapi_map_set_map_property(int* type, ...)
908     {
909     va_list args;
910     static int rv;
911     mapstruct* map;
912     int val;
913     int property;
914    
915     va_start(args, type);
916    
917     property = va_arg(args, int);
918    
919     switch (property)
920     {
921     case CFAPI_MAP_PROP_LIGHT:
922     map = va_arg(args, mapstruct*);
923     val = va_arg(args, int);
924     rv = change_map_light(map, val);
925     *type = CFAPI_INT;
926     va_end(args);
927     return &rv;
928     break;
929    
930     case CFAPI_MAP_PROP_RESET_TIME:
931     map = va_arg(args, mapstruct*);
932     *type = CFAPI_NONE;
933     va_end(args);
934     return NULL;
935     break;
936    
937     default:
938     *type = CFAPI_NONE;
939     va_end(args);
940     return NULL;
941     break;
942     }
943     }
944     void* cfapi_map_out_of_map(int* type, ...)
945     {
946     va_list args;
947     static int rv;
948     mapstruct* map;
949     int x, y;
950    
951     va_start(args, type);
952     map = va_arg(args, mapstruct*);
953     x = va_arg(args, int);
954     y = va_arg(args, int);
955    
956     rv = out_of_map(map, x, y);
957     va_end(args);
958     *type = CFAPI_INT;
959     return &rv;
960     }
961     void* cfapi_map_update_position(int* type, ...)
962     {
963     va_list args;
964     mapstruct* map;
965     int x, y;
966    
967     va_start(args, type);
968    
969     map = va_arg(args, mapstruct*);
970     x = va_arg(args, int);
971     y = va_arg(args, int);
972    
973     update_position(map, x, y);
974     va_end(args);
975     *type = CFAPI_NONE;
976     return NULL;
977     }
978     void* cfapi_map_delete_map(int* type, ...)
979     {
980     va_list args;
981     mapstruct* map;
982     va_start(args, type);
983    
984     map = va_arg(args, mapstruct*);
985    
986     delete_map(map);
987    
988     va_end(args);
989     *type = CFAPI_NONE;
990     return NULL;
991     }
992     void* cfapi_map_message(int* type, ...)
993     {
994     va_list args;
995     mapstruct* map;
996     char* string;
997     int color;
998    
999     va_start(args, type);
1000     map = va_arg(args, mapstruct*);
1001     string = va_arg(args, char*);
1002     color = va_arg(args, int);
1003     va_end(args);
1004    
1005     new_info_map(color, map, string);
1006     *type = CFAPI_NONE;
1007     return NULL;
1008     }
1009     void* cfapi_map_get_object_at(int* type, ...)
1010     {
1011     va_list args;
1012     mapstruct* map;
1013     int x, y;
1014     object* rv;
1015    
1016     va_start(args, type);
1017     map = va_arg(args, mapstruct*);
1018     x = va_arg(args, int);
1019     y = va_arg(args, int);
1020     va_end(args);
1021    
1022     rv = get_map_ob(map, x, y);
1023     *type = CFAPI_POBJECT;
1024     return rv;
1025     }
1026     void* cfapi_map_get_flags(int* type, ...)
1027     {
1028     va_list args;
1029     sint16 x, y;
1030     sint16 *nx, *ny;
1031     static mapstruct* map;
1032     mapstruct** newmap;
1033     static int rv;
1034    
1035     va_start(args, type);
1036    
1037     map = va_arg(args, mapstruct*);
1038     newmap = va_arg(args, mapstruct**);
1039     x = va_arg(args, int);
1040     y = va_arg(args, int);
1041     nx = va_arg(args, sint16*);
1042     ny = va_arg(args, sint16*);
1043     va_end(args);
1044    
1045     rv = get_map_flags(map, newmap, x, y, nx, ny);
1046    
1047     *type = CFAPI_INT;
1048     return &rv;
1049     }
1050     void* cfapi_map_present_arch_by_name(int* type, ...)
1051     {
1052     va_list args;
1053     object* rv;
1054     int x, y;
1055     mapstruct* map;
1056     char* msg;
1057    
1058     va_start(args, type);
1059    
1060     msg = va_arg(args, char*);
1061     map = va_arg(args, mapstruct*);
1062     x = va_arg(args, int);
1063     y = va_arg(args, int);
1064    
1065     va_end(args);
1066    
1067     rv = present_arch(find_archetype(msg), map, x, y);
1068     *type = CFAPI_POBJECT;
1069     return rv;
1070     }
1071    
1072     /* OBJECT-RELATED HOOKS */
1073    
1074     void* cfapi_object_move(int* type, ...)
1075     {
1076     va_list args;
1077     int kind;
1078     object* op;
1079     object* activator;
1080     player* pl;
1081     int direction;
1082     static int rv=0;
1083    
1084     va_start(args, type);
1085     kind = va_arg(args, int);
1086     switch (kind)
1087     {
1088     case 0:
1089     op = va_arg(args, object*);
1090     direction = va_arg(args, int);
1091     activator = va_arg(args, object*);
1092     va_end(args);
1093     rv = move_ob(op, direction, activator);
1094     break;
1095    
1096     case 1:
1097     pl = va_arg(args, player*);
1098     direction = va_arg(args, int);
1099     va_end(args);
1100     rv = move_player(pl->ob, direction);
1101     break;
1102     }
1103     *type = CFAPI_INT;
1104     return &rv;
1105     }
1106    
1107     void* cfapi_object_get_key(int* type, ...)
1108     {
1109     va_list args;
1110     char* rv;
1111     char* keyname;
1112     object* op;
1113    
1114     va_start(args, type);
1115     op = va_arg(args, object*);
1116     keyname = va_arg(args, char*);
1117     va_end(args);
1118    
1119     rv = (char*)get_ob_key_value(op, keyname);
1120     *type = CFAPI_STRING;
1121     return rv;
1122     }
1123     void* cfapi_object_set_key(int* type, ...)
1124     {
1125     va_list args;
1126     char* keyname;
1127     char* value;
1128     object* op;
1129    
1130     va_start(args, type);
1131     op = va_arg(args, object*);
1132     keyname = va_arg(args, char*);
1133     value = va_arg(args, char*);
1134     va_end(args);
1135    
1136     set_ob_key_value(op, keyname, value, 0);
1137     *type = CFAPI_NONE;
1138     return NULL;
1139     }
1140     void* cfapi_object_get_property(int* type, ...)
1141     {
1142     va_list args;
1143     int property;
1144     object* op;
1145     void* rv;
1146     static int ri;
1147    
1148     va_start(args, type);
1149    
1150     op = va_arg(args, object*);
1151     property = va_arg(args, int);
1152     rv = NULL;
1153     if (op != NULL) {
1154     switch (property)
1155     {
1156     case CFAPI_OBJECT_PROP_OB_ABOVE:
1157     rv = op->above;
1158     *type = CFAPI_POBJECT;
1159     break;
1160    
1161     case CFAPI_OBJECT_PROP_OB_BELOW:
1162     rv = op->below;
1163     *type = CFAPI_POBJECT;
1164     break;
1165    
1166     case CFAPI_OBJECT_PROP_NEXT_ACTIVE_OB:
1167     rv = op->active_next;
1168     *type = CFAPI_POBJECT;
1169     break;
1170    
1171     case CFAPI_OBJECT_PROP_PREV_ACTIVE_OB:
1172     rv = op->active_prev;
1173     *type = CFAPI_POBJECT;
1174     break;
1175    
1176     case CFAPI_OBJECT_PROP_INVENTORY:
1177     rv = op->inv;
1178     *type = CFAPI_POBJECT;
1179     break;
1180    
1181     case CFAPI_OBJECT_PROP_ENVIRONMENT:
1182     rv = op->env;
1183     *type = CFAPI_POBJECT;
1184     break;
1185    
1186     case CFAPI_OBJECT_PROP_HEAD:
1187     rv = op->head;
1188     *type = CFAPI_POBJECT;
1189     break;
1190    
1191     case CFAPI_OBJECT_PROP_CONTAINER:
1192     rv = op->container;
1193     *type = CFAPI_POBJECT;
1194     break;
1195    
1196     case CFAPI_OBJECT_PROP_MAP:
1197     rv = op->map;
1198     *type = CFAPI_PMAP;
1199     break;
1200    
1201     case CFAPI_OBJECT_PROP_COUNT:
1202     ri = op->count; rv = &ri;
1203     *type = CFAPI_INT;
1204     break;
1205    
1206     case CFAPI_OBJECT_PROP_REFCOUNT:
1207     ri = op->refcount; rv = &ri;
1208     *type = CFAPI_INT;
1209     break;
1210    
1211     case CFAPI_OBJECT_PROP_NAME:
1212     rv = query_name(op);
1213     *type = CFAPI_STRING;
1214     break;
1215    
1216     case CFAPI_OBJECT_PROP_NAME_PLURAL:
1217 root 1.9 rv = (char*)&op->name_pl;
1218 elmex 1.1 *type = CFAPI_STRING;
1219     break;
1220    
1221     case CFAPI_OBJECT_PROP_TITLE:
1222 root 1.9 rv = (char*)&op->title;
1223 elmex 1.1 *type = CFAPI_STRING;
1224     break;
1225    
1226     case CFAPI_OBJECT_PROP_RACE:
1227 root 1.9 rv = (char*)&op->race;
1228 elmex 1.1 *type = CFAPI_STRING;
1229     break;
1230    
1231     case CFAPI_OBJECT_PROP_SLAYING:
1232 root 1.9 rv = (char*)&op->slaying;
1233 elmex 1.1 *type = CFAPI_STRING;
1234     break;
1235    
1236     case CFAPI_OBJECT_PROP_SKILL:
1237 root 1.9 rv = (char*)&op->skill;
1238 elmex 1.1 *type = CFAPI_STRING;
1239     break;
1240    
1241     case CFAPI_OBJECT_PROP_MESSAGE:
1242 root 1.9 rv = (char*)&op->msg;
1243 elmex 1.1 if (rv == NULL)
1244     rv = (void*)"";
1245     *type = CFAPI_STRING;
1246     break;
1247    
1248     case CFAPI_OBJECT_PROP_LORE:
1249 root 1.9 rv = (char*)&op->lore;
1250 elmex 1.1 *type = CFAPI_STRING;
1251     break;
1252    
1253     case CFAPI_OBJECT_PROP_X:
1254     ri = op->x;
1255     rv = &ri;
1256     *type = CFAPI_INT;
1257     break;
1258    
1259     case CFAPI_OBJECT_PROP_Y:
1260     ri = op->y;
1261     rv = &ri;
1262     *type = CFAPI_INT;
1263     break;
1264    
1265     case CFAPI_OBJECT_PROP_SPEED:
1266     rv = &op->speed;
1267     *type = CFAPI_DOUBLE;
1268     break;
1269    
1270     case CFAPI_OBJECT_PROP_SPEED_LEFT:
1271     rv = &op->speed_left;
1272     *type = CFAPI_DOUBLE;
1273     break;
1274    
1275     case CFAPI_OBJECT_PROP_NROF:
1276     ri = op->nrof; rv = &ri;
1277     *type = CFAPI_INT;
1278     break;
1279    
1280     case CFAPI_OBJECT_PROP_DIRECTION:
1281     ri = op->direction; rv = &ri;
1282     *type = CFAPI_INT;
1283     break;
1284    
1285     case CFAPI_OBJECT_PROP_FACING:
1286     ri = op->facing; rv = &ri;
1287     *type = CFAPI_INT;
1288     break;
1289    
1290     case CFAPI_OBJECT_PROP_TYPE:
1291     ri = op->type; rv = &ri;
1292     *type = CFAPI_INT;
1293     break;
1294    
1295     case CFAPI_OBJECT_PROP_SUBTYPE:
1296     ri = op->subtype; rv = &ri;
1297     *type = CFAPI_INT;
1298     break;
1299    
1300     case CFAPI_OBJECT_PROP_CLIENT_TYPE:
1301     ri = op->client_type; rv = &ri;
1302     *type = CFAPI_INT;
1303     break;
1304    
1305     case CFAPI_OBJECT_PROP_RESIST:
1306     {
1307     int idx;
1308     idx = va_arg(args, int);
1309     ri = op->resist[idx]; rv = &ri;
1310     }
1311     *type = CFAPI_INT;
1312     break;
1313    
1314     case CFAPI_OBJECT_PROP_ATTACK_TYPE:
1315     ri = op->attacktype; rv = &ri;
1316     *type = CFAPI_INT;
1317     break;
1318    
1319     case CFAPI_OBJECT_PROP_PATH_ATTUNED:
1320     ri = op->path_attuned; rv = &ri;
1321     *type = CFAPI_INT;
1322     break;
1323    
1324     case CFAPI_OBJECT_PROP_PATH_REPELLED:
1325     ri = op->path_repelled; rv = &ri;
1326     *type = CFAPI_INT;
1327     break;
1328    
1329     case CFAPI_OBJECT_PROP_PATH_DENIED:
1330     ri = op->path_denied; rv = &ri;
1331     *type = CFAPI_INT;
1332     break;
1333    
1334     case CFAPI_OBJECT_PROP_MATERIAL:
1335     ri = op->material; rv = &ri;
1336     *type = CFAPI_INT;
1337     break;
1338    
1339     case CFAPI_OBJECT_PROP_MATERIAL_NAME:
1340 root 1.9 rv = (char*)&op->materialname;
1341 elmex 1.1 *type = CFAPI_STRING;
1342     break;
1343    
1344     case CFAPI_OBJECT_PROP_MAGIC:
1345     ri = op->magic; rv = &ri;
1346     *type = CFAPI_INT;
1347     break;
1348    
1349     case CFAPI_OBJECT_PROP_VALUE:
1350     ri = op->value; rv = &ri;
1351     *type = CFAPI_INT;
1352     break;
1353    
1354     case CFAPI_OBJECT_PROP_LEVEL:
1355     ri = op->level; rv = &ri;
1356     *type = CFAPI_INT;
1357     break;
1358    
1359     case CFAPI_OBJECT_PROP_LAST_HEAL:
1360     ri = op->last_heal; rv = &ri;
1361     *type = CFAPI_INT;
1362     break;
1363    
1364     case CFAPI_OBJECT_PROP_LAST_SP:
1365     ri = op->last_sp; rv = &ri;
1366     *type = CFAPI_INT;
1367     break;
1368    
1369     case CFAPI_OBJECT_PROP_LAST_GRACE:
1370     ri = op->last_grace; rv = &ri;
1371     *type = CFAPI_INT;
1372     break;
1373    
1374     case CFAPI_OBJECT_PROP_LAST_EAT:
1375     ri = op->last_eat; rv = &ri;
1376     *type = CFAPI_INT;
1377     break;
1378    
1379     case CFAPI_OBJECT_PROP_INVISIBLE_TIME:
1380     ri = op->invisible; rv = &ri;
1381     *type = CFAPI_INT;
1382     break;
1383    
1384     case CFAPI_OBJECT_PROP_PICK_UP:
1385     ri = op->pick_up; rv = &ri;
1386     *type = CFAPI_INT;
1387     break;
1388    
1389     case CFAPI_OBJECT_PROP_ITEM_POWER:
1390     ri = op->item_power; rv = &ri;
1391     *type = CFAPI_INT;
1392     break;
1393    
1394     case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR:
1395     ri = op->gen_sp_armour; rv = &ri;
1396     *type = CFAPI_INT;
1397     break;
1398    
1399     case CFAPI_OBJECT_PROP_WEIGHT:
1400     ri = op->weight; rv = &ri;
1401     *type = CFAPI_INT;
1402     break;
1403    
1404     case CFAPI_OBJECT_PROP_WEIGHT_LIMIT:
1405     ri = op->weight_limit; rv = &ri;
1406     *type = CFAPI_INT;
1407     break;
1408    
1409     case CFAPI_OBJECT_PROP_CARRYING:
1410     ri = op->carrying; rv = &ri;
1411     *type = CFAPI_INT;
1412     break;
1413    
1414     case CFAPI_OBJECT_PROP_GLOW_RADIUS:
1415     ri = op->glow_radius; rv = &ri;
1416     *type = CFAPI_INT;
1417     break;
1418    
1419     case CFAPI_OBJECT_PROP_PERM_EXP:
1420     rv = &op->perm_exp;
1421     *type = CFAPI_LONG;
1422     break;
1423    
1424     case CFAPI_OBJECT_PROP_CURRENT_WEAPON:
1425     rv = op->current_weapon;
1426     *type = CFAPI_POBJECT;
1427     break;
1428    
1429     case CFAPI_OBJECT_PROP_ENEMY:
1430     rv = op->enemy;
1431     *type = CFAPI_POBJECT;
1432     break;
1433    
1434     case CFAPI_OBJECT_PROP_ATTACKED_BY:
1435     rv = op->attacked_by;
1436     *type = CFAPI_POBJECT;
1437     break;
1438    
1439     case CFAPI_OBJECT_PROP_RUN_AWAY:
1440     ri = op->run_away; rv = &ri;
1441     *type = CFAPI_INT;
1442     break;
1443    
1444     case CFAPI_OBJECT_PROP_CHOSEN_SKILL:
1445     rv = op->chosen_skill;
1446     *type = CFAPI_POBJECT;
1447     break;
1448    
1449     case CFAPI_OBJECT_PROP_HIDDEN:
1450     ri = op->hide; rv = &ri;
1451     *type = CFAPI_INT;
1452     break;
1453    
1454     case CFAPI_OBJECT_PROP_MOVE_STATUS:
1455     ri = op->move_status; rv = &ri;
1456     *type = CFAPI_INT;
1457     break;
1458    
1459     case CFAPI_OBJECT_PROP_MOVE_TYPE:
1460     ri = op->attack_movement; rv = &ri;
1461     *type = CFAPI_INT;
1462     break;
1463    
1464     case CFAPI_OBJECT_PROP_SPELL_ITEM:
1465     rv = op->spellitem;
1466     *type = CFAPI_POBJECT;
1467     break;
1468    
1469     case CFAPI_OBJECT_PROP_EXP_MULTIPLIER:
1470     rv = &op->expmul;
1471     *type = CFAPI_DOUBLE;
1472     break;
1473    
1474     case CFAPI_OBJECT_PROP_ARCHETYPE:
1475     rv = op->arch;
1476     *type = CFAPI_PARCH;
1477     break;
1478    
1479     case CFAPI_OBJECT_PROP_OTHER_ARCH:
1480     rv = op->other_arch;
1481     *type = CFAPI_PARCH;
1482     break;
1483    
1484     case CFAPI_OBJECT_PROP_CUSTOM_NAME:
1485 root 1.9 rv = (char*)&op->custom_name;
1486 elmex 1.1 *type = CFAPI_STRING;
1487     break;
1488    
1489     case CFAPI_OBJECT_PROP_ANIM_SPEED:
1490     ri = op->anim_speed; rv = &ri;
1491     *type = CFAPI_INT;
1492     break;
1493    
1494     case CFAPI_OBJECT_PROP_FRIENDLY:
1495     ri = is_friendly(op);
1496     rv = &ri;
1497     *type = CFAPI_INT;
1498     break;
1499    
1500     case CFAPI_OBJECT_PROP_SHORT_NAME:
1501     rv = (char*)query_short_name(op);
1502     *type = CFAPI_STRING;
1503     break;
1504    
1505     case CFAPI_OBJECT_PROP_BASE_NAME:
1506     {
1507     int i;
1508     i = va_arg(args, int);
1509     rv = (char*)query_base_name(op, i);
1510     *type = CFAPI_STRING;
1511     }
1512     break;
1513    
1514     case CFAPI_OBJECT_PROP_MAGICAL:
1515     ri = is_magical(op);
1516     rv = &ri;
1517     *type = CFAPI_INT;
1518     break;
1519    
1520     case CFAPI_OBJECT_PROP_LUCK:
1521     ri = op->stats.luck; rv = &ri;
1522     *type = CFAPI_INT;
1523     break;
1524    
1525     case CFAPI_OBJECT_PROP_EXP:
1526     rv = &op->stats.exp;
1527     *type = CFAPI_LONG;
1528     break;
1529    
1530     case CFAPI_OBJECT_PROP_OWNER:
1531     rv = get_owner(op);
1532     *type = CFAPI_POBJECT;
1533     break;
1534    
1535     case CFAPI_OBJECT_PROP_PRESENT:
1536     {
1537     int stype;
1538     rv = 0;
1539     stype = va_arg(args, int);
1540     switch (stype) {
1541    
1542     unsigned char ptype;
1543     char* buf;
1544     archetype* at;
1545    
1546     case 0: /* present_in_ob */
1547     ptype = (unsigned char)(va_arg(args, int));
1548     rv = present_in_ob(ptype, op);
1549     break;
1550    
1551     case 1: /* present_in_ob_by_name */
1552     ptype = (unsigned char)(va_arg(args, int));
1553     buf = va_arg(args, char*);
1554     rv = present_in_ob_by_name(ptype, buf, op);
1555     break;
1556    
1557     case 2: /* present_arch_in_ob */
1558     at = va_arg(args, archetype*);
1559     rv = present_arch_in_ob(at, op);
1560     break;
1561     }
1562     }
1563     *type = CFAPI_POBJECT;
1564     break;
1565    
1566     case CFAPI_OBJECT_PROP_CHEATER:
1567     ri = (QUERY_FLAG(op, FLAG_WAS_WIZ));
1568     rv = &ri;
1569     *type = CFAPI_INT;
1570     break;
1571    
1572     case CFAPI_OBJECT_PROP_MERGEABLE:
1573     {
1574     object* op2;
1575     op2 = va_arg(args, object*);
1576     ri = CAN_MERGE(op, op2);
1577     rv = &ri;
1578     }
1579     *type = CFAPI_INT;
1580     break;
1581    
1582     case CFAPI_OBJECT_PROP_PICKABLE:
1583     {
1584     object* op2;
1585     rv = 0;
1586     op2 = va_arg(args, object*);
1587     ri = can_pick(op2, op);
1588     rv = &ri;
1589     }
1590     *type = CFAPI_INT;
1591     break;
1592    
1593     case CFAPI_OBJECT_PROP_FLAGS:
1594     {
1595     int fl;
1596     ri = 0;
1597     fl = va_arg(args, int);
1598     ri = QUERY_FLAG(op, fl);
1599     rv = &ri;
1600     }
1601     *type = CFAPI_INT;
1602     break;
1603    
1604     case CFAPI_OBJECT_PROP_STR:
1605     ri = op->stats.Str;
1606     rv = &ri;
1607     *type = CFAPI_INT;
1608     break;
1609    
1610     case CFAPI_OBJECT_PROP_DEX:
1611     ri = op->stats.Dex;
1612     rv = &ri;
1613     *type = CFAPI_INT;
1614     break;
1615    
1616     case CFAPI_OBJECT_PROP_CON:
1617     ri = op->stats.Con;
1618     rv = &ri;
1619     *type = CFAPI_INT;
1620     break;
1621    
1622     case CFAPI_OBJECT_PROP_WIS:
1623     ri = op->stats.Wis;
1624     rv = &ri;
1625     *type = CFAPI_INT;
1626     break;
1627    
1628     case CFAPI_OBJECT_PROP_INT:
1629     ri = op->stats.Int;
1630     rv = &ri;
1631     *type = CFAPI_INT;
1632     break;
1633    
1634     case CFAPI_OBJECT_PROP_POW:
1635     ri = op->stats.Pow;
1636     rv = &ri;
1637     *type = CFAPI_INT;
1638     break;
1639    
1640     case CFAPI_OBJECT_PROP_CHA:
1641     ri = op->stats.Cha;
1642     rv = &ri;
1643     *type = CFAPI_INT;
1644     break;
1645    
1646     case CFAPI_OBJECT_PROP_WC:
1647     ri = op->stats.wc;
1648     rv = &ri;
1649     *type = CFAPI_INT;
1650     break;
1651    
1652     case CFAPI_OBJECT_PROP_AC:
1653     ri = op->stats.ac;
1654     rv = &ri;
1655     *type = CFAPI_INT;
1656     break;
1657    
1658     case CFAPI_OBJECT_PROP_HP:
1659     ri = op->stats.hp;
1660     rv = &ri;
1661     *type = CFAPI_INT;
1662     break;
1663    
1664     case CFAPI_OBJECT_PROP_SP:
1665     ri = op->stats.sp;
1666     rv = &ri;
1667     *type = CFAPI_INT;
1668     break;
1669    
1670     case CFAPI_OBJECT_PROP_GP:
1671     ri = op->stats.grace;
1672     rv = &ri;
1673     *type = CFAPI_INT;
1674     break;
1675    
1676     case CFAPI_OBJECT_PROP_FP:
1677     ri = op->stats.food;
1678     rv = &ri;
1679     *type = CFAPI_INT;
1680     break;
1681    
1682     case CFAPI_OBJECT_PROP_MAXHP:
1683     ri = op->stats.maxhp;
1684     rv = &ri;
1685     *type = CFAPI_INT;
1686     break;
1687    
1688     case CFAPI_OBJECT_PROP_MAXSP:
1689     ri = op->stats.maxsp;
1690     rv = &ri;
1691     *type = CFAPI_INT;
1692     break;
1693    
1694     case CFAPI_OBJECT_PROP_MAXGP:
1695     ri = op->stats.maxgrace;
1696     rv = &ri;
1697     *type = CFAPI_INT;
1698     break;
1699    
1700     case CFAPI_OBJECT_PROP_DAM:
1701     ri = op->stats.dam;
1702     rv = &ri;
1703     *type = CFAPI_INT;
1704     break;
1705    
1706     case CFAPI_OBJECT_PROP_GOD:
1707     rv = (char*)determine_god(op);
1708     *type = CFAPI_STRING;
1709     break;
1710    
1711     case CFAPI_OBJECT_PROP_ARCH_NAME:
1712 root 1.9 rv = (char*)&op->arch->name;
1713 elmex 1.1 *type = CFAPI_STRING;
1714     break;
1715    
1716     case CFAPI_OBJECT_PROP_INVISIBLE:
1717     ri = op->invisible;
1718     rv = &ri;
1719     *type = CFAPI_INT;
1720     break;
1721    
1722     case CFAPI_OBJECT_PROP_FACE:
1723     ri = op->animation_id;
1724     rv = &ri;
1725     *type = CFAPI_INT;
1726     break;
1727    
1728     case CFAPI_PLAYER_PROP_IP:
1729     rv = op->contr->socket.host;
1730     *type = CFAPI_STRING;
1731     break;
1732    
1733     case CFAPI_PLAYER_PROP_MARKED_ITEM:
1734     rv = find_marked_object(op);
1735     *type = CFAPI_POBJECT;
1736     break;
1737    
1738     case CFAPI_PLAYER_PROP_PARTY:
1739     rv = (op->contr ? op->contr->party : NULL);
1740     *type = CFAPI_PPARTY;
1741     break;
1742     default:
1743     *type = CFAPI_NONE;
1744     break;
1745     }
1746     }
1747     va_end(args);
1748     return rv;
1749     }
1750    
1751     void* cfapi_object_set_property(int* type, ...)
1752     {
1753     va_list args;
1754     int iarg;
1755     long larg;
1756     char* sarg;
1757     double darg;
1758     object* oparg;
1759     object* op;
1760     int property;
1761     void* rv;
1762     partylist* partyarg;
1763     va_start(args, type);
1764    
1765     op = va_arg(args, object*);
1766     property = va_arg(args, int);
1767     rv = NULL;
1768    
1769     if (op != NULL && (!op->arch || (op != &op->arch->clone))) {
1770     switch (property)
1771     {
1772     case CFAPI_OBJECT_PROP_NAME:
1773     sarg = va_arg(args, char*);
1774 root 1.9 #define FREE_AND_COPY(a,b) (a) = (b) // TODO: remove, but plugins.C is considered zombie code
1775 elmex 1.1 FREE_AND_COPY(op->name, sarg);
1776     send_changed_object(op);
1777     break;
1778    
1779     case CFAPI_OBJECT_PROP_NAME_PLURAL:
1780     sarg = va_arg(args, char*);
1781     FREE_AND_COPY(op->name_pl, sarg);
1782     send_changed_object(op);
1783     break;
1784    
1785     case CFAPI_OBJECT_PROP_TITLE:
1786     sarg = va_arg(args, char*);
1787     FREE_AND_COPY(op->title, sarg);
1788     break;
1789    
1790     case CFAPI_OBJECT_PROP_RACE:
1791     sarg = va_arg(args, char*);
1792     FREE_AND_COPY(op->race, sarg);
1793     break;
1794    
1795     case CFAPI_OBJECT_PROP_SLAYING:
1796     sarg = va_arg(args, char*);
1797     FREE_AND_COPY(op->slaying, sarg);
1798     break;
1799    
1800     case CFAPI_OBJECT_PROP_SKILL:
1801     sarg = va_arg(args, char*);
1802     FREE_AND_COPY(op->skill, sarg);
1803     break;
1804    
1805     case CFAPI_OBJECT_PROP_MESSAGE:
1806     sarg = va_arg(args, char*);
1807     FREE_AND_COPY(op->msg, sarg);
1808     break;
1809    
1810     case CFAPI_OBJECT_PROP_LORE:
1811     sarg = va_arg(args, char*);
1812     FREE_AND_COPY(op->lore, sarg);
1813     break;
1814    
1815     case CFAPI_OBJECT_PROP_SPEED:
1816     darg = va_arg(args, double);
1817     op->speed = darg;
1818     break;
1819    
1820     case CFAPI_OBJECT_PROP_SPEED_LEFT:
1821     darg = va_arg(args, double);
1822     op->speed_left = darg;
1823     break;
1824    
1825     case CFAPI_OBJECT_PROP_NROF:
1826     iarg = va_arg(args, int);
1827     if (iarg < 0)
1828     iarg = 0;
1829     if (op->nrof > (uint32)iarg)
1830     decrease_ob_nr(op, op->nrof-iarg);
1831     else if (op->nrof < (uint32)iarg) {
1832     object* tmp;
1833     player *pl;
1834     op->nrof = iarg;
1835     if (op->env != NULL) {
1836     tmp = is_player_inv(op->env);
1837     if (!tmp) {
1838     for (pl = first_player; pl; pl = pl->next)
1839     if (pl->ob->container == op->env)
1840     break;
1841     if (pl)
1842     tmp = pl->ob;
1843     else
1844     tmp = NULL;
1845     }
1846     else {
1847     sum_weight(tmp);
1848     fix_player(tmp);
1849     }
1850     if (tmp)
1851     esrv_send_item(tmp, op);
1852     }
1853     else
1854     {
1855     object *above = op->above;
1856    
1857     for (tmp = above; tmp != NULL; tmp = tmp->above)
1858     if (tmp->type == PLAYER)
1859     esrv_send_item(tmp, op);
1860     }
1861     }
1862     break;
1863    
1864     case CFAPI_OBJECT_PROP_DIRECTION:
1865     iarg = va_arg(args, int);
1866     op->direction = iarg;
1867     break;
1868    
1869     case CFAPI_OBJECT_PROP_FACING:
1870     iarg = va_arg(args, int);
1871     op->facing = iarg;
1872     break;
1873    
1874     case CFAPI_OBJECT_PROP_RESIST:
1875     {
1876     int iargbis = va_arg(args, int);
1877     iarg = va_arg(args, int);
1878     op->resist[iargbis] = iarg;
1879     }
1880     break;
1881    
1882     case CFAPI_OBJECT_PROP_ATTACK_TYPE:
1883     iarg = va_arg(args, int);
1884     op->attacktype = iarg;
1885     break;
1886    
1887     case CFAPI_OBJECT_PROP_PATH_ATTUNED:
1888     iarg = va_arg(args, int);
1889     op->path_attuned = iarg;
1890     break;
1891    
1892     case CFAPI_OBJECT_PROP_PATH_REPELLED:
1893     iarg = va_arg(args, int);
1894     op->path_repelled = iarg;
1895     break;
1896    
1897     case CFAPI_OBJECT_PROP_PATH_DENIED:
1898     iarg = va_arg(args, int);
1899     op->path_denied = iarg;
1900     break;
1901    
1902     case CFAPI_OBJECT_PROP_MATERIAL:
1903     iarg = va_arg(args, int);
1904     op->material = iarg;
1905     break;
1906    
1907     case CFAPI_OBJECT_PROP_MATERIAL_NAME:
1908     break;
1909    
1910     case CFAPI_OBJECT_PROP_MAGIC:
1911     iarg = va_arg(args, int);
1912     op->magic = iarg;
1913     break;
1914    
1915     case CFAPI_OBJECT_PROP_VALUE:
1916     iarg = va_arg(args, int);
1917     op->value = iarg;
1918     break;
1919    
1920     case CFAPI_OBJECT_PROP_LEVEL:
1921     iarg = va_arg(args, int);
1922     op->level = iarg;
1923     break;
1924    
1925     case CFAPI_OBJECT_PROP_LAST_HEAL:
1926     iarg = va_arg(args, int);
1927     op->last_heal = iarg;
1928     break;
1929    
1930     case CFAPI_OBJECT_PROP_LAST_SP:
1931     iarg = va_arg(args, int);
1932     op->last_sp = iarg;
1933     break;
1934    
1935     case CFAPI_OBJECT_PROP_LAST_GRACE:
1936     iarg = va_arg(args, int);
1937     op->last_grace = iarg;
1938     break;
1939    
1940     case CFAPI_OBJECT_PROP_LAST_EAT:
1941     iarg = va_arg(args, int);
1942     op->last_eat = iarg;
1943     break;
1944    
1945     case CFAPI_OBJECT_PROP_INVISIBLE_TIME:
1946     iarg = va_arg(args, int);
1947     op->invisible = iarg;
1948     break;
1949    
1950     case CFAPI_OBJECT_PROP_PICK_UP:
1951     iarg = va_arg(args, int);
1952     op->pick_up = iarg;
1953     break;
1954    
1955     case CFAPI_OBJECT_PROP_ITEM_POWER:
1956     iarg = va_arg(args, int);
1957     op->item_power = iarg;
1958     break;
1959    
1960     case CFAPI_OBJECT_PROP_GEN_SP_ARMOUR:
1961     iarg = va_arg(args, int);
1962     op->gen_sp_armour = iarg;
1963     break;
1964    
1965     case CFAPI_OBJECT_PROP_WEIGHT:
1966     iarg = va_arg(args, int);
1967     if (op->weight != iarg) {
1968     object* tmp;
1969     player *pl;
1970     op->weight = iarg;
1971     if (op->env != NULL) {
1972     tmp = is_player_inv(op->env);
1973     if (!tmp) {
1974     for (pl = first_player; pl; pl = pl->next)
1975     if (pl->ob->container == op->env)
1976     break;
1977     if (pl)
1978     tmp = pl->ob;
1979     else
1980     tmp = NULL;
1981     } else {
1982     sum_weight(tmp);
1983     fix_player(tmp);
1984     }
1985     if (tmp)
1986     esrv_send_item(tmp, op);
1987     }
1988     else
1989     {
1990     object *above = op->above;
1991    
1992     for (tmp = above; tmp != NULL; tmp = tmp->above)
1993     if (tmp->type == PLAYER)
1994     esrv_send_item(tmp, op);
1995     }
1996     }
1997     break;
1998    
1999     case CFAPI_OBJECT_PROP_WEIGHT_LIMIT:
2000     iarg = va_arg(args, int);
2001     op->weight_limit = iarg;
2002     break;
2003    
2004     case CFAPI_OBJECT_PROP_GLOW_RADIUS:
2005     iarg = va_arg(args, int);
2006     op->glow_radius = iarg;
2007     break;
2008    
2009     case CFAPI_OBJECT_PROP_PERM_EXP:
2010     larg = va_arg(args, long);
2011     op->perm_exp = larg;
2012     break;
2013    
2014     case CFAPI_OBJECT_PROP_ENEMY:
2015     oparg = va_arg(args, object*);
2016     op->enemy = oparg;
2017     break;
2018    
2019     case CFAPI_OBJECT_PROP_RUN_AWAY:
2020     iarg = va_arg(args, int);
2021     op->run_away = iarg;
2022     break;
2023    
2024     case CFAPI_OBJECT_PROP_CHOSEN_SKILL:
2025     oparg = va_arg(args, object*);
2026     op->chosen_skill = oparg;
2027     break;
2028    
2029     case CFAPI_OBJECT_PROP_HIDDEN:
2030     iarg = va_arg(args, int);
2031     op->hide = iarg;
2032     break;
2033    
2034     case CFAPI_OBJECT_PROP_MOVE_STATUS:
2035     iarg = va_arg(args, int);
2036     op->move_status = iarg;
2037     break;
2038    
2039     case CFAPI_OBJECT_PROP_MOVE_TYPE:
2040     iarg = va_arg(args, int);
2041     op->attack_movement = iarg;
2042     break;
2043    
2044     case CFAPI_OBJECT_PROP_SPELL_ITEM:
2045     oparg = va_arg(args, object*);
2046     op->spellitem = oparg;
2047     break;
2048    
2049     case CFAPI_OBJECT_PROP_EXP_MULTIPLIER:
2050     darg = va_arg(args, double);
2051     op->expmul = darg;
2052     break;
2053    
2054     case CFAPI_OBJECT_PROP_CUSTOM_NAME:
2055     sarg = va_arg(args, char*);
2056     FREE_AND_COPY(op->custom_name, sarg);
2057     send_changed_object(op);
2058     break;
2059    
2060     case CFAPI_OBJECT_PROP_ANIM_SPEED:
2061     iarg = va_arg(args, int);
2062     op->anim_speed = iarg;
2063     break;
2064    
2065     case CFAPI_OBJECT_PROP_FRIENDLY:
2066     iarg = va_arg(args, int);
2067     if (iarg == 1 && is_friendly(op) == 0)
2068     add_friendly_object(op);
2069     else if (iarg == 0 && is_friendly(op) == 1)
2070     remove_friendly_object(op);
2071     break;
2072    
2073     case CFAPI_OBJECT_PROP_LUCK:
2074     iarg = va_arg(args, int);
2075     op->stats.luck = iarg;
2076     break;
2077    
2078     case CFAPI_OBJECT_PROP_EXP:
2079     {
2080     char* skillname;
2081    
2082     larg = va_arg(args, long);
2083     skillname = va_arg(args, char*);
2084     iarg = va_arg(args, int);
2085     change_exp(op, larg, skillname, iarg);
2086     }
2087     break;
2088    
2089     case CFAPI_OBJECT_PROP_OWNER:
2090     oparg = va_arg(args, object*);
2091     set_owner(op, oparg);
2092     break;
2093    
2094     case CFAPI_OBJECT_PROP_CHEATER:
2095     set_cheat(op);
2096     break;
2097    
2098     case CFAPI_OBJECT_PROP_FLAGS:
2099     {
2100     int iargbis;
2101     iarg = va_arg(args, int);
2102     iargbis = va_arg(args, int);
2103     if (iargbis == 1)
2104     SET_FLAG(op, iarg);
2105     else
2106     CLEAR_FLAG(op, iarg);
2107     }
2108     break;
2109    
2110     case CFAPI_OBJECT_PROP_STR:
2111     iarg = va_arg(args, int);
2112     op->stats.Str=iarg;
2113     break;
2114    
2115     case CFAPI_OBJECT_PROP_DEX:
2116     iarg = va_arg(args, int);
2117     op->stats.Dex=iarg;
2118     break;
2119    
2120     case CFAPI_OBJECT_PROP_CON:
2121     iarg = va_arg(args, int);
2122     op->stats.Con=iarg;
2123     break;
2124    
2125     case CFAPI_OBJECT_PROP_WIS:
2126     iarg = va_arg(args, int);
2127     op->stats.Wis=iarg;
2128     break;
2129    
2130     case CFAPI_OBJECT_PROP_INT:
2131     iarg = va_arg(args, int);
2132     op->stats.Int=iarg;
2133     break;
2134    
2135     case CFAPI_OBJECT_PROP_POW:
2136     iarg = va_arg(args, int);
2137     op->stats.Pow=iarg;
2138     break;
2139    
2140     case CFAPI_OBJECT_PROP_CHA:
2141     iarg = va_arg(args, int);
2142     op->stats.Cha=iarg;
2143     break;
2144    
2145     case CFAPI_OBJECT_PROP_WC:
2146     iarg = va_arg(args, int);
2147     op->stats.wc=iarg;
2148     break;
2149    
2150     case CFAPI_OBJECT_PROP_AC:
2151     iarg = va_arg(args, int);
2152     op->stats.ac=iarg;
2153     break;
2154    
2155     case CFAPI_OBJECT_PROP_HP:
2156     iarg = va_arg(args, int);
2157     op->stats.hp=iarg;
2158     break;
2159    
2160     case CFAPI_OBJECT_PROP_SP:
2161     iarg = va_arg(args, int);
2162     op->stats.sp=iarg;
2163     break;
2164    
2165     case CFAPI_OBJECT_PROP_GP:
2166     iarg = va_arg(args, int);
2167     op->stats.grace=iarg;
2168     break;
2169    
2170     case CFAPI_OBJECT_PROP_FP:
2171     iarg = va_arg(args, int);
2172     op->stats.food=iarg;
2173     break;
2174    
2175     case CFAPI_OBJECT_PROP_MAXHP:
2176     iarg = va_arg(args, int);
2177     op->stats.maxhp=iarg;
2178     break;
2179    
2180     case CFAPI_OBJECT_PROP_MAXSP:
2181     iarg = va_arg(args, int);
2182     op->stats.maxsp=iarg;
2183     break;
2184    
2185     case CFAPI_OBJECT_PROP_MAXGP:
2186     iarg = va_arg(args, int);
2187     op->stats.maxgrace=iarg;
2188     break;
2189    
2190     case CFAPI_OBJECT_PROP_DAM:
2191     iarg = va_arg(args, int);
2192     op->stats.dam=iarg;
2193     break;
2194    
2195     case CFAPI_OBJECT_PROP_FACE:
2196     iarg = va_arg(args, int);
2197     op->animation_id = iarg;
2198     update_object(op, UP_OBJ_FACE);
2199     break;
2200    
2201     case CFAPI_OBJECT_ANIMATION:
2202     iarg = va_arg(args, int);
2203     if (iarg != -1) {
2204     SET_ANIMATION(op, iarg);
2205     }
2206     update_object(op, UP_OBJ_FACE);
2207     break;
2208    
2209     case CFAPI_PLAYER_PROP_MARKED_ITEM:
2210     if (op->contr) {
2211     oparg = va_arg(args, object*);
2212     op->contr->mark = oparg;
2213     if (oparg)
2214     op->contr->mark_count = oparg->count;
2215     }
2216     break;
2217    
2218     case CFAPI_PLAYER_PROP_PARTY:
2219     if (op->contr) {
2220     partyarg = va_arg(args, partylist*);
2221     op->contr->party = partyarg;
2222     }
2223     break;
2224    
2225     default:
2226     *type = CFAPI_NONE;
2227     break;
2228     }
2229     }
2230     va_end(args);
2231    
2232     *type = CFAPI_NONE;
2233     return NULL;
2234     }
2235    
2236     void* cfapi_object_apply_below(int* type, ...)
2237     {
2238     va_list args;
2239     object* applier;
2240    
2241     va_start(args, type);
2242    
2243     applier = va_arg(args, object*);
2244    
2245     va_end(args);
2246    
2247     player_apply_below(applier);
2248     *type = CFAPI_NONE;
2249     return NULL;
2250     }
2251    
2252     void* cfapi_object_apply(int* type, ...)
2253     {
2254     va_list args;
2255     object* applied;
2256     object* applier;
2257     int aflags;
2258     static int rv;
2259    
2260     va_start(args, type);
2261    
2262     applied = va_arg(args, object*);
2263     applier = va_arg(args, object*);
2264     aflags = va_arg(args, int);
2265    
2266     va_end(args);
2267    
2268     *type = CFAPI_INT;
2269     rv = manual_apply(applier, applied, aflags);
2270     return &rv;
2271     }
2272     void* cfapi_object_identify(int* type, ...)
2273     {
2274     va_list args;
2275     object* op;
2276    
2277     va_start(args, type);
2278    
2279     op = va_arg(args, object*);
2280    
2281     va_end(args);
2282    
2283     identify(op);
2284     *type = CFAPI_NONE;
2285     return NULL;
2286     }
2287     void* cfapi_object_describe(int* type, ...)
2288     {
2289     va_list args;
2290     object* op;
2291     object* owner;
2292    
2293     va_start(args, type);
2294    
2295     op = va_arg(args, object*);
2296     owner = va_arg(args, object*);
2297     va_end(args);
2298    
2299     *type = CFAPI_STRING;
2300     return describe_item(op, owner);
2301     }
2302     void* cfapi_object_drain(int* type, ...)
2303     {
2304     va_list args;
2305    
2306     object* op;
2307     int ds;
2308    
2309     va_start(args, type);
2310    
2311     op = va_arg(args, object*);
2312     ds = va_arg(args, int);
2313    
2314     va_end(args);
2315    
2316     drain_specific_stat(op, ds);
2317    
2318     *type = CFAPI_NONE;
2319     return NULL;
2320     }
2321     void* cfapi_object_fix(int* type, ...)
2322     {
2323     va_list args;
2324     object* op;
2325    
2326     va_start(args, type);
2327    
2328     op = va_arg(args, object*);
2329    
2330     va_end(args);
2331    
2332     fix_player(op);
2333    
2334     *type = CFAPI_NONE;
2335     return NULL;
2336     }
2337     void* cfapi_object_give_skill(int* type, ...)
2338     {
2339     va_list args;
2340    
2341     object* op;
2342     char* skillname;
2343    
2344     va_start(args, type);
2345    
2346     op = va_arg(args, object*);
2347     skillname = va_arg(args, char*);
2348    
2349     va_end(args);
2350    
2351     *type = CFAPI_POBJECT;
2352     return give_skill_by_name(op, skillname);
2353     }
2354     void* cfapi_object_transmute(int* type, ...)
2355     {
2356     va_list args;
2357    
2358     object* op;
2359     object* chg;
2360    
2361     va_start(args, type);
2362    
2363     op = va_arg(args, object*);
2364     chg = va_arg(args, object*);
2365    
2366     va_end(args);
2367    
2368     transmute_materialname(op, chg);
2369     *type = CFAPI_NONE;
2370     return NULL;
2371     }
2372     void* cfapi_object_remove(int* type, ...)
2373     {
2374     va_list args;
2375     object* op;
2376    
2377     va_start(args, type);
2378    
2379     op = va_arg(args, object*);
2380    
2381     va_end(args);
2382    
2383     send_removed_object(op);
2384     remove_ob(op);
2385     *type = CFAPI_NONE;
2386     return NULL;
2387     }
2388     void* cfapi_object_delete(int* type, ...)
2389     {
2390     va_list args;
2391     object* op;
2392    
2393     va_start(args, type);
2394    
2395     op = va_arg(args, object*);
2396    
2397     va_end(args);
2398    
2399     free_object(op);
2400    
2401     *type = CFAPI_NONE;
2402     return NULL;
2403     }
2404     void* cfapi_object_clone(int* type, ...)
2405     {
2406     va_list args;
2407     object* op;
2408     int kind;
2409    
2410     va_start(args, type);
2411    
2412     op = va_arg(args, object*);
2413     kind = va_arg(args, int);
2414    
2415     va_end(args);
2416    
2417     if (kind == 0) {
2418     *type = CFAPI_POBJECT;
2419     return object_create_clone(op);
2420     } else {
2421     object* tmp;
2422     tmp = get_object();
2423     copy_object(op, tmp);
2424     *type = CFAPI_POBJECT;
2425     return tmp;
2426     }
2427     }
2428     void* cfapi_object_find(int* type, ...)
2429     {
2430     va_list args;
2431     int ftype;
2432     void* rv;
2433     int ival;
2434     int ival2;
2435     char* sval;
2436     object* op;
2437     va_start(args, type);
2438    
2439     *type = CFAPI_POBJECT;
2440     ftype = va_arg(args, int);
2441     switch (ftype)
2442     {
2443     case 0:
2444     ival = va_arg(args, int);
2445     rv = find_object(ival);
2446     break;
2447    
2448     case 1:
2449     sval = va_arg(args, char*);
2450     rv = find_object_name(sval);
2451     break;
2452    
2453     case 2:
2454     op = va_arg(args, object*);
2455     ival = va_arg(args, int);
2456     ival2 = va_arg(args, int);
2457     rv = find_obj_by_type_subtype(op, ival, ival2);
2458     break;
2459    
2460     case 3:
2461     op = va_arg(args, object*);
2462     rv = is_player_inv(op);
2463     break;
2464    
2465     default:
2466     rv = NULL;
2467     *type = CFAPI_NONE;
2468     break;
2469     }
2470    
2471     va_end(args);
2472    
2473     return rv;
2474     }
2475     void* cfapi_object_create(int* type, ...)
2476     {
2477     va_list args;
2478     int ival;
2479     va_start(args, type);
2480     ival = va_arg(args, int);
2481    
2482     *type = CFAPI_POBJECT;
2483     switch (ival)
2484     {
2485     case 0:
2486     va_end(args);
2487     return get_object();
2488     break;
2489    
2490     case 1: /* Named object. Nearly the old plugin behavior, but we don't add artifact suffixes */
2491     {
2492     char* sval;
2493     object* op;
2494     sval = va_arg(args, char*);
2495    
2496     op = get_archetype_by_object_name(sval);
2497    
2498     if (strncmp(query_name(op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) {
2499     free_object(op);
2500     /* Try with archetype names... */
2501     op = get_archetype(sval);
2502     if (strncmp(query_name(op), ARCH_SINGULARITY, ARCH_SINGULARITY_LEN) == 0) {
2503     free_object(op);
2504     *type = CFAPI_NONE;
2505     va_end(args);
2506     return NULL;
2507     }
2508     }
2509     va_end(args);
2510     return op;
2511     }
2512     break;
2513    
2514     default:
2515     *type = CFAPI_NONE;
2516     va_end(args);
2517     return NULL;
2518     break;
2519     }
2520     }
2521     void* cfapi_object_insert(int* type, ...)
2522     {
2523     va_list args;
2524     object* op;
2525     object* orig;
2526     mapstruct* map;
2527     int flag, x, y;
2528     int itype;
2529     char* arch_string;
2530     void* rv = NULL;
2531    
2532     va_start(args, type);
2533    
2534     op = va_arg(args, object*);
2535     itype = va_arg(args, int);
2536    
2537     switch (itype) {
2538     case 0:
2539     map = va_arg(args, mapstruct*);
2540     orig = va_arg(args, object*);
2541     flag = va_arg(args, int);
2542     x = va_arg(args, int);
2543     y = va_arg(args, int);
2544     rv = insert_ob_in_map_at(op, map, orig, flag, x, y);
2545     *type = CFAPI_POBJECT;
2546     break;
2547    
2548     case 1:
2549     map = va_arg(args, mapstruct*);
2550     orig = va_arg(args, object*);
2551     flag = va_arg(args, int);
2552     rv = insert_ob_in_map(op, map, orig, flag);
2553     *type = CFAPI_POBJECT;
2554     break;
2555    
2556     case 2:
2557     arch_string = va_arg(args, char*);
2558     replace_insert_ob_in_map(arch_string, op);
2559     *type = CFAPI_NONE;
2560     break;
2561    
2562     case 3:
2563     orig = va_arg(args, object*);
2564     rv = insert_ob_in_ob(op, orig);
2565     if (orig->type == PLAYER) {
2566     esrv_send_item(orig, op);
2567     }
2568     *type = CFAPI_POBJECT;
2569     break;
2570     }
2571    
2572     va_end(args);
2573    
2574     return rv;
2575     }
2576     void* cfapi_object_split(int* type, ...)
2577     {
2578     va_list args;
2579    
2580     int nr;
2581     object* op;
2582     va_start(args, type);
2583    
2584     op = va_arg(args, object*);
2585     nr = va_arg(args, int);
2586    
2587     va_end(args);
2588     *type = CFAPI_POBJECT;
2589     return get_split_ob(op, nr);
2590     }
2591     void* cfapi_object_merge(int* type, ...)
2592     {
2593     va_list args;
2594     object* op;
2595     object* op2;
2596    
2597     va_start(args, type);
2598    
2599     op = va_arg(args, object*);
2600     op2 = va_arg(args, object*);
2601    
2602     va_end(args);
2603    
2604    
2605     *type = CFAPI_POBJECT;
2606     return merge_ob(op, op2);
2607     }
2608     void* cfapi_object_distance(int* type, ...)
2609     {
2610     va_list args;
2611     static int rv;
2612     object* op;
2613     object* op2;
2614     va_start(args, type);
2615    
2616     op = va_arg(args, object*);
2617     op2 = va_arg(args, object*);
2618    
2619     va_end(args);
2620    
2621     *type = CFAPI_INT;
2622     rv = distance(op, op2);
2623     return &rv;
2624     }
2625     void* cfapi_object_update(int* type, ...)
2626     {
2627     va_list args;
2628     int action;
2629     object* op;
2630     va_start(args, type);
2631    
2632     op = va_arg(args, object*);
2633     action = va_arg(args, int);
2634    
2635     va_end(args);
2636    
2637     update_object(op, action);
2638     *type = CFAPI_NONE;
2639     return NULL;
2640     }
2641     void* cfapi_object_clear(int* type, ...)
2642     {
2643     va_list args;
2644     object* op;
2645     va_start(args, type);
2646    
2647     op = va_arg(args, object*);
2648    
2649     va_end(args);
2650    
2651     clear_object(op);
2652     *type = CFAPI_NONE;
2653     return NULL;
2654     }
2655     void* cfapi_object_reset(int* type, ...)
2656     {
2657     va_list args;
2658     object* op;
2659    
2660     va_start(args, type);
2661    
2662     op = va_arg(args, object*);
2663    
2664     va_end(args);
2665    
2666     reset_object(op);
2667     *type = CFAPI_NONE;
2668     return NULL;
2669     }
2670    
2671     void* cfapi_object_check_inventory(int* type, ...)
2672     {
2673     va_list args;
2674     object* op;
2675     object* op2;
2676     int checktype;
2677     object* ret = NULL;
2678    
2679     va_start(args, type);
2680    
2681     op = va_arg(args, object*);
2682     op2 = va_arg(args, object*);
2683     checktype = va_arg(args, int);
2684    
2685     if (checktype == 0) {
2686     check_inv(op, op2);
2687     *type = CFAPI_NONE;
2688     } else {
2689     ret = check_inv_recursive(op, op2);
2690     *type = CFAPI_POBJECT;
2691     }
2692    
2693     va_end(args);
2694    
2695     return ret;
2696     }
2697    
2698     void* cfapi_object_clean_object(int* type, ...)
2699     {
2700     va_list args;
2701     object* op;
2702     va_start(args, type);
2703     op = va_arg(args, object*);
2704     clean_object(op);
2705     va_end(args);
2706     *type = CFAPI_NONE;
2707     return NULL;
2708     }
2709     void* cfapi_object_on_same_map(int* type, ...)
2710     {
2711     va_list args;
2712     static int rv;
2713     object* op1;
2714     object* op2;
2715    
2716     va_start(args, type);
2717     op1 = va_arg(args, object*);
2718     op2 = va_arg(args, object*);
2719    
2720     rv = on_same_map(op1, op2);
2721     va_end(args);
2722    
2723     *type = CFAPI_INT;
2724     return &rv;
2725     }
2726    
2727     void* cfapi_object_spring_trap(int* type, ...)
2728     {
2729     object* trap;
2730     object* victim;
2731     va_list args;
2732    
2733     va_start(args, type);
2734     trap = va_arg(args, object*);
2735     victim = va_arg(args, object*);
2736     va_end(args);
2737    
2738     spring_trap(trap, victim);
2739     *type = CFAPI_NONE;
2740     return NULL;
2741     }
2742    
2743     void* cfapi_object_check_trigger(int* type, ...)
2744     {
2745     object* op;
2746     object* cause;
2747     va_list args;
2748     static int rv;
2749    
2750     va_start(args, type);
2751     op = va_arg(args, object*);
2752     cause = va_arg(args, object*);
2753     va_end(args);
2754    
2755     rv = check_trigger(op, cause);
2756     *type = CFAPI_INT;
2757     return &rv;
2758     }
2759    
2760     void* cfapi_object_query_cost(int* type, ...)
2761     {
2762     object* op;
2763     object* who;
2764     int flags;
2765     va_list args;
2766     static int rv;
2767    
2768     va_start(args, type);
2769     op = va_arg(args, object*);
2770     who = va_arg(args, object*);
2771     flags = va_arg(args, int);
2772     va_end(args);
2773    
2774     rv = query_cost(op, who, flags);
2775     *type = CFAPI_INT;
2776     return &rv;
2777     }
2778    
2779     void* cfapi_object_query_money(int* type, ...)
2780     {
2781     object* op;
2782     va_list args;
2783     static int rv;
2784    
2785     va_start(args, type);
2786     op = va_arg(args, object*);
2787     va_end(args);
2788    
2789     rv = query_money(op);
2790     *type = CFAPI_INT;
2791     return &rv;
2792     }
2793     void* cfapi_object_cast(int* type, ...)
2794     {
2795     object* op;
2796     object* sp;
2797     int dir;
2798     char* str;
2799     object* caster;
2800     va_list args;
2801     static int rv;
2802     va_start(args, type);
2803     op = va_arg(args, object*);
2804     caster = va_arg(args, object*);
2805     dir = va_arg(args, int);
2806     sp = va_arg(args, object*);
2807     str = va_arg(args, char*);
2808     va_end(args);
2809     rv = cast_spell(op, caster, dir, sp, str);
2810     *type = CFAPI_INT;
2811     return &rv;
2812     }
2813     void* cfapi_object_learn_spell(int* type, ...)
2814     {
2815     object* op;
2816     object* sp;
2817     int prayer;
2818     va_list args;
2819    
2820     va_start(args, type);
2821     op = va_arg(args, object*);
2822     sp = va_arg(args, object*);
2823     prayer = va_arg(args, int);
2824     va_end(args);
2825     do_learn_spell(op, sp, prayer);
2826     *type = CFAPI_NONE;
2827     return NULL;
2828     }
2829     void* cfapi_object_forget_spell(int* type, ...)
2830     {
2831     object* op;
2832     object* sp;
2833     va_list args;
2834    
2835     va_start(args, type);
2836     op = va_arg(args, object*);
2837     sp = va_arg(args, object*);
2838     va_end(args);
2839     do_forget_spell(op, query_name(sp));
2840     *type = CFAPI_NONE;
2841     return NULL;
2842     }
2843     void* cfapi_object_check_spell(int* type, ...)
2844     {
2845     object* op;
2846     char* spellname;
2847     va_list args;
2848     object* rv;
2849    
2850     va_start(args, type);
2851     op = va_arg(args, object*);
2852     spellname = va_arg(args, char*);
2853     va_end(args);
2854     rv = check_spell_known(op, spellname);
2855     *type = CFAPI_POBJECT;
2856     return rv;
2857     }
2858     void* cfapi_object_pay_amount(int* type, ...)
2859     {
2860     object* op;
2861     uint64 amount;
2862     va_list args;
2863     static int rv;
2864    
2865     va_start(args, type);
2866     op = va_arg(args, object*);
2867     amount = va_arg(args, uint64);
2868     va_end(args);
2869    
2870     rv = pay_for_amount(amount, op);
2871     *type = CFAPI_INT;
2872     return &rv;
2873     }
2874     void* cfapi_object_pay_item(int* type, ...)
2875     {
2876     object* op;
2877     object* tobuy;
2878    
2879     va_list args;
2880     static int rv;
2881    
2882     va_start(args, type);
2883     tobuy = va_arg(args, object*);
2884     op = va_arg(args, object*);
2885     va_end(args);
2886    
2887     rv = pay_for_item(tobuy, op);
2888     *type = CFAPI_INT;
2889     return &rv;
2890     }
2891     void* cfapi_object_transfer(int* type, ...)
2892     {
2893     object* op;
2894     object* originator;
2895     int x, y, randompos, ttype;
2896     va_list args;
2897     static int rv=0;
2898     mapstruct* map;
2899    
2900     va_start(args, type);
2901     op = va_arg(args, object*);
2902     ttype = va_arg(args, int);
2903     switch (ttype)
2904     {
2905     case 0:
2906     x = va_arg(args, int);
2907     y = va_arg(args, int);
2908     randompos = va_arg(args, int);
2909     originator = va_arg(args, object*);
2910     va_end(args);
2911    
2912     rv = transfer_ob(op, x, y, randompos, originator);
2913     *type = CFAPI_INT;
2914     return &rv;
2915     break;
2916    
2917     case 1:
2918     x = va_arg(args, int);
2919     y = va_arg(args, int);
2920     map = va_arg(args, mapstruct*);
2921     va_end(args);
2922     if (x < 0 || y < 0) {
2923     x = map->enter_x;
2924     y = map->enter_y;
2925     }
2926     /*
2927     originator = get_object();
2928     EXIT_PATH(originator) = add_string(map->path);
2929     EXIT_X(originator) = x;
2930     EXIT_Y(originator) = y;
2931     printf("B Transfer: X=%d, Y=%d, OP=%s\n", x, y, op->name);*/
2932     /*enter_exit(op, originator);*/
2933     insert_ob_in_map_at(op, map, NULL, 0, x, y);
2934     /*printf("A Transfer: X=%d, Y=%d, MAP=%s\n", x, y, op->map->name);
2935     free_object(originator);
2936     */
2937     *type = CFAPI_INT;
2938     return &rv;
2939     break;
2940    
2941     default:
2942     *type = CFAPI_NONE;
2943     return NULL;
2944     break;
2945     }
2946     }
2947    
2948     void* cfapi_object_find_archetype_inside(int* type, ...)
2949     {
2950     object* op;
2951     int critera;
2952     char* str;
2953     va_list args;
2954     object* rv;
2955    
2956     *type = CFAPI_POBJECT;
2957     va_start(args, type);
2958     op = va_arg(args, object*);
2959     critera = va_arg(args, int);
2960    
2961     switch(critera)
2962     {
2963     case 0: /* By name, either exact or from query_name */
2964     str = va_arg(args, char*);
2965     rv = present_arch_in_ob(find_archetype(str), op);
2966     if (rv == NULL) {
2967     object* tmp;
2968     /* Search by query_name instead */
2969     for (tmp = op->inv; tmp; tmp = tmp->below) {
2970     if (!strncmp(query_name(tmp), str, strlen(str)))
2971     rv = tmp;
2972     if (!strncmp(tmp->name, str, strlen(str)))
2973     rv = tmp;
2974     if (rv != NULL)
2975     break;
2976     }
2977     }
2978     break;
2979    
2980     default:
2981     rv = NULL;
2982     break;
2983     }
2984     va_end(args);
2985    
2986     if (rv == NULL) {
2987     *type = CFAPI_NONE;
2988     }
2989     return rv;
2990     }
2991    
2992     void* cfapi_object_drop(int* type, ...)
2993     {
2994     object* op;
2995     object* author;
2996     va_list args;
2997    
2998     va_start(args, type);
2999     op = va_arg(args, object*);
3000     author = va_arg(args, object*);
3001     va_end(args);
3002    
3003     if (QUERY_FLAG(op, FLAG_NO_DROP))
3004     return NULL;
3005     drop(author, op);
3006    
3007     if (author->type == PLAYER) {
3008     author->contr->count = 0;
3009     author->contr->socket.update_look = 1;
3010     }
3011    
3012     *type = CFAPI_NONE;
3013     return NULL;
3014     }
3015    
3016     void* cfapi_object_take(int* type, ...)
3017     {
3018     object *op;
3019     object *author;
3020     va_list args;
3021    
3022     va_start(args, type);
3023     op = va_arg(args, object*);
3024     author = va_arg(args, object*);
3025     va_end(args);
3026     pick_up(author, op);
3027    
3028     *type = CFAPI_NONE;
3029     return NULL;
3030     }
3031    
3032     void* cfapi_object_say(int* type, ...)
3033 root 1.8 { abort(); }
3034 elmex 1.1 void* cfapi_object_speak(int* type, ...)
3035 root 1.8 { abort(); }
3036 elmex 1.1 /* PLAYER SUBCLASS */
3037     void* cfapi_player_find(int* type, ...)
3038     {
3039     va_list args;
3040     void* rv;
3041     char* sval;
3042     va_start(args, type);
3043    
3044     sval = va_arg(args, char*);
3045     va_end(args);
3046    
3047     rv = find_player(sval);
3048    
3049     *type = CFAPI_PPLAYER;
3050     return rv;
3051     }
3052     void* cfapi_player_message(int* type, ...)
3053     {
3054     va_list args;
3055     int flags;
3056     int pri;
3057     object* pl;
3058     char* buf;
3059    
3060     va_start(args, type);
3061    
3062     flags = va_arg(args, int);
3063     pri = va_arg(args, int);
3064     pl = va_arg(args, object*);
3065     buf = va_arg(args, char*);
3066     va_end(args);
3067    
3068     new_draw_info(flags, pri, pl, buf);
3069     *type = CFAPI_NONE;
3070     return NULL;
3071     }
3072     void *cfapi_player_send_inventory(int *type, ...)
3073     {
3074     /* Currently a stub. Do we really need this anymore ? */
3075     *type = CFAPI_NONE;
3076     return NULL;
3077     }
3078    
3079     void* cfapi_object_teleport(int *type, ...)
3080     {
3081     mapstruct* map;
3082     int x, y;
3083     object* who;
3084     static int result;
3085     va_list args;
3086    
3087     va_start(args, type);
3088     who = va_arg(args, object*);
3089     map = va_arg(args, mapstruct*);
3090     x = va_arg(args, int);
3091     y = va_arg(args, int);
3092    
3093     if (!out_of_map(map, x, y)) {
3094     int k;
3095     object *tmp;
3096     k = find_first_free_spot(who, map, x, y);
3097     if (k == -1) {
3098     result = 1;
3099     return &result;
3100     }
3101    
3102     send_removed_object(who);
3103     remove_ob(who);
3104    
3105     for (tmp = who; tmp != NULL; tmp = tmp->more)
3106     tmp->x = x+freearr_x[k]+(tmp->arch == NULL ? 0 : tmp->arch->clone.x),
3107     tmp->y = y+freearr_y[k]+(tmp->arch == NULL ? 0 : tmp->arch->clone.y);
3108    
3109     insert_ob_in_map(who, map, NULL, 0);
3110     result = 0;
3111     }
3112    
3113     return &result;
3114     }
3115     void* cfapi_object_pickup(int *type, ...)
3116     {
3117     object* who;
3118     object* what;
3119     va_list args;
3120    
3121     va_start(args, type);
3122     who = va_arg(args, object*);
3123     what = va_arg(args, object*);
3124     va_end(args);
3125    
3126     pick_up(who, what);
3127     *type = CFAPI_NONE;
3128     return NULL;
3129     }
3130    
3131     /* Archetype-related functions */
3132     void* cfapi_archetype_get_first(int* type, ...)
3133     {
3134     va_list args;
3135     va_start(args, type);
3136     va_end(args);
3137     *type = CFAPI_PARCH;
3138     return first_archetype;
3139     }
3140    
3141     void* cfapi_archetype_get_property(int* type, ...)
3142     {
3143     archetype* arch;
3144     int prop;
3145     va_list args;
3146     void* rv;
3147    
3148     va_start(args, type);
3149     arch = va_arg(args, archetype*);
3150     prop = va_arg(args, int);
3151     switch (prop) {
3152     case CFAPI_ARCH_PROP_NAME:
3153     *type = CFAPI_STRING;
3154 root 1.9 rv = (void*)&arch->name;
3155 elmex 1.1 break;
3156    
3157     case CFAPI_ARCH_PROP_NEXT:
3158     *type = CFAPI_PARCH;
3159     rv = arch->next;
3160     break;
3161    
3162     case CFAPI_ARCH_PROP_HEAD:
3163     *type = CFAPI_PARCH;
3164     rv = arch->head;
3165     break;
3166    
3167     case CFAPI_ARCH_PROP_MORE:
3168     *type = CFAPI_PARCH;
3169     rv = arch->more;
3170     break;
3171    
3172     case CFAPI_ARCH_PROP_CLONE:
3173     *type = CFAPI_POBJECT;
3174     rv = &arch->clone;
3175     break;
3176    
3177     default:
3178     *type = CFAPI_NONE;
3179     rv = NULL;
3180     break;
3181     }
3182     va_end(args);
3183     return rv;
3184     }
3185    
3186     /* Party-related functions */
3187     void* cfapi_party_get_property(int* type, ...)
3188     {
3189     partylist* party;
3190     int prop;
3191     va_list args;
3192     void* rv;
3193     object* obarg;
3194     player* pl;
3195    
3196     va_start(args, type);
3197     party = va_arg(args, partylist*);
3198     prop = va_arg(args, int);
3199     switch (prop)
3200     {
3201     case CFAPI_PARTY_PROP_NAME:
3202     *type = CFAPI_STRING;
3203     rv = (void*)party->partyname;
3204     break;
3205    
3206     case CFAPI_PARTY_PROP_NEXT:
3207     *type = CFAPI_PPARTY;
3208     rv = (party ? party->next : get_firstparty());
3209     break;
3210    
3211     case CFAPI_PARTY_PROP_PASSWORD:
3212     *type = CFAPI_STRING;
3213     rv = (void*)party->passwd;
3214     break;
3215    
3216     case CFAPI_PARTY_PROP_PLAYER:
3217     *type = CFAPI_PPLAYER;
3218     obarg = va_arg(args, object*);
3219     pl = (obarg ? obarg->contr : first_player);
3220     rv = NULL;
3221     for (; pl != NULL; pl = pl->next)
3222     if (pl->ob->contr->party == party) {
3223     rv = (void*)pl;
3224     break;
3225     }
3226     break;
3227    
3228     default:
3229     *type = CFAPI_NONE;
3230     rv = NULL;
3231     break;
3232     }
3233     va_end(args);
3234     return rv;
3235     }
3236    
3237     /* Regions-related functions */
3238     void* cfapi_region_get_property(int* type, ...)
3239     {
3240     region* reg;
3241     int prop;
3242     va_list args;
3243     void* rv;
3244    
3245     va_start(args, type);
3246     reg = va_arg(args, region*);
3247     prop = va_arg(args, int);
3248     switch (prop) {
3249     case CFAPI_REGION_PROP_NAME:
3250     *type = CFAPI_STRING;
3251     rv = (void*)reg->name;
3252     break;
3253    
3254     case CFAPI_REGION_PROP_NEXT:
3255     *type = CFAPI_PREGION;
3256     rv = (reg?reg->next:first_region);
3257     break;
3258    
3259     case CFAPI_REGION_PROP_PARENT:
3260     *type = CFAPI_PREGION;
3261     rv = (void*)reg->parent;
3262     break;
3263    
3264     case CFAPI_REGION_PROP_LONGNAME:
3265     *type = CFAPI_STRING;
3266     rv = (void*)reg->longname;
3267     break;
3268    
3269     case CFAPI_REGION_PROP_MESSAGE:
3270     *type = CFAPI_STRING;
3271     rv = (void*)reg->msg;
3272     break;
3273    
3274     default:
3275     *type = CFAPI_NONE;
3276     rv = NULL;
3277     break;
3278     }
3279     va_end(args);
3280     return rv;
3281     }
3282    
3283     /*****************************************************************************/
3284     /* NEW PLUGIN STUFF ENDS HERE */
3285     /*****************************************************************************/
3286    
3287    
3288     /*****************************************************************************/
3289     /* Tries to find if a given command is handled by a plugin. */
3290     /* Note that find_plugin_command is called *before* the internal commands are*/
3291     /* checked, meaning that you can "overwrite" them. */
3292     /*****************************************************************************/
3293     CommArray_s *find_plugin_command(char *cmd, object *op)
3294     {
3295     int i;
3296     crossfire_plugin* cp;
3297     CommArray_s* rtn_cmd;
3298    
3299     if (plugins_list == NULL)
3300     return NULL;
3301    
3302     for (cp = plugins_list; cp != NULL; cp = cp->next) {
3303     rtn_cmd = (CommArray_s*) cp->propfunc(&i, "command?", cmd);
3304     if (rtn_cmd)
3305     return rtn_cmd;
3306     }
3307     return NULL;
3308     }
3309    
3310     /*****************************************************************************/
3311     /* Plugins initialization. Browses the plugins directory and call */
3312     /* initOnePlugin for each file found. */
3313     /* Returns 0 if at least one plugin was successfully loaded, -1 if not */
3314     /*****************************************************************************/
3315     int initPlugins(void)
3316     {
3317     struct dirent *currentfile;
3318     DIR *plugdir;
3319     size_t l;
3320     char buf[MAX_BUF];
3321     char buf2[MAX_BUF];
3322     int result;
3323    
3324     LOG(llevInfo, "Initializing plugins\n");
3325     strcpy(buf, LIBDIR);
3326     strcat(buf, "/plugins/");
3327     LOG(llevInfo, "Plugins directory is %s\n", buf);
3328    
3329 root 1.2 plugins_init_perl ();
3330    
3331 elmex 1.1 plugdir = opendir(buf);
3332     if (plugdir == NULL)
3333     return -1;
3334    
3335     result = -1;
3336     while ((currentfile = readdir(plugdir)) != NULL) {
3337     l = strlen(currentfile->d_name);
3338     if (l > strlen(PLUGIN_SUFFIX)) {
3339     if (strcmp(currentfile->d_name+l-strlen(PLUGIN_SUFFIX), PLUGIN_SUFFIX) == 0) {
3340     strcpy(buf2, buf);
3341     strcat(buf2, currentfile->d_name);
3342     LOG(llevInfo, " -> Loading plugin : %s\n", currentfile->d_name);
3343     if (plugins_init_plugin(buf2) == 0)
3344     result = 0;
3345     }
3346     }
3347     }
3348    
3349     closedir(plugdir);
3350     return result;
3351     }