… | |
… | |
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 | |
152 | static void |
152 | static 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 | |
472 | static void * |
485 | static 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 | |
704 | void cfperl_free_ob (object *op) |
692 | void 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 | |
712 | static event_klass klass_of[NUM_EVENT_TYPES] = { |
699 | static 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 | |