Fix buttons not working for Lua-triggered formspecs
This commit is contained in:
		
							parent
							
								
									8b75736c6f
								
							
						
					
					
						commit
						0b1d09ff4f
					
				| @ -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: | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -179,6 +179,7 @@ struct ClientEvent | ||||
| 		} deathscreen; | ||||
| 		struct{ | ||||
| 			std::string* formspec; | ||||
| 			std::string* formname; | ||||
| 		} show_formspec; | ||||
| 		struct{ | ||||
| 		} textures_updated; | ||||
|  | ||||
| @ -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 | ||||
| 	*/ | ||||
| }; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										11
									
								
								src/game.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								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) | ||||
| 				{ | ||||
|  | ||||
| @ -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{ | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user