00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <plugin_template.h>
00032 #include <stdarg.h>
00033 #ifndef __CEXTRACT__
00034 #include <plugin_template_proto.h>
00035 #endif
00036
00037 CFPContext *context_stack;
00038
00039 CFPContext *current_context;
00040
00041 static int current_command = -999;
00042
00043 void initContextStack(void) {
00044 current_context = NULL;
00045 context_stack = NULL;
00046 }
00047
00048 void pushContext(CFPContext *context) {
00049 CFPContext *stack_context;
00050
00051 if (current_context == NULL) {
00052 context_stack = context;
00053 context->down = NULL;
00054 } else {
00055 context->down = current_context;
00056 }
00057 current_context = context;
00058 }
00059
00060 CFPContext *popContext(void) {
00061 CFPContext *oldcontext;
00062
00063 if (current_context != NULL) {
00064 oldcontext = current_context;
00065 current_context = current_context->down;
00066 return oldcontext;
00067 } else
00068 return NULL;
00069 }
00070
00071 CF_PLUGIN int initPlugin(const char *iversion, f_plug_api gethooksptr) {
00072 cf_init_plugin(gethooksptr);
00073
00074 cf_log(llevDebug, PLUGIN_VERSION " init\n");
00075
00076
00077 return 0;
00078 }
00079
00080 CF_PLUGIN void *getPluginProperty(int *type, ...) {
00081 va_list args;
00082 const char *propname;
00083 int i, size;
00084 command_array_struct *rtn_cmd;
00085 char *buf;
00086
00087 va_start(args, type);
00088 propname = va_arg(args, const char *);
00089
00090 if (!strcmp(propname, "command?")) {
00091 const char *cmdname;
00092 cmdname = va_arg(args, const char *);
00093 rtn_cmd = va_arg(args, command_array_struct *);
00094 va_end(args);
00095
00097 return NULL;
00098 } else if (!strcmp(propname, "Identification")) {
00099 buf = va_arg(args, char *);
00100 size = va_arg(args, int);
00101 va_end(args);
00102 snprintf(buf, size, PLUGIN_NAME);
00103 return NULL;
00104 } else if (!strcmp(propname, "FullName")) {
00105 buf = va_arg(args, char *);
00106 size = va_arg(args, int);
00107 va_end(args);
00108 snprintf(buf, size, PLUGIN_VERSION);
00109 return NULL;
00110 }
00111 va_end(args);
00112 return NULL;
00113 }
00114
00115 CF_PLUGIN int runPluginCommand(object *op, char *params) {
00116 return -1;
00117 }
00118
00119 CF_PLUGIN int postInitPlugin(void) {
00120 cf_log(llevDebug, PLUGIN_VERSION" post init\n");
00121 initContextStack();
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 return 0;
00141 }
00142
00143 CF_PLUGIN void *globalEventListener(int *type, ...) {
00144 va_list args;
00145 static int rv = 0;
00146 CFPContext *context;
00147 context = malloc(sizeof(CFPContext));
00148 char *buf;
00149 player *pl;
00150 object *op;
00151
00152 va_start(args, type);
00153 context->event_code = va_arg(args, int);
00154 printf("****** Global event listener called ***********\n");
00155 printf("- Event code: %d\n", context->event_code);
00156
00157 context->message[0] = 0;
00158
00159 context->who = NULL;
00160 context->activator = NULL;
00161 context->third = NULL;
00162 context->event = NULL;
00163 rv = context->returnvalue = 0;
00164 switch (context->event_code) {
00165 case EVENT_CRASH:
00166 printf("Unimplemented for now\n");
00167 break;
00168
00169 case EVENT_BORN:
00170 context->activator = va_arg(args, object *);
00171 break;
00172
00173 case EVENT_PLAYER_DEATH:
00174 context->who = va_arg(args, object *);
00175 break;
00176
00177 case EVENT_GKILL:
00178 context->who = va_arg(args, object *);
00179 context->activator = va_arg(args, object *);
00180 break;
00181
00182 case EVENT_LOGIN:
00183 pl = va_arg(args, player *);
00184 context->activator = pl->ob;
00185 buf = va_arg(args, char *);
00186 if (buf != 0)
00187 strcpy(context->message, buf);
00188 break;
00189
00190 case EVENT_LOGOUT:
00191 pl = va_arg(args, player *);
00192 context->activator = pl->ob;
00193 buf = va_arg(args, char *);
00194 if (buf != 0)
00195 strcpy(context->message, buf);
00196 break;
00197
00198 case EVENT_REMOVE:
00199 context->activator = va_arg(args, object *);
00200 break;
00201
00202 case EVENT_SHOUT:
00203 context->activator = va_arg(args, object *);
00204 buf = va_arg(args, char *);
00205 if (buf != 0)
00206 strcpy(context->message, buf);
00207 break;
00208
00209 case EVENT_MUZZLE:
00210 context->activator = va_arg(args, object *);
00211 buf = va_arg(args, char *);
00212 if (buf != 0)
00213 strcpy(context->message, buf);
00214 break;
00215
00216 case EVENT_KICK:
00217 context->activator = va_arg(args, object *);
00218 buf = va_arg(args, char *);
00219 if (buf != 0)
00220 strcpy(context->message, buf);
00221 break;
00222
00223 case EVENT_MAPENTER:
00224 context->activator = va_arg(args, object *);
00225 break;
00226
00227 case EVENT_MAPLEAVE:
00228 context->activator = va_arg(args, object *);
00229 break;
00230
00231 case EVENT_CLOCK:
00232 break;
00233
00234 case EVENT_MAPRESET:
00235 buf = va_arg(args, char *);
00236 if (buf != 0)
00237 strcpy(context->message, buf);
00238 break;
00239
00240 case EVENT_TELL:
00241 context->activator = va_arg(args, object *);
00242 buf = va_arg(args, char *);
00243 if (buf != 0)
00244 strcpy(context->message, buf);
00245 context->third = va_arg(args, object *);
00246 break;
00247 }
00248 va_end(args);
00249 context->returnvalue = 0;
00250
00251 pushContext(context);
00252
00253 context = popContext();
00254 rv = context->returnvalue;
00255 free(context);
00256 cf_log(llevDebug, "*********** Execution complete ****************\n");
00257
00258 return &rv;
00259 }
00260
00261 CF_PLUGIN void *eventListener(int *type, ...) {
00262 static int rv = 0;
00263 va_list args;
00264 char *buf;
00265 CFPContext *context;
00266
00267 context = malloc(sizeof(CFPContext));
00268
00269 context->message[0] = 0;
00270
00271 va_start(args, type);
00272
00273 context->who = va_arg(args, object *);
00274 context->activator = va_arg(args, object *);
00275 context->third = va_arg(args, object *);
00276 buf = va_arg(args, char *);
00277 if (buf != 0)
00278 strcpy(context->message, buf);
00279 context->fix = va_arg(args, int);
00280 context->event = va_arg(args, object *);
00281 context->event_code = context->event->subtype;
00282 strncpy(context->options, context->event->name, sizeof(context->options));
00283 context->returnvalue = 0;
00284 va_end(args);
00285
00286 pushContext(context);
00287
00288 context = popContext();
00289 rv = context->returnvalue;
00290 free(context);
00291 cf_log(llevDebug, "Execution complete");
00292 return &rv;
00293 }
00294
00295 CF_PLUGIN int closePlugin(void) {
00296 cf_log(llevDebug, PLUGIN_VERSION " closing\n");
00297 return 0;
00298 }