summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2013-01-03 17:59:28 +0000
committerPerttu Ahola <celeron55@gmail.com>2013-01-07 19:00:33 +0200
commit0b1d09ff4f4e92986f6abdbc57db97c18707196a (patch)
tree1ae8016123a1c031406653c924c6f32e1e24db43
parent8b75736c6f747ec4d01419ee6475e03feab398b9 (diff)
downloadminetest-0b1d09ff4f4e92986f6abdbc57db97c18707196a.tar.gz
minetest-0b1d09ff4f4e92986f6abdbc57db97c18707196a.tar.bz2
minetest-0b1d09ff4f4e92986f6abdbc57db97c18707196a.zip
Fix buttons not working for Lua-triggered formspecs
-rw-r--r--doc/lua_api.txt4
-rw-r--r--src/client.cpp2
-rw-r--r--src/client.h1
-rw-r--r--src/clientserver.h4
-rw-r--r--src/game.cpp11
-rw-r--r--src/scriptapi.cpp7
-rw-r--r--src/server.cpp7
-rw-r--r--src/server.h4
8 files changed, 29 insertions, 11 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index b0c1b41a3..94fc78b2e 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -891,8 +891,10 @@ minetest.get_inventory(location) -> InvRef
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:
diff --git a/src/client.cpp b/src/client.cpp
index 216d86cd4..9969ef538 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -1906,12 +1906,14 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
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
diff --git a/src/client.h b/src/client.h
index e46da6b0e..7052e840a 100644
--- a/src/client.h
+++ b/src/client.h
@@ -179,6 +179,7 @@ struct ClientEvent
} deathscreen;
struct{
std::string* formspec;
+ std::string* formname;
} show_formspec;
struct{
} textures_updated;
diff --git a/src/clientserver.h b/src/clientserver.h
index bb7e1181e..52b9dc7b0 100644
--- a/src/clientserver.h
+++ b/src/clientserver.h
@@ -359,8 +359,10 @@ enum ToClientCommand
TOCLIENT_SHOW_FORMSPEC = 0x44,
/*
[0] u16 command
- u16 len
+ u32 len
u8[len] formspec
+ u16 len
+ u8[len] formname
*/
};
diff --git a/src/game.cpp b/src/game.cpp
index ca992c056..c8f1d2187 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -118,13 +118,20 @@ struct TextDestPlayerInventory : public TextDest
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 */
@@ -2154,6 +2161,7 @@ void the_game(
&g_menumgr,
&client, gamedef);
menu->setFormSource(current_formspec);
+ menu->setTextDest(new TextDestPlayerInventory(&client,*(event.show_formspec.formname)));
menu->drop();
}
else
@@ -2162,6 +2170,7 @@ void the_game(
current_formspec->setForm(*(event.show_formspec.formspec));
}
delete(event.show_formspec.formspec);
+ delete(event.show_formspec.formname);
}
else if(event.type == CE_TEXTURES_UPDATED)
{
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index 60e5b55f4..8e4a43266 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -4921,13 +4921,14 @@ static int l_create_detached_inventory_raw(lua_State *L)
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{
diff --git a/src/server.cpp b/src/server.cpp
index f4b5ee872..f635bc676 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -3638,7 +3638,7 @@ void Server::SendChatMessage(u16 peer_id, const std::wstring &message)
// 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);
@@ -3649,6 +3649,7 @@ void Server::SendShowFormspecMessage(u16 peer_id, const std::string formspec)
writeU16(buf, TOCLIENT_SHOW_FORMSPEC);
os.write((char*)buf, 2);
os<<serializeLongString(formspec);
+ os<<serializeString(formname);
// Make data buffer
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);
}
-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);
@@ -4606,7 +4607,7 @@ bool Server::showFormspec(const char *playername, const std::string &formspec)
return false;
}
- SendShowFormspecMessage(player->peer_id,formspec);
+ SendShowFormspecMessage(player->peer_id, formspec, formname);
return true;
}
diff --git a/src/server.h b/src/server.h
index 19c29cbd7..43beb167a 100644
--- a/src/server.h
+++ b/src/server.h
@@ -583,7 +583,7 @@ public:
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.
@@ -621,7 +621,7 @@ private:
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