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.9 by root, Fri Aug 25 15:31:45 2006 UTC vs.
Revision 1.10 by root, Fri Aug 25 17:11:53 2006 UTC

142 SV *sv; 142 SV *sv;
143 143
144 if (!ptr) 144 if (!ptr)
145 return &PL_sv_undef; 145 return &PL_sv_undef;
146 146
147 sv = newSV (0); 147 sv = (SV *)newHV ();
148 sv_magic (sv, 0, PERL_MAGIC_ext, (char *)ptr, 0); 148 sv_magic (sv, 0, PERL_MAGIC_ext, (char *)ptr, 0);
149 return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1)); 149 return sv_bless (newRV_noinc (sv), gv_stashpv (klass, 1));
150} 150}
151 151
152static void 152static void
223{ 223{
224 SV *sv; 224 SV *sv;
225 225
226 switch (type) 226 switch (type)
227 { 227 {
228 // first three exist only for cfapi-compatibility
228 case DT_INT: 229 case DT_INT_PTR:
229 sv = newSViv (*va_arg (ap, int *)); 230 sv = newSViv (*va_arg (ap, int *));
230 break; 231 break;
231 232
232 case DT_LONG: 233 case DT_INT64_PTR:
233 sv = newSVval64 ((val64)*va_arg (ap, sint64 *)); 234 sv = newSVval64 ((val64)*va_arg (ap, sint64 *));
234 break; 235 break;
235 236
236 case DT_DOUBLE: 237 case DT_DOUBLE_PTR:
237 sv = newSVnv (*va_arg (ap, double *)); 238 sv = newSVnv (*va_arg (ap, double *));
238 break; 239 break;
239 240
241 case DT_INT:
242 sv = newSViv (va_arg (ap, int));
243 break;
244
245 case DT_INT64:
246 sv = newSVval64 ((val64)va_arg (ap, sint64));
247 break;
248
249 case DT_DOUBLE:
250 sv = newSVnv (va_arg (ap, double));
251 break;
252
240 case DT_STRING: 253 case DT_STRING:
241 { 254 {
242 char *str = va_arg (ap, char *); 255 char *str = (char *)va_arg (ap, const char *);
243 sv = str ? newSVpv (str, 0) : &PL_sv_undef; 256 sv = str ? newSVpv (str, 0) : &PL_sv_undef;
244 } 257 }
245 break; 258 break;
246 259
247 case DT_DATA: 260 case DT_DATA:
248 { 261 {
249 char *str = (char *)va_arg (ap, void *); 262 char *str = (char *)va_arg (ap, const void *);
250 int len = va_arg (ap, int); 263 int len = va_arg (ap, int);
251 sv = str ? newSVpv (str, len) : &PL_sv_undef; 264 sv = str ? newSVpv (str, len) : &PL_sv_undef;
252 } 265 }
253 break; 266 break;
254 267
257 object *obj = va_arg (ap, object *); 270 object *obj = va_arg (ap, object *);
258 271
259 if (!obj) 272 if (!obj)
260 sv = &PL_sv_undef; 273 sv = &PL_sv_undef;
261 else 274 else
275 {
276 if (!obj->self)
262 switch (obj->type) 277 switch (obj->type)
263 { 278 {
264 case MAP: 279 case MAP:
265 sv = newSVptr_cached (obj, "cf::object::map::wrap"); 280 obj->self = static_cast<void *>(newSVptr (obj, "cf::object::map::wrap"));
266 break; 281 break;
267 282
268 case PLAYER: 283 case PLAYER:
269 sv = newSVptr_cached (obj, "cf::object::player::wrap"); 284 obj->self = static_cast<void *>(newSVptr (obj, "cf::object::player::wrap"));
270 break; 285 break;
271 286
272 default: 287 default:
273 sv = newSVptr_cached (obj, "cf::object::wrap"); 288 obj->self = static_cast<void *>(newSVptr (obj, "cf::object::wrap"));
274 break; 289 break;
290 }
291
292 sv = newSVsv (static_cast<SV *>(obj->self));
275 } 293 }
276 } 294 }
277 break; 295 break;
278 296
279 case DT_MAP: 297 case DT_MAP:
280 sv = newSVptr (va_arg (ap, mapstruct *), "cf::map::wrap"); 298 sv = newSVptr (va_arg (ap, mapstruct *), "cf::map::wrap");
323 va_list ap; 341 va_list ap;
324 va_start (ap, type); 342 va_start (ap, type);
325 343
326 switch (type) 344 switch (type)
327 { 345 {
328 case CFAPI_INT: sv = newSVdt_va (ap, DT_INT ); break; 346 case CFAPI_INT: sv = newSVdt_va (ap, DT_INT_PTR ); break;
329 case CFAPI_LONG: sv = newSVdt_va (ap, DT_LONG ); break; 347 case CFAPI_LONG: sv = newSVdt_va (ap, DT_INT64_PTR ); break;
330 case CFAPI_DOUBLE: sv = newSVdt_va (ap, DT_DOUBLE); break; 348 case CFAPI_DOUBLE: sv = newSVdt_va (ap, DT_DOUBLE_PTR); break;
331 case CFAPI_STRING: sv = newSVdt_va (ap, DT_STRING); break; 349 case CFAPI_STRING: sv = newSVdt_va (ap, DT_STRING); break;
332 case CFAPI_POBJECT: sv = newSVdt_va (ap, DT_OBJECT); break; 350 case CFAPI_POBJECT: sv = newSVdt_va (ap, DT_OBJECT); break;
333 case CFAPI_PMAP: sv = newSVdt_va (ap, DT_MAP ); break; 351 case CFAPI_PMAP: sv = newSVdt_va (ap, DT_MAP ); break;
334 case CFAPI_PPLAYER: sv = newSVdt_va (ap, DT_PLAYER); break; 352 case CFAPI_PPLAYER: sv = newSVdt_va (ap, DT_PLAYER); break;
335 case CFAPI_PARCH: sv = newSVdt_va (ap, DT_ARCH ); break; 353 case CFAPI_PARCH: sv = newSVdt_va (ap, DT_ARCH ); break;
454 472
455 /* Pick the global events you want to monitor from this plugin */ 473 /* Pick the global events you want to monitor from this plugin */
456 registerGlobalEvent (NULL, EVENT_CLOCK, PLUGIN_NAME, globalEventListener); 474 registerGlobalEvent (NULL, EVENT_CLOCK, PLUGIN_NAME, globalEventListener);
457 //registerGlobalEvent (NULL, EVENT_CRASH, PLUGIN_NAME, globalEventListener); 475 //registerGlobalEvent (NULL, EVENT_CRASH, PLUGIN_NAME, globalEventListener);
458 registerGlobalEvent (NULL, EVENT_FIND_UNARMED_SKILL, PLUGIN_NAME, globalEventListener); 476 registerGlobalEvent (NULL, EVENT_FIND_UNARMED_SKILL, PLUGIN_NAME, globalEventListener);
459 registerGlobalEvent (NULL, EVENT_PLAYER_USE_SKILL, PLUGIN_NAME, globalEventListener);
460 registerGlobalEvent (NULL, EVENT_CAST_SPELL, PLUGIN_NAME, globalEventListener);
461 registerGlobalEvent (NULL, EVENT_MONSTER_USE_SKILL, PLUGIN_NAME, globalEventListener);
462 registerGlobalEvent (NULL, EVENT_GKILL, PLUGIN_NAME, globalEventListener);
463 registerGlobalEvent (NULL, EVENT_SHOUT, PLUGIN_NAME, globalEventListener); 477 registerGlobalEvent (NULL, EVENT_SHOUT, PLUGIN_NAME, globalEventListener);
464 registerGlobalEvent (NULL, EVENT_TELL, PLUGIN_NAME, globalEventListener); 478 registerGlobalEvent (NULL, EVENT_TELL, PLUGIN_NAME, globalEventListener);
465 registerGlobalEvent (NULL, EVENT_MUZZLE, PLUGIN_NAME, globalEventListener); 479 registerGlobalEvent (NULL, EVENT_MUZZLE, PLUGIN_NAME, globalEventListener);
466 registerGlobalEvent (NULL, EVENT_KICK, PLUGIN_NAME, globalEventListener); 480 registerGlobalEvent (NULL, EVENT_KICK, PLUGIN_NAME, globalEventListener);
467 registerGlobalEvent (NULL, EVENT_EXTCMD, PLUGIN_NAME, globalEventListener);
468 481
469 return 0; 482 return 0;
470} 483}
471 484
472static void * 485static void *
501 switch (event_code) 514 switch (event_code)
502 { 515 {
503 case EVENT_CRASH: 516 case EVENT_CRASH:
504 break; 517 break;
505 518
506 case EVENT_GKILL:
507 PUSH_OB;
508 PUSH_OB;
509 break;
510
511 case EVENT_SHOUT: 519 case EVENT_SHOUT:
512 case EVENT_MUZZLE: 520 case EVENT_MUZZLE:
513 case EVENT_KICK: 521 case EVENT_KICK:
514 PUSH_OB; 522 PUSH_OB;
515 PUSH_PV; 523 PUSH_PV;
516 break; 524 break;
517 525
518 case EVENT_FIND_UNARMED_SKILL: 526 case EVENT_FIND_UNARMED_SKILL:
519 PUSH_OB; 527 PUSH_OB;
520 break;
521
522 case EVENT_PLAYER_USE_SKILL:
523 case EVENT_MONSTER_USE_SKILL:
524 case EVENT_CAST_SPELL:
525 PUSH_OB;
526 PUSH_OB;
527 PUSH_OB;
528 PUSH_IV;
529 PUSH_PV;
530 break;
531
532 case EVENT_EXTCMD:
533 PUSH_PL;
534 {
535 char *buf = va_arg (args, char *);
536 int len = va_arg (args, int);
537 PUSHs (sv_2mortal (newSVpvn (buf, len)));
538 }
539 break; 528 break;
540 529
541 case EVENT_TELL: 530 case EVENT_TELL:
542 break; 531 break;
543 } 532 }
607 break; 596 break;
608 597
609 case EVENT_APPLY: // $ob, $who 598 case EVENT_APPLY: // $ob, $who
610 case EVENT_DROP: // $ob, $who 599 case EVENT_DROP: // $ob, $who
611 case EVENT_CLOSE: // $ob, $who 600 case EVENT_CLOSE: // $ob, $who
612 case EVENT_DEATH: // $ob[, $killer]
613 case EVENT_MOVE: // $ob, $enemy 601 case EVENT_MOVE: // $ob, $enemy
614 case EVENT_THROW: // $ob, $thrower 602 case EVENT_THROW: // $ob, $thrower
615 PUSHcfapi (POBJECT, activator); 603 PUSHcfapi (POBJECT, activator);
616 break; 604 break;
617 605
701 call_pv ("cf::main", G_DISCARD | G_VOID); 689 call_pv ("cf::main", G_DISCARD | G_VOID);
702} 690}
703 691
704void cfperl_free_ob (object *op) 692void cfperl_free_ob (object *op)
705{ 693{
706 SV *sv = hv_delete (obj_cache, (char *)&op, sizeof (void *), 0); 694 if (op->self) fprintf (stderr, "free_ob_self %p %s\n", op, op->name);//D
707 695 if (op->self) SvREFCNT_dec (op->self), op->self = 0;
708 if (sv) 696 if (op->cb) SvREFCNT_dec (op->cb), op->cb = 0;
709 clearSVptr (sv);
710} 697}
711 698
712static event_klass klass_of[NUM_EVENT_TYPES] = { 699static event_klass klass_of[NUM_EVENT_TYPES] = {
713# define def(type,name) KLASS_ ## type, 700# define def(type,name) KLASS_ ## type,
714# include "eventinc.h" 701# include "eventinc.h"
1354 static const struct { 1341 static const struct {
1355 const char *name; 1342 const char *name;
1356 IV klass; 1343 IV klass;
1357 IV iv; 1344 IV iv;
1358 } *eiv, event_iv[] = { 1345 } *eiv, event_iv[] = {
1359# define def(klass,name) { # name, (IV)KLASS_ ## klass, (IV)EV_ ## klass ## name }, 1346# define def(klass,name) { # name, (IV)KLASS_ ## klass, (IV)EV_ ## klass ## _ ## name },
1360# include "eventinc.h" 1347# include "eventinc.h"
1361# undef def 1348# undef def
1362 }; 1349 };
1363 1350
1364 AV *av = get_av ("cf::EVENT", 1); 1351 AV *av = get_av ("cf::EVENT", 1);
1377 } *event, event_list[] = { 1364 } *event, event_list[] = {
1378# define const_event(name) { # name, (IV)EVENT_ ## name }, 1365# define const_event(name) { # name, (IV)EVENT_ ## name },
1379 const_event (NONE) 1366 const_event (NONE)
1380 const_event (APPLY) 1367 const_event (APPLY)
1381 const_event (ATTACK) 1368 const_event (ATTACK)
1382 const_event (DEATH)
1383 const_event (DROP) 1369 const_event (DROP)
1384 const_event (DROP_ON) 1370 const_event (DROP_ON)
1385 const_event (PICKUP) 1371 const_event (PICKUP)
1386 const_event (SAY) 1372 const_event (SAY)
1387 const_event (STOP) 1373 const_event (STOP)
1392 const_event (TIMER) 1378 const_event (TIMER)
1393 const_event (MOVE) 1379 const_event (MOVE)
1394 1380
1395 //const_event (CLOCK) 1381 //const_event (CLOCK)
1396 const_event (CRASH) 1382 const_event (CRASH)
1397 const_event (GKILL)
1398 const_event (SHOUT) 1383 const_event (SHOUT)
1399 const_event (TELL) 1384 const_event (TELL)
1400 const_event (MUZZLE) 1385 const_event (MUZZLE)
1401 const_event (KICK) 1386 const_event (KICK)
1402 const_event (PLAYER_USE_SKILL)
1403 const_event (MONSTER_USE_SKILL)
1404 const_event (CAST_SPELL)
1405 const_event (FIND_UNARMED_SKILL) 1387 const_event (FIND_UNARMED_SKILL)
1406 const_event (EXTCMD)
1407 //const_event (FREE_OB) 1388 //const_event (FREE_OB)
1408 }; 1389 };
1409 1390
1410 av = get_av ("cf::PLUGIN_EVENT", 1); 1391 av = get_av ("cf::PLUGIN_EVENT", 1);
1411 1392

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines