viewing paste Unknown #15563 | C

Posted on the
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
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;
    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] == '"'){
                        clif_displaymessage(sd->fd, "Wrong input.");
                        clif_displaymessage(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;
}
Viewed 570 times, submitted by Guest.