1 | /* |
1 | /* |
2 | * static char *rcsid_plugins_c = |
2 | * static char *rcsid_plugins_c = |
3 | * "$Id: plugins.c,v 1.10 2006/03/28 16:08:38 root Exp $"; |
3 | * "$Id: plugins.c,v 1.13 2006/08/12 11:51:38 elmex Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /*****************************************************************************/ |
6 | /*****************************************************************************/ |
7 | /* CrossFire, A Multiplayer game for X-windows */ |
7 | /* CrossFire, A Multiplayer game for X-windows */ |
8 | /* */ |
8 | /* */ |
… | |
… | |
286 | int execute_global_event(int eventcode, ...) |
286 | int execute_global_event(int eventcode, ...) |
287 | { |
287 | { |
288 | va_list args; |
288 | va_list args; |
289 | object* op; |
289 | object* op; |
290 | object* op2; |
290 | object* op2; |
|
|
291 | object* op3; |
291 | mapstruct *map; |
292 | mapstruct *map; |
292 | player* pl; |
293 | player* pl; |
293 | char* buf; |
294 | char* buf; |
294 | int i, rt; |
295 | int i, rt, retval = 0, *tmpretval = NULL, fix; |
295 | crossfire_plugin* cp; |
296 | crossfire_plugin* cp; |
296 | if (plugins_list == NULL) |
297 | if (plugins_list == NULL) |
297 | return -1; |
298 | return -1; |
298 | |
299 | |
299 | va_start(args, eventcode); |
300 | va_start(args, eventcode); |
… | |
… | |
414 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
415 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
415 | if (cp->gevent[eventcode] != NULL) |
416 | if (cp->gevent[eventcode] != NULL) |
416 | cp->gevent[eventcode](&rt, eventcode, op, buf); |
417 | cp->gevent[eventcode](&rt, eventcode, op, buf); |
417 | } |
418 | } |
418 | break; |
419 | break; |
|
|
420 | |
|
|
421 | case EVENT_FIND_UNARMED_SKILL: |
|
|
422 | op = va_arg(args, object*); |
|
|
423 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
|
|
424 | if (cp->gevent[eventcode] != NULL) |
|
|
425 | if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op)) && *tmpretval > 0) { |
|
|
426 | retval = *tmpretval; |
|
|
427 | } |
|
|
428 | } |
|
|
429 | break; |
|
|
430 | |
|
|
431 | case EVENT_PLAYER_USE_SKILL: |
|
|
432 | case EVENT_MONSTER_USE_SKILL: |
|
|
433 | op = va_arg(args, object*); |
|
|
434 | op2 = va_arg(args, object*); |
|
|
435 | op3 = va_arg(args, object*); |
|
|
436 | fix = va_arg(args, int); |
|
|
437 | buf = va_arg(args, char*); |
|
|
438 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
|
|
439 | if (cp->gevent[eventcode] != NULL) |
|
|
440 | if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op, op2, op3, fix, buf)) && *tmpretval != 0) { |
|
|
441 | retval = *tmpretval; |
|
|
442 | } |
|
|
443 | } |
|
|
444 | break; |
|
|
445 | |
|
|
446 | case EVENT_CAST_SPELL: |
|
|
447 | op = va_arg(args, object*); |
|
|
448 | op2 = va_arg(args, object*); |
|
|
449 | op3 = va_arg(args, object*); |
|
|
450 | fix = va_arg(args, int); |
|
|
451 | buf = va_arg(args, char*); |
|
|
452 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
|
|
453 | if (cp->gevent[eventcode] != NULL) |
|
|
454 | if ((tmpretval = cp->gevent[eventcode](&rt, eventcode, op, op2, op3, fix, buf)) && *tmpretval != 0) { |
|
|
455 | retval = *tmpretval; |
|
|
456 | break; /* The first who did something wins! */ |
|
|
457 | } |
|
|
458 | } |
|
|
459 | break; |
|
|
460 | |
|
|
461 | case EVENT_EXTCMD: |
|
|
462 | /*KICK: op, parms*/ |
|
|
463 | pl = va_arg (args, player *); |
|
|
464 | buf = va_arg (args, char *); |
|
|
465 | i = va_arg (args, int); |
|
|
466 | for (cp = plugins_list; cp != NULL; cp = cp->next) { |
|
|
467 | if (cp->gevent[eventcode] != NULL) |
|
|
468 | cp->gevent[eventcode](&rt, eventcode, pl, buf, i, buf); |
|
|
469 | } |
|
|
470 | break; |
419 | } |
471 | } |
420 | va_end(args); |
472 | va_end(args); |
|
|
473 | |
421 | return 0; |
474 | return retval; |
422 | } |
475 | } |
423 | |
476 | |
424 | int plugins_init_plugin(const char* libfile) |
477 | int plugins_init_plugin(const char* libfile) |
425 | { |
478 | { |
426 | LIBPTRTYPE ptr; |
479 | LIBPTRTYPE ptr; |