… | |
… | |
834 | PL_exit_flags |= PERL_EXIT_DESTRUCT_END; |
834 | PL_exit_flags |= PERL_EXIT_DESTRUCT_END; |
835 | |
835 | |
836 | char *argv[] = { |
836 | char *argv[] = { |
837 | "", |
837 | "", |
838 | "-e" |
838 | "-e" |
839 | "cf->bootstrap;" |
839 | "use Event;" // required for bootstrap |
|
|
840 | "cf->bootstrap;" // required for datadir :*> |
840 | "unshift @INC, cf::datadir ();" |
841 | "unshift @INC, cf::datadir ();" |
841 | "require cf;" |
842 | "require cf;" |
842 | }; |
843 | }; |
843 | |
844 | |
844 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
845 | if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) || perl_run (perl)) |
… | |
… | |
1055 | cfperl_result_DOUBLE (int idx) |
1056 | cfperl_result_DOUBLE (int idx) |
1056 | { |
1057 | { |
1057 | return SvNV (cfperl_result (idx)); |
1058 | return SvNV (cfperl_result (idx)); |
1058 | } |
1059 | } |
1059 | |
1060 | |
|
|
1061 | ///////////////////////////////////////////////////////////////////////////// |
|
|
1062 | |
|
|
1063 | struct EventAPI *watcher_base::GEventAPI; |
|
|
1064 | |
|
|
1065 | static void iow_dispatch (pe_event *ev) |
|
|
1066 | { |
|
|
1067 | iow *w = (iow *)ev->ext_data; |
|
|
1068 | w->call (*w, ((pe_ioevent *)ev)->got); |
|
|
1069 | } |
|
|
1070 | |
|
|
1071 | void |
|
|
1072 | iow::alloc () |
|
|
1073 | { |
|
|
1074 | pe = GEventAPI->new_io (0, 0); |
|
|
1075 | |
|
|
1076 | pe->base.callback = (void *)iow_dispatch; |
|
|
1077 | pe->base.ext_data = (void *)this; |
|
|
1078 | |
|
|
1079 | pe->fd = -1; |
|
|
1080 | pe->poll = 0; |
|
|
1081 | } |
|
|
1082 | |
|
|
1083 | iow & |
|
|
1084 | iow::fd (int fd) |
|
|
1085 | { |
|
|
1086 | pe->fd = fd; |
|
|
1087 | |
|
|
1088 | return *this; |
|
|
1089 | } |
|
|
1090 | |
|
|
1091 | int |
|
|
1092 | iow::poll () |
|
|
1093 | { |
|
|
1094 | return pe->poll; |
|
|
1095 | } |
|
|
1096 | |
|
|
1097 | iow & |
|
|
1098 | iow::poll (int events) |
|
|
1099 | { |
|
|
1100 | if (pe->poll != events) |
|
|
1101 | { |
|
|
1102 | if (pe->poll) stop (); |
|
|
1103 | pe->poll = events; |
|
|
1104 | if (pe->poll) start (); |
|
|
1105 | } |
|
|
1106 | |
|
|
1107 | return *this; |
|
|
1108 | } |
|
|
1109 | |
1060 | MODULE = cf PACKAGE = cf PREFIX = cf_ |
1110 | MODULE = cf PACKAGE = cf PREFIX = cf_ |
1061 | |
1111 | |
1062 | BOOT: |
1112 | BOOT: |
1063 | { |
1113 | { |
1064 | HV *stash = gv_stashpv ("cf", 1); |
1114 | HV *stash = gv_stashpv ("cf", 1); |
|
|
1115 | |
|
|
1116 | I_EVENT_API (PACKAGE); |
|
|
1117 | watcher_base::GEventAPI = GEventAPI; |
1065 | |
1118 | |
1066 | newCONSTSUB (stash, "VERSION", newSVpv (VERSION, sizeof (VERSION) - 1)); |
1119 | newCONSTSUB (stash, "VERSION", newSVpv (VERSION, sizeof (VERSION) - 1)); |
1067 | |
1120 | |
1068 | static const struct { |
1121 | static const struct { |
1069 | const char *name; |
1122 | const char *name; |
… | |
… | |
1580 | av_push (event, newSVpv ((char *)eiv->name + eiv->skip, 0)); |
1633 | av_push (event, newSVpv ((char *)eiv->name + eiv->skip, 0)); |
1581 | av_push (event, newSViv (eiv->klass)); |
1634 | av_push (event, newSViv (eiv->klass)); |
1582 | av_store (av, eiv->iv, newRV_noinc ((SV *)event)); |
1635 | av_store (av, eiv->iv, newRV_noinc ((SV *)event)); |
1583 | newCONSTSUB (stash, (char *)eiv->name, newSViv (eiv->iv)); |
1636 | newCONSTSUB (stash, (char *)eiv->name, newSViv (eiv->iv)); |
1584 | } |
1637 | } |
1585 | |
|
|
1586 | //I_EVENT_API (PACKAGE); |
|
|
1587 | } |
1638 | } |
1588 | |
1639 | |
1589 | void _init_vars () |
1640 | void _init_vars () |
1590 | CODE: |
1641 | CODE: |
1591 | cb_global = get_av ("cf::CB_GLOBAL", 1); |
1642 | cb_global = get_av ("cf::CB_GLOBAL", 1); |
… | |
… | |
2038 | |
2089 | |
2039 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
2090 | MODULE = cf PACKAGE = cf::player PREFIX = cf_player_ |
2040 | |
2091 | |
2041 | INCLUDE: $PERL genacc player ../include/player.h | |
2092 | INCLUDE: $PERL genacc player ../include/player.h | |
2042 | |
2093 | |
2043 | char * |
|
|
2044 | client (player *pl) |
|
|
2045 | CODE: |
|
|
2046 | RETVAL = pl->socket->client; |
|
|
2047 | OUTPUT: |
|
|
2048 | RETVAL |
|
|
2049 | |
|
|
2050 | char * |
|
|
2051 | host (player *pl) |
|
|
2052 | CODE: |
|
|
2053 | RETVAL = pl->socket->host; |
|
|
2054 | OUTPUT: |
|
|
2055 | RETVAL |
|
|
2056 | |
|
|
2057 | int invoke (player *pl, int event, ...) |
2094 | int invoke (player *pl, int event, ...) |
2058 | CODE: |
2095 | CODE: |
2059 | if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); |
2096 | if (KLASS_OF (event) != KLASS_PLAYER) croak ("event class must be PLAYER"); |
2060 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2097 | AV *av = (AV *)sv_2mortal ((SV *)newAV ()); |
2061 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
2098 | for (int i = 2; i < items; i++) av_push (av, SvREFCNT_inc (ST (i))); |
… | |
… | |
2086 | CODE: |
2123 | CODE: |
2087 | RETVAL = FABS (dx) <= pl->socket->mapx / 2 && FABS (dy) <= pl->socket->mapy / 2 |
2124 | RETVAL = FABS (dx) <= pl->socket->mapx / 2 && FABS (dy) <= pl->socket->mapy / 2 |
2088 | && !pl->blocked_los [dx + pl->socket->mapx / 2][dy + pl->socket->mapy / 2]; |
2125 | && !pl->blocked_los [dx + pl->socket->mapx / 2][dy + pl->socket->mapy / 2]; |
2089 | OUTPUT: |
2126 | OUTPUT: |
2090 | RETVAL |
2127 | RETVAL |
2091 | |
|
|
2092 | void |
|
|
2093 | buggy_mapscroll (player *pl, int value = 1) |
|
|
2094 | CODE: |
|
|
2095 | pl->socket->buggy_mapscroll = value; |
|
|
2096 | |
2128 | |
2097 | void |
2129 | void |
2098 | send (player *pl, SV *packet) |
2130 | send (player *pl, SV *packet) |
2099 | CODE: |
2131 | CODE: |
2100 | { |
2132 | { |