* Removed the attempts to recover from invalid syntax in npc_parsesrcfile since they can produce incorrect results (spaces in sscanf can match \n's and company).

* Made script_rid2sd report the script source directly and changed related return 1's to return 0's to avoid double script source reports.
* Added missing return 0's after script_rid2sd is used and an extra error message in buildin_set/buildin_setd.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11860 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
FlavioJS 2007-12-06 15:12:55 +00:00
parent fc7b4eaef0
commit 1d827807ae
3 changed files with 244 additions and 85 deletions

View File

@ -4,6 +4,13 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/12/06 2007/12/06
* Removed the attempts to recover from invalid syntax in npc_parsesrcfile
since they can produce incorrect results (spaces in sscanf can match
\n's and company).
* Made script_rid2sd report the script source directly and changed related
return 1's to return 0's to avoid double script source reports.
* Added missing return 0's after script_rid2sd is used and an extra error
message in buildin_set/buildin_setd. [FlavioJS]
* The default event script behaviour is to trigger on labels rather than * The default event script behaviour is to trigger on labels rather than
NPCs now. NPCs now.
* Removed several script config options which break NPC compatibility when * Removed several script config options which break NPC compatibility when

View File

@ -2610,18 +2610,10 @@ void npc_parsesrcfile(const char* filepath)
// w1<TAB>w2<TAB>w3<TAB>w4 // w1<TAB>w2<TAB>w3<TAB>w4
if( (count = sscanf(p, "%[^\t\r\n]\t%[^\t\r\n]\t%[^\t\r\n]\t%n%[^\r\n]", w1, w2, w3, &w4pos, w4)) < 3 ) if( (count = sscanf(p, "%[^\t\r\n]\t%[^\t\r\n]\t%[^\t\r\n]\t%n%[^\r\n]", w1, w2, w3, &w4pos, w4)) < 3 )
{ {// Unknown syntax, try to continue
if( (count = sscanf(p, "%s %s %[^\t]\t %n%[^\n]", w1, w2, w3, &w4pos, w4)) == 4 ShowError("npc_parsesrcfile: Unknown syntax in file '%s', line '%d'.\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,p-buffer), w1, w2, w3, w4);
|| (count = sscanf(p, "%s %s %s %n%[^\n]\n", w1, w2, w3, &w4pos, w4)) >= 3 ) p = strchr(p,'\n');// next line
{// Incorrect syntax, try to parse continue;
ShowWarning("npc_parsesrcfile: Incorrect separator syntax in file '%s', line '%d'. Use tabs instead of spaces!\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,p-buffer), w1, w2, w3, w4);
}
else
{// Unknown syntax, try to continue
ShowError("npc_parsesrcfile: Unknown syntax in file '%s', line '%d'.\n * w1=%s\n * w2=%s\n * w3=%s\n * w4=%s\n", filepath, strline(buffer,p-buffer), w1, w2, w3, w4);
p = strchr(p,'\n');// next line
continue;
}
} }
if( strcmp(w1,"-") !=0 && strcasecmp(w1,"function") != 0 ) if( strcmp(w1,"-") !=0 && strcasecmp(w1,"function") != 0 )

View File

@ -2092,6 +2092,7 @@ TBL_PC *script_rid2sd(struct script_state *st)
TBL_PC *sd=map_id2sd(st->rid); TBL_PC *sd=map_id2sd(st->rid);
if(!sd){ if(!sd){
ShowError("script_rid2sd: fatal error ! player not attached!\n"); ShowError("script_rid2sd: fatal error ! player not attached!\n");
script_reportsrc(st);
st->state = END; st->state = END;
} }
return sd; return sd;
@ -2120,13 +2121,13 @@ int get_val(struct script_state* st, struct script_data* data)
{// needs player attached {// needs player attached
if( postfix == '$' ) if( postfix == '$' )
{// string variable {// string variable
ShowError("script:get_val: cannot access player variable '%s', defaulting to \"\"\n", name); ShowWarning("script:get_val: cannot access player variable '%s', defaulting to \"\"\n", name);
data->type = C_CONSTSTR; data->type = C_CONSTSTR;
data->u.str = ""; data->u.str = "";
} }
else else
{// integer variable {// integer variable
ShowError("script:get_val: cannot access player variable '%s', defaulting to 0\n", name); ShowWarning("script:get_val: cannot access player variable '%s', defaulting to 0\n", name);
data->type = C_INT; data->type = C_INT;
data->u.num = 0; data->u.num = 0;
} }
@ -3660,7 +3661,8 @@ BUILDIN_FUNC(mes)
{ {
TBL_PC* sd = script_rid2sd(st); TBL_PC* sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
clif_scriptmes(sd, st->oid, script_getstr(st, 2)); clif_scriptmes(sd, st->oid, script_getstr(st, 2));
return 0; return 0;
} }
@ -3675,7 +3677,7 @@ BUILDIN_FUNC(next)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
st->state = STOP; st->state = STOP;
clif_scriptnext(sd, st->oid); clif_scriptnext(sd, st->oid);
@ -3692,7 +3694,7 @@ BUILDIN_FUNC(close)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
st->state = END; st->state = END;
clif_scriptclose(sd, st->oid); clif_scriptclose(sd, st->oid);
@ -3709,7 +3711,7 @@ BUILDIN_FUNC(close2)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
st->state = STOP; st->state = STOP;
clif_scriptclose(sd, st->oid); clif_scriptclose(sd, st->oid);
@ -3776,7 +3778,7 @@ BUILDIN_FUNC(menu)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
// TODO detect multiple scripts waiting for input at the same time, and what to do when that happens // TODO detect multiple scripts waiting for input at the same time, and what to do when that happens
if( sd->state.menu_or_input == 0 ) if( sd->state.menu_or_input == 0 )
@ -3880,7 +3882,7 @@ BUILDIN_FUNC(select)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
if( sd->state.menu_or_input == 0 ) if( sd->state.menu_or_input == 0 )
{ {
@ -3940,7 +3942,7 @@ BUILDIN_FUNC(prompt)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; return 0;
if( sd->state.menu_or_input == 0 ) if( sd->state.menu_or_input == 0 )
{ {
@ -4218,9 +4220,11 @@ BUILDIN_FUNC(warp)
int ret; int ret;
int x,y; int x,y;
const char* str; const char* str;
TBL_PC* sd = script_rid2sd(st); TBL_PC* sd;
nullpo_retr(0, sd); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
str = script_getstr(st,2); str = script_getstr(st,2);
x = script_getnum(st,3); x = script_getnum(st,3);
@ -4445,6 +4449,9 @@ BUILDIN_FUNC(warpguild)
y=script_getnum(st,4); y=script_getnum(st,4);
g=script_getnum(st,5); g=script_getnum(st,5);
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
if(map[sd->bl.m].flag.noreturn || map[sd->bl.m].flag.nowarpto) if(map[sd->bl.m].flag.noreturn || map[sd->bl.m].flag.nowarpto)
return 0; return 0;
@ -4559,6 +4566,7 @@ BUILDIN_FUNC(itemheal)
BUILDIN_FUNC(percentheal) BUILDIN_FUNC(percentheal)
{ {
int hp,sp; int hp,sp;
TBL_PC* sd;
hp=script_getnum(st,2); hp=script_getnum(st,2);
sp=script_getnum(st,3); sp=script_getnum(st,3);
@ -4569,7 +4577,11 @@ BUILDIN_FUNC(percentheal)
return 0; return 0;
} }
pc_percentheal(script_rid2sd(st),hp,sp); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_percentheal(sd,hp,sp);
return 0; return 0;
} }
@ -4586,9 +4598,15 @@ BUILDIN_FUNC(jobchange)
if (pcdb_checkid(job)) if (pcdb_checkid(job))
{ {
pc_jobchange(script_rid2sd(st),job, upper); TBL_PC* sd;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_jobchange(sd, job, upper);
if(use_irc && irc_announce_jobchange_flag) if(use_irc && irc_announce_jobchange_flag)
irc_announce_jobchange(script_rid2sd(st)); irc_announce_jobchange(sd);
} }
return 0; return 0;
@ -4615,7 +4633,7 @@ BUILDIN_FUNC(input)
char *name=str_buf+str_data[num&0x00ffffff].str; char *name=str_buf+str_data[num&0x00ffffff].str;
char postfix = name[strlen(name)-1]; char postfix = name[strlen(name)-1];
if (!sd) return 1; if (!sd) return 0;
if( !data_isreference(data) ){ if( !data_isreference(data) ){
ShowError("script:input: not a variable\n"); ShowError("script:input: not a variable\n");
@ -4668,7 +4686,14 @@ BUILDIN_FUNC(set)
} }
if(not_server_variable(prefix)) if(not_server_variable(prefix))
{
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
{
ShowError("script:set: no player attached for player variable '%s'\n", name);
return 0;
}
}
if( postfix=='$' ){ if( postfix=='$' ){
// •¶Žš—ñ // •¶Žš—ñ
@ -4751,7 +4776,7 @@ BUILDIN_FUNC(setarray)
{ {
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached return 0;// no player attached
} }
end = start + script_lastdata(st) - 2; end = start + script_lastdata(st) - 2;
@ -4815,7 +4840,7 @@ BUILDIN_FUNC(cleararray)
{ {
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached return 0;// no player attached
} }
if( is_string_variable(name) ) if( is_string_variable(name) )
@ -4890,7 +4915,7 @@ BUILDIN_FUNC(copyarray)
{ {
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached return 0;// no player attached
} }
count = script_getnum(st, 4); count = script_getnum(st, 4);
@ -4993,7 +5018,7 @@ BUILDIN_FUNC(deletearray)
{ {
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached return 0;// no player attached
} }
end = getarraysize(st, id, start, is_string_variable(name), reference_getref(data)); end = getarraysize(st, id, start, is_string_variable(name), reference_getref(data));
@ -5086,11 +5111,16 @@ BUILDIN_FUNC(getelementofarray)
BUILDIN_FUNC(setlook) BUILDIN_FUNC(setlook)
{ {
int type,val; int type,val;
TBL_PC* sd;
type=script_getnum(st,2); type=script_getnum(st,2);
val=script_getnum(st,3); val=script_getnum(st,3);
pc_changelook(script_rid2sd(st),type,val); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_changelook(sd,type,val);
return 0; return 0;
} }
@ -5100,7 +5130,13 @@ BUILDIN_FUNC(setlook)
*------------------------------------------*/ *------------------------------------------*/
BUILDIN_FUNC(cutin) BUILDIN_FUNC(cutin)
{ {
clif_cutin(script_rid2sd(st),script_getstr(st,2),script_getnum(st,3)); TBL_PC* sd;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
clif_cutin(sd,script_getstr(st,2),script_getnum(st,3));
return 0; return 0;
} }
@ -5110,14 +5146,19 @@ BUILDIN_FUNC(cutin)
BUILDIN_FUNC(viewpoint) BUILDIN_FUNC(viewpoint)
{ {
int type,x,y,id,color; int type,x,y,id,color;
TBL_PC* sd;
type=script_getnum(st,2); type=script_getnum(st,2);
x=script_getnum(st,3); x=script_getnum(st,3);
y=script_getnum(st,4); y=script_getnum(st,4);
id=script_getnum(st,5); id=script_getnum(st,5);
color=script_getnum(st,6); color=script_getnum(st,6);
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color); clif_viewpoint(sd,st->oid,type,x,y,id,color);
return 0; return 0;
} }
@ -5232,6 +5273,8 @@ BUILDIN_FUNC(checkweight)
struct script_data *data; struct script_data *data;
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
data=script_getdata(st,2); data=script_getdata(st,2);
get_val(st,data); get_val(st,data);
@ -5354,6 +5397,8 @@ BUILDIN_FUNC(getitem2)
struct script_data *data; struct script_data *data;
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
data=script_getdata(st,2); data=script_getdata(st,2);
get_val(st,data); get_val(st,data);
@ -5577,6 +5622,8 @@ BUILDIN_FUNC(delitem)
struct script_data *data; struct script_data *data;
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
data=script_getdata(st,2); data=script_getdata(st,2);
get_val(st,data); get_val(st,data);
@ -5681,6 +5728,8 @@ BUILDIN_FUNC(delitem2)
struct script_data *data; struct script_data *data;
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
data=script_getdata(st,2); data=script_getdata(st,2);
get_val(st,data); get_val(st,data);
@ -6102,10 +6151,8 @@ BUILDIN_FUNC(getequipid)
sd=script_rid2sd(st); sd=script_rid2sd(st);
if(sd == NULL) if(sd == NULL)
{
ShowError("getequipid: sd == NULL\n");
return 0; return 0;
}
num=script_getnum(st,2); num=script_getnum(st,2);
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
@ -6133,8 +6180,11 @@ BUILDIN_FUNC(getequipname)
static char pos[11][100] = {"Head","Body","Left hand","Right hand","Robe","Shoes","Accessory 1","Accessory 2","Head 2","Head 3","Not Equipped"}; static char pos[11][100] = {"Head","Body","Left hand","Right hand","Robe","Shoes","Accessory 1","Accessory 2","Head 2","Head 3","Not Equipped"};
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
buf=(char *)aMallocA(64*sizeof(char)); buf=(char *)aMallocA(64*sizeof(char));
sd=script_rid2sd(st);
num=script_getnum(st,2); num=script_getnum(st,2);
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
@ -6160,7 +6210,9 @@ BUILDIN_FUNC(getbrokenid)
int i,num,id=0,brokencounter=0; int i,num,id=0,brokencounter=0;
TBL_PC *sd; TBL_PC *sd;
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
num=script_getnum(st,2); num=script_getnum(st,2);
for(i=0; i<MAX_INVENTORY; i++) { for(i=0; i<MAX_INVENTORY; i++) {
@ -6187,8 +6239,9 @@ BUILDIN_FUNC(repair)
int repaircounter=0; int repaircounter=0;
TBL_PC *sd; TBL_PC *sd;
sd = script_rid2sd(st);
sd=script_rid2sd(st); if( sd == NULL )
return 0;
num=script_getnum(st,2); num=script_getnum(st,2);
for(i=0; i<MAX_INVENTORY; i++) { for(i=0; i<MAX_INVENTORY; i++) {
@ -6216,7 +6269,9 @@ BUILDIN_FUNC(getequipisequiped)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
@ -6237,7 +6292,10 @@ BUILDIN_FUNC(getequipisenableref)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine) if(i >= 0 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine)
@ -6259,7 +6317,10 @@ BUILDIN_FUNC(getequipisidentify)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) if(i >= 0)
@ -6279,7 +6340,10 @@ BUILDIN_FUNC(getequiprefinerycnt)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) if(i >= 0)
@ -6299,7 +6363,10 @@ BUILDIN_FUNC(getequipweaponlv)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i]) if(i >= 0 && sd->inventory_data[i])
@ -6319,7 +6386,10 @@ BUILDIN_FUNC(getequippercentrefinery)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->status.inventory[i].nameid && sd->status.inventory[i].refine < MAX_REFINE) if(i >= 0 && sd->status.inventory[i].nameid && sd->status.inventory[i].refine < MAX_REFINE)
@ -6339,7 +6409,10 @@ BUILDIN_FUNC(successrefitem)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) { if(i >= 0) {
@ -6392,7 +6465,10 @@ BUILDIN_FUNC(failedrefitem)
TBL_PC *sd; TBL_PC *sd;
num=script_getnum(st,2); num=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
if (num > 0 && num <= ARRAYLENGTH(equip)) if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]); i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) { if(i >= 0) {
@ -6422,7 +6498,10 @@ BUILDIN_FUNC(statusup)
TBL_PC *sd; TBL_PC *sd;
type=script_getnum(st,2); type=script_getnum(st,2);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_statusup(sd,type); pc_statusup(sd,type);
return 0; return 0;
@ -6437,7 +6516,10 @@ BUILDIN_FUNC(statusup2)
type=script_getnum(st,2); type=script_getnum(st,2);
val=script_getnum(st,3); val=script_getnum(st,3);
sd=script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_statusup2(sd,type,val); pc_statusup2(sd,type,val);
return 0; return 0;
@ -6462,7 +6544,7 @@ BUILDIN_FUNC(bonus)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1; // no player attached return 0; // no player attached
type = script_getnum(st,2); type = script_getnum(st,2);
switch( script_lastdata(st) ){ switch( script_lastdata(st) ){
@ -6513,7 +6595,7 @@ BUILDIN_FUNC(bonusautoscript)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
str = script_getstr(st,2); str = script_getstr(st,2);
rate = script_getnum(st,3); rate = script_getnum(st,3);
@ -6539,7 +6621,7 @@ BUILDIN_FUNC(bonusautoscript2)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
str = script_getstr(st,2); str = script_getstr(st,2);
rate = script_getnum(st,3); rate = script_getnum(st,3);
@ -6573,7 +6655,7 @@ BUILDIN_FUNC(skill)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = script_getnum(st,2);
level = script_getnum(st,3); level = script_getnum(st,3);
@ -6600,7 +6682,7 @@ BUILDIN_FUNC(addtoskill)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = script_getnum(st,2);
level = script_getnum(st,3); level = script_getnum(st,3);
@ -6623,7 +6705,7 @@ BUILDIN_FUNC(guildskill)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = script_getnum(st,2);
level = script_getnum(st,3); level = script_getnum(st,3);
@ -6643,7 +6725,7 @@ BUILDIN_FUNC(getskilllv)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
id = script_getnum(st,2); id = script_getnum(st,2);
script_pushint(st, pc_checkskill(sd,id)); script_pushint(st, pc_checkskill(sd,id));
@ -6691,7 +6773,7 @@ BUILDIN_FUNC(getgmlevel)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
script_pushint(st, pc_isGM(sd)); script_pushint(st, pc_isGM(sd));
@ -6717,7 +6799,7 @@ BUILDIN_FUNC(checkoption)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
option = script_getnum(st,2); option = script_getnum(st,2);
if( sd->sc.option&option ) if( sd->sc.option&option )
@ -6738,7 +6820,7 @@ BUILDIN_FUNC(checkoption1)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
opt1 = script_getnum(st,2); opt1 = script_getnum(st,2);
if( sd->sc.opt1 == opt1 ) if( sd->sc.opt1 == opt1 )
@ -6759,7 +6841,7 @@ BUILDIN_FUNC(checkoption2)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
opt2 = script_getnum(st,2); opt2 = script_getnum(st,2);
if( sd->sc.opt2&opt2 ) if( sd->sc.opt2&opt2 )
@ -6785,7 +6867,7 @@ BUILDIN_FUNC(setoption)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
option = script_getnum(st,2); option = script_getnum(st,2);
if( script_hasdata(st,3) ) if( script_hasdata(st,3) )
@ -6815,7 +6897,7 @@ BUILDIN_FUNC(checkcart)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( pc_iscarton(sd) ) if( pc_iscarton(sd) )
script_pushint(st, 1); script_pushint(st, 1);
@ -6843,7 +6925,7 @@ BUILDIN_FUNC(setcart)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( script_hasdata(st,2) ) if( script_hasdata(st,2) )
type = script_getnum(st,2); type = script_getnum(st,2);
@ -6863,7 +6945,7 @@ BUILDIN_FUNC(checkfalcon)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( pc_isfalcon(sd) ) if( pc_isfalcon(sd) )
script_pushint(st, 1); script_pushint(st, 1);
@ -6885,7 +6967,7 @@ BUILDIN_FUNC(setfalcon)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( script_hasdata(st,2) ) if( script_hasdata(st,2) )
flag = script_getnum(st,2); flag = script_getnum(st,2);
@ -6906,7 +6988,7 @@ BUILDIN_FUNC(checkriding)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( pc_isriding(sd) ) if( pc_isriding(sd) )
script_pushint(st, 1); script_pushint(st, 1);
@ -6928,7 +7010,7 @@ BUILDIN_FUNC(setriding)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
if( script_hasdata(st,2) ) if( script_hasdata(st,2) )
flag = script_getnum(st,2); flag = script_getnum(st,2);
@ -6951,7 +7033,7 @@ BUILDIN_FUNC(savepoint)
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL ) if( sd == NULL )
return 1;// no player attached, report source return 0;// no player attached, report source
str = script_getstr(st, 2); str = script_getstr(st, 2);
x = script_getnum(st,3); x = script_getnum(st,3);
@ -7070,14 +7152,25 @@ BUILDIN_FUNC(gettimestr)
*------------------------------------------*/ *------------------------------------------*/
BUILDIN_FUNC(openstorage) BUILDIN_FUNC(openstorage)
{ {
storage_storageopen(script_rid2sd(st)); TB_PC* sd;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
storage_storageopen(sd);
return 0; return 0;
} }
BUILDIN_FUNC(guildopenstorage) BUILDIN_FUNC(guildopenstorage)
{ {
TBL_PC *sd=script_rid2sd(st); TBL_PC* sd;
int ret; int ret;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
ret = storage_guild_storageopen(sd); ret = storage_guild_storageopen(sd);
script_pushint(st,ret); script_pushint(st,ret);
return 0; return 0;
@ -7108,7 +7201,11 @@ BUILDIN_FUNC(itemskill)
BUILDIN_FUNC(produce) BUILDIN_FUNC(produce)
{ {
int trigger; int trigger;
TBL_PC *sd=script_rid2sd(st); TBL_PC* sd;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
trigger=script_getnum(st,2); trigger=script_getnum(st,2);
clif_skill_produce_mix_list(sd, trigger); clif_skill_produce_mix_list(sd, trigger);
@ -7119,10 +7216,13 @@ BUILDIN_FUNC(produce)
*------------------------------------------*/ *------------------------------------------*/
BUILDIN_FUNC(makepet) BUILDIN_FUNC(makepet)
{ {
TBL_PC *sd = script_rid2sd(st); TBL_PC* sd;
int id,pet_id; int id,pet_id;
id=script_getnum(st,2); id=script_getnum(st,2);
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pet_id = search_petDB_index(id, PET_CLASS); pet_id = search_petDB_index(id, PET_CLASS);
@ -7144,11 +7244,13 @@ BUILDIN_FUNC(makepet)
*------------------------------------------*/ *------------------------------------------*/
BUILDIN_FUNC(getexp) BUILDIN_FUNC(getexp)
{ {
TBL_PC *sd = script_rid2sd(st); TBL_PC* sd;;
int base=0,job=0; int base=0,job=0;
double bonus; double bonus;
nullpo_retr(0, sd); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
base=script_getnum(st,2); base=script_getnum(st,2);
job =script_getnum(st,3); job =script_getnum(st,3);
@ -7170,9 +7272,13 @@ BUILDIN_FUNC(getexp)
*------------------------------------------*/ *------------------------------------------*/
BUILDIN_FUNC(guildgetexp) BUILDIN_FUNC(guildgetexp)
{ {
TBL_PC *sd = script_rid2sd(st); TBL_PC* sd;
int exp; int exp;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
exp = script_getnum(st,2); exp = script_getnum(st,2);
if(exp < 0) if(exp < 0)
return 0; return 0;
@ -7397,9 +7503,14 @@ BUILDIN_FUNC(addtimer)
{ {
int tick = script_getnum(st,2); int tick = script_getnum(st,2);
const char* event = script_getstr(st, 3); const char* event = script_getstr(st, 3);
TBL_PC* sd;
check_event(st, event); check_event(st, event);
pc_addeventtimer(script_rid2sd(st),tick,event); sd = script_rid2sd(st);
if( sd == NULL )
return 0;
pc_addeventtimer(sd,tick,event);
return 0; return 0;
} }
/*========================================== /*==========================================
@ -7408,9 +7519,15 @@ BUILDIN_FUNC(addtimer)
BUILDIN_FUNC(deltimer) BUILDIN_FUNC(deltimer)
{ {
const char *event; const char *event;
TBL_PC* sd;
event=script_getstr(st, 2); event=script_getstr(st, 2);
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
check_event(st, event); check_event(st, event);
pc_deleventtimer(script_rid2sd(st),event); pc_deleventtimer(sd,event);
return 0; return 0;
} }
/*========================================== /*==========================================
@ -7420,10 +7537,16 @@ BUILDIN_FUNC(addtimercount)
{ {
const char *event; const char *event;
int tick; int tick;
TBL_PC* sd;
event=script_getstr(st, 2); event=script_getstr(st, 2);
tick=script_getnum(st,3); tick=script_getnum(st,3);
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
check_event(st, event); check_event(st, event);
pc_addeventtimercount(script_rid2sd(st),event,tick); pc_addeventtimercount(sd,event,tick);
return 0; return 0;
} }
@ -7459,7 +7582,9 @@ BUILDIN_FUNC(initnpctimer)
if (!nd) return 0; if (!nd) return 0;
if (flag) { //Attach if (flag) { //Attach
TBL_PC* sd = script_rid2sd(st); TBL_PC* sd = script_rid2sd(st);
if (sd) nd->u.scr.rid = sd->bl.id; if( sd == NULL )
return 0;
nd->u.scr.rid = sd->bl.id;
} }
npc_settimerevent_tick(nd,0); npc_settimerevent_tick(nd,0);
@ -7498,7 +7623,9 @@ BUILDIN_FUNC(startnpctimer)
if (!nd) return 0; if (!nd) return 0;
if (flag) { //Attach if (flag) { //Attach
TBL_PC* sd = script_rid2sd(st); TBL_PC* sd = script_rid2sd(st);
if (sd) nd->u.scr.rid = sd->bl.id; if( sd == NULL )
return 0;
nd->u.scr.rid = sd->bl.id;
} }
npc_timerevent_start(nd, st->rid); npc_timerevent_start(nd, st->rid);
@ -7661,6 +7788,8 @@ BUILDIN_FUNC(announce)
if(flag&0x0f){ if(flag&0x0f){
struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) : struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) :
(struct block_list *)script_rid2sd(st); (struct block_list *)script_rid2sd(st);
if( bl == NULL )
return 0;
if (color) if (color)
clif_announce(bl,str,(int)strlen(str)+1, strtol(color, (char **)NULL, 0),flag); clif_announce(bl,str,(int)strlen(str)+1, strtol(color, (char **)NULL, 0),flag);
else else
@ -8124,8 +8253,12 @@ BUILDIN_FUNC(catchpet)
{ {
int pet_id; int pet_id;
TBL_PC *sd; TBL_PC *sd;
pet_id= script_getnum(st,2); pet_id= script_getnum(st,2);
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
pet_catch_process1(sd,pet_id); pet_catch_process1(sd,pet_id);
return 0; return 0;
} }
@ -8136,7 +8269,11 @@ BUILDIN_FUNC(catchpet)
BUILDIN_FUNC(homunculus_evolution) BUILDIN_FUNC(homunculus_evolution)
{ {
TBL_PC *sd; TBL_PC *sd;
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
if(merc_is_hom_active(sd->hd)) if(merc_is_hom_active(sd->hd))
{ {
if (sd->hd->homunculus.intimacy > 91000) if (sd->hd->homunculus.intimacy > 91000)
@ -8151,7 +8288,11 @@ BUILDIN_FUNC(homunculus_evolution)
BUILDIN_FUNC(homunculus_shuffle) BUILDIN_FUNC(homunculus_shuffle)
{ {
TBL_PC *sd; TBL_PC *sd;
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
if(merc_is_hom_active(sd->hd)) if(merc_is_hom_active(sd->hd))
merc_hom_shuffle(sd->hd); merc_hom_shuffle(sd->hd);
@ -8201,6 +8342,9 @@ BUILDIN_FUNC(birthpet)
{ {
TBL_PC *sd; TBL_PC *sd;
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
clif_sendegg(sd); clif_sendegg(sd);
return 0; return 0;
} }
@ -8215,6 +8359,9 @@ BUILDIN_FUNC(resetlvl)
int type=script_getnum(st,2); int type=script_getnum(st,2);
sd=script_rid2sd(st); sd=script_rid2sd(st);
if( sd == NULL )
return 0;
pc_resetlvl(sd,type); pc_resetlvl(sd,type);
return 0; return 0;
} }
@ -11482,11 +11629,18 @@ BUILDIN_FUNC(setd)
buffer = script_getstr(st, 2); buffer = script_getstr(st, 2);
value = script_getstr(st, 3); value = script_getstr(st, 3);
if(sscanf(buffer, "%[^[][%d]", varname, &elem) < 2) if(sscanf(buffer, "%99[^[][%d]", varname, &elem) < 2)
elem = 0; elem = 0;
if(st->rid) if( not_server_variable(*varname) )
{
sd = script_rid2sd(st); sd = script_rid2sd(st);
if( sd == NULL )
{
ShowError("script:setd: no player attached for player variable '%s'\n", buffer);
return 0;
}
}
if(varname[strlen(varname)-1] != '$') { if(varname[strlen(varname)-1] != '$') {
setd_sub(st,sd, varname, elem, (void *)atoi(value),NULL); setd_sub(st,sd, varname, elem, (void *)atoi(value),NULL);
@ -12756,8 +12910,14 @@ BUILDIN_FUNC(warpportal)
BUILDIN_FUNC(openmail) BUILDIN_FUNC(openmail)
{ {
TBL_PC* sd;
sd = script_rid2sd(st);
if( sd == NULL )
return 0;
#ifndef TXT_ONLY #ifndef TXT_ONLY
mail_openmail(script_rid2sd(st)); mail_openmail(sd);
#endif #endif
return 0; return 0;
} }