diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/map/script.c | 143 |
1 files changed, 105 insertions, 38 deletions
diff --git a/src/map/script.c b/src/map/script.c index e64034276..c8d1ef2a8 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -3922,13 +3922,13 @@ struct script_function buildin_func[] = { BUILDIN_DEF(addtimer,"is"), BUILDIN_DEF(deltimer,"s"), BUILDIN_DEF(addtimercount,"si"), - BUILDIN_DEF(initnpctimer,"*"), - BUILDIN_DEF(stopnpctimer,"*"), - BUILDIN_DEF(startnpctimer,"*"), - BUILDIN_DEF(setnpctimer,"*"), - BUILDIN_DEF(getnpctimer,"i*"), - BUILDIN_DEF(attachnpctimer,"*"), // attached the player id to the npc timer [Celest] - BUILDIN_DEF(detachnpctimer,"*"), // detached the player id from the npc timer [Celest] + BUILDIN_DEF(initnpctimer,"??"), + BUILDIN_DEF(stopnpctimer,"??"), + BUILDIN_DEF(startnpctimer,"??"), + BUILDIN_DEF(setnpctimer,"i?"), + BUILDIN_DEF(getnpctimer,"i?"), + BUILDIN_DEF(attachnpctimer,"?"), // attached the player id to the npc timer [Celest] + BUILDIN_DEF(detachnpctimer,"?"), // detached the player id from the npc timer [Celest] BUILDIN_DEF(playerattached,""), // returns id of the current attached player. [Skotlex] BUILDIN_DEF(announce,"si*"), BUILDIN_DEF(mapannounce,"ssi*"), @@ -7342,8 +7342,8 @@ BUILDIN_FUNC(addtimer) { char *event; int tick; - tick=conv_num(st,& (st->stack->stack_data[st->start+2])); - event=conv_str(st,& (st->stack->stack_data[st->start+3])); + tick=conv_num(st, script_getdata(st,2)); + event=conv_str(st, script_getdata(st,3)); check_event(st, event); pc_addeventtimer(script_rid2sd(st),tick,event); return 0; @@ -7355,7 +7355,7 @@ BUILDIN_FUNC(addtimer) BUILDIN_FUNC(deltimer) { char *event; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); + event=conv_str(st, script_getdata(st,2)); check_event(st, event); pc_deleventtimer(script_rid2sd(st),event); return 0; @@ -7368,8 +7368,8 @@ BUILDIN_FUNC(addtimercount) { char *event; int tick; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); - tick=conv_num(st,& (st->stack->stack_data[st->start+3])); + event=conv_str(st, script_getdata(st,2)); + tick=conv_num(st, script_getdata(st,3)); check_event(st, event); pc_addeventtimercount(script_rid2sd(st),event,tick); return 0; @@ -7382,11 +7382,35 @@ BUILDIN_FUNC(addtimercount) BUILDIN_FUNC(initnpctimer) { struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else + int flag = 0; + if( script_hasdata(st,3) ) + { //Two arguments: NPC name and attach flag. + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + flag = conv_num(st, script_getdata(st,3)); + } else + if( script_hasdata(st,2) ) + { //Check if argument is numeric (flag) or string (npc name) + struct script_data *data; + data = script_getdata(st,2); + get_val(st,data); + if( data_isstring(data) ) //NPC name + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + else if( data_isint(data) ) { //Flag + nd = (struct npc_data *)map_id2bl(st->oid); + flag = conv_num(st, script_getdata(st,3)); + } else { + ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); + return 1; + } + } else nd=(struct npc_data *)map_id2bl(st->oid); + if (!nd) return 0; + if (flag) { //Attach + TBL_PC* sd = script_rid2sd(st); + if (sd) nd->u.scr.rid = sd->bl.id; + } + npc_settimerevent_tick(nd,0); npc_timerevent_start(nd, st->rid); return 0; @@ -7398,11 +7422,35 @@ BUILDIN_FUNC(initnpctimer) BUILDIN_FUNC(startnpctimer) { struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else + int flag = 0; + if( script_hasdata(st,3) ) + { //Two arguments: NPC name and attach flag. + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + flag = conv_num(st, script_getdata(st,3)); + } else + if( script_hasdata(st,2) ) + { //Check if argument is numeric (flag) or string (npc name) + struct script_data *data; + data = script_getdata(st,2); + get_val(st,data); + if( data_isstring(data) ) //NPC name + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + else if( data_isint(data) ) { //Flag + nd = (struct npc_data *)map_id2bl(st->oid); + flag = conv_num(st, script_getdata(st,3)); + } else { + ShowError("startnpctimer: invalid argument type #1 (needs be int or string)).\n"); + return 1; + } + } else nd=(struct npc_data *)map_id2bl(st->oid); + if (!nd) return 0; + if (flag) { //Attach + TBL_PC* sd = script_rid2sd(st); + if (sd) nd->u.scr.rid = sd->bl.id; + } + npc_timerevent_start(nd, st->rid); return 0; } @@ -7413,11 +7461,33 @@ BUILDIN_FUNC(startnpctimer) BUILDIN_FUNC(stopnpctimer) { struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else + int flag = 0; + if( script_hasdata(st,3) ) + { //Two arguments: NPC name and attach flag. + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + flag = conv_num(st, script_getdata(st,3)); + } else + if( script_hasdata(st,2) ) + { //Check if argument is numeric (flag) or string (npc name) + struct script_data *data; + data = script_getdata(st,2); + get_val(st,data); + if( data_isstring(data) ) //NPC name + nd = npc_name2id(conv_str(st, script_getdata(st,2))); + else if( data_isint(data) ) { //Flag + nd = (struct npc_data *)map_id2bl(st->oid); + flag = conv_num(st, script_getdata(st,3)); + } else { + ShowError("stopnpctimer: invalid argument type #1 (needs be int or string)).\n"); + return 1; + } + } else nd=(struct npc_data *)map_id2bl(st->oid); + if (!nd) return 0; + if (flag) //Detach + nd->u.scr.rid = 0; + npc_timerevent_stop(nd); return 0; } @@ -7429,12 +7499,12 @@ BUILDIN_FUNC(getnpctimer) { struct npc_data *nd; struct map_session_data *sd; - int type=conv_num(st,& (st->stack->stack_data[st->start+2])); + int type=conv_num(st, script_getdata(st,2)); int val=0; - if( st->end > st->start+3 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3]))); + if( script_hasdata(st,3) ) + nd = npc_name2id(conv_str(st,script_getdata(st,3))); else - nd=(struct npc_data *)map_id2bl(st->oid); + nd = (struct npc_data *)map_id2bl(st->oid); if (!nd || nd->bl.type != BL_NPC) { @@ -7471,9 +7541,9 @@ BUILDIN_FUNC(setnpctimer) { int tick; struct npc_data *nd; - tick=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end > st->start+3 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3]))); + tick=conv_num(st,script_getdata(st,2)); + if( script_hasdata(st,3) ) + nd=npc_name2id(conv_str(st,script_getdata(st,3))); else nd=(struct npc_data *)map_id2bl(st->oid); @@ -7491,12 +7561,10 @@ BUILDIN_FUNC(attachnpctimer) struct npc_data *nd; nd=(struct npc_data *)map_id2bl(st->oid); - if( st->end > st->start+2 ) { - char *name = conv_str(st,& (st->stack->stack_data[st->start+2])); - sd=map_nick2sd(name); - } else { + if( script_hasdata(st,2) ) + sd=map_nick2sd(conv_str(st,script_getdata(st,2))); + else sd = script_rid2sd(st); - } if (sd==NULL) return 0; @@ -7512,8 +7580,8 @@ BUILDIN_FUNC(attachnpctimer) BUILDIN_FUNC(detachnpctimer) { struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); + if( script_hasdata(st,2) ) + nd=npc_name2id(conv_str(st,script_getdata(st,2))); else nd=(struct npc_data *)map_id2bl(st->oid); @@ -7524,13 +7592,12 @@ BUILDIN_FUNC(detachnpctimer) /*========================================== * To avoid "player not attached" script errors, this function is provided, * it checks if there is a player attached to the current script. [Skotlex] - * If no, returns 0, if yes, returns the char_id of the attached player. + * If no, returns 0, if yes, returns the account_id of the attached player. *------------------------------------------ */ BUILDIN_FUNC(playerattached) { - struct map_session_data *sd; - if (st->rid == 0 || (sd = map_id2sd(st->rid)) == NULL) + if(st->rid == 0 || map_id2sd(st->rid) == NULL) push_val(st->stack,C_INT,0); else push_val(st->stack,C_INT,st->rid); |