Skip to content

Commit

Permalink
Added script command getfreecell
Browse files Browse the repository at this point in the history
* The command can randomly find a free cell on the given map and store the references to the found cell in the given variables.
* Check out the script commands documentation for more information.
Thanks to @Tokeiburu!
  • Loading branch information
aleos89 committed Apr 10, 2017
1 parent 425c0a6 commit 0c2ccc7
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 0 deletions.
16 changes: 16 additions & 0 deletions doc/script_commands.txt
Expand Up @@ -8285,6 +8285,22 @@ Example:

---------------------------------------

*getfreecell "<map name>",<rX>,<rY>{,<x>,<y>,<rangeX>,<rangeY>,<flag>};

Finds a free cell on the given map and stores the reference to the found cell
in <rX> and <rY>. Passing <x> and <y> with <rangeX> and <rangeY> allows for
searching within a specified area on the given map. The <flag> is a bitmask
and has the following possible values:
- 1 = Random cell on the map or from <x>,<y> range. (default)
- 2 = The target should be able to walk to the target tile.
- 4 = There shouldn't be any players around the target tile (use the no_spawn_on_player setting).

Examples:
getfreecell("prontera",.@x,.@y); // Find a random empty cell in Prontera and store it within .@x and .@y
getfreecell("prontera",.@x,.@y,150,150,5,5); // Find a random empty cell on 150,150 (with a range of 5x5) in Prontera and store it within .@x and .@y

---------------------------------------

*setwall "<map name>",<x>,<y>,<size>,<dir>,<shootable>,"<name>";
*delwall "<name>";

Expand Down
89 changes: 89 additions & 0 deletions src/map/script.c
Expand Up @@ -18434,6 +18434,94 @@ BUILDIN_FUNC(setcell)
return SCRIPT_CMD_SUCCESS;
}

/**
* Gets a free cell in the specified area.
* getfreecell "<map name>",<rX>,<rY>{,<x>,<y>,<rangeX>,<rangeY>,<flag>};
*/
BUILDIN_FUNC(getfreecell)
{
const char *mapn = script_getstr(st, 2), *name;
char prefix;
struct map_session_data *sd;
int64 num;
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))) {
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))) {
ShowWarning("script: buildin_getfreecell: rY is not a variable.\n");
script_pushint(st, -1);
return SCRIPT_CMD_FAILURE;
}

if (is_string_variable(reference_getname(script_getdata(st, 3)))) {
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)))) {
ShowWarning("script: buildin_getfreecell: rY is a string, must be an INT.\n");
script_pushint(st, -1);
return SCRIPT_CMD_FAILURE;
}

if (script_hasdata(st, 5))
x = script_getnum(st, 5);

if (script_hasdata(st, 6))
y = script_getnum(st, 6);

if (script_hasdata(st, 7))
rx = script_getnum(st, 7);

if (script_hasdata(st, 8))
ry = script_getnum(st, 8);

if (script_hasdata(st, 9))
flag = script_getnum(st, 9);

if (sd && strcmp(mapn, "this") == 0)
m = sd->bl.m;
else
m = map_mapname2mapid(mapn);

map_search_freecell(NULL, 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))
sd = script_rid2sd(st);
else
sd = NULL;

set_reg(st, sd, num, name, (void*)__64BPRTSIZE((int)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))
sd = script_rid2sd(st);
else
sd = NULL;

set_reg(st, sd, num, name, (void*)__64BPRTSIZE((int)y), script_getref(st, 4));

return SCRIPT_CMD_SUCCESS;
}

/*==========================================
* Mercenary Commands
*------------------------------------------*/
Expand Down Expand Up @@ -22720,6 +22808,7 @@ struct script_function buildin_func[] = {
BUILDIN_DEF(openauction,"?"),
BUILDIN_DEF(checkcell,"siii"),
BUILDIN_DEF(setcell,"siiiiii"),
BUILDIN_DEF(getfreecell,"srr?????"),
BUILDIN_DEF(setwall,"siiiiis"),
BUILDIN_DEF(delwall,"s"),
BUILDIN_DEF(searchitem,"rs"),
Expand Down

0 comments on commit 0c2ccc7

Please sign in to comment.