summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt7
-rw-r--r--src/map/npc.c16
-rw-r--r--src/map/script.c306
3 files changed, 244 insertions, 85 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index 355fa5695..532d7c1dd 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -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.
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
NPCs now.
* Removed several script config options which break NPC compatibility when
diff --git a/src/map/npc.c b/src/map/npc.c
index 26ce12757..e8d5c6478 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -2610,18 +2610,10 @@ void npc_parsesrcfile(const char* filepath)
// 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, "%s %s %[^\t]\t %n%[^\n]", w1, w2, w3, &w4pos, w4)) == 4
- || (count = sscanf(p, "%s %s %s %n%[^\n]\n", w1, w2, w3, &w4pos, w4)) >= 3 )
- {// Incorrect syntax, try to parse
- 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;
- }
+ {// 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 )
diff --git a/src/map/script.c b/src/map/script.c
index 8a479bac6..ec0c3494c 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -2092,6 +2092,7 @@ TBL_PC *script_rid2sd(struct script_state *st)
TBL_PC *sd=map_id2sd(st->rid);
if(!sd){
ShowError("script_rid2sd: fatal error ! player not attached!\n");
+ script_reportsrc(st);
st->state = END;
}
return sd;
@@ -2120,13 +2121,13 @@ int get_val(struct script_state* st, struct script_data* data)
{// needs player attached
if( postfix == '$' )
{// 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->u.str = "";
}
else
{// 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->u.num = 0;
}
@@ -3660,7 +3661,8 @@ BUILDIN_FUNC(mes)
{
TBL_PC* sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
+
clif_scriptmes(sd, st->oid, script_getstr(st, 2));
return 0;
}
@@ -3675,7 +3677,7 @@ BUILDIN_FUNC(next)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
st->state = STOP;
clif_scriptnext(sd, st->oid);
@@ -3692,7 +3694,7 @@ BUILDIN_FUNC(close)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
st->state = END;
clif_scriptclose(sd, st->oid);
@@ -3709,7 +3711,7 @@ BUILDIN_FUNC(close2)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
st->state = STOP;
clif_scriptclose(sd, st->oid);
@@ -3776,7 +3778,7 @@ BUILDIN_FUNC(menu)
sd = script_rid2sd(st);
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
if( sd->state.menu_or_input == 0 )
@@ -3880,7 +3882,7 @@ BUILDIN_FUNC(select)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
if( sd->state.menu_or_input == 0 )
{
@@ -3940,7 +3942,7 @@ BUILDIN_FUNC(prompt)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;
+ return 0;
if( sd->state.menu_or_input == 0 )
{
@@ -4218,9 +4220,11 @@ BUILDIN_FUNC(warp)
int ret;
int x,y;
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);
x = script_getnum(st,3);
@@ -4445,6 +4449,9 @@ BUILDIN_FUNC(warpguild)
y=script_getnum(st,4);
g=script_getnum(st,5);
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if(map[sd->bl.m].flag.noreturn || map[sd->bl.m].flag.nowarpto)
return 0;
@@ -4559,6 +4566,7 @@ BUILDIN_FUNC(itemheal)
BUILDIN_FUNC(percentheal)
{
int hp,sp;
+ TBL_PC* sd;
hp=script_getnum(st,2);
sp=script_getnum(st,3);
@@ -4569,7 +4577,11 @@ BUILDIN_FUNC(percentheal)
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;
}
@@ -4586,9 +4598,15 @@ BUILDIN_FUNC(jobchange)
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)
- irc_announce_jobchange(script_rid2sd(st));
+ irc_announce_jobchange(sd);
}
return 0;
@@ -4615,7 +4633,7 @@ BUILDIN_FUNC(input)
char *name=str_buf+str_data[num&0x00ffffff].str;
char postfix = name[strlen(name)-1];
- if (!sd) return 1;
+ if (!sd) return 0;
if( !data_isreference(data) ){
ShowError("script:input: not a variable\n");
@@ -4668,7 +4686,14 @@ BUILDIN_FUNC(set)
}
if(not_server_variable(prefix))
+ {
sd=script_rid2sd(st);
+ if( sd == NULL )
+ {
+ ShowError("script:set: no player attached for player variable '%s'\n", name);
+ return 0;
+ }
+ }
if( postfix=='$' ){
// •¶Žš—ñ
@@ -4751,7 +4776,7 @@ BUILDIN_FUNC(setarray)
{
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached
+ return 0;// no player attached
}
end = start + script_lastdata(st) - 2;
@@ -4815,7 +4840,7 @@ BUILDIN_FUNC(cleararray)
{
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached
+ return 0;// no player attached
}
if( is_string_variable(name) )
@@ -4890,7 +4915,7 @@ BUILDIN_FUNC(copyarray)
{
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached
+ return 0;// no player attached
}
count = script_getnum(st, 4);
@@ -4993,7 +5018,7 @@ BUILDIN_FUNC(deletearray)
{
sd = script_rid2sd(st);
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));
@@ -5086,11 +5111,16 @@ BUILDIN_FUNC(getelementofarray)
BUILDIN_FUNC(setlook)
{
int type,val;
+ TBL_PC* sd;
type=script_getnum(st,2);
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;
}
@@ -5100,7 +5130,13 @@ BUILDIN_FUNC(setlook)
*------------------------------------------*/
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;
}
@@ -5110,14 +5146,19 @@ BUILDIN_FUNC(cutin)
BUILDIN_FUNC(viewpoint)
{
int type,x,y,id,color;
+ TBL_PC* sd;
type=script_getnum(st,2);
x=script_getnum(st,3);
y=script_getnum(st,4);
id=script_getnum(st,5);
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;
}
@@ -5232,6 +5273,8 @@ BUILDIN_FUNC(checkweight)
struct script_data *data;
sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
data=script_getdata(st,2);
get_val(st,data);
@@ -5354,6 +5397,8 @@ BUILDIN_FUNC(getitem2)
struct script_data *data;
sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
data=script_getdata(st,2);
get_val(st,data);
@@ -5577,6 +5622,8 @@ BUILDIN_FUNC(delitem)
struct script_data *data;
sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
data=script_getdata(st,2);
get_val(st,data);
@@ -5681,6 +5728,8 @@ BUILDIN_FUNC(delitem2)
struct script_data *data;
sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
data=script_getdata(st,2);
get_val(st,data);
@@ -6102,10 +6151,8 @@ BUILDIN_FUNC(getequipid)
sd=script_rid2sd(st);
if(sd == NULL)
- {
- ShowError("getequipid: sd == NULL\n");
return 0;
- }
+
num=script_getnum(st,2);
if (num > 0 && num <= ARRAYLENGTH(equip))
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"};
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
buf=(char *)aMallocA(64*sizeof(char));
- sd=script_rid2sd(st);
num=script_getnum(st,2);
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
@@ -6160,7 +6210,9 @@ BUILDIN_FUNC(getbrokenid)
int i,num,id=0,brokencounter=0;
TBL_PC *sd;
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
num=script_getnum(st,2);
for(i=0; i<MAX_INVENTORY; i++) {
@@ -6187,8 +6239,9 @@ BUILDIN_FUNC(repair)
int repaircounter=0;
TBL_PC *sd;
-
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
num=script_getnum(st,2);
for(i=0; i<MAX_INVENTORY; i++) {
@@ -6216,7 +6269,9 @@ BUILDIN_FUNC(getequipisequiped)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
@@ -6237,7 +6292,10 @@ BUILDIN_FUNC(getequipisenableref)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i] && !sd->inventory_data[i]->flag.no_refine)
@@ -6259,7 +6317,10 @@ BUILDIN_FUNC(getequipisidentify)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0)
@@ -6279,7 +6340,10 @@ BUILDIN_FUNC(getequiprefinerycnt)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0)
@@ -6299,7 +6363,10 @@ BUILDIN_FUNC(getequipweaponlv)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0 && sd->inventory_data[i])
@@ -6319,7 +6386,10 @@ BUILDIN_FUNC(getequippercentrefinery)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
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;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) {
@@ -6392,7 +6465,10 @@ BUILDIN_FUNC(failedrefitem)
TBL_PC *sd;
num=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if (num > 0 && num <= ARRAYLENGTH(equip))
i=pc_checkequip(sd,equip[num-1]);
if(i >= 0) {
@@ -6422,7 +6498,10 @@ BUILDIN_FUNC(statusup)
TBL_PC *sd;
type=script_getnum(st,2);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
pc_statusup(sd,type);
return 0;
@@ -6437,7 +6516,10 @@ BUILDIN_FUNC(statusup2)
type=script_getnum(st,2);
val=script_getnum(st,3);
- sd=script_rid2sd(st);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
pc_statusup2(sd,type,val);
return 0;
@@ -6462,7 +6544,7 @@ BUILDIN_FUNC(bonus)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1; // no player attached
+ return 0; // no player attached
type = script_getnum(st,2);
switch( script_lastdata(st) ){
@@ -6513,7 +6595,7 @@ BUILDIN_FUNC(bonusautoscript)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
str = script_getstr(st,2);
rate = script_getnum(st,3);
@@ -6539,7 +6621,7 @@ BUILDIN_FUNC(bonusautoscript2)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
str = script_getstr(st,2);
rate = script_getnum(st,3);
@@ -6573,7 +6655,7 @@ BUILDIN_FUNC(skill)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
id = script_getnum(st,2);
level = script_getnum(st,3);
@@ -6600,7 +6682,7 @@ BUILDIN_FUNC(addtoskill)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
id = script_getnum(st,2);
level = script_getnum(st,3);
@@ -6623,7 +6705,7 @@ BUILDIN_FUNC(guildskill)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
id = script_getnum(st,2);
level = script_getnum(st,3);
@@ -6643,7 +6725,7 @@ BUILDIN_FUNC(getskilllv)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
id = script_getnum(st,2);
script_pushint(st, pc_checkskill(sd,id));
@@ -6691,7 +6773,7 @@ BUILDIN_FUNC(getgmlevel)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
script_pushint(st, pc_isGM(sd));
@@ -6717,7 +6799,7 @@ BUILDIN_FUNC(checkoption)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
option = script_getnum(st,2);
if( sd->sc.option&option )
@@ -6738,7 +6820,7 @@ BUILDIN_FUNC(checkoption1)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
opt1 = script_getnum(st,2);
if( sd->sc.opt1 == opt1 )
@@ -6759,7 +6841,7 @@ BUILDIN_FUNC(checkoption2)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
opt2 = script_getnum(st,2);
if( sd->sc.opt2&opt2 )
@@ -6785,7 +6867,7 @@ BUILDIN_FUNC(setoption)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
option = script_getnum(st,2);
if( script_hasdata(st,3) )
@@ -6815,7 +6897,7 @@ BUILDIN_FUNC(checkcart)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( pc_iscarton(sd) )
script_pushint(st, 1);
@@ -6843,7 +6925,7 @@ BUILDIN_FUNC(setcart)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( script_hasdata(st,2) )
type = script_getnum(st,2);
@@ -6863,7 +6945,7 @@ BUILDIN_FUNC(checkfalcon)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( pc_isfalcon(sd) )
script_pushint(st, 1);
@@ -6885,7 +6967,7 @@ BUILDIN_FUNC(setfalcon)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( script_hasdata(st,2) )
flag = script_getnum(st,2);
@@ -6906,7 +6988,7 @@ BUILDIN_FUNC(checkriding)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( pc_isriding(sd) )
script_pushint(st, 1);
@@ -6928,7 +7010,7 @@ BUILDIN_FUNC(setriding)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
if( script_hasdata(st,2) )
flag = script_getnum(st,2);
@@ -6951,7 +7033,7 @@ BUILDIN_FUNC(savepoint)
sd = script_rid2sd(st);
if( sd == NULL )
- return 1;// no player attached, report source
+ return 0;// no player attached, report source
str = script_getstr(st, 2);
x = script_getnum(st,3);
@@ -7070,14 +7152,25 @@ BUILDIN_FUNC(gettimestr)
*------------------------------------------*/
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;
}
BUILDIN_FUNC(guildopenstorage)
{
- TBL_PC *sd=script_rid2sd(st);
+ TBL_PC* sd;
int ret;
+
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
ret = storage_guild_storageopen(sd);
script_pushint(st,ret);
return 0;
@@ -7108,7 +7201,11 @@ BUILDIN_FUNC(itemskill)
BUILDIN_FUNC(produce)
{
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);
clif_skill_produce_mix_list(sd, trigger);
@@ -7119,10 +7216,13 @@ BUILDIN_FUNC(produce)
*------------------------------------------*/
BUILDIN_FUNC(makepet)
{
- TBL_PC *sd = script_rid2sd(st);
+ TBL_PC* sd;
int id,pet_id;
id=script_getnum(st,2);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
pet_id = search_petDB_index(id, PET_CLASS);
@@ -7144,11 +7244,13 @@ BUILDIN_FUNC(makepet)
*------------------------------------------*/
BUILDIN_FUNC(getexp)
{
- TBL_PC *sd = script_rid2sd(st);
+ TBL_PC* sd;;
int base=0,job=0;
double bonus;
- nullpo_retr(0, sd);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
base=script_getnum(st,2);
job =script_getnum(st,3);
@@ -7170,9 +7272,13 @@ BUILDIN_FUNC(getexp)
*------------------------------------------*/
BUILDIN_FUNC(guildgetexp)
{
- TBL_PC *sd = script_rid2sd(st);
+ TBL_PC* sd;
int exp;
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
exp = script_getnum(st,2);
if(exp < 0)
return 0;
@@ -7397,9 +7503,14 @@ BUILDIN_FUNC(addtimer)
{
int tick = script_getnum(st,2);
const char* event = script_getstr(st, 3);
+ TBL_PC* sd;
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;
}
/*==========================================
@@ -7408,9 +7519,15 @@ BUILDIN_FUNC(addtimer)
BUILDIN_FUNC(deltimer)
{
const char *event;
+ TBL_PC* sd;
+
event=script_getstr(st, 2);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
check_event(st, event);
- pc_deleventtimer(script_rid2sd(st),event);
+ pc_deleventtimer(sd,event);
return 0;
}
/*==========================================
@@ -7420,10 +7537,16 @@ BUILDIN_FUNC(addtimercount)
{
const char *event;
int tick;
+ TBL_PC* sd;
+
event=script_getstr(st, 2);
tick=script_getnum(st,3);
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
check_event(st, event);
- pc_addeventtimercount(script_rid2sd(st),event,tick);
+ pc_addeventtimercount(sd,event,tick);
return 0;
}
@@ -7459,7 +7582,9 @@ BUILDIN_FUNC(initnpctimer)
if (!nd) return 0;
if (flag) { //Attach
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);
@@ -7498,7 +7623,9 @@ BUILDIN_FUNC(startnpctimer)
if (!nd) return 0;
if (flag) { //Attach
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);
@@ -7661,6 +7788,8 @@ BUILDIN_FUNC(announce)
if(flag&0x0f){
struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) :
(struct block_list *)script_rid2sd(st);
+ if( bl == NULL )
+ return 0;
if (color)
clif_announce(bl,str,(int)strlen(str)+1, strtol(color, (char **)NULL, 0),flag);
else
@@ -8124,8 +8253,12 @@ BUILDIN_FUNC(catchpet)
{
int pet_id;
TBL_PC *sd;
+
pet_id= script_getnum(st,2);
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
pet_catch_process1(sd,pet_id);
return 0;
}
@@ -8136,7 +8269,11 @@ BUILDIN_FUNC(catchpet)
BUILDIN_FUNC(homunculus_evolution)
{
TBL_PC *sd;
+
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if(merc_is_hom_active(sd->hd))
{
if (sd->hd->homunculus.intimacy > 91000)
@@ -8151,7 +8288,11 @@ BUILDIN_FUNC(homunculus_evolution)
BUILDIN_FUNC(homunculus_shuffle)
{
TBL_PC *sd;
+
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
if(merc_is_hom_active(sd->hd))
merc_hom_shuffle(sd->hd);
@@ -8201,6 +8342,9 @@ BUILDIN_FUNC(birthpet)
{
TBL_PC *sd;
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
clif_sendegg(sd);
return 0;
}
@@ -8215,6 +8359,9 @@ BUILDIN_FUNC(resetlvl)
int type=script_getnum(st,2);
sd=script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
pc_resetlvl(sd,type);
return 0;
}
@@ -11482,11 +11629,18 @@ BUILDIN_FUNC(setd)
buffer = script_getstr(st, 2);
value = script_getstr(st, 3);
- if(sscanf(buffer, "%[^[][%d]", varname, &elem) < 2)
+ if(sscanf(buffer, "%99[^[][%d]", varname, &elem) < 2)
elem = 0;
- if(st->rid)
+ if( not_server_variable(*varname) )
+ {
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] != '$') {
setd_sub(st,sd, varname, elem, (void *)atoi(value),NULL);
@@ -12756,8 +12910,14 @@ BUILDIN_FUNC(warpportal)
BUILDIN_FUNC(openmail)
{
+ TBL_PC* sd;
+
+ sd = script_rid2sd(st);
+ if( sd == NULL )
+ return 0;
+
#ifndef TXT_ONLY
- mail_openmail(script_rid2sd(st));
+ mail_openmail(sd);
#endif
return 0;
}