summaryrefslogtreecommitdiff
path: root/src/server.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-03-31 16:23:26 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-03-31 16:25:02 +0300
commit52122c342d335a2561ace87c9d8deaa16a136604 (patch)
tree33ed625674d82c505b347adf26307748c85c8cfc /src/server.cpp
parent96ee73f79018c8aae22a392af6f66f9a05cb0174 (diff)
downloadminetest-52122c342d335a2561ace87c9d8deaa16a136604.tar.gz
minetest-52122c342d335a2561ace87c9d8deaa16a136604.tar.bz2
minetest-52122c342d335a2561ace87c9d8deaa16a136604.zip
Add 'fly' and 'fast' privileges and the underlying privileges-to-client system
Diffstat (limited to 'src/server.cpp')
-rw-r--r--src/server.cpp49
1 files changed, 44 insertions, 5 deletions
diff --git a/src/server.cpp b/src/server.cpp
index 08813f7fa..d6357e416 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -2194,13 +2194,13 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
// Send node definitions
SendNodeDef(m_con, peer_id, m_nodedef);
- // Send texture announcement
+ // Send media announcement
sendMediaAnnouncement(peer_id);
- // Send player info to all players
- //SendPlayerInfos();
-
- // Send inventory to player
+ // Send privileges
+ SendPlayerPrivileges(peer_id);
+
+ // Send inventory
UpdateCrafting(peer_id);
SendInventory(peer_id);
@@ -3544,6 +3544,28 @@ void Server::SendMovePlayer(u16 peer_id)
m_con.Send(peer_id, 0, data, true);
}
+void Server::SendPlayerPrivileges(u16 peer_id)
+{
+ Player *player = m_env->getPlayer(peer_id);
+ assert(player);
+ std::set<std::string> privs;
+ scriptapi_get_auth(m_lua, player->getName(), NULL, &privs);
+
+ std::ostringstream os(std::ios_base::binary);
+ writeU16(os, TOCLIENT_PRIVILEGES);
+ writeU16(os, privs.size());
+ for(std::set<std::string>::const_iterator i = privs.begin();
+ i != privs.end(); i++){
+ os<<serializeString(*i);
+ }
+
+ // Make data buffer
+ std::string s = os.str();
+ SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+ // Send as reliable
+ m_con.Send(peer_id, 0, data, true);
+}
+
s32 Server::playSound(const SimpleSoundSpec &spec,
const ServerSoundParams &params)
{
@@ -4286,6 +4308,23 @@ bool Server::checkPriv(const std::string &name, const std::string &priv)
return (privs.count(priv) != 0);
}
+void Server::reportPrivsModified(const std::string &name)
+{
+ if(name == ""){
+ for(core::map<u16, RemoteClient*>::Iterator
+ i = m_clients.getIterator();
+ i.atEnd() == false; i++){
+ RemoteClient *client = i.getNode()->getValue();
+ SendPlayerPrivileges(client->peer_id);
+ }
+ } else {
+ Player *player = m_env->getPlayer(name.c_str());
+ if(!player)
+ return;
+ SendPlayerPrivileges(player->peer_id);
+ }
+}
+
// Saves g_settings to configpath given at initialization
void Server::saveConfig()
{