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

Comparing deliantra/server/plugins/cfperl/cfperl.xs (file contents):
Revision 1.14 by root, Tue Feb 7 23:29:55 2006 UTC vs.
Revision 1.17 by root, Wed Feb 8 05:22:41 2006 UTC

28#include <perl.h> 28#include <perl.h>
29#include <XSUB.h> 29#include <XSUB.h>
30 30
31#undef save_long // clashes with libproto.h 31#undef save_long // clashes with libproto.h
32 32
33#define PLUGIN_NAME "cfperl" 33#define PLUGIN_NAME "perl"
34#define PLUGIN_VERSION "cfperl 0.0" 34#define PLUGIN_VERSION "cfperl 0.0"
35 35
36#ifndef __CEXTRACT__ 36#ifndef __CEXTRACT__
37#include <plugin.h> 37#include <plugin.h>
38#endif 38#endif
62 object* activator; 62 object* activator;
63 object* third; 63 object* third;
64 char message[1024]; 64 char message[1024];
65 int fix; 65 int fix;
66 int event_code; 66 int event_code;
67 char options[1024]; 67 char extension[1024]; // name field, should invoke specific perl extension
68 char options[1024]; // slaying field of event_connectors
68 int returnvalue; 69 int returnvalue;
69} CFPContext; 70} CFPContext;
70 71
71//static int current_command = -999; 72//static int current_command = -999;
72 73
79// all objects no longer referenced and empty are 80// all objects no longer referenced and empty are
80// eligible for destruction. 81// eligible for destruction.
81void 82void
82clean_obj_cache () 83clean_obj_cache ()
83{ 84{
85 return; //D // killing neko-san gives me an unreferenced scalar
84 int todo = 10; 86 int todo = 10;
85 do 87 do
86 { 88 {
87 I32 klen; 89 I32 klen;
88 char *key; 90 char *key;
89 HE *he = hv_iternext (obj_cache); 91 HE *he = hv_iternext (obj_cache);
90 92
91 if (he) 93 if (he)
92 { 94 {
93 SV *sv = SvRV (hv_iterval (obj_cache, he)); 95 SV *sv = hv_iterval (obj_cache, he);
94 96
95 // emopty and unreferened? nuke it 97 // emopty and unreferened? nuke it
96 if (SvREFCNT (sv) == 1 && !HvFILL ((HV *)sv)) 98 if (SvREFCNT (sv) == 1 && SvREFCNT (SvRV (sv)) == 1 && !HvFILL ((HV *)(SvRV (sv))))
97 { 99 {
98 hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD); 100 hv_delete (obj_cache, HeKEY (he), HeKLEN (he), G_DISCARD);
99 todo++; 101 todo++;
100 } 102 }
101 } 103 }
128 130
129 if (he) 131 if (he)
130 sv = *he; 132 sv = *he;
131 else 133 else
132 { 134 {
135 return sv; //D
133 sv = newSVptr (ptr, klass); 136 sv = newSVptr (ptr, klass);
134 hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0); 137 hv_store (obj_cache, (char *)&ptr, sizeof (ptr), sv, 0);
135 } 138 }
136 139
137 return newSVsv (sv); 140 return newSVsv (sv);
244} 247}
245 248
246///////////////////////////////////////////////////////////////////////////// 249/////////////////////////////////////////////////////////////////////////////
247 250
248void 251void
249inject_event (CFPContext *context) 252inject_event (const char *func, CFPContext *context)
250{ 253{
251 dSP; 254 dSP;
252 255
253 ENTER; 256 ENTER;
254 SAVETMPS; 257 SAVETMPS;
255 258
256 PUSHMARK (SP); 259 PUSHMARK (SP);
257
258 EXTEND (SP, 2);
259 //PUSHs (sv_2mortal (newSViv (type)));
260 260
261 HV *hv = newHV (); 261 HV *hv = newHV ();
262#define hv_context(type,addr,expr) hv_store (hv, #expr, sizeof (#expr) - 1, newSVcfapi (type, addr context->expr), 0) 262#define hv_context(type,addr,expr) hv_store (hv, #expr, sizeof (#expr) - 1, newSVcfapi (type, addr context->expr), 0)
263 hv_context (CFAPI_POBJECT, ,who); 263 hv_context (CFAPI_POBJECT, ,who);
264 hv_context (CFAPI_POBJECT, ,activator); 264 hv_context (CFAPI_POBJECT, ,activator);
265 hv_context (CFAPI_POBJECT, ,third); 265 hv_context (CFAPI_POBJECT, ,third);
266 hv_context (CFAPI_STRING , ,message); 266 hv_context (CFAPI_STRING , ,message);
267 hv_context (CFAPI_INT ,&,fix); 267 hv_context (CFAPI_INT ,&,fix);
268 hv_context (CFAPI_INT ,&,event_code); 268 hv_context (CFAPI_INT ,&,event_code);
269 hv_context (CFAPI_STRING , ,options); 269 hv_context (CFAPI_STRING , ,options);
270 hv_context (CFAPI_STRING , ,extension);
270 271
271 PUSHs (sv_2mortal (newRV_noinc ((SV *)hv))); 272 XPUSHs (sv_2mortal (newRV_noinc ((SV *)hv)));
272 273
273 PUTBACK; 274 PUTBACK;
274 int count = call_pv ("cf::inject_event", G_SCALAR | G_EVAL); 275 int count = call_pv (func, G_SCALAR | G_EVAL);
275 SPAGAIN; 276 SPAGAIN;
276 277
277 if (SvTRUE (ERRSV)) 278 if (SvTRUE (ERRSV))
278 LOG (llevError, "event '%d' callback evaluation error: %s", context->event_code, SvPV_nolen (ERRSV)); 279 LOG (llevError, "event '%d' callback evaluation error: %s", context->event_code, SvPV_nolen (ERRSV));
279 280
488 case EVENT_LOGOUT: 489 case EVENT_LOGOUT:
489 pl = va_arg (args, player *); 490 pl = va_arg (args, player *);
490 context.activator = pl->ob; 491 context.activator = pl->ob;
491 buf = va_arg (args, char *); 492 buf = va_arg (args, char *);
492 if (buf != 0) 493 if (buf != 0)
493 strcpy (context.message, buf); 494 strncpy (context.message, buf, sizeof (context.message));
494 break; 495 break;
495 496
496 case EVENT_SHOUT: 497 case EVENT_SHOUT:
497 case EVENT_MUZZLE: 498 case EVENT_MUZZLE:
498 case EVENT_KICK: 499 case EVENT_KICK:
499 context.activator = va_arg (args, object *); 500 context.activator = va_arg (args, object *);
500 buf = va_arg (args, char *); 501 buf = va_arg (args, char *);
501 if (buf != 0) 502 if (buf != 0)
502 strcpy (context.message, buf); 503 strncpy (context.message, buf, sizeof (context.message));
503 break; 504 break;
504 505
505 case EVENT_CLOCK: 506 case EVENT_CLOCK:
506 clean_obj_cache (); 507 clean_obj_cache ();
507 break; 508 break;
510 break; 511 break;
511 512
512 case EVENT_MAPRESET: 513 case EVENT_MAPRESET:
513 buf = va_arg (args, char *); 514 buf = va_arg (args, char *);
514 if (buf != 0) 515 if (buf != 0)
515 strcpy (context.message, buf); 516 strncpy (context.message, buf, sizeof (context.message));
516 break; 517 break;
517 } 518 }
518 519
519 va_end (args); 520 va_end (args);
520 521
527 clearSVptr (sv); 528 clearSVptr (sv);
528 SvREFCNT_dec (sv); 529 SvREFCNT_dec (sv);
529 } 530 }
530 } 531 }
531 else 532 else
532 inject_event (&context); 533 inject_event ("cf::inject_global_event", &context);
533 534
534 rv = context.returnvalue; 535 rv = context.returnvalue;
535 536
536 return &rv; 537 return &rv;
537} 538}
553 554
554 context.who = va_arg (args, object *); 555 context.who = va_arg (args, object *);
555 context.event_code = va_arg (args, int); 556 context.event_code = va_arg (args, int);
556 context.activator = va_arg (args, object *); 557 context.activator = va_arg (args, object *);
557 context.third = va_arg (args, object *); 558 context.third = va_arg (args, object *);
559
558 buf = va_arg (args, char *); 560 buf = va_arg (args, char *);
559
560 if (buf != 0) 561 if (buf != 0)
561 strcpy (context.message, buf); 562 strncpy (context.message, buf, sizeof (context.message));
562 563
563 context.fix = va_arg (args, int); 564 context.fix = va_arg (args, int);
565 strncpy (context.extension, va_arg (args, char *), sizeof (context.extension));
564 strcpy (context.options, va_arg (args, char *)); 566 strncpy (context.options, va_arg (args, char *), sizeof (context.options));
565 context.returnvalue = 0; 567 context.returnvalue = 0;
566 va_end (args); 568 va_end (args);
567 569
568 inject_event (&context); 570 inject_event ("cf::inject_event", &context);
569 571
570 rv = context.returnvalue; 572 rv = context.returnvalue;
571 return &rv; 573 return &rv;
572} 574}
573 575
1174int cf_object_get_flag (object *op, int flag) 1176int cf_object_get_flag (object *op, int flag)
1175 ALIAS: flag = 0 1177 ALIAS: flag = 0
1176 1178
1177void cf_object_set_flag (object *op, int flag, int value) 1179void cf_object_set_flag (object *op, int flag, int value)
1178 1180
1179void cf_object_move (object *op, object *originator, int dir) 1181void cf_object_move (object *op, int dir, object *originator)
1180 1182
1181void cf_object_apply (object *op, object *author, int flags = 0) 1183void cf_object_apply (object *op, object *author, int flags = 0)
1182 1184
1183void cf_object_apply_below (object *op) 1185void cf_object_apply_below (object *op)
1184 1186
1267void cf_fix_object (object *pl) 1269void cf_fix_object (object *pl)
1268 ALIAS: fix = 0 1270 ALIAS: fix = 0
1269 1271
1270object *cf_insert_ob_in_ob (object *ob, object *where) 1272object *cf_insert_ob_in_ob (object *ob, object *where)
1271 1273
1274object *get_nearest_player (object *ob)
1275 ALIAS: nearest_player = 0
1276
1277void rangevector (object *ob, object *other, int flags = 0)
1278 PROTOTYPE: $$;$
1279 PPCODE:
1280{
1281 rv_vector rv;
1282 get_rangevector (ob, other, &rv, flags);
1283 EXTEND (SP, 5);
1284 PUSHs (newSVuv (rv.distance));
1285 PUSHs (newSViv (rv.distance_x));
1286 PUSHs (newSViv (rv.distance_y));
1287 PUSHs (newSViv (rv.direction));
1288 PUSHs (newSVcfapi (CFAPI_POBJECT, rv.part));
1289}
1290
1291bool on_same_map_as (object *ob, object *other)
1292 CODE:
1293 RETVAL = on_same_map (ob, other);
1294 OUTPUT: RETVAL
1295
1272 1296
1273MODULE = cf PACKAGE = cf::object::player PREFIX = cf_player_ 1297MODULE = cf PACKAGE = cf::object::player PREFIX = cf_player_
1274 1298
1275player *player (object *op) 1299player *player (object *op)
1276 CODE: 1300 CODE:
1307# nonstandard 1331# nonstandard
1308object *ob (player *pl) 1332object *ob (player *pl)
1309 CODE: 1333 CODE:
1310 RETVAL = pl->ob; 1334 RETVAL = pl->ob;
1311 OUTPUT: RETVAL 1335 OUTPUT: RETVAL
1336
1337player *first ()
1338 CODE:
1339 RETVAL = first_player;
1340 OUTPUT: RETVAL
1341
1342player *next (player *pl)
1343 CODE:
1344 RETVAL = pl->next;
1345 OUTPUT: RETVAL
1346
1347void
1348list ()
1349 PPCODE:
1350{
1351 player *pl;
1352 for (pl = first_player; pl; pl = pl->next)
1353 XPUSHs (newSVcfapi (CFAPI_PPLAYER, pl));
1354}
1312 1355
1313 1356
1314MODULE = cf PACKAGE = cf::map PREFIX = cf_map_ 1357MODULE = cf PACKAGE = cf::map PREFIX = cf_map_
1315 1358
1316SV * 1359SV *

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines