#include "mainmenumanager.h"
#include "map.h"
#include "util/string.h"
+#include "nodedef.h"
extern MainGameCallback *g_gamecallback;
return 1;
}
+// print(text)
+int ModApiClient::l_print(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ std::string text = luaL_checkstring(L, 1);
+ rawstream << text << std::endl;
+ return 0;
+}
+
// display_chat_message(message)
int ModApiClient::l_display_chat_message(lua_State *L)
{
int newTable = lua_gettop(L);
int index = 1;
std::list<std::string>::const_iterator iter;
- for (iter = plist.begin(); iter != plist.end(); iter++) {
+ for (iter = plist.begin(); iter != plist.end(); ++iter) {
lua_pushstring(L, (*iter).c_str());
lua_rawseti(L, newTable, index);
index++;
SimpleSoundSpec spec;
read_soundspec(L, 1, spec);
- float gain = 1.0;
+ float gain = 1.0f;
+ float pitch = 1.0f;
bool looped = false;
s32 handle;
if (lua_istable(L, 2)) {
getfloatfield(L, 2, "gain", gain);
+ getfloatfield(L, 2, "pitch", pitch);
getboolfield(L, 2, "loop", looped);
lua_getfield(L, 2, "pos");
if (!lua_isnil(L, -1)) {
v3f pos = read_v3f(L, -1) * BS;
lua_pop(L, 1);
- handle =
- sound->playSoundAt(spec.name, looped, gain * spec.gain, pos);
+ handle = sound->playSoundAt(
+ spec.name, looped, gain * spec.gain, pos, pitch);
lua_pushinteger(L, handle);
return 1;
}
}
- handle = sound->playSound(spec.name, looped, gain * spec.gain);
+ handle = sound->playSound(spec.name, looped, gain * spec.gain, 0.0f, pitch);
lua_pushinteger(L, handle);
return 1;
return 0;
}
-// get_protocol_version()
-int ModApiClient::l_get_protocol_version(lua_State *L)
+// get_server_info()
+int ModApiClient::l_get_server_info(lua_State *L)
+{
+ Client *client = getClient(L);
+ Address serverAddress = client->getServerAddress();
+ lua_newtable(L);
+ lua_pushstring(L, client->getAddressName().c_str());
+ lua_setfield(L, -2, "address");
+ lua_pushstring(L, serverAddress.serializeString().c_str());
+ lua_setfield(L, -2, "ip");
+ lua_pushinteger(L, serverAddress.getPort());
+ lua_setfield(L, -2, "port");
+ lua_pushinteger(L, client->getProtoVersion());
+ lua_setfield(L, -2, "protocol_version");
+ return 1;
+}
+
+// get_item_def(itemstring)
+int ModApiClient::l_get_item_def(lua_State *L)
+{
+ IGameDef *gdef = getGameDef(L);
+ assert(gdef);
+
+ IItemDefManager *idef = gdef->idef();
+ assert(idef);
+
+ if (!lua_isstring(L, 1))
+ return 0;
+
+ const std::string &name(lua_tostring(L, 1));
+ if (!idef->isKnown(name))
+ return 0;
+ const ItemDefinition &def = idef->get(name);
+
+ push_item_definition_full(L, def);
+
+ return 1;
+}
+
+// get_node_def(nodename)
+int ModApiClient::l_get_node_def(lua_State *L)
+{
+ IGameDef *gdef = getGameDef(L);
+ assert(gdef);
+
+ INodeDefManager *ndef = gdef->ndef();
+ assert(ndef);
+
+ if (!lua_isstring(L, 1))
+ return 0;
+
+ const std::string &name = lua_tostring(L, 1);
+ const ContentFeatures &cf = ndef->get(ndef->getId(name));
+ if (cf.name != name) // Unknown node. | name = <whatever>, cf.name = ignore
+ return 0;
+
+ push_content_features(L, cf);
+
+ return 1;
+}
+
+int ModApiClient::l_take_screenshot(lua_State *L)
+{
+ Client *client = getClient(L);
+ client->makeScreenshot();
+ return 0;
+}
+
+int ModApiClient::l_get_privilege_list(lua_State *L)
+{
+ const Client *client = getClient(L);
+ lua_newtable(L);
+ for (const std::string &priv : client->getPrivilegeList()) {
+ lua_pushboolean(L, true);
+ lua_setfield(L, -2, priv.c_str());
+ }
+ return 1;
+}
+
+// get_builtin_path()
+int ModApiClient::l_get_builtin_path(lua_State *L)
{
- lua_pushinteger(L, getClient(L)->getProtoVersion());
+ lua_pushstring(L, BUILTIN_MOD_NAME ":");
return 1;
}
void ModApiClient::Initialize(lua_State *L, int top)
{
API_FCT(get_current_modname);
+ API_FCT(print);
API_FCT(display_chat_message);
API_FCT(get_player_names);
API_FCT(set_last_run_mod);
API_FCT(get_meta);
API_FCT(sound_play);
API_FCT(sound_stop);
- API_FCT(get_protocol_version);
+ API_FCT(get_server_info);
+ API_FCT(get_item_def);
+ API_FCT(get_node_def);
+ API_FCT(take_screenshot);
+ API_FCT(get_privilege_list);
+ API_FCT(get_builtin_path);
}