Port formspec API from waspsaliva

This API is inofficial and undocumented; invalid usage causes the game to crash. Use at own risk!
This commit is contained in:
Elias Fleckenstein 2021-02-18 20:20:22 +01:00
parent e391ee435f
commit 1669682324
2 changed files with 50 additions and 0 deletions

View File

@ -621,6 +621,48 @@ int ModApiClient::l_interact(lua_State *L)
return 1;
}
StringMap *table_to_stringmap(lua_State *L, int index)
{
StringMap *m = new StringMap;
lua_pushvalue(L, index);
lua_pushnil(L);
while (lua_next(L, -2)) {
lua_pushvalue(L, -2);
std::basic_string<char> key = lua_tostring(L, -1);
std::basic_string<char> value = lua_tostring(L, -2);
(*m)[key] = value;
lua_pop(L, 2);
}
lua_pop(L, 1);
return m;
}
// send_inventory_fields(formname, fields)
// Only works if the inventory form was opened beforehand.
int ModApiClient::l_send_inventory_fields(lua_State *L)
{
std::string formname = luaL_checkstring(L, 1);
StringMap *fields = table_to_stringmap(L, 2);
getClient(L)->sendInventoryFields(formname, *fields);
return 0;
}
// send_nodemeta_fields(position, formname, fields)
int ModApiClient::l_send_nodemeta_fields(lua_State *L)
{
v3s16 pos = check_v3s16(L, 1);
std::string formname = luaL_checkstring(L, 2);
StringMap *m = table_to_stringmap(L, 3);
getClient(L)->sendNodemetaFields(pos, formname, *m);
return 0;
}
void ModApiClient::Initialize(lua_State *L, int top)
{
API_FCT(get_current_modname);
@ -657,4 +699,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(get_objects_inside_radius);
API_FCT(make_screenshot);
API_FCT(interact);
API_FCT(send_inventory_fields);
API_FCT(send_nodemeta_fields);
}

View File

@ -132,6 +132,12 @@ private:
// interact(action, pointed_thing)
static int l_interact(lua_State *L);
// send_inventory_fields(formname, fields)
static int l_send_inventory_fields(lua_State *L);
// send_nodemeta_fields(position, formname, fields)
static int l_send_nodemeta_fields(lua_State *L);
public:
static void Initialize(lua_State *L, int top);
};