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

Comparing deliantra/server/server/cfperl.xs (file contents):
Revision 1.6 by root, Thu Aug 24 17:29:30 2006 UTC vs.
Revision 1.7 by root, Fri Aug 25 13:24:50 2006 UTC

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
515static void * 470static 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:
742extern "C" int cfperl_closePlugin () 655extern "C" int cfperl_closePlugin ()
743{ 656{
744 return 0; 657 return 0;
745} 658}
746 659
660void
661cfperl_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
747void cfperl_main () 692void 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
701void 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
756int cfperl_invoke (const char *klass, event_type event, ...) 709int 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
1865char *
1866host (player *pl)
1867 CODE:
1868 RETVAL = pl->socket.host;
1869 OUTPUT:
1870 RETVAL
1871
1872char *
1873killer (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
1913void 1881void
1914buggy_mapscroll (player *pl, int value = 1) 1882buggy_mapscroll (player *pl, int value = 1)
1915 CODE: 1883 CODE:
1916 pl->socket.buggy_mapscroll = value; 1884 pl->socket.buggy_mapscroll = value;
1917 1885

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines