From ac0d17f4aaef431f1db4ee89bf11cdf18c1d2cc7 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 4 Feb 2020 19:58:04 +0100 Subject: [PATCH] Corrected getfreecell command for flag 2 (#4491) * Little simplification of the code * Extends the target type for flag 2 to match the docs (target applicable for player, monster, pet, homunculus) Thanks to @Lemongrass3110 --- src/map/script.cpp | 77 +++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 49 deletions(-) diff --git a/src/map/script.cpp b/src/map/script.cpp index 47234c4f3e..1c11f5dcb0 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -19138,37 +19138,43 @@ BUILDIN_FUNC(setcell) */ BUILDIN_FUNC(getfreecell) { - const char *mapn = script_getstr(st, 2), *name; - char prefix; - struct map_session_data *sd; - int64 num; + const char *mapn = script_getstr(st, 2), *name_x, *name_y; + struct script_data + *data_x = script_getdata(st, 3), + *data_y = script_getdata(st, 4); + struct block_list* bl = map_id2bl(st->rid); + struct map_session_data *sd = nullptr; int16 m, x = 0, y = 0; int rx = -1, ry = -1, flag = 1; - sd = map_id2sd(st->rid); - - if (!data_isreference(script_getdata(st, 3))) { + if (!data_isreference(data_x)) { ShowWarning("script: buildin_getfreecell: rX is not a variable.\n"); - script_pushint(st, -1); return SCRIPT_CMD_FAILURE; } - - if (!data_isreference(script_getdata(st, 4))) { + if (!data_isreference(data_y)) { ShowWarning("script: buildin_getfreecell: rY is not a variable.\n"); - script_pushint(st, -1); return SCRIPT_CMD_FAILURE; } + name_x = reference_getname(data_x), + name_y = reference_getname(data_y); - if (is_string_variable(reference_getname(script_getdata(st, 3)))) { + if (is_string_variable(name_x)) { ShowWarning("script: buildin_getfreecell: rX is a string, must be an INT.\n"); - script_pushint(st, -1); + return SCRIPT_CMD_FAILURE; + } + if (is_string_variable(name_y)) { + ShowWarning("script: buildin_getfreecell: rY is a string, must be an INT.\n"); return SCRIPT_CMD_FAILURE; } - if (is_string_variable(reference_getname(script_getdata(st, 4)))) { - ShowWarning("script: buildin_getfreecell: rY is a string, must be an INT.\n"); - script_pushint(st, -1); - return SCRIPT_CMD_FAILURE; + if (not_server_variable(*name_x) || not_server_variable(*name_y)) { + if (!script_rid2sd(sd)) { + if (not_server_variable(*name_x)) + ShowError( "buildin_getfreecell: variable '%s' for mapX is not a server variable, but no player is attached!", name_x ); + else + ShowError( "buildin_getfreecell: variable '%s' for mapY is not a server variable, but no player is attached!", name_y ); + return SCRIPT_CMD_FAILURE; + } } if (script_hasdata(st, 5)) @@ -19186,42 +19192,15 @@ BUILDIN_FUNC(getfreecell) if (script_hasdata(st, 9)) flag = script_getnum(st, 9); - if (sd && strcmp(mapn, "this") == 0) - m = sd->bl.m; + if (bl && strcmp(mapn, "this") == 0) + m = bl->m; else m = map_mapname2mapid(mapn); - map_search_freecell(NULL, m, &x, &y, rx, ry, flag); + map_search_freecell(bl, m, &x, &y, rx, ry, flag); - // Set MapX - num = st->stack->stack_data[st->start + 3].u.num; - name = get_str(num&0x00ffffff); - prefix = *name; - - if (not_server_variable(prefix)){ - if( !script_rid2sd(sd) ){ - ShowError( "buildin_getfreecell: variable '%s' for mapX is not a server variable, but no player is attached!", name ); - return SCRIPT_CMD_FAILURE; - } - }else - sd = NULL; - - set_reg_num( st, sd, num, name, x, script_getref( st, 3 ) ); - - // Set MapY - num = st->stack->stack_data[st->start + 4].u.num; - name = get_str(num&0x00ffffff); - prefix = *name; - - if (not_server_variable(prefix)){ - if( !script_rid2sd(sd) ){ - ShowError( "buildin_getfreecell: variable '%s' for mapY is not a server variable, but no player is attached!", name ); - return SCRIPT_CMD_FAILURE; - } - }else - sd = NULL; - - set_reg_num( st, sd, num, name, y, script_getref( st, 4 ) ); + set_reg_num(st, sd, reference_getuid(data_x), name_x, x, data_x->ref); + set_reg_num(st, sd, reference_getuid(data_y), name_y, y, data_y->ref); return SCRIPT_CMD_SUCCESS; }