// @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 ..."); 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; }