… | |
… | |
470 | |
470 | |
471 | if (!SvROK (sv) |
471 | if (!SvROK (sv) |
472 | || (SvSTASH (SvRV (sv)) != stash_cf_player_wrap |
472 | || (SvSTASH (SvRV (sv)) != stash_cf_player_wrap |
473 | && !sv_derived_from (sv, "cf::player"))) |
473 | && !sv_derived_from (sv, "cf::player"))) |
474 | croak ("object of type cf::player expected"); |
474 | croak ("object of type cf::player expected"); |
475 | |
|
|
476 | if (SvSTASH (SvRV (sv)) != stash_cf_player_wrap) |
|
|
477 | printf ("unexpected stash %s:%s\n", HvNAME(SvSTASH(SvRV(sv))));//D |
|
|
478 | |
|
|
479 | |
475 | |
480 | return SvPTR_nc (sv); |
476 | return SvPTR_nc (sv); |
481 | } |
477 | } |
482 | |
478 | |
483 | static inline SV *to_sv (const shstr & v) { return newSVpvn_utf8 ((const char *)v, v.length (), 1); } |
479 | static inline SV *to_sv (const shstr & v) { return newSVpvn_utf8 ((const char *)v, v.length (), 1); } |
… | |
… | |
3008 | faceinfo *f = face_info (idx); assert (f); |
3004 | faceinfo *f = face_info (idx); assert (f); |
3009 | facedata *d = &(faceset ? f->data64 : f->data32); |
3005 | facedata *d = &(faceset ? f->data64 : f->data32); |
3010 | sv_to (data, d->data); |
3006 | sv_to (data, d->data); |
3011 | STRLEN clen; |
3007 | STRLEN clen; |
3012 | char *cdata = SvPVbyte (chksum, clen); |
3008 | char *cdata = SvPVbyte (chksum, clen); |
3013 | clen = min (CHKSUM_SIZE, clen); |
3009 | clen = min (CHKSUM_MAXLEN, clen); |
3014 | |
3010 | |
3015 | if (memcmp (d->chksum, cdata, clen)) |
3011 | if (clen != d->chksum_len || memcmp (d->chksum, cdata, clen)) |
3016 | { |
3012 | { |
|
|
3013 | d->chksum_len = clen; |
3017 | memcpy (d->chksum, cdata, clen); |
3014 | memcpy (d->chksum, cdata, clen); |
3018 | |
3015 | |
3019 | // invalidate existing client face info |
3016 | // invalidate existing client face info |
3020 | for_all_clients (ns) |
3017 | for_all_clients (ns) |
3021 | if (ns->faceset == faceset) |
3018 | if (ns->faceset == faceset) |
… | |
… | |
3036 | |
3033 | |
3037 | SV *get_chksum (faceidx idx, int faceset = 0) |
3034 | SV *get_chksum (faceidx idx, int faceset = 0) |
3038 | CODE: |
3035 | CODE: |
3039 | facedata *d = face_data (idx, faceset); |
3036 | facedata *d = face_data (idx, faceset); |
3040 | if (!d) XSRETURN_UNDEF; |
3037 | if (!d) XSRETURN_UNDEF; |
3041 | RETVAL = newSVpvn ((char *)d->chksum, CHKSUM_SIZE); |
3038 | RETVAL = newSVpvn ((char *)d->chksum, d->chksum_len); |
3042 | OUTPUT: |
3039 | OUTPUT: |
3043 | RETVAL |
3040 | RETVAL |
3044 | |
3041 | |
3045 | SV *get_data (faceidx idx, int faceset = 0) |
3042 | SV *get_data (faceidx idx, int faceset = 0) |
3046 | CODE: |
3043 | CODE: |