… | |
… | |
449 | object_insert = (void* (*)(int*, ...)) gethook (&rtype, hooktype, "cfapi_object_insert"); |
449 | object_insert = (void* (*)(int*, ...)) gethook (&rtype, hooktype, "cfapi_object_insert"); |
450 | |
450 | |
451 | cf_init_plugin (gethook); |
451 | cf_init_plugin (gethook); |
452 | |
452 | |
453 | /* Pick the global events you want to monitor from this plugin */ |
453 | /* Pick the global events you want to monitor from this plugin */ |
454 | registerGlobalEvent (NULL, EVENT_BORN, PLUGIN_NAME, globalEventListener); |
|
|
455 | registerGlobalEvent (NULL, EVENT_CLOCK, PLUGIN_NAME, globalEventListener); |
454 | registerGlobalEvent (NULL, EVENT_CLOCK, PLUGIN_NAME, globalEventListener); |
456 | //registerGlobalEvent (NULL, EVENT_CRASH, PLUGIN_NAME, globalEventListener); |
455 | //registerGlobalEvent (NULL, EVENT_CRASH, PLUGIN_NAME, globalEventListener); |
457 | registerGlobalEvent (NULL, EVENT_FIND_UNARMED_SKILL, PLUGIN_NAME, globalEventListener); |
456 | registerGlobalEvent (NULL, EVENT_FIND_UNARMED_SKILL, PLUGIN_NAME, globalEventListener); |
458 | registerGlobalEvent (NULL, EVENT_PLAYER_USE_SKILL, PLUGIN_NAME, globalEventListener); |
457 | registerGlobalEvent (NULL, EVENT_PLAYER_USE_SKILL, PLUGIN_NAME, globalEventListener); |
459 | registerGlobalEvent (NULL, EVENT_CAST_SPELL, PLUGIN_NAME, globalEventListener); |
458 | registerGlobalEvent (NULL, EVENT_CAST_SPELL, PLUGIN_NAME, globalEventListener); |
460 | registerGlobalEvent (NULL, EVENT_MONSTER_USE_SKILL, PLUGIN_NAME, globalEventListener); |
459 | registerGlobalEvent (NULL, EVENT_MONSTER_USE_SKILL, PLUGIN_NAME, globalEventListener); |
461 | registerGlobalEvent (NULL, EVENT_PLAYER_DEATH, PLUGIN_NAME, globalEventListener); |
|
|
462 | registerGlobalEvent (NULL, EVENT_GKILL, PLUGIN_NAME, globalEventListener); |
460 | registerGlobalEvent (NULL, EVENT_GKILL, PLUGIN_NAME, globalEventListener); |
463 | registerGlobalEvent (NULL, EVENT_LOGIN, PLUGIN_NAME, globalEventListener); |
|
|
464 | registerGlobalEvent (NULL, EVENT_LOGOUT, PLUGIN_NAME, globalEventListener); |
|
|
465 | registerGlobalEvent (NULL, EVENT_MAPENTER, PLUGIN_NAME, globalEventListener); |
|
|
466 | registerGlobalEvent (NULL, EVENT_MAPLEAVE, PLUGIN_NAME, globalEventListener); |
|
|
467 | registerGlobalEvent (NULL, EVENT_MAPRESET, PLUGIN_NAME, globalEventListener); |
|
|
468 | registerGlobalEvent (NULL, EVENT_MAPLOAD, PLUGIN_NAME, globalEventListener); |
|
|
469 | registerGlobalEvent (NULL, EVENT_MAPOUT, PLUGIN_NAME, globalEventListener); |
|
|
470 | registerGlobalEvent (NULL, EVENT_MAPIN, PLUGIN_NAME, globalEventListener); |
|
|
471 | registerGlobalEvent (NULL, EVENT_MAPCLEAN, PLUGIN_NAME, globalEventListener); |
|
|
472 | registerGlobalEvent (NULL, EVENT_REMOVE, PLUGIN_NAME, globalEventListener); |
|
|
473 | registerGlobalEvent (NULL, EVENT_SHOUT, PLUGIN_NAME, globalEventListener); |
461 | registerGlobalEvent (NULL, EVENT_SHOUT, PLUGIN_NAME, globalEventListener); |
474 | registerGlobalEvent (NULL, EVENT_TELL, PLUGIN_NAME, globalEventListener); |
462 | registerGlobalEvent (NULL, EVENT_TELL, PLUGIN_NAME, globalEventListener); |
475 | registerGlobalEvent (NULL, EVENT_MUZZLE, PLUGIN_NAME, globalEventListener); |
463 | registerGlobalEvent (NULL, EVENT_MUZZLE, PLUGIN_NAME, globalEventListener); |
476 | registerGlobalEvent (NULL, EVENT_KICK, PLUGIN_NAME, globalEventListener); |
464 | registerGlobalEvent (NULL, EVENT_KICK, PLUGIN_NAME, globalEventListener); |
477 | registerGlobalEvent (NULL, EVENT_FREE_OB, PLUGIN_NAME, globalEventListener); |
|
|
478 | registerGlobalEvent (NULL, EVENT_PLAYER_LOAD, PLUGIN_NAME, globalEventListener); |
|
|
479 | registerGlobalEvent (NULL, EVENT_PLAYER_SAVE, PLUGIN_NAME, globalEventListener); |
|
|
480 | registerGlobalEvent (NULL, EVENT_EXTCMD, PLUGIN_NAME, globalEventListener); |
465 | registerGlobalEvent (NULL, EVENT_EXTCMD, PLUGIN_NAME, globalEventListener); |
481 | |
|
|
482 | char *argv[] = { |
|
|
483 | "", |
|
|
484 | "-e" |
|
|
485 | "BEGIN {" |
|
|
486 | " cf->bootstrap;" |
|
|
487 | " unshift @INC, cf::datadir ();" |
|
|
488 | "}" |
|
|
489 | "" |
|
|
490 | "use cf;" |
|
|
491 | }; |
|
|
492 | |
|
|
493 | perl = perl_alloc (); |
|
|
494 | perl_construct (perl); |
|
|
495 | |
|
|
496 | PL_exit_flags |= PERL_EXIT_DESTRUCT_END; |
|
|
497 | |
|
|
498 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
|
|
499 | { |
|
|
500 | printf ("unable to initialize perl-interpreter, aborting.\n"); |
|
|
501 | |
|
|
502 | exit (EXIT_FAILURE); |
|
|
503 | //perl_destruct (perl); |
|
|
504 | //perl_free (perl); |
|
|
505 | //perl = 0; |
|
|
506 | } |
|
|
507 | else |
|
|
508 | { |
|
|
509 | obj_cache = newHV (); |
|
|
510 | } |
|
|
511 | |
466 | |
512 | return 0; |
467 | return 0; |
513 | } |
468 | } |
514 | |
469 | |
515 | static void * |
470 | static void * |
… | |
… | |
523 | return NULL; |
478 | return NULL; |
524 | |
479 | |
525 | va_start (args, type); |
480 | va_start (args, type); |
526 | event_code = va_arg (args, int); |
481 | event_code = va_arg (args, int); |
527 | |
482 | |
528 | if (event_code == EVENT_FREE_OB) |
|
|
529 | { |
|
|
530 | player *pl; |
|
|
531 | object *op; |
|
|
532 | SV *sv; |
|
|
533 | |
|
|
534 | op = va_arg (args, object *); |
|
|
535 | sv = hv_delete (obj_cache, (char *)&op, sizeof (void *), 0); |
|
|
536 | |
|
|
537 | if (sv) |
|
|
538 | clearSVptr (sv); |
|
|
539 | |
|
|
540 | rv = 0; |
|
|
541 | } |
|
|
542 | else if (event_code == EVENT_CLOCK) |
483 | if (event_code == EVENT_CLOCK) |
543 | { |
484 | { |
544 | clean_obj_cache (); |
485 | clean_obj_cache (); |
545 | } |
486 | } |
546 | else |
487 | else |
547 | { |
488 | { |
… | |
… | |
558 | switch (event_code) |
499 | switch (event_code) |
559 | { |
500 | { |
560 | case EVENT_CRASH: |
501 | case EVENT_CRASH: |
561 | break; |
502 | break; |
562 | |
503 | |
563 | case EVENT_PLAYER_LOAD: |
|
|
564 | case EVENT_PLAYER_SAVE: |
|
|
565 | PUSH_OB; |
|
|
566 | PUSH_PV; |
|
|
567 | break; |
|
|
568 | |
|
|
569 | case EVENT_MAPLOAD: |
|
|
570 | case EVENT_MAPOUT: |
|
|
571 | case EVENT_MAPIN: |
|
|
572 | case EVENT_MAPCLEAN: |
|
|
573 | case EVENT_MAPRESET: |
|
|
574 | PUSH_MAP; |
|
|
575 | break; |
|
|
576 | |
|
|
577 | case EVENT_MAPENTER: |
|
|
578 | case EVENT_MAPLEAVE: |
|
|
579 | case EVENT_BORN: |
|
|
580 | case EVENT_REMOVE: |
|
|
581 | case EVENT_PLAYER_DEATH: |
|
|
582 | PUSH_OB; |
|
|
583 | break; |
|
|
584 | |
|
|
585 | case EVENT_GKILL: |
504 | case EVENT_GKILL: |
586 | PUSH_OB; |
505 | PUSH_OB; |
587 | PUSH_OB; |
506 | PUSH_OB; |
588 | break; |
|
|
589 | |
|
|
590 | case EVENT_LOGIN: |
|
|
591 | case EVENT_LOGOUT: |
|
|
592 | PUSH_PL; |
|
|
593 | PUSH_PV; |
|
|
594 | break; |
507 | break; |
595 | |
508 | |
596 | case EVENT_SHOUT: |
509 | case EVENT_SHOUT: |
597 | case EVENT_MUZZLE: |
510 | case EVENT_MUZZLE: |
598 | case EVENT_KICK: |
511 | case EVENT_KICK: |
… | |
… | |
742 | extern "C" int cfperl_closePlugin () |
655 | extern "C" int cfperl_closePlugin () |
743 | { |
656 | { |
744 | return 0; |
657 | return 0; |
745 | } |
658 | } |
746 | |
659 | |
|
|
660 | void |
|
|
661 | cfperl_init () |
|
|
662 | { |
|
|
663 | char *argv[] = { |
|
|
664 | "", |
|
|
665 | "-e" |
|
|
666 | "BEGIN {" |
|
|
667 | " cf->bootstrap;" |
|
|
668 | " unshift @INC, cf::datadir ();" |
|
|
669 | "}" |
|
|
670 | "" |
|
|
671 | "use cf;" |
|
|
672 | }; |
|
|
673 | |
|
|
674 | perl = perl_alloc (); |
|
|
675 | perl_construct (perl); |
|
|
676 | |
|
|
677 | PL_exit_flags |= PERL_EXIT_DESTRUCT_END; |
|
|
678 | |
|
|
679 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
|
|
680 | { |
|
|
681 | printf ("unable to initialize perl-interpreter, aborting.\n"); |
|
|
682 | |
|
|
683 | exit (EXIT_FAILURE); |
|
|
684 | //perl_destruct (perl); |
|
|
685 | //perl_free (perl); |
|
|
686 | //perl = 0; |
|
|
687 | } |
|
|
688 | else |
|
|
689 | obj_cache = newHV (); |
|
|
690 | } |
|
|
691 | |
747 | void cfperl_main () |
692 | void cfperl_main () |
748 | { |
693 | { |
749 | dSP; |
694 | dSP; |
750 | |
695 | |
751 | PUSHMARK (SP); |
696 | PUSHMARK (SP); |
752 | PUTBACK; |
697 | PUTBACK; |
753 | call_pv ("cf::run", G_DISCARD | G_VOID); |
698 | call_pv ("cf::main", G_DISCARD | G_VOID); |
754 | } |
699 | } |
755 | |
700 | |
|
|
701 | void cfperl_free_ob (object *op) |
|
|
702 | { |
|
|
703 | SV *sv = hv_delete (obj_cache, (char *)&op, sizeof (void *), 0); |
|
|
704 | |
|
|
705 | if (sv) |
|
|
706 | clearSVptr (sv); |
|
|
707 | } |
|
|
708 | |
756 | int cfperl_invoke (const char *klass, event_type event, ...) |
709 | int cfperl_invoke (event_type event, ...) |
757 | { |
710 | { |
758 | dSP; |
711 | dSP; |
759 | va_list ap; |
712 | va_list ap; |
760 | |
713 | |
761 | ENTER; |
714 | ENTER; |
… | |
… | |
764 | va_start (ap, event); |
717 | va_start (ap, event); |
765 | PUSHMARK (SP); |
718 | PUSHMARK (SP); |
766 | EXTEND (SP, 2); |
719 | EXTEND (SP, 2); |
767 | PUSHs (sv_2mortal (newSViv (event))); |
720 | PUSHs (sv_2mortal (newSViv (event))); |
768 | |
721 | |
|
|
722 | // todo, optimise here wether we actually want to invoke an event |
|
|
723 | |
769 | for (;;) |
724 | for (;;) |
770 | { |
725 | { |
771 | data_type dt = (data_type) va_arg (ap, int); |
726 | data_type dt = (data_type) va_arg (ap, int); |
772 | |
727 | |
773 | if (dt == DT_END) |
728 | if (dt == DT_END) |
… | |
… | |
777 | } |
732 | } |
778 | |
733 | |
779 | va_end (ap); |
734 | va_end (ap); |
780 | |
735 | |
781 | PUTBACK; |
736 | PUTBACK; |
782 | int count = call_pv (klass, G_SCALAR | G_EVAL); |
737 | int count = call_pv ("cf::invoke", G_SCALAR | G_EVAL); |
783 | SPAGAIN; |
738 | SPAGAIN; |
784 | |
739 | |
785 | count = count > 0 ? POPi : 0; |
740 | count = count > 0 ? POPi : 0; |
786 | |
741 | |
787 | FREETMPS; |
742 | FREETMPS; |
… | |
… | |
1274 | |
1229 | |
1275 | const_iv (MAP_IN_MEMORY) |
1230 | const_iv (MAP_IN_MEMORY) |
1276 | const_iv (MAP_SWAPPED) |
1231 | const_iv (MAP_SWAPPED) |
1277 | const_iv (MAP_LOADING) |
1232 | const_iv (MAP_LOADING) |
1278 | const_iv (MAP_SAVING) |
1233 | const_iv (MAP_SAVING) |
|
|
1234 | |
|
|
1235 | const_iv (KLASS_GLOBAL) |
|
|
1236 | const_iv (KLASS_OBJECT) |
|
|
1237 | const_iv (KLASS_PLAYER) |
|
|
1238 | const_iv (KLASS_MAP) |
1279 | }; |
1239 | }; |
1280 | |
1240 | |
1281 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) |
1241 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) |
1282 | newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); |
1242 | newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); |
1283 | |
1243 | |
1284 | static const struct { |
1244 | static const struct { |
1285 | const char *name; |
1245 | const char *name; |
|
|
1246 | IV klass; |
1286 | IV iv; |
1247 | IV iv; |
1287 | } *eiv, event_iv[] = { |
1248 | } *eiv, event_iv[] = { |
1288 | # define def(name) { # name, (IV)EV_ ## name }, |
1249 | # define def(klass,name) { # name, (IV)KLASS_ ## klass, (IV)EV_ ## klass ## name }, |
1289 | # include "eventinc.h" |
1250 | # include "eventinc.h" |
1290 | # undef def |
1251 | # undef def |
1291 | }; |
1252 | }; |
1292 | |
1253 | |
1293 | AV *av = get_av ("cf::EVENT", 1); |
1254 | AV *av = get_av ("cf::EVENT", 1); |
1294 | |
1255 | |
1295 | for (eiv = event_iv + sizeof (event_iv) / sizeof (event_iv [0]); eiv-- > event_iv; ) |
1256 | for (eiv = event_iv + sizeof (event_iv) / sizeof (event_iv [0]); eiv-- > event_iv; ) |
|
|
1257 | { |
|
|
1258 | AV *event = newAV (); |
1296 | av_store (av, eiv->iv, newSVpv ((char *)eiv->name, 0)); |
1259 | av_push (event, newSVpv ((char *)eiv->name, 0)); |
|
|
1260 | av_push (event, newSViv (eiv->klass)); |
|
|
1261 | av_store (av, eiv->iv, newRV_noinc ((SV *)event)); |
|
|
1262 | } |
1297 | |
1263 | |
1298 | static const struct { |
1264 | static const struct { |
1299 | const char *name; |
1265 | const char *name; |
1300 | IV iv; |
1266 | IV iv; |
1301 | } *event, event_list[] = { |
1267 | } *event, event_list[] = { |
… | |
… | |
1314 | const_event (TRIGGER) |
1280 | const_event (TRIGGER) |
1315 | const_event (CLOSE) |
1281 | const_event (CLOSE) |
1316 | const_event (TIMER) |
1282 | const_event (TIMER) |
1317 | const_event (MOVE) |
1283 | const_event (MOVE) |
1318 | |
1284 | |
1319 | const_event (BORN) |
|
|
1320 | //const_event (CLOCK) |
1285 | //const_event (CLOCK) |
1321 | const_event (CRASH) |
1286 | const_event (CRASH) |
1322 | const_event (PLAYER_DEATH) |
|
|
1323 | const_event (PLAYER_LOAD) |
|
|
1324 | const_event (PLAYER_SAVE) |
|
|
1325 | const_event (GKILL) |
1287 | const_event (GKILL) |
1326 | const_event (LOGIN) |
|
|
1327 | const_event (LOGOUT) |
|
|
1328 | const_event (MAPENTER) |
|
|
1329 | const_event (MAPLEAVE) |
|
|
1330 | const_event (MAPRESET) |
|
|
1331 | const_event (MAPLOAD) |
|
|
1332 | const_event (MAPOUT) |
|
|
1333 | const_event (MAPIN) |
|
|
1334 | const_event (MAPCLEAN) |
|
|
1335 | const_event (REMOVE) |
|
|
1336 | const_event (SHOUT) |
1288 | const_event (SHOUT) |
1337 | const_event (TELL) |
1289 | const_event (TELL) |
1338 | const_event (MUZZLE) |
1290 | const_event (MUZZLE) |
1339 | const_event (KICK) |
1291 | const_event (KICK) |
1340 | const_event (PLAYER_USE_SKILL) |
1292 | const_event (PLAYER_USE_SKILL) |
… | |
… | |
1908 | CODE: |
1860 | CODE: |
1909 | RETVAL = pl->socket.client; |
1861 | RETVAL = pl->socket.client; |
1910 | OUTPUT: |
1862 | OUTPUT: |
1911 | RETVAL |
1863 | RETVAL |
1912 | |
1864 | |
|
|
1865 | char * |
|
|
1866 | host (player *pl) |
|
|
1867 | CODE: |
|
|
1868 | RETVAL = pl->socket.host; |
|
|
1869 | OUTPUT: |
|
|
1870 | RETVAL |
|
|
1871 | |
|
|
1872 | char * |
|
|
1873 | killer (player *pl, char *killer = 0) |
|
|
1874 | CODE: |
|
|
1875 | if (killer) |
|
|
1876 | snprintf (pl->killer, sizeof (pl->killer), "%s", killer); |
|
|
1877 | RETVAL = pl->killer; |
|
|
1878 | OUTPUT: |
|
|
1879 | RETVAL |
|
|
1880 | |
1913 | void |
1881 | void |
1914 | buggy_mapscroll (player *pl, int value = 1) |
1882 | buggy_mapscroll (player *pl, int value = 1) |
1915 | CODE: |
1883 | CODE: |
1916 | pl->socket.buggy_mapscroll = value; |
1884 | pl->socket.buggy_mapscroll = value; |
1917 | |
1885 | |