--- deliantra/server/plugins/cfperl/cfperl.xs 2006/02/07 23:29:55 1.14 +++ deliantra/server/plugins/cfperl/cfperl.xs 2006/02/10 04:35:33 1.21 @@ -30,7 +30,7 @@ #undef save_long // clashes with libproto.h -#define PLUGIN_NAME "cfperl" +#define PLUGIN_NAME "perl" #define PLUGIN_VERSION "cfperl 0.0" #ifndef __CEXTRACT__ @@ -64,7 +64,8 @@ char message[1024]; int fix; int event_code; - char options[1024]; + char extension[1024]; // name field, should invoke specific perl extension + char options[1024]; // slaying field of event_connectors int returnvalue; } CFPContext; @@ -81,7 +82,12 @@ void clean_obj_cache () { - int todo = 10; + static int count; + + if (++count & 7) + return; + + int todo = 1000; do { I32 klen; @@ -90,10 +96,10 @@ if (he) { - SV *sv = SvRV (hv_iterval (obj_cache, he)); + SV *sv = hv_iterval (obj_cache, he); - // emopty and unreferened? nuke it - if (SvREFCNT (sv) == 1 && !HvFILL ((HV *)sv)) + // empty and unreferenced? nuke it + if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv)))) { hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); todo++; @@ -108,12 +114,14 @@ static SV * newSVptr (void *ptr, const char *klass) { + SV *sv; + if (!ptr) return &PL_sv_undef; - HV *hv = newHV (); - sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); - return sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); + sv = newSV (0); + sv_magic (sv, 0, PERL_MAGIC_ext, (char *)ptr, 0); + return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1)); } static SV * @@ -130,7 +138,9 @@ sv = *he; else { - sv = newSVptr (ptr, klass); + HV *hv = newHV (); + sv_magic ((SV *)hv, 0, PERL_MAGIC_ext, (char *)ptr, 0); + sv = sv_bless (newRV_noinc ((SV *)hv), gv_stashpv (klass, 1)); hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); } @@ -246,7 +256,7 @@ ///////////////////////////////////////////////////////////////////////////// void -inject_event (CFPContext *context) +inject_event (const char *func, CFPContext *context) { dSP; @@ -255,9 +265,6 @@ PUSHMARK (SP); - EXTEND (SP, 2); - //PUSHs (sv_2mortal (newSViv (type))); - HV *hv = newHV (); #define hv_context(type,addr,expr) hv_store (hv, #expr, sizeof (#expr) - 1, newSVcfapi (type, addr context->expr), 0) hv_context (CFAPI_POBJECT, ,who); @@ -267,11 +274,12 @@ hv_context (CFAPI_INT ,&,fix); hv_context (CFAPI_INT ,&,event_code); hv_context (CFAPI_STRING , ,options); + hv_context (CFAPI_STRING , ,extension); - PUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); + XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); PUTBACK; - int count = call_pv ("cf::inject_event", G_SCALAR | G_EVAL); + int count = call_pv (func, G_SCALAR | G_EVAL); SPAGAIN; if (SvTRUE (ERRSV)) @@ -490,7 +498,7 @@ context.activator = pl->ob; buf = va_arg (args, char *); if (buf != 0) - strcpy (context.message, buf); + strncpy (context.message, buf, sizeof (context.message)); break; case EVENT_SHOUT: @@ -499,7 +507,7 @@ context.activator = va_arg (args, object *); buf = va_arg (args, char *); if (buf != 0) - strcpy (context.message, buf); + strncpy (context.message, buf, sizeof (context.message)); break; case EVENT_CLOCK: @@ -512,7 +520,7 @@ case EVENT_MAPRESET: buf = va_arg (args, char *); if (buf != 0) - strcpy (context.message, buf); + strncpy (context.message, buf, sizeof (context.message)); break; } @@ -520,16 +528,13 @@ if (context.event_code == EVENT_FREE_OB) { - SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (object *), 0); + SV *sv = hv_delete (obj_cache, (char *)&context.activator, sizeof (void *), 0); if (sv) - { - clearSVptr (sv); - SvREFCNT_dec (sv); - } + clearSVptr (sv); } else - inject_event (&context); + inject_event ("cf::inject_global_event", &context); rv = context.returnvalue; @@ -555,17 +560,18 @@ context.event_code = va_arg (args, int); context.activator = va_arg (args, object *); context.third = va_arg (args, object *); - buf = va_arg (args, char *); + buf = va_arg (args, char *); if (buf != 0) - strcpy (context.message, buf); + strncpy (context.message, buf, sizeof (context.message)); context.fix = va_arg (args, int); - strcpy (context.options, va_arg (args, char *)); + strncpy (context.extension, va_arg (args, char *), sizeof (context.extension)); + strncpy (context.options, va_arg (args, char *), sizeof (context.options)); context.returnvalue = 0; va_end (args); - inject_event (&context); + inject_event ("cf::inject_event", &context); rv = context.returnvalue; return &rv; @@ -1176,7 +1182,7 @@ void cf_object_set_flag (object *op, int flag, int value) -void cf_object_move (object *op, object *originator, int dir) +void cf_object_move (object *op, int dir, object *originator = op) void cf_object_apply (object *op, object *author, int flags = 0) @@ -1192,7 +1198,7 @@ int cf_object_change_map (object *op, int x, int y, mapstruct *map) -object *cf_object_clone (object *op, int clonetype) +object *cf_object_clone (object *op, int clonetype = 0) int cf_object_pay_item (object *op, object *buyer) @@ -1269,6 +1275,30 @@ object *cf_insert_ob_in_ob (object *ob, object *where) +object *get_nearest_player (object *ob) + ALIAS: nearest_player = 0 + PREINIT: + extern object *get_nearest_player (object *); + +void rangevector (object *ob, object *other, int flags = 0) + PROTOTYPE: $$;$ + PPCODE: +{ + rv_vector rv; + get_rangevector (ob, other, &rv, flags); + EXTEND (SP, 5); + PUSHs (newSVuv (rv.distance)); + PUSHs (newSViv (rv.distance_x)); + PUSHs (newSViv (rv.distance_y)); + PUSHs (newSViv (rv.direction)); + PUSHs (newSVcfapi (CFAPI_POBJECT, rv.part)); +} + +bool on_same_map_as (object *ob, object *other) + CODE: + RETVAL = on_same_map (ob, other); + OUTPUT: RETVAL + MODULE = cf PACKAGE = cf::object::player PREFIX = cf_player_ @@ -1310,6 +1340,25 @@ RETVAL = pl->ob; OUTPUT: RETVAL +player *first () + CODE: + RETVAL = first_player; + OUTPUT: RETVAL + +player *next (player *pl) + CODE: + RETVAL = pl->next; + OUTPUT: RETVAL + +void +list () + PPCODE: +{ + player *pl; + for (pl = first_player; pl; pl = pl->next) + XPUSHs (newSVcfapi (CFAPI_PPLAYER, pl)); +} + MODULE = cf PACKAGE = cf::map PREFIX = cf_map_