aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/lua_api')
-rw-r--r--src/script/lua_api/l_mainmenu.cpp217
-rw-r--r--src/script/lua_api/l_mainmenu.h6
-rw-r--r--src/script/lua_api/l_mapgen.cpp13
-rw-r--r--src/script/lua_api/l_object.cpp46
-rw-r--r--src/script/lua_api/l_server.cpp124
-rw-r--r--src/script/lua_api/l_server.h2
-rw-r--r--src/script/lua_api/l_settings.cpp2
-rw-r--r--src/script/lua_api/l_util.cpp13
-rw-r--r--src/script/lua_api/l_util.h3
9 files changed, 120 insertions, 306 deletions
diff --git a/src/script/lua_api/l_mainmenu.cpp b/src/script/lua_api/l_mainmenu.cpp
index 3ea5eb4ba..4d437b967 100644
--- a/src/script/lua_api/l_mainmenu.cpp
+++ b/src/script/lua_api/l_mainmenu.cpp
@@ -275,207 +275,6 @@ int ModApiMainMenu::l_get_worlds(lua_State *L)
}
/******************************************************************************/
-int ModApiMainMenu::l_get_favorites(lua_State *L)
-{
- std::string listtype = "local";
-
- if (!lua_isnone(L, 1)) {
- listtype = luaL_checkstring(L, 1);
- }
-
- std::vector<ServerListSpec> servers;
-
- if(listtype == "online") {
- servers = ServerList::getOnline();
- } else {
- servers = ServerList::getLocal();
- }
-
- lua_newtable(L);
- int top = lua_gettop(L);
- unsigned int index = 1;
-
- for (const Json::Value &server : servers) {
-
- lua_pushnumber(L, index);
-
- lua_newtable(L);
- int top_lvl2 = lua_gettop(L);
-
- if (!server["clients"].asString().empty()) {
- std::string clients_raw = server["clients"].asString();
- char* endptr = 0;
- int numbervalue = strtol(clients_raw.c_str(), &endptr,10);
-
- if ((!clients_raw.empty()) && (*endptr == 0)) {
- lua_pushstring(L, "clients");
- lua_pushnumber(L, numbervalue);
- lua_settable(L, top_lvl2);
- }
- }
-
- if (!server["clients_max"].asString().empty()) {
-
- std::string clients_max_raw = server["clients_max"].asString();
- char* endptr = 0;
- int numbervalue = strtol(clients_max_raw.c_str(), &endptr,10);
-
- if ((!clients_max_raw.empty()) && (*endptr == 0)) {
- lua_pushstring(L, "clients_max");
- lua_pushnumber(L, numbervalue);
- lua_settable(L, top_lvl2);
- }
- }
-
- if (!server["version"].asString().empty()) {
- lua_pushstring(L, "version");
- std::string topush = server["version"].asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["proto_min"].asString().empty()) {
- lua_pushstring(L, "proto_min");
- lua_pushinteger(L, server["proto_min"].asInt());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["proto_max"].asString().empty()) {
- lua_pushstring(L, "proto_max");
- lua_pushinteger(L, server["proto_max"].asInt());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["password"].asString().empty()) {
- lua_pushstring(L, "password");
- lua_pushboolean(L, server["password"].asBool());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["creative"].asString().empty()) {
- lua_pushstring(L, "creative");
- lua_pushboolean(L, server["creative"].asBool());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["damage"].asString().empty()) {
- lua_pushstring(L, "damage");
- lua_pushboolean(L, server["damage"].asBool());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["pvp"].asString().empty()) {
- lua_pushstring(L, "pvp");
- lua_pushboolean(L, server["pvp"].asBool());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["description"].asString().empty()) {
- lua_pushstring(L, "description");
- std::string topush = server["description"].asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["name"].asString().empty()) {
- lua_pushstring(L, "name");
- std::string topush = server["name"].asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["address"].asString().empty()) {
- lua_pushstring(L, "address");
- std::string topush = server["address"].asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl2);
- }
-
- if (!server["port"].asString().empty()) {
- lua_pushstring(L, "port");
- std::string topush = server["port"].asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl2);
- }
-
- if (server.isMember("ping")) {
- float ping = server["ping"].asFloat();
- lua_pushstring(L, "ping");
- lua_pushnumber(L, ping);
- lua_settable(L, top_lvl2);
- }
-
- if (server["clients_list"].isArray()) {
- unsigned int index_lvl2 = 1;
- lua_pushstring(L, "clients_list");
- lua_newtable(L);
- int top_lvl3 = lua_gettop(L);
- for (const Json::Value &client : server["clients_list"]) {
- lua_pushnumber(L, index_lvl2);
- std::string topush = client.asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl3);
- index_lvl2++;
- }
- lua_settable(L, top_lvl2);
- }
-
- if (server["mods"].isArray()) {
- unsigned int index_lvl2 = 1;
- lua_pushstring(L, "mods");
- lua_newtable(L);
- int top_lvl3 = lua_gettop(L);
- for (const Json::Value &mod : server["mods"]) {
-
- lua_pushnumber(L, index_lvl2);
- std::string topush = mod.asString();
- lua_pushstring(L, topush.c_str());
- lua_settable(L, top_lvl3);
- index_lvl2++;
- }
- lua_settable(L, top_lvl2);
- }
-
- lua_settable(L, top);
- index++;
- }
- return 1;
-}
-
-/******************************************************************************/
-int ModApiMainMenu::l_delete_favorite(lua_State *L)
-{
- std::vector<ServerListSpec> servers;
-
- std::string listtype = "local";
-
- if (!lua_isnone(L,2)) {
- listtype = luaL_checkstring(L,2);
- }
-
- if ((listtype != "local") &&
- (listtype != "online"))
- return 0;
-
-
- if(listtype == "online") {
- servers = ServerList::getOnline();
- } else {
- servers = ServerList::getLocal();
- }
-
- int fav_idx = luaL_checkinteger(L,1) -1;
-
- if ((fav_idx >= 0) &&
- (fav_idx < (int) servers.size())) {
-
- ServerList::deleteEntry(servers[fav_idx]);
- }
-
- return 0;
-}
-
-/******************************************************************************/
int ModApiMainMenu::l_get_games(lua_State *L)
{
std::vector<SubgameSpec> games = getAvailableGames();
@@ -730,6 +529,7 @@ int ModApiMainMenu::l_get_texturepath(lua_State *L)
return 1;
}
+/******************************************************************************/
int ModApiMainMenu::l_get_texturepath_share(lua_State *L)
{
std::string gamepath = fs::RemoveRelativePathComponents(
@@ -738,6 +538,7 @@ int ModApiMainMenu::l_get_texturepath_share(lua_State *L)
return 1;
}
+/******************************************************************************/
int ModApiMainMenu::l_get_cache_path(lua_State *L)
{
lua_pushstring(L, fs::RemoveRelativePathComponents(porting::path_cache).c_str());
@@ -745,6 +546,13 @@ int ModApiMainMenu::l_get_cache_path(lua_State *L)
}
/******************************************************************************/
+int ModApiMainMenu::l_get_temp_path(lua_State *L)
+{
+ lua_pushstring(L, fs::TempPath().c_str());
+ return 1;
+}
+
+/******************************************************************************/
int ModApiMainMenu::l_create_dir(lua_State *L) {
const char *path = luaL_checkstring(L, 1);
@@ -1133,11 +941,9 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
API_FCT(get_content_info);
API_FCT(start);
API_FCT(close);
- API_FCT(get_favorites);
API_FCT(show_keys_menu);
API_FCT(create_world);
API_FCT(delete_world);
- API_FCT(delete_favorite);
API_FCT(set_background);
API_FCT(set_topleft_text);
API_FCT(get_mapgen_names);
@@ -1148,6 +954,7 @@ void ModApiMainMenu::Initialize(lua_State *L, int top)
API_FCT(get_texturepath);
API_FCT(get_texturepath_share);
API_FCT(get_cache_path);
+ API_FCT(get_temp_path);
API_FCT(create_dir);
API_FCT(delete_dir);
API_FCT(copy_dir);
@@ -1173,7 +980,6 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
{
API_FCT(get_worlds);
API_FCT(get_games);
- API_FCT(get_favorites);
API_FCT(get_mapgen_names);
API_FCT(get_user_path);
API_FCT(get_modpath);
@@ -1182,6 +988,7 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
API_FCT(get_texturepath);
API_FCT(get_texturepath_share);
API_FCT(get_cache_path);
+ API_FCT(get_temp_path);
API_FCT(create_dir);
API_FCT(delete_dir);
API_FCT(copy_dir);
@@ -1189,5 +996,7 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
//API_FCT(extract_zip); //TODO remove dependency to GuiEngine
API_FCT(may_modify_path);
API_FCT(download_file);
+ API_FCT(get_min_supp_proto);
+ API_FCT(get_max_supp_proto);
//API_FCT(gettext); (gettext lib isn't threadsafe)
}
diff --git a/src/script/lua_api/l_mainmenu.h b/src/script/lua_api/l_mainmenu.h
index 0b02ed892..49ce7c251 100644
--- a/src/script/lua_api/l_mainmenu.h
+++ b/src/script/lua_api/l_mainmenu.h
@@ -74,10 +74,6 @@ private:
static int l_get_mapgen_names(lua_State *L);
- static int l_get_favorites(lua_State *L);
-
- static int l_delete_favorite(lua_State *L);
-
static int l_gettext(lua_State *L);
//packages
@@ -126,6 +122,8 @@ private:
static int l_get_cache_path(lua_State *L);
+ static int l_get_temp_path(lua_State *L);
+
static int l_create_dir(lua_State *L);
static int l_delete_dir(lua_State *L);
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 834938e56..12a497b1e 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -873,9 +873,6 @@ int ModApiMapgen::l_set_mapgen_params(lua_State *L)
if (lua_isnumber(L, -1))
settingsmgr->setMapSetting("chunksize", readParam<std::string>(L, -1), true);
- warn_if_field_exists(L, 1, "flagmask",
- "Obsolete: flags field now includes unset flags.");
-
lua_getfield(L, 1, "flags");
if (lua_isstring(L, -1))
settingsmgr->setMapSetting("mg_flags", readParam<std::string>(L, -1), true);
@@ -985,7 +982,7 @@ int ModApiMapgen::l_set_noiseparams(lua_State *L)
bool set_default = !lua_isboolean(L, 3) || readParam<bool>(L, 3);
- g_settings->setNoiseParams(name, np, set_default);
+ Settings::getLayer(set_default ? SL_DEFAULTS : SL_GLOBAL)->setNoiseParams(name, np);
return 0;
}
@@ -1338,11 +1335,9 @@ int ModApiMapgen::l_register_ore(lua_State *L)
lua_getfield(L, index, "noise_params");
if (read_noiseparams(L, -1, &ore->np)) {
ore->flags |= OREFLAG_USE_NOISE;
- } else if (ore->NEEDS_NOISE) {
- errorstream << "register_ore: specified ore type requires valid "
- "'noise_params' parameter" << std::endl;
- delete ore;
- return 0;
+ } else if (ore->needs_noise) {
+ log_deprecated(L,
+ "register_ore: ore type requires 'noise_params' but it is not specified, falling back to defaults");
}
lua_pop(L, 1);
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index f52e4892e..07aa3f7c9 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -355,6 +355,15 @@ int ObjectRef::l_set_armor_groups(lua_State *L)
ItemGroupList groups;
read_groups(L, 2, groups);
+ if (sao->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
+ if (!g_settings->getBool("enable_damage") && !itemgroup_get(groups, "immortal")) {
+ warningstream << "Mod tried to enable damage for a player, but it's "
+ "disabled globally. Ignoring." << std::endl;
+ infostream << script_get_backtrace(L) << std::endl;
+ groups["immortal"] = 1;
+ }
+ }
+
sao->setArmorGroups(groups);
return 0;
}
@@ -399,7 +408,7 @@ int ObjectRef::l_get_animation(lua_State *L)
if (sao == nullptr)
return 0;
- v2f frames = v2f(1,1);
+ v2f frames = v2f(1, 1);
float frame_speed = 15;
float frame_blend = 0;
bool frame_loop = true;
@@ -463,8 +472,8 @@ int ObjectRef::l_set_eye_offset(lua_State *L)
if (player == nullptr)
return 0;
- v3f offset_first = read_v3f(L, 2);
- v3f offset_third = read_v3f(L, 3);
+ v3f offset_first = readParam<v3f>(L, 2, v3f(0, 0, 0));
+ v3f offset_third = readParam<v3f>(L, 3, v3f(0, 0, 0));
// Prevent abuse of offset values (keep player always visible)
offset_third.X = rangelim(offset_third.X,-10,10);
@@ -537,9 +546,9 @@ int ObjectRef::l_set_bone_position(lua_State *L)
if (sao == nullptr)
return 0;
- std::string bone = readParam<std::string>(L, 2);
- v3f position = check_v3f(L, 3);
- v3f rotation = check_v3f(L, 4);
+ std::string bone = readParam<std::string>(L, 2, "");
+ v3f position = readParam<v3f>(L, 3, v3f(0, 0, 0));
+ v3f rotation = readParam<v3f>(L, 4, v3f(0, 0, 0));
sao->setBonePosition(bone, position, rotation);
return 0;
@@ -554,7 +563,7 @@ int ObjectRef::l_get_bone_position(lua_State *L)
if (sao == nullptr)
return 0;
- std::string bone = readParam<std::string>(L, 2);
+ std::string bone = readParam<std::string>(L, 2, "");
v3f position = v3f(0, 0, 0);
v3f rotation = v3f(0, 0, 0);
@@ -578,10 +587,10 @@ int ObjectRef::l_set_attach(lua_State *L)
if (sao == parent)
throw LuaError("ObjectRef::set_attach: attaching object to itself is not allowed.");
- int parent_id = 0;
+ int parent_id;
std::string bone;
- v3f position = v3f(0, 0, 0);
- v3f rotation = v3f(0, 0, 0);
+ v3f position;
+ v3f rotation;
bool force_visible;
sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible);
@@ -590,9 +599,9 @@ int ObjectRef::l_set_attach(lua_State *L)
old_parent->removeAttachmentChild(sao->getId());
}
- bone = readParam<std::string>(L, 3, "");
- position = read_v3f(L, 4);
- rotation = read_v3f(L, 5);
+ bone = readParam<std::string>(L, 3, "");
+ position = readParam<v3f>(L, 4, v3f(0, 0, 0));
+ rotation = readParam<v3f>(L, 5, v3f(0, 0, 0));
force_visible = readParam<bool>(L, 6, false);
sao->setAttachment(parent->getId(), bone, position, rotation, force_visible);
@@ -609,10 +618,10 @@ int ObjectRef::l_get_attach(lua_State *L)
if (sao == nullptr)
return 0;
- int parent_id = 0;
+ int parent_id;
std::string bone;
- v3f position = v3f(0, 0, 0);
- v3f rotation = v3f(0, 0, 0);
+ v3f position;
+ v3f rotation;
bool force_visible;
sao->getAttachment(&parent_id, &bone, &position, &rotation, &force_visible);
@@ -892,9 +901,6 @@ int ObjectRef::l_set_yaw(lua_State *L)
if (entitysao == nullptr)
return 0;
- if (isNaN(L, 2))
- throw LuaError("ObjectRef::set_yaw: NaN value is not allowed.");
-
float yaw = readParam<float>(L, 2) * core::RADTODEG;
entitysao->setRotation(v3f(0, yaw, 0));
@@ -2199,7 +2205,7 @@ int ObjectRef::l_set_minimap_modes(lua_State *L)
luaL_checktype(L, 2, LUA_TTABLE);
std::vector<MinimapMode> modes;
- s16 selected_mode = luaL_checkint(L, 3);
+ s16 selected_mode = readParam<s16>(L, 3);
lua_pushnil(L);
while (lua_next(L, 2) != 0) {
diff --git a/src/script/lua_api/l_server.cpp b/src/script/lua_api/l_server.cpp
index 64ae924d2..026f5282c 100644
--- a/src/script/lua_api/l_server.cpp
+++ b/src/script/lua_api/l_server.cpp
@@ -44,7 +44,7 @@ int ModApiServer::l_request_shutdown(lua_State *L)
int ModApiServer::l_get_server_status(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- lua_pushstring(L, wide_to_narrow(getServer(L)->getStatusString()).c_str());
+ lua_pushstring(L, getServer(L)->getStatusString().c_str());
return 1;
}
@@ -116,24 +116,18 @@ int ModApiServer::l_get_player_privs(lua_State *L)
int ModApiServer::l_get_player_ip(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- const char * name = luaL_checkstring(L, 1);
- RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
- if(player == NULL)
- {
+
+ Server *server = getServer(L);
+
+ const char *name = luaL_checkstring(L, 1);
+ RemotePlayer *player = server->getEnv().getPlayer(name);
+ if (!player) {
lua_pushnil(L); // no such player
return 1;
}
- try
- {
- Address addr = getServer(L)->getPeerAddress(player->getPeerId());
- std::string ip_str = addr.serializeString();
- lua_pushstring(L, ip_str.c_str());
- return 1;
- } catch (const con::PeerNotFoundException &) {
- dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
- lua_pushnil(L); // error
- return 1;
- }
+
+ lua_pushstring(L, server->getPeerAddress(player->getPeerId()).serializeString().c_str());
+ return 1;
}
// get_player_information(name)
@@ -150,26 +144,18 @@ int ModApiServer::l_get_player_information(lua_State *L)
return 1;
}
- Address addr;
- try {
- addr = server->getPeerAddress(player->getPeerId());
- } catch (const con::PeerNotFoundException &) {
- dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
- lua_pushnil(L); // error
- return 1;
- }
-
- float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter;
- ClientState state;
- u32 uptime;
- u16 prot_vers;
- u8 ser_vers, major, minor, patch;
- std::string vers_string, lang_code;
+ /*
+ Be careful not to introduce a depdendency on the connection to
+ the peer here. This function is >>REQUIRED<< to still be able to return
+ values even when the peer unexpectedly disappears.
+ Hence all the ConInfo values here are optional.
+ */
auto getConInfo = [&] (con::rtt_stat_type type, float *value) -> bool {
return server->getClientConInfo(player->getPeerId(), type, value);
};
+ float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter;
bool have_con_info =
getConInfo(con::MIN_RTT, &min_rtt) &&
getConInfo(con::MAX_RTT, &max_rtt) &&
@@ -178,11 +164,9 @@ int ModApiServer::l_get_player_information(lua_State *L)
getConInfo(con::MAX_JITTER, &max_jitter) &&
getConInfo(con::AVG_JITTER, &avg_jitter);
- bool r = server->getClientInfo(player->getPeerId(), &state, &uptime,
- &ser_vers, &prot_vers, &major, &minor, &patch, &vers_string,
- &lang_code);
- if (!r) {
- dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
+ ClientInfo info;
+ if (!server->getClientInfo(player->getPeerId(), info)) {
+ warningstream << FUNCTION_NAME << ": no client info?!" << std::endl;
lua_pushnil(L); // error
return 1;
}
@@ -191,13 +175,13 @@ int ModApiServer::l_get_player_information(lua_State *L)
int table = lua_gettop(L);
lua_pushstring(L,"address");
- lua_pushstring(L, addr.serializeString().c_str());
+ lua_pushstring(L, info.addr.serializeString().c_str());
lua_settable(L, table);
lua_pushstring(L,"ip_version");
- if (addr.getFamily() == AF_INET) {
+ if (info.addr.getFamily() == AF_INET) {
lua_pushnumber(L, 4);
- } else if (addr.getFamily() == AF_INET6) {
+ } else if (info.addr.getFamily() == AF_INET6) {
lua_pushnumber(L, 6);
} else {
lua_pushnumber(L, 0);
@@ -231,11 +215,11 @@ int ModApiServer::l_get_player_information(lua_State *L)
}
lua_pushstring(L,"connection_uptime");
- lua_pushnumber(L, uptime);
+ lua_pushnumber(L, info.uptime);
lua_settable(L, table);
lua_pushstring(L,"protocol_version");
- lua_pushnumber(L, prot_vers);
+ lua_pushnumber(L, info.prot_vers);
lua_settable(L, table);
lua_pushstring(L, "formspec_version");
@@ -243,32 +227,32 @@ int ModApiServer::l_get_player_information(lua_State *L)
lua_settable(L, table);
lua_pushstring(L, "lang_code");
- lua_pushstring(L, lang_code.c_str());
+ lua_pushstring(L, info.lang_code.c_str());
lua_settable(L, table);
#ifndef NDEBUG
lua_pushstring(L,"serialization_version");
- lua_pushnumber(L, ser_vers);
+ lua_pushnumber(L, info.ser_vers);
lua_settable(L, table);
lua_pushstring(L,"major");
- lua_pushnumber(L, major);
+ lua_pushnumber(L, info.major);
lua_settable(L, table);
lua_pushstring(L,"minor");
- lua_pushnumber(L, minor);
+ lua_pushnumber(L, info.minor);
lua_settable(L, table);
lua_pushstring(L,"patch");
- lua_pushnumber(L, patch);
+ lua_pushnumber(L, info.patch);
lua_settable(L, table);
lua_pushstring(L,"version_string");
- lua_pushstring(L, vers_string.c_str());
+ lua_pushstring(L, info.vers_string.c_str());
lua_settable(L, table);
lua_pushstring(L,"state");
- lua_pushstring(L,ClientInterface::state2Name(state).c_str());
+ lua_pushstring(L, ClientInterface::state2Name(info.state).c_str());
lua_settable(L, table);
#endif
@@ -296,23 +280,18 @@ int ModApiServer::l_get_ban_description(lua_State *L)
int ModApiServer::l_ban_player(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- const char * name = luaL_checkstring(L, 1);
- RemotePlayer *player = dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name);
- if (player == NULL) {
+
+ Server *server = getServer(L);
+
+ const char *name = luaL_checkstring(L, 1);
+ RemotePlayer *player = server->getEnv().getPlayer(name);
+ if (!player) {
lua_pushboolean(L, false); // no such player
return 1;
}
- try
- {
- Address addr = getServer(L)->getPeerAddress(
- dynamic_cast<ServerEnvironment *>(getEnv(L))->getPlayer(name)->getPeerId());
- std::string ip_str = addr.serializeString();
- getServer(L)->setIpBanned(ip_str, name);
- } catch(const con::PeerNotFoundException &) {
- dstream << FUNCTION_NAME << ": peer was not found" << std::endl;
- lua_pushboolean(L, false); // error
- return 1;
- }
+
+ std::string ip_str = server->getPeerAddress(player->getPeerId()).serializeString();
+ server->setIpBanned(ip_str, name);
lua_pushboolean(L, true);
return 1;
}
@@ -474,19 +453,30 @@ int ModApiServer::l_sound_fade(lua_State *L)
}
// dynamic_add_media(filepath)
-int ModApiServer::l_dynamic_add_media(lua_State *L)
+int ModApiServer::l_dynamic_add_media_raw(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- // Reject adding media before the server has started up
if (!getEnv(L))
throw LuaError("Dynamic media cannot be added before server has started up");
std::string filepath = readParam<std::string>(L, 1);
CHECK_SECURE_PATH(L, filepath.c_str(), false);
- bool ok = getServer(L)->dynamicAddMedia(filepath);
- lua_pushboolean(L, ok);
+ std::vector<RemotePlayer*> sent_to;
+ bool ok = getServer(L)->dynamicAddMedia(filepath, sent_to);
+ if (ok) {
+ // (see wrapper code in builtin)
+ lua_createtable(L, sent_to.size(), 0);
+ int i = 0;
+ for (RemotePlayer *player : sent_to) {
+ lua_pushstring(L, player->getName());
+ lua_rawseti(L, -2, ++i);
+ }
+ } else {
+ lua_pushboolean(L, false);
+ }
+
return 1;
}
@@ -554,7 +544,7 @@ void ModApiServer::Initialize(lua_State *L, int top)
API_FCT(sound_play);
API_FCT(sound_stop);
API_FCT(sound_fade);
- API_FCT(dynamic_add_media);
+ API_FCT(dynamic_add_media_raw);
API_FCT(get_player_information);
API_FCT(get_player_privs);
diff --git a/src/script/lua_api/l_server.h b/src/script/lua_api/l_server.h
index 938bfa8ef..2df180b17 100644
--- a/src/script/lua_api/l_server.h
+++ b/src/script/lua_api/l_server.h
@@ -71,7 +71,7 @@ private:
static int l_sound_fade(lua_State *L);
// dynamic_add_media(filepath)
- static int l_dynamic_add_media(lua_State *L);
+ static int l_dynamic_add_media_raw(lua_State *L);
// get_player_privs(name, text)
static int l_get_player_privs(lua_State *L);
diff --git a/src/script/lua_api/l_settings.cpp b/src/script/lua_api/l_settings.cpp
index 33eb02392..bcbaf15fa 100644
--- a/src/script/lua_api/l_settings.cpp
+++ b/src/script/lua_api/l_settings.cpp
@@ -197,7 +197,7 @@ int LuaSettings::l_set_np_group(lua_State *L)
SET_SECURITY_CHECK(L, key);
- o->m_settings->setNoiseParams(key, value, false);
+ o->m_settings->setNoiseParams(key, value);
return 0;
}
diff --git a/src/script/lua_api/l_util.cpp b/src/script/lua_api/l_util.cpp
index e2730c6d9..60ae7871c 100644
--- a/src/script/lua_api/l_util.cpp
+++ b/src/script/lua_api/l_util.cpp
@@ -250,6 +250,17 @@ int ModApiUtil::l_get_builtin_path(lua_State *L)
return 1;
}
+// get_user_path()
+int ModApiUtil::l_get_user_path(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+
+ std::string path = porting::path_user;
+ lua_pushstring(L, path.c_str());
+
+ return 1;
+}
+
// compress(data, method, level)
int ModApiUtil::l_compress(lua_State *L)
{
@@ -486,6 +497,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(is_yes);
API_FCT(get_builtin_path);
+ API_FCT(get_user_path);
API_FCT(compress);
API_FCT(decompress);
@@ -544,6 +556,7 @@ void ModApiUtil::InitializeAsync(lua_State *L, int top)
API_FCT(is_yes);
API_FCT(get_builtin_path);
+ API_FCT(get_user_path);
API_FCT(compress);
API_FCT(decompress);
diff --git a/src/script/lua_api/l_util.h b/src/script/lua_api/l_util.h
index b6c1b58af..dbdd62b99 100644
--- a/src/script/lua_api/l_util.h
+++ b/src/script/lua_api/l_util.h
@@ -68,6 +68,9 @@ private:
// get_builtin_path()
static int l_get_builtin_path(lua_State *L);
+ // get_user_path()
+ static int l_get_user_path(lua_State *L);
+
// compress(data, method, ...)
static int l_compress(lua_State *L);