Fix buttons not working for Lua-triggered formspecs

This commit is contained in:
sapier 2013-01-03 17:59:28 +00:00 committed by Perttu Ahola
parent 8b75736c6f
commit 0b1d09ff4f
8 changed files with 29 additions and 11 deletions

View File

@ -891,8 +891,10 @@ minetest.get_inventory(location) -> InvRef
minetest.create_detached_inventory(name, callbacks) -> InvRef minetest.create_detached_inventory(name, callbacks) -> InvRef
^ callbacks: See "Detached inventory callbacks" ^ callbacks: See "Detached inventory callbacks"
^ Creates a detached inventory. If it already exists, it is cleared. ^ 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 ^ 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 ^ formspec: formspec to display
Item handling: Item handling:

View File

@ -1906,12 +1906,14 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
std::istringstream is(datastring, std::ios_base::binary); std::istringstream is(datastring, std::ios_base::binary);
std::string formspec = deSerializeLongString(is); std::string formspec = deSerializeLongString(is);
std::string formname = deSerializeString(is);
ClientEvent event; ClientEvent event;
event.type = CE_SHOW_FORMSPEC; event.type = CE_SHOW_FORMSPEC;
// pointer is required as event is a struct only! // pointer is required as event is a struct only!
// adding a std:string to a struct isn't possible // adding a std:string to a struct isn't possible
event.show_formspec.formspec = new std::string(formspec); event.show_formspec.formspec = new std::string(formspec);
event.show_formspec.formname = new std::string(formname);
m_client_event_queue.push_back(event); m_client_event_queue.push_back(event);
} }
else else

View File

@ -179,6 +179,7 @@ struct ClientEvent
} deathscreen; } deathscreen;
struct{ struct{
std::string* formspec; std::string* formspec;
std::string* formname;
} show_formspec; } show_formspec;
struct{ struct{
} textures_updated; } textures_updated;

View File

@ -359,8 +359,10 @@ enum ToClientCommand
TOCLIENT_SHOW_FORMSPEC = 0x44, TOCLIENT_SHOW_FORMSPEC = 0x44,
/* /*
[0] u16 command [0] u16 command
u16 len u32 len
u8[len] formspec u8[len] formspec
u16 len
u8[len] formname
*/ */
}; };

View File

@ -118,13 +118,20 @@ struct TextDestPlayerInventory : public TextDest
TextDestPlayerInventory(Client *client) TextDestPlayerInventory(Client *client)
{ {
m_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) void gotText(std::map<std::string, std::string> fields)
{ {
m_client->sendInventoryFields("", fields); m_client->sendInventoryFields(m_formname, fields);
} }
Client *m_client; Client *m_client;
std::string m_formname;
}; };
/* Respawn menu callback */ /* Respawn menu callback */
@ -2154,6 +2161,7 @@ void the_game(
&g_menumgr, &g_menumgr,
&client, gamedef); &client, gamedef);
menu->setFormSource(current_formspec); menu->setFormSource(current_formspec);
menu->setTextDest(new TextDestPlayerInventory(&client,*(event.show_formspec.formname)));
menu->drop(); menu->drop();
} }
else else
@ -2162,6 +2170,7 @@ void the_game(
current_formspec->setForm(*(event.show_formspec.formspec)); current_formspec->setForm(*(event.show_formspec.formspec));
} }
delete(event.show_formspec.formspec); delete(event.show_formspec.formspec);
delete(event.show_formspec.formname);
} }
else if(event.type == CE_TEXTURES_UPDATED) else if(event.type == CE_TEXTURES_UPDATED)
{ {

View File

@ -4921,13 +4921,14 @@ static int l_create_detached_inventory_raw(lua_State *L)
return 1; return 1;
} }
// create_detached_formspec_raw(name) // show_formspec(playername,formname,formspec)
static int l_show_formspec(lua_State *L) static int l_show_formspec(lua_State *L)
{ {
const char *playername = luaL_checkstring(L, 1); 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); lua_pushboolean(L, true);
}else{ }else{

View File

@ -3638,7 +3638,7 @@ void Server::SendChatMessage(u16 peer_id, const std::wstring &message)
// Send as reliable // Send as reliable
m_con.Send(peer_id, 0, data, true); 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); DSTACK(__FUNCTION_NAME);
@ -3649,6 +3649,7 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec)
writeU16(buf, TOCLIENT_SHOW_FORMSPEC); writeU16(buf, TOCLIENT_SHOW_FORMSPEC);
os.write((char*)buf, 2); os.write((char*)buf, 2);
os<<serializeLongString(formspec); os<<serializeLongString(formspec);
os<<serializeString(formname);
// Make data buffer // Make data buffer
std::string s = os.str(); std::string s = os.str();
@ -4596,7 +4597,7 @@ void Server::notifyPlayer(const char *name, const std::wstring msg)
SendChatMessage(player->peer_id, std::wstring(L"Server: -!- ")+msg); 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); Player *player = m_env->getPlayer(playername);
@ -4606,7 +4607,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec)
return false; return false;
} }
SendShowFormspecMessage(player->peer_id,formspec); SendShowFormspecMessage(player->peer_id, formspec, formname);
return true; return true;
} }

View File

@ -583,7 +583,7 @@ public:
m_async_fatal_error.set(error); 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: private:
// con::PeerHandler implementation. // con::PeerHandler implementation.
@ -621,7 +621,7 @@ private:
void SendMovePlayer(u16 peer_id); void SendMovePlayer(u16 peer_id);
void SendPlayerPrivileges(u16 peer_id); void SendPlayerPrivileges(u16 peer_id);
void SendPlayerInventoryFormspec(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. Send a node removal/addition event to all clients except ignore_id.
Additionally, if far_players!=NULL, players further away than Additionally, if far_players!=NULL, players further away than