Pārlūkot izejas kodu

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
Atemo 5 gadi atpakaļ
vecāks
revīzija
ac0d17f4aa
1 mainītis faili ar 27 papildinājumiem un 48 dzēšanām
  1. 27 48
      src/map/script.cpp

+ 27 - 48
src/map/script.cpp

@@ -19138,39 +19138,45 @@ 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(reference_getname(script_getdata(st, 4)))) {
+	if (is_string_variable(name_y)) {
 		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))
 		x = script_getnum(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;
 }