minetest.create_detached_inventory(name, callbacks) -> InvRef
^ callbacks: See "Detached inventory callbacks"
^ Creates a detached inventory. If it already exists, it is cleared.
-minetest.show_formspec(playername, formspec)
+minetest.show_formspec(playername, formname, formspec)
^ playername: name of player to show formspec
+^ formname: name passed to on_player_receive_fields callbacks
+^ should follow "modname:<whatever>" naming convention
^ formspec: formspec to display
Item handling:
std::istringstream is(datastring, std::ios_base::binary);
std::string formspec = deSerializeLongString(is);
+ std::string formname = deSerializeString(is);
ClientEvent event;
event.type = CE_SHOW_FORMSPEC;
// pointer is required as event is a struct only!
// adding a std:string to a struct isn't possible
event.show_formspec.formspec = new std::string(formspec);
+ event.show_formspec.formname = new std::string(formname);
m_client_event_queue.push_back(event);
}
else
} deathscreen;
struct{
std::string* formspec;
+ std::string* formname;
} show_formspec;
struct{
} textures_updated;
TOCLIENT_SHOW_FORMSPEC = 0x44,
/*
[0] u16 command
- u16 len
+ u32 len
u8[len] formspec
+ u16 len
+ u8[len] formname
*/
};
TextDestPlayerInventory(Client *client)
{
m_client = client;
+ m_formname = "";
+ }
+ TextDestPlayerInventory(Client *client, std::string formname)
+ {
+ m_client = client;
+ m_formname = formname;
}
void gotText(std::map<std::string, std::string> fields)
{
- m_client->sendInventoryFields("", fields);
+ m_client->sendInventoryFields(m_formname, fields);
}
Client *m_client;
+ std::string m_formname;
};
/* Respawn menu callback */
&g_menumgr,
&client, gamedef);
menu->setFormSource(current_formspec);
+ menu->setTextDest(new TextDestPlayerInventory(&client,*(event.show_formspec.formname)));
menu->drop();
}
else
current_formspec->setForm(*(event.show_formspec.formspec));
}
delete(event.show_formspec.formspec);
+ delete(event.show_formspec.formname);
}
else if(event.type == CE_TEXTURES_UPDATED)
{
return 1;
}
-// create_detached_formspec_raw(name)
+// show_formspec(playername,formname,formspec)
static int l_show_formspec(lua_State *L)
{
const char *playername = luaL_checkstring(L, 1);
- const char *formspec = luaL_checkstring(L, 2);
+ const char *formname = luaL_checkstring(L, 2);
+ const char *formspec = luaL_checkstring(L, 3);
- if(get_server(L)->showFormspec(playername,formspec))
+ if(get_server(L)->showFormspec(playername,formspec,formname))
{
lua_pushboolean(L, true);
}else{
// Send as reliable
m_con.Send(peer_id, 0, data, true);
}
-void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec)
+void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec, const std::string formname)
{
DSTACK(__FUNCTION_NAME);
writeU16(buf, TOCLIENT_SHOW_FORMSPEC);
os.write((char*)buf, 2);
os<<serializeLongString(formspec);
+ os<<serializeString(formname);
// Make data buffer
std::string s = os.str();
SendChatMessage(player->peer_id, std::wstring(L"Server: -!- ")+msg);
}
-bool Server::showFormspec(const char *playername, const std::string &formspec)
+bool Server::showFormspec(const char *playername, const std::string &formspec, const std::string &formname)
{
Player *player = m_env->getPlayer(playername);
return false;
}
- SendShowFormspecMessage(player->peer_id,formspec);
+ SendShowFormspecMessage(player->peer_id, formspec, formname);
return true;
}
m_async_fatal_error.set(error);
}
- bool showFormspec(const char *name, const std::string &formspec);
+ bool showFormspec(const char *name, const std::string &formspec, const std::string &formname);
private:
// con::PeerHandler implementation.
void SendMovePlayer(u16 peer_id);
void SendPlayerPrivileges(u16 peer_id);
void SendPlayerInventoryFormspec(u16 peer_id);
- void SendShowFormspecMessage(u16 peer_id, const std::string formspec);
+ void SendShowFormspecMessage(u16 peer_id, const std::string formspec, const std::string formname);
/*
Send a node removal/addition event to all clients except ignore_id.
Additionally, if far_players!=NULL, players further away than