From 1f97beae277a95bf7ede02e582a108b8802bb46c Mon Sep 17 00:00:00 2001 From: Aleos Date: Tue, 5 Feb 2019 18:50:54 -0500 Subject: [PATCH] Cleaned up script command argument parsing (#3910) * Cleaned up the way script commands parse arguments. * script_isstring and script_isint will now properly check variable references. * This allows script command arguments to contain variables without having to make source side adjustments. * Reverted several script commands that reference the data directly. Thanks to @Lemongrass3110! --- src/map/pc.cpp | 4 +- src/map/pc.hpp | 5 +- src/map/script.cpp | 596 +++++++++++++++++++-------------------------- src/map/script.hpp | 4 +- 4 files changed, 257 insertions(+), 352 deletions(-) diff --git a/src/map/pc.cpp b/src/map/pc.cpp index fbe15e7967..f4bea6e087 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -2318,13 +2318,13 @@ static void pc_bonus_item_drop(std::vector &drop, unsigned short nam * @param script: Script to execute * @param rate: Success chance * @param dur: Duration - * @param flag: Battle flag + * @param flag: Battle flag/skill * @param other_script: Secondary script to execute * @param pos: Item equip position * @param onskill: Skill used to trigger autobonus * @return True on success or false otherwise */ -bool pc_addautobonus(std::vector &bonus, const char *script, short rate, unsigned int dur, short flag, const char *other_script, unsigned int pos, bool onskill) +bool pc_addautobonus(std::vector &bonus, const char *script, short rate, unsigned int dur, uint16 flag, const char *other_script, unsigned int pos, bool onskill) { if (bonus.size() == MAX_PC_BONUS) { ShowWarning("pc_addautobonus: Reached max (%d) number of autobonus per character!\n", MAX_PC_BONUS); diff --git a/src/map/pc.hpp b/src/map/pc.hpp index f5bde866c9..ea5465bc80 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -195,7 +195,8 @@ struct s_add_drop { /// AutoBonus bonus struct struct s_autobonus { - short rate,atk_type; + short rate; + uint16 atk_type; unsigned int duration; char *bonus_script, *other_script; int active; @@ -1070,7 +1071,7 @@ bool pc_adoption(struct map_session_data *p1_sd, struct map_session_data *p2_sd, void pc_updateweightstatus(struct map_session_data *sd); -bool pc_addautobonus(std::vector &bonus, const char *script, short rate, unsigned int dur, short atk_type, const char *o_script, unsigned int pos, bool onskill); +bool pc_addautobonus(std::vector &bonus, const char *script, short rate, unsigned int dur, uint16 atk_type, const char *o_script, unsigned int pos, bool onskill); void pc_exeautobonus(struct map_session_data* sd, std::vector *bonus, struct s_autobonus *autobonus); TIMER_FUNC(pc_endautobonus); void pc_delautobonus(struct map_session_data* sd, std::vector &bonus, bool restore); diff --git a/src/map/script.cpp b/src/map/script.cpp index c5b36cc033..a632517cbe 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -2678,14 +2678,14 @@ static bool script_rid2sd_( struct script_state *st, struct map_session_data** s * @param data Variable/constant * @param sd If NULL, will try to use sd from st->rid (for player's variables) */ -void get_val_(struct script_state* st, struct script_data* data, struct map_session_data *sd) +struct script_data *get_val_(struct script_state* st, struct script_data* data, struct map_session_data *sd) { const char* name; char prefix; char postfix; if( !data_isreference(data) ) - return;// not a variable/constant + return data;// not a variable/constant name = reference_getname(data); prefix = name[0]; @@ -2703,7 +2703,7 @@ void get_val_(struct script_state* st, struct script_data* data, struct map_sess data->type = C_INT; data->u.num = 0; } - return; + return data; } } @@ -2811,12 +2811,12 @@ void get_val_(struct script_state* st, struct script_data* data, struct map_sess } data->ref = NULL; - return; + return data; } -void get_val(struct script_state* st, struct script_data* data) +struct script_data *get_val(struct script_state* st, struct script_data* data) { - get_val_(st,data,NULL); + return get_val_(st,data,NULL); } struct script_data* push_val2(struct script_stack* stack, enum c_op type, int64 val, struct reg_db* ref); @@ -3250,7 +3250,7 @@ const char* conv_str_(struct script_state* st, struct script_data* data, struct } else if( data_isreference(data) ) {// reference -> string - //##TODO when does this happen (check get_val) [FlavioJS] + //##TODO when does this happen (check get_val) [FlavioJS] -- at getd!! data->type = C_CONSTSTR; data->u.str = reference_getname(data); } @@ -6775,7 +6775,6 @@ BUILDIN_FUNC(countitem) { int i = 0, aid = 3; struct item_data* id = NULL; - struct script_data* data; char *command = (char *)script_getfuncname(st); uint8 loc = 0; uint16 size, count = 0; @@ -6836,14 +6835,11 @@ BUILDIN_FUNC(countitem) script_pushint(st,-1); return SCRIPT_CMD_SUCCESS; } - - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - if( data_isstring(data) ) // item name - id = itemdb_searchname(conv_str(st, data)); + if( script_isstring(st, 2) ) // item name + id = itemdb_searchname(script_getstr(st, 2)); else // item id - id = itemdb_exists(conv_num(st, data)); + id = itemdb_exists(script_getnum(st, 2)); if( id == NULL ) { ShowError("buildin_%s: Invalid item '%s'.\n", command, script_getstr(st,2)); // returns string, regardless of what it was @@ -6939,12 +6935,11 @@ BUILDIN_FUNC(checkweight) for (i = 2; i < nbargs; i += 2) { unsigned short nameid, amount; - struct script_data* data = script_getdata(st,i); - get_val(st, data); // Convert into value in case of a variable - if( data_isstring(data) ) // item name - id = itemdb_searchname(conv_str(st, data)); + + if( script_isstring(st, i) ) // item name + id = itemdb_searchname(script_getstr(st, i)); else // item id - id = itemdb_exists(conv_num(st, data)); + id = itemdb_exists(script_getnum(st, i)); if( id == NULL ) { ShowError("buildin_checkweight: Invalid item '%s'.\n", script_getstr(st,i)); // returns string, regardless of what it was script_pushint(st,0); @@ -7116,30 +7111,25 @@ BUILDIN_FUNC(getitem) unsigned short nameid, amount; struct item it; TBL_PC *sd; - struct script_data *data; unsigned char flag = 0; const char* command = script_getfuncname(st); struct item_data *id = NULL; - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ) {// "" - const char *name = conv_str(st,data); + if( script_isstring(st, 2) ) {// "" + const char *name = script_getstr(st, 2); + id = itemdb_searchname(name); if( id == NULL ){ ShowError("buildin_getitem: Nonexistant item %s requested.\n", name); return SCRIPT_CMD_FAILURE; //No item created. } nameid = id->nameid; - } else if( data_isint(data) ) {// - nameid = conv_num(st,data); + } else {// + nameid = script_getnum(st, 2); if( !(id = itemdb_exists(nameid)) ){ ShowError("buildin_getitem: Nonexistant item %d requested.\n", nameid); return SCRIPT_CMD_FAILURE; //No item created. } - } else { - ShowError("buildin_getitem: invalid data type for argument #1 (%d).", data->type); - return SCRIPT_CMD_FAILURE; } // @@ -7216,7 +7206,6 @@ BUILDIN_FUNC(getitem2) struct item_data *item_data = NULL; struct item item_tmp; TBL_PC *sd; - struct script_data *data; const char* command = script_getfuncname(st); int offset = 0; @@ -7244,17 +7233,16 @@ BUILDIN_FUNC(getitem2) if( sd == NULL ) // no target return SCRIPT_CMD_SUCCESS; - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ) { - const char *name = conv_str(st,data); + if( script_isstring(st, 2) ) { + const char *name = script_getstr(st, 2); + if( (item_data = itemdb_searchname(name)) == NULL ){ ShowError("buildin_getitem2: Nonexistant item %s requested (by conv_str).\n", name); return SCRIPT_CMD_FAILURE; //No item created. } nameid = item_data->nameid; } else { - nameid = conv_num(st,data); + nameid = script_getnum(st, 2); if( (item_data = itemdb_exists(nameid)) == NULL ){ ShowError("buildin_getitem2: Nonexistant item %d requested (by conv_num).\n", nameid); return SCRIPT_CMD_FAILURE; //No item created. @@ -7332,22 +7320,19 @@ BUILDIN_FUNC(getitem2) */ BUILDIN_FUNC(rentitem) { struct map_session_data *sd; - struct script_data *data; struct item it; int seconds; unsigned short nameid = 0; unsigned char flag = 0; - data = script_getdata(st,2); - get_val(st,data); - if (!script_accid2sd(4,sd)) return SCRIPT_CMD_FAILURE; - if( data_isstring(data) ) + if( script_isstring(st, 2) ) { - const char *name = conv_str(st,data); + const char *name = script_getstr(st, 2); struct item_data *itd = itemdb_searchname(name); + if( itd == NULL ) { ShowError("buildin_rentitem: Nonexistant item %s requested.\n", name); @@ -7355,20 +7340,15 @@ BUILDIN_FUNC(rentitem) { } nameid = itd->nameid; } - else if( data_isint(data) ) + else { - nameid = conv_num(st,data); + nameid = script_getnum(st, 2); if( nameid == 0 || !itemdb_exists(nameid) ) { ShowError("buildin_rentitem: Nonexistant item %hu requested.\n", nameid); return SCRIPT_CMD_FAILURE; } } - else - { - ShowError("buildin_rentitem: invalid data type for argument #1 (%d).\n", data->type); - return SCRIPT_CMD_FAILURE; - } seconds = script_getnum(st,3); memset(&it, 0, sizeof(it)); @@ -7395,7 +7375,6 @@ BUILDIN_FUNC(rentitem) { */ BUILDIN_FUNC(rentitem2) { struct map_session_data *sd; - struct script_data *data; struct item it; struct item_data *id; int seconds; @@ -7404,35 +7383,28 @@ BUILDIN_FUNC(rentitem2) { int iden,ref,attr,c1,c2,c3,c4; const char *funcname = script_getfuncname(st); - data = script_getdata(st,2); - get_val(st,data); - if (funcname[strlen(funcname)-1] == '3') { if (!script_accid2sd(14,sd)) return SCRIPT_CMD_FAILURE; } else if (!script_accid2sd(11,sd)) return SCRIPT_CMD_FAILURE; - if( data_isstring(data) ) { - const char *name = conv_str(st,data); + if( script_isstring(st, 2) ) { + const char *name = script_getstr(st, 2); + id = itemdb_searchname(name); if( id == NULL ) { ShowError("buildin_rentitem2: Nonexistant item %s requested.\n", name); return SCRIPT_CMD_FAILURE; } nameid = id->nameid; - } - else if( data_isint(data) ) { - nameid = conv_num(st,data); + } else { + nameid = script_getnum(st, 2); if( !(id = itemdb_search(nameid))) { ShowError("buildin_rentitem2: Nonexistant item %hu requested.\n", nameid); return SCRIPT_CMD_FAILURE; } } - else { - ShowError("buildin_rentitem2: invalid data type for argument #1 (%d).\n", data->type); - return SCRIPT_CMD_FAILURE; - } seconds = script_getnum(st,3); iden = script_getnum(st,4); @@ -7492,7 +7464,6 @@ BUILDIN_FUNC(getnameditem) unsigned short nameid; struct item item_tmp; TBL_PC *sd, *tsd; - struct script_data *data; if (!script_rid2sd(sd)) { //Player not attached! @@ -7500,11 +7471,10 @@ BUILDIN_FUNC(getnameditem) return SCRIPT_CMD_SUCCESS; } - data=script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ){ - const char *name=conv_str(st,data); + if( script_isstring(st, 2) ){ + const char *name = script_getstr(st, 2); struct item_data *item_data = itemdb_searchname(name); + if( item_data == NULL) { //Failed script_pushint(st,0); @@ -7512,7 +7482,7 @@ BUILDIN_FUNC(getnameditem) } nameid = item_data->nameid; }else - nameid = conv_num(st,data); + nameid = script_getnum(st, 2); if(!itemdb_exists(nameid)/* || itemdb_isstackable(nameid)*/) { //Even though named stackable items "could" be risky, they are required for certain quests. @@ -7520,12 +7490,10 @@ BUILDIN_FUNC(getnameditem) return SCRIPT_CMD_SUCCESS; } - data=script_getdata(st,3); - get_val(st,data); - if( data_isstring(data) ) //Char Name - tsd=map_nick2sd(conv_str(st,data),false); + if( script_isstring(st, 3) ) //Char Name + tsd = map_nick2sd(script_getstr(st, 3),false); else //Char Id was given - tsd=map_charid2sd(conv_num(st,data)); + tsd = map_charid2sd(script_getnum(st, 3)); if( tsd == NULL ) { //Failed @@ -7577,20 +7545,18 @@ BUILDIN_FUNC(makeitem) { const char *mapname; int m; struct item item_tmp; - struct script_data *data; - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ){ - const char *name = conv_str(st,data); + if( script_isstring(st, 2) ){ + const char *name = script_getstr(st, 2); struct item_data *item_data = itemdb_searchname(name); + if( item_data ) nameid = item_data->nameid; else nameid = UNKNOWN_ITEM_ID; } else - nameid = conv_num(st,data); + nameid = script_getnum(st, 2); amount = script_getnum(st,3); mapname = script_getstr(st,4); @@ -7635,22 +7601,20 @@ BUILDIN_FUNC(makeitem2) { const char *mapname; int m; struct item item_tmp; - struct script_data *data; struct item_data *id; const char *funcname = script_getfuncname(st); - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ){ - const char *name = conv_str(st,data); + if( script_isstring(st, 2) ){ + const char *name = script_getstr(st, 2); struct item_data *item_data = itemdb_searchname(name); + if( item_data ) nameid = item_data->nameid; else nameid = UNKNOWN_ITEM_ID; } else - nameid = conv_num(st,data); + nameid = script_getnum(st, 2); amount = script_getnum(st,3); mapname = script_getstr(st,4); @@ -7946,7 +7910,6 @@ BUILDIN_FUNC(delitem) { TBL_PC *sd; struct item it; - struct script_data *data; uint8 loc = 0; char* command = (char*)script_getfuncname(st); @@ -7977,12 +7940,11 @@ BUILDIN_FUNC(delitem) } } - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ) + if( script_isstring(st, 2) ) { - const char* item_name = conv_str(st,data); + const char* item_name = script_getstr(st, 2); struct item_data* id = itemdb_searchname(item_name); + if( id == NULL ) { ShowError("buildin_%s: unknown item \"%s\".\n", command, item_name); @@ -7993,7 +7955,7 @@ BUILDIN_FUNC(delitem) } else { - it.nameid = conv_num(st,data);// + it.nameid = script_getnum(st, 2);// if( !itemdb_exists( it.nameid ) ) { ShowError("buildin_%s: unknown item \"%hu\".\n", command, it.nameid); @@ -8035,7 +7997,6 @@ BUILDIN_FUNC(delitem2) { TBL_PC *sd; struct item it; - struct script_data *data; uint8 loc = 0; char* command = (char*)script_getfuncname(st); int aid_pos = 11; @@ -8073,12 +8034,11 @@ BUILDIN_FUNC(delitem2) memset(&it, 0, sizeof(it)); - data = script_getdata(st,2); - get_val(st,data); - if( data_isstring(data) ) + if( script_isstring(st, 2) ) { - const char* item_name = conv_str(st,data); + const char* item_name = script_getstr(st, 2); struct item_data* id = itemdb_searchname(item_name); + if( id == NULL ) { ShowError("buildin_%s: unknown item \"%s\".\n", command, item_name); @@ -8089,7 +8049,7 @@ BUILDIN_FUNC(delitem2) } else { - it.nameid = conv_num(st,data);// + it.nameid = script_getnum(st, 2);// if( !itemdb_exists( it.nameid ) ) { ShowError("buildin_%s: unknown item \"%hu\".\n", command, it.nameid); @@ -8161,14 +8121,10 @@ BUILDIN_FUNC(readparam) TBL_PC *sd = NULL; if( script_hasdata(st, 3) ){ - struct script_data *data2 = script_getdata(st, 3); - - get_val(st, data2); - if (data_isint(data2) || script_getnum(st, 3)) { + if (script_isint(st, 3)) script_charid2sd(3, sd); - } else if (data_isstring(data2)) { + else script_nick2sd(3, sd); - } }else{ script_rid2sd(sd); } @@ -9171,7 +9127,6 @@ BUILDIN_FUNC(bonus) int val4 = 0; int val5 = 0; TBL_PC* sd; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS; // no player attached @@ -9197,9 +9152,21 @@ BUILDIN_FUNC(bonus) case SP_SKILL_USE_SP: case SP_SUB_SKILL: // these bonuses support skill names - data = script_getdata(st, 3); - get_val(st, data); // Convert into value in case of a variable - val1 = ( data_isstring(data) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) ); + if (script_isstring(st, 3)) { + const char *name = script_getstr(st, 3); + + if (!(val1 = skill_name2id(name))) { + ShowError("buildin_bonus: Invalid skill name %s passed to item bonus. Skipping.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + val1 = script_getnum(st, 3); + + if (!skill_get_index(val1)) { + ShowError("buildin_bonus: Invalid skill ID %d passed to item bonus. Skipping.\n", val1); + return SCRIPT_CMD_FAILURE; + } + } break; default: if (script_hasdata(st, 3)) @@ -9222,9 +9189,7 @@ BUILDIN_FUNC(bonus) pc_bonus3(sd, type, val1, val2, val3); break; case 4: - data = script_getdata(st, 4); - get_val(st, data); // Convert into value in case of a variable - if( type == SP_AUTOSPELL_ONSKILL && data_isstring(data) ) + if( type == SP_AUTOSPELL_ONSKILL && script_isstring(st, 4) ) val2 = skill_name2id(script_getstr(st,4)); // 2nd value can be skill name else val2 = script_getnum(st,4); @@ -9234,9 +9199,7 @@ BUILDIN_FUNC(bonus) pc_bonus4(sd, type, val1, val2, val3, val4); break; case 5: - data = script_getdata(st, 4); - get_val(st, data); // Convert into value in case of a variable - if( type == SP_AUTOSPELL_ONSKILL && data_isstring(data) ) + if( type == SP_AUTOSPELL_ONSKILL && script_isstring(st, 4) ) val2 = skill_name2id(script_getstr(st,4)); // 2nd value can be skill name else val2 = script_getnum(st,4); @@ -9258,7 +9221,7 @@ BUILDIN_FUNC(autobonus) { unsigned int dur, pos; short rate; - short atk_type = 0; + uint16 atk_type = 0; TBL_PC* sd; const char *bonus_script, *other_script = NULL; @@ -9298,7 +9261,7 @@ BUILDIN_FUNC(autobonus2) { unsigned int dur, pos; short rate; - short atk_type = 0; + uint16 atk_type = 0; TBL_PC* sd; const char *bonus_script, *other_script = NULL; @@ -9337,10 +9300,10 @@ BUILDIN_FUNC(autobonus2) BUILDIN_FUNC(autobonus3) { unsigned int dur, pos; - short rate,atk_type; + short rate; + uint16 skill_id = 0; TBL_PC* sd; const char *bonus_script, *other_script = NULL; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS; // no player attached @@ -9355,17 +9318,29 @@ BUILDIN_FUNC(autobonus3) rate = script_getnum(st,3); dur = script_getnum(st,4); - data = script_getdata(st, 5); - get_val(st, data); // Convert into value in case of a variable - atk_type = ( data_isstring(data) ? skill_name2id(script_getstr(st,5)) : script_getnum(st,5) ); + if (script_isstring(st, 5)) { + const char *name = script_getstr(st, 5); + + if (!(skill_id = skill_name2id(name))) { + ShowError("buildin_autobonus3: Invalid skill name %s passed to item bonus. Skipping.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + skill_id = script_getnum(st, 5); + + if (!skill_get_index(skill_id)) { + ShowError("buildin_autobonus3: Invalid skill ID %d passed to item bonus. Skipping.\n", skill_id); + return SCRIPT_CMD_FAILURE; + } + } bonus_script = script_getstr(st,2); - if( !rate || !dur || !pos || !atk_type || !bonus_script ) + if( !rate || !dur || !pos || !bonus_script ) return SCRIPT_CMD_SUCCESS; if( script_hasdata(st,6) ) other_script = script_getstr(st,6); - if( pc_addautobonus(sd->autobonus3, bonus_script, rate, dur, atk_type, other_script, pos, true) ) + if( pc_addautobonus(sd->autobonus3, bonus_script, rate, dur, skill_id, other_script, pos, true) ) { script_add_autobonus(bonus_script); if( other_script ) @@ -9391,7 +9366,6 @@ BUILDIN_FUNC(skill) int level; int flag = ADDSKILL_TEMP; TBL_PC* sd; - struct script_data *data; const char* command = script_getfuncname(st); if( !script_rid2sd(sd) ) @@ -9400,9 +9374,7 @@ BUILDIN_FUNC(skill) if (strcmpi(command, "addtoskill") == 0) flag = ADDSKILL_TEMP_ADDLEVEL; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); level = script_getnum(st,3); if( script_hasdata(st,4) ) flag = script_getnum(st,4); @@ -9421,14 +9393,11 @@ BUILDIN_FUNC(guildskill) int level; TBL_PC* sd; int i; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS;// no player attached, report source - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); level = script_getnum(st,3); for( i=0; i < level; i++ ) guild_skillup(sd, id); @@ -9444,14 +9413,11 @@ BUILDIN_FUNC(getskilllv) { int id; TBL_PC* sd; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS;// no player attached, report source - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); script_pushint(st, pc_checkskill(sd,id)); return SCRIPT_CMD_SUCCESS; @@ -9466,12 +9432,9 @@ BUILDIN_FUNC(getgdskilllv) int guild_id; uint16 skill_id; struct guild* g; - struct script_data *data; guild_id = script_getnum(st,2); - data = script_getdata(st, 3); - get_val(st, data); // Convert into value in case of a variable - skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) ); + skill_id = ( script_isstring(st, 3) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) ); g = guild_search(guild_id); if( g == NULL ) script_pushint(st, -1); @@ -10069,14 +10032,25 @@ BUILDIN_FUNC(itemskill) int lv; bool keep_requirement; TBL_PC* sd; - struct script_data *data; if( !script_rid2sd(sd) || sd->ud.skilltimer != INVALID_TIMER ) return SCRIPT_CMD_SUCCESS; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + if (script_isstring(st, 2)) { + const char *name = script_getstr(st, 2); + + if (!(id = skill_name2id(name))) { + ShowError("buildin_itemskill: Invalid skill name %s passed to item bonus. Skipping.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + id = script_getnum(st, 2); + + if (!skill_get_index(id)) { + ShowError("buildin_itemskill: Invalid skill ID %d passed to item bonus. Skipping.\n", id); + return SCRIPT_CMD_FAILURE; + } + } lv = script_getnum(st,3); if (script_hasdata(st, 4)) { keep_requirement = (script_getnum(st, 4) != 0); @@ -10659,20 +10633,12 @@ BUILDIN_FUNC(initnpctimer) } 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, data)); - else if( data_isint(data) ) //Flag + if( script_isstring(st, 2) ) //NPC name + nd = npc_name2id(script_getstr(st, 2)); + else //Flag { nd = (struct npc_data *)map_id2bl(st->oid); - flag = conv_num(st,data); - } - else - { - ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); - return SCRIPT_CMD_FAILURE; + flag = script_getnum(st, 2); } } else @@ -10708,20 +10674,12 @@ BUILDIN_FUNC(startnpctimer) } 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, data)); - else if( data_isint(data) ) //Flag + if( script_isstring(st, 2) ) //NPC name + nd = npc_name2id(script_getstr(st, 2)); + else //Flag { nd = (struct npc_data *)map_id2bl(st->oid); - flag = conv_num(st,data); - } - else - { - ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); - return SCRIPT_CMD_FAILURE; + flag = script_getnum(st, 2); } } else @@ -10754,20 +10712,12 @@ BUILDIN_FUNC(stopnpctimer) } 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, data)); - else if( data_isint(data) ) //Flag + if( script_isstring(st, 2) ) //NPC name + nd = npc_name2id(script_getstr(st, 2)); + else //Flag { nd = (struct npc_data *)map_id2bl(st->oid); - flag = conv_num(st,data); - } - else - { - ShowError("initnpctimer: invalid argument type #1 (needs be int or string)).\n"); - return SCRIPT_CMD_FAILURE; + flag = script_getnum(st, 2); } } else @@ -11250,7 +11200,6 @@ BUILDIN_FUNC(getareadropitem) const char *str; int16 m,x0,y0,x1,y1; unsigned short nameid, amount = 0; - struct script_data *data; str=script_getstr(st,2); x0=script_getnum(st,3); @@ -11258,16 +11207,15 @@ BUILDIN_FUNC(getareadropitem) x1=script_getnum(st,5); y1=script_getnum(st,6); - data=script_getdata(st,7); - get_val(st,data); - if( data_isstring(data) ){ - const char *name=conv_str(st,data); + if( script_isstring(st, 7) ){ + const char *name = script_getstr(st, 7); struct item_data *item_data = itemdb_searchname(name); + nameid=UNKNOWN_ITEM_ID; if( item_data ) nameid=item_data->nameid; }else - nameid=conv_num(st,data); + nameid = script_getnum(st, 7); if( (m=map_mapname2mapid(str))< 0){ script_pushint(st,-1); @@ -13425,19 +13373,13 @@ BUILDIN_FUNC(guardian) guardian=script_getnum(st,8); has_index = true; } else if( script_hasdata(st,7) ){ - struct script_data *data = script_getdata(st,7); - get_val(st,data); - if( data_isstring(data) ) + if( script_isstring(st, 7) ) {// "" evt=script_getstr(st,7); - } else if( data_isint(data) ) + } else {// guardian=script_getnum(st,7); has_index = true; - } else { - ShowError("script:guardian: invalid data type for argument #6 (from 1)\n"); - script_reportdata(data); - return SCRIPT_CMD_FAILURE; } } @@ -13538,18 +13480,15 @@ BUILDIN_FUNC(getitemname) unsigned short item_id = 0; struct item_data *i_data; char *item_name; - struct script_data *data; - data=script_getdata(st,2); - get_val(st,data); - - if( data_isstring(data) ){ - const char *name=conv_str(st,data); + if( script_isstring(st, 2) ){ + const char *name = script_getstr(st, 2); struct item_data *item_data = itemdb_searchname(name); + if( item_data ) item_id=item_data->nameid; }else - item_id=conv_num(st,data); + item_id = script_getnum(st, 2); i_data = itemdb_exists(item_id); if (i_data == NULL) @@ -14145,16 +14084,13 @@ BUILDIN_FUNC(petrecovery) BUILDIN_FUNC(petskillattack) { struct pet_data *pd; - struct script_data *data; TBL_PC *sd; int id = 0; if(!script_rid2sd(sd) || sd->pd == NULL) return SCRIPT_CMD_FAILURE; - data = script_getdata(st, 2); - get_val(st, data); - id = (data_isstring(data) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); + id = (script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); if (!id) { ShowError("buildin_petskillattack: Invalid skill defined!\n"); return SCRIPT_CMD_FAILURE; @@ -14181,16 +14117,13 @@ BUILDIN_FUNC(petskillattack) BUILDIN_FUNC(petskillattack2) { struct pet_data *pd; - struct script_data *data; TBL_PC *sd; int id = 0; if(!script_rid2sd(sd) || sd->pd == NULL) return SCRIPT_CMD_FAILURE; - data = script_getdata(st, 2); - get_val(st, data); - id = (data_isstring(data) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); + id = (script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); if (!id) { ShowError("buildin_petskillattack2: Invalid skill defined!\n"); return SCRIPT_CMD_FAILURE; @@ -14217,16 +14150,13 @@ BUILDIN_FUNC(petskillattack2) BUILDIN_FUNC(petskillsupport) { struct pet_data *pd; - struct script_data *data; TBL_PC *sd; int id = 0; if(!script_rid2sd(sd) || sd->pd == NULL) return SCRIPT_CMD_FAILURE; - data = script_getdata(st, 2); - get_val(st, data); - id = (data_isstring(data) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); + id = (script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : skill_get_index(script_getnum(st,2))); if (!id) { ShowError("buildin_petskillsupport: Invalid skill defined!\n"); return SCRIPT_CMD_FAILURE; @@ -14268,15 +14198,11 @@ BUILDIN_FUNC(skilleffect) { TBL_PC *sd; uint16 skill_id, skill_lv; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS; - data = script_getdata(st, 2); - - get_val(st, data); // Convert into value in case of a variable - skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + skill_id = ( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); skill_lv = script_getnum(st,3); /* Ensure we're standing because the following packet causes the client to virtually set the char to stand, @@ -14300,10 +14226,8 @@ BUILDIN_FUNC(npcskilleffect) struct block_list *bl= map_id2bl(st->oid); uint16 skill_id, skill_lv; int x, y; - struct script_data *data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - skill_id=( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + skill_id=( script_isstring(st, 2) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); skill_lv=script_getnum(st,3); x=script_getnum(st,4); y=script_getnum(st,5); @@ -14579,10 +14503,8 @@ BUILDIN_FUNC(recovery) case 4: { struct s_mapiterator *iter; - struct script_data *data = script_getdata(st, 3); - get_val(st, data); // Convert into value in case of a variable - if(script_hasdata(st,3) && !data_isstring(data)) + if(script_hasdata(st,3) && script_isint(st, 3)) revive = script_getnum(st,3); // recovery 4,; iter = mapit_getallusers(); for (sd = (TBL_PC*)mapit_first(iter); mapit_exists(iter); sd = (TBL_PC*)mapit_next(iter)) { @@ -16259,10 +16181,7 @@ BUILDIN_FUNC(replacestr) } if(script_hasdata(st, 5)) { - struct script_data *data = script_getdata(st, 5); - - get_val(st, data); // Convert into value in case of a variable - if( !data_isstring(data) ) + if( script_isint(st, 5) ) usecase = script_getnum(st, 5) != 0; else { ShowError("script:replacestr: Invalid usecase value. Expected int got string\n"); @@ -16343,11 +16262,7 @@ BUILDIN_FUNC(countstr) } if(script_hasdata(st, 4)) { - struct script_data *data; - - data = script_getdata(st, 4); - get_val(st, data); // Convert into value in case of a variable - if( !data_isstring(data) ) + if( script_isint(st, 4) ) usecase = script_getnum(st, 4) != 0; else { ShowError("script:countstr: Invalid usecase value. Expected int got string\n"); @@ -16392,28 +16307,19 @@ BUILDIN_FUNC(setnpcdisplay) const char* name; const char* newname = NULL; int class_ = JT_FAKENPC, size = -1; - struct script_data* data; struct npc_data* nd; name = script_getstr(st,2); - data = script_getdata(st,3); if( script_hasdata(st,4) ) class_ = script_getnum(st,4); if( script_hasdata(st,5) ) size = script_getnum(st,5); - get_val(st, data); - if( data_isstring(data) ) - newname = conv_str(st,data); - else if( data_isint(data) ) - class_ = conv_num(st,data); + if( script_isstring(st, 3) ) + newname = script_getstr(st, 3); else - { - ShowError("script:setnpcdisplay: expected string or number\n"); - script_reportdata(data); - return SCRIPT_CMD_FAILURE; - } + class_ = script_getnum(st, 3); nd = npc_name2id(name); if( nd == NULL ) @@ -16981,13 +16887,10 @@ BUILDIN_FUNC(setitemscript) BUILDIN_FUNC(addmonsterdrop) { struct mob_db *mob; - struct script_data *data; unsigned short item_id; int rate; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - if(data_isstring(data)) + if(script_isstring(st, 2)) mob = mob_db(mobdb_searchname(script_getstr(st,2))); else mob = mob_db(script_getnum(st,2)); @@ -17039,12 +16942,9 @@ BUILDIN_FUNC(addmonsterdrop) BUILDIN_FUNC(delmonsterdrop) { struct mob_db *mob; - struct script_data *data; unsigned short item_id; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - if(data_isstring(data)) + if(script_isstring(st, 2)) mob = mob_db(mobdb_searchname(script_getstr(st,2))); else mob = mob_db(script_getnum(st,2)); @@ -17715,7 +17615,6 @@ BUILDIN_FUNC(getunitdata) BUILDIN_FUNC(setunitdata) { struct block_list* bl = NULL; - struct script_data* data; const char *mapname = NULL; TBL_MOB* md = NULL; TBL_HOM* hd = NULL; @@ -17751,17 +17650,11 @@ BUILDIN_FUNC(setunitdata) } type = script_getnum(st, 3); - data = script_getdata(st, 4); - get_val(st, data); - if (type == 5 && data_isstring(data)) - mapname = conv_str(st, data); - else if (data_isint(data)) - value = conv_num(st, data); - else { - ShowError("buildin_setunitdata: Invalid data type for argument #3 (%d).\n", data->type); - return SCRIPT_CMD_FAILURE; - } + if (type == 5 && script_isstring(st, 4)) + mapname = script_getstr(st, 4); + else + value = script_getnum(st, 4); switch (bl->type) { case BL_MOB: @@ -18353,7 +18246,6 @@ BUILDIN_FUNC(unitattack) { struct block_list* unit_bl; struct block_list* target_bl = NULL; - struct script_data* data; int actiontype = 0; if (!script_rid2bl(2,unit_bl)) { @@ -18361,15 +18253,12 @@ BUILDIN_FUNC(unitattack) return SCRIPT_CMD_FAILURE; } - data = script_getdata(st, 3); - get_val(st, data); - - if (data_isstring(data)) { - TBL_PC* sd = map_nick2sd(conv_str(st, data),false); + if (script_isstring(st, 3)) { + TBL_PC* sd = map_nick2sd(script_getstr(st, 3),false); if( sd != NULL ) target_bl = &sd->bl; } else - target_bl = map_id2bl(conv_num(st, data)); + target_bl = map_id2bl(script_getnum(st, 3)); if (!target_bl) { script_pushint(st, false); @@ -18508,12 +18397,23 @@ BUILDIN_FUNC(unitskilluseid) int unit_id, target_id, casttime; uint16 skill_id, skill_lv; struct block_list* bl; - struct script_data *data; unit_id = script_getnum(st,2); - data = script_getdata(st, 3); - get_val(st, data); // Convert into value in case of a variable - skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) ); + if (script_isstring(st, 3)) { + const char *name = script_getstr(st, 3); + + if (!(skill_id = skill_name2id(name))) { + ShowError("buildin_unitskilluseid: Invalid skill name %s passed to item bonus. Skipping.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + skill_id = script_getnum(st, 3); + + if (!skill_get_index(skill_id)) { + ShowError("buildin_unitskilluseid: Invalid skill ID %d passed to item bonus. Skipping.\n", skill_id); + return SCRIPT_CMD_FAILURE; + } + } skill_lv = script_getnum(st,4); target_id = ( script_hasdata(st,5) ? script_getnum(st,5) : unit_id ); casttime = ( script_hasdata(st,6) ? script_getnum(st,6) : 0 ); @@ -18540,11 +18440,22 @@ BUILDIN_FUNC(unitskillusepos) int skill_x, skill_y, casttime; uint16 skill_id, skill_lv; struct block_list* bl; - struct script_data *data; - data = script_getdata(st, 3); - get_val(st, data); // Convert into value in case of a variable - skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,3)) : script_getnum(st,3) ); + if (script_isstring(st, 3)) { + const char *name = script_getstr(st, 3); + + if (!(skill_id = skill_name2id(name))) { + ShowError("buildin_unitskillusepos: Invalid skill name %s.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + skill_id = script_getnum(st, 3); + + if (!skill_get_index(skill_id)) { + ShowError("buildin_unitskillusepos: Invalid skill ID %d.\n", skill_id); + return SCRIPT_CMD_FAILURE; + } + } skill_lv = script_getnum(st,4); skill_x = script_getnum(st,5); skill_y = script_getnum(st,6); @@ -20369,7 +20280,6 @@ static int buildin_mobuseskill_sub(struct block_list *bl,va_list ap) BUILDIN_FUNC(areamobuseskill) { struct block_list center; - struct script_data *data; int16 m; int range,mobid,skill_id,skill_lv,casttime,emotion,target,cancel; @@ -20383,9 +20293,21 @@ BUILDIN_FUNC(areamobuseskill) center.y = script_getnum(st,4); range = script_getnum(st,5); mobid = script_getnum(st,6); - data = script_getdata(st, 7); - get_val(st, data); // Convert into value in case of a variable - skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,7)) : script_getnum(st,7) ); + if (script_isstring(st, 7)) { + const char *name = script_getstr(st, 7); + + if (!(skill_id = skill_name2id(name))) { + ShowError("buildin_areamobuseskill: Invalid skill name %s.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + skill_id = script_getnum(st, 7); + + if (!skill_get_index(skill_id)) { + ShowError("buildin_areamobuseskill: Invalid skill ID %d.\n", skill_id); + return SCRIPT_CMD_FAILURE; + } + } if( (skill_lv = script_getnum(st,8)) > battle_config.mob_max_skilllvl ) skill_lv = battle_config.mob_max_skilllvl; @@ -20751,16 +20673,12 @@ BUILDIN_FUNC(getcharip) /* check if a character name is specified */ if( script_hasdata(st, 2) ) { - struct script_data *data; - - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - if (data_isstring(data)) + if (script_isstring(st, 2)) sd = map_nick2sd(script_getstr(st, 2),false); - else if (data_isint(data) || script_getnum(st, 2)) + else { - int id = 0; - id = script_getnum(st, 2); + int id = script_getnum(st, 2); + sd = (map_id2sd(id) ? map_id2sd(id) : map_charid2sd(id)); } } @@ -21113,14 +21031,25 @@ BUILDIN_FUNC(npcskill) unsigned int npc_level; struct npc_data *nd; struct map_session_data *sd; - struct script_data *data; if( !script_rid2sd(sd) ) return SCRIPT_CMD_SUCCESS; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - skill_id = data_isstring(data) ? skill_name2id(script_getstr(st, 2)) : script_getnum(st, 2); + if (script_isstring(st, 2)) { + const char *name = script_getstr(st, 2); + + if (!(skill_id = skill_name2id(name))) { + ShowError("buildin_npcskill: Invalid skill name %s.\n", name); + return SCRIPT_CMD_FAILURE; + } + } else { + skill_id = script_getnum(st, 2); + + if (!skill_get_index(skill_id)) { + ShowError("buildin_npcskill: Invalid skill ID %d.\n", skill_id); + return SCRIPT_CMD_FAILURE; + } + } skill_level = script_getnum(st, 3); stat_point = script_getnum(st, 4); npc_level = script_getnum(st, 5); @@ -21162,32 +21091,25 @@ BUILDIN_FUNC(npcskill) BUILDIN_FUNC(consumeitem) { TBL_PC *sd; - struct script_data *data; struct item_data *item_data; if (!script_charid2sd(3, sd)) return SCRIPT_CMD_FAILURE; - data = script_getdata( st, 2 ); - get_val( st, data ); - - if( data_isstring( data ) ){ - const char *name = conv_str( st, data ); + if( script_isstring(st, 2) ){ + const char *name = script_getstr(st, 2); if( ( item_data = itemdb_searchname( name ) ) == NULL ){ ShowError( "buildin_consumeitem: Nonexistant item %s requested.\n", name ); return SCRIPT_CMD_FAILURE; } - }else if( data_isint( data ) ){ - unsigned short nameid = conv_num( st, data ); + } else { + unsigned short nameid = script_getnum(st, 2); if( ( item_data = itemdb_exists( nameid ) ) == NULL ){ ShowError("buildin_consumeitem: Nonexistant item %hu requested.\n", nameid ); return SCRIPT_CMD_FAILURE; } - }else{ - ShowError("buildin_consumeitem: invalid data type for argument #1 (%d).\n", data->type ); - return SCRIPT_CMD_FAILURE; } run_script( item_data->script, 0, sd->bl.id, 0 ); @@ -21561,15 +21483,12 @@ BUILDIN_FUNC(montransform) { TBL_PC *sd; enum sc_type type; int tick, mob_id, val1, val2, val3, val4; - struct script_data *data; val1 = val2 = val3 = val4 = 0; if( !script_rid2sd(sd) ) return SCRIPT_CMD_FAILURE; - data = script_getdata(st, 2); - get_val(st, data); // Convert into value in case of a variable - if( data_isstring(data) ) + if( script_isstring(st, 2) ) mob_id = mobdb_searchname(script_getstr(st, 2)); else mob_id = mobdb_checkid(script_getnum(st, 2)); @@ -21582,7 +21501,7 @@ BUILDIN_FUNC(montransform) { type = SC_NONE; if (mob_id == 0) { - if( data_isstring(data) ) + if( script_isstring(st, 2) ) ShowWarning("buildin_montransform: Attempted to use non-existing monster '%s'.\n", script_getstr(st, 2)); else ShowWarning("buildin_montransform: Attempted to use non-existing monster of ID '%d'.\n", script_getnum(st, 2)); @@ -21913,21 +21832,18 @@ BUILDIN_FUNC(mergeitem2) { return SCRIPT_CMD_FAILURE; if (script_hasdata(st, 2)) { - struct script_data *data = script_getdata(st, 2); - get_val(st, data); - - if (data_isstring(data)) {// "" - const char *name = conv_str(st,data); + if (script_isstring(st, 2)) {// "" + const char *name = script_getstr(st, 2); struct item_data *id; + if (!(id = itemdb_searchname(name))) { ShowError("buildin_mergeitem2: Nonexistant item %s requested.\n", name); script_pushint(st, count); return SCRIPT_CMD_FAILURE; } nameid = id->nameid; - } - else if (data_isint(data)) {// - nameid = conv_num(st,data); + } else {// + nameid = script_getnum(st, 2); if (!itemdb_exists(nameid)) { ShowError("buildin_mergeitem: Nonexistant item %d requested.\n", nameid); script_pushint(st, count); @@ -22375,55 +22291,42 @@ BUILDIN_FUNC(navigateto){ BUILDIN_FUNC(adopt) { TBL_PC *sd, *b_sd; - struct script_data *data; enum adopt_responses response; - data = script_getdata(st, 2); - get_val(st, data); - - if (data_isstring(data)) { - const char *name = conv_str(st, data); + if (script_isstring(st, 2)) { + const char *name = script_getstr(st, 2); sd = map_nick2sd(name,false); if (sd == NULL) { ShowError("buildin_adopt: Non-existant parent character %s requested.\n", name); return SCRIPT_CMD_FAILURE; } - } else if (data_isint(data)) { - uint32 char_id = conv_num(st, data); + } else { + uint32 char_id = script_getnum(st, 2); sd = map_charid2sd(char_id); if (sd == NULL) { ShowError("buildin_adopt: Non-existant parent character %d requested.\n", char_id); return SCRIPT_CMD_FAILURE; } - } else { - ShowError("buildin_adopt: Invalid data type for argument #1 (%d).", data->type); - return SCRIPT_CMD_FAILURE; } - data = script_getdata(st, 3); - get_val(st, data); - - if (data_isstring(data)) { - const char *name = conv_str(st, data); + if (script_isstring(st, 3)) { + const char *name = script_getstr(st, 3); b_sd = map_nick2sd(name,false); if (b_sd == NULL) { ShowError("buildin_adopt: Non-existant baby character %s requested.\n", name); return SCRIPT_CMD_FAILURE; } - } else if (data_isint(data)) { - uint32 char_id = conv_num(st, data); + } else { + uint32 char_id = script_getnum(st, 3); b_sd = map_charid2sd(char_id); if (b_sd == NULL) { ShowError("buildin_adopt: Non-existant baby character %d requested.\n", char_id); return SCRIPT_CMD_FAILURE; } - } else { - ShowError("buildin_adopt: Invalid data type for argument #2 (%d).", data->type); - return SCRIPT_CMD_FAILURE; } response = pc_try_adopt(sd, map_charid2sd(sd->status.partner_id), b_sd); @@ -23295,21 +23198,22 @@ BUILDIN_FUNC(channel_unban) { BUILDIN_FUNC(channel_kick) { struct Channel *ch = NULL; const char *chname = script_getstr(st,2); - struct script_data *data = script_getdata(st,3); TBL_PC *tsd = NULL; int res = 1; - get_val(st, data); - if (data_isstring(data)) { - if (!(tsd = map_nick2sd(conv_str(st,data),false))) { - ShowError("buildin_channel_kick: Player with nick '%s' is not online\n", conv_str(st,data)); + if (script_isstring(st, 3)) { + const char *name = script_getstr(st, 3); + + if (!(tsd = map_nick2sd(name,false))) { + ShowError("buildin_channel_kick: Player with nick '%s' is not online\n", name); script_pushint(st,0); return SCRIPT_CMD_FAILURE; } - } - else { - if (!(tsd = map_charid2sd(conv_num(st,data)))) { - ShowError("buildin_channel_kick: Player with char_id '%d' is not online\n", conv_num(st,data)); + } else { + int char_id = script_getnum(st, 3); + + if (!(tsd = map_charid2sd(char_id))) { + ShowError("buildin_channel_kick: Player with char_id '%d' is not online\n", char_id); script_pushint(st,0); return SCRIPT_CMD_FAILURE; } diff --git a/src/map/script.hpp b/src/map/script.hpp index 303713831a..9a06555fa4 100644 --- a/src/map/script.hpp +++ b/src/map/script.hpp @@ -46,8 +46,8 @@ /// Pushes a copy of the data in the target index #define script_pushcopy(st,i) push_copy((st)->stack, (st)->start + (i)) -#define script_isstring(st,i) data_isstring(script_getdata(st,i)) -#define script_isint(st,i) data_isint(script_getdata(st,i)) +#define script_isstring(st,i) data_isstring(get_val(st, script_getdata(st,i))) +#define script_isint(st,i) data_isint(get_val(st, script_getdata(st,i))) #define script_getnum(st,val) conv_num(st, script_getdata(st,val)) #define script_getstr(st,val) conv_str(st, script_getdata(st,val))