// @commands (script based)
int npc_do_atcmd_event(struct map_session_data* sd, const char* command, const char* message, const char* eventname)
{
struct event_data* ev = (struct event_data*)strdb_get(ev_db, eventname);
struct npc_data *nd;
struct script_state *st;
int i = 0, j = 0, k = 0, a = 0;
char *temp;
nullpo_ret(sd);
if( ev == NULL || (nd = ev->nd) == NULL ) {
ShowError("npc_event: event not found [%s]\n", eventname);
return 0;
}
if( sd->npc_id != 0 ) { // Enqueue the event trigger.
int i;
ARR_FIND( 0, MAX_EVENTQUEUE, i, sd->eventqueue[i][0] == '\0' );
if( i < MAX_EVENTQUEUE ) {
safestrncpy(sd->eventqueue[i],eventname,50); //Event enqueued.
return 0;
}
ShowWarning("npc_event: player's event queue is full, can't add event '%s' !\n", eventname);
return 1;
}
if( ev->nd->sc.option&OPTION_INVISIBLE ) { // Disabled npc, shouldn't trigger event.
npc_event_dequeue(sd);
return 2;
}
st = script_alloc_state(ev->nd->u.scr.script, ev->pos, sd->bl.id, ev->nd->bl.id);
setd_sub(st, NULL, ".@atcmd_command$", 0, (void *)command, NULL);
temp = (char*)aMalloc(strlen(message) + 1);
for( i = 0; i < ( strlen( message ) + 1 ) && k < 127; i ++ ) {
if( message[i] == ' ' || message[i] == '\0' || message[i] == '"') {
if( message[ ( i - 1 ) ] == ' ' ) {
continue; // To prevent "@atcmd [space][space][space]..."
}
if(message[i] == '"'){
i++;
while(message[i] != '"' && k < 127) {
temp[k] = message[i];
k++;
i++;
}
}else{
temp[k] = '\0';
k = 0;
setd_sub( st, NULL, ".@atcmd_parameters$", j++, (void *)temp, NULL );
}
} else {
if(message[i - 1] == '"'){
dispbottom(sd->fd, "Wrong input.");
dispbottom(sd->fd, "@jail <value1> <value2> ...");
return -1;
}
temp[k] = message[i];
k++;
}
}
//}
setd_sub(st, NULL, ".@atcmd_numparameters", 0, (void *)__64BPRTSIZE(j), NULL);
aFree(temp);
run_script_main(st); return 0;
}