diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-09-26 11:57:28 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-09-26 11:57:28 +0300 |
commit | 0ccc0ac927bdbfcc97c1b5c9d5dc64754946f817 (patch) | |
tree | 0db7c756fbcfd18497dee04578d7cb037b2bd7fa /src/server.cpp | |
parent | 63eca0feb2a08aa15f8be1164c4815a44246a2e6 (diff) | |
parent | 8b875d71d1ab928e9866914b886ff58cf8a38192 (diff) | |
download | minetest-0ccc0ac927bdbfcc97c1b5c9d5dc64754946f817.tar.xz |
Merge remote-tracking branch 'darkrose/master'
Diffstat (limited to 'src/server.cpp')
-rw-r--r-- | src/server.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/server.cpp b/src/server.cpp index ba0efe75f..304eb8920 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2881,7 +2881,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) { MapEditEventIgnorer ign(&m_ignore_map_edit_events); - m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks); + std::string p_name = std::string(player->getName()); + m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks, p_name); } /* Set blocks not sent to far players @@ -3208,7 +3209,46 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) } // Disallow moving items if not allowed to build else if((getPlayerPrivs(player) & PRIV_BUILD) == 0) + { return; + } + // if it's a locking chest, only allow the owner or server admins to move items + else if (ma->from_inv != "current_player" && (getPlayerPrivs(player) & PRIV_SERVER) == 0) + { + Strfnd fn(ma->from_inv); + std::string id0 = fn.next(":"); + if(id0 == "nodemeta") + { + v3s16 p; + p.X = stoi(fn.next(",")); + p.Y = stoi(fn.next(",")); + p.Z = stoi(fn.next(",")); + NodeMetadata *meta = m_env.getMap().getNodeMetadata(p); + if(meta && meta->typeId() == CONTENT_LOCKABLE_CHEST) { + LockingChestNodeMetadata *lcm = (LockingChestNodeMetadata*)meta; + if (lcm->getOwner() != player->getName()) + return; + } + } + } + else if (ma->to_inv != "current_player" && (getPlayerPrivs(player) & PRIV_SERVER) == 0) + { + Strfnd fn(ma->to_inv); + std::string id0 = fn.next(":"); + if(id0 == "nodemeta") + { + v3s16 p; + p.X = stoi(fn.next(",")); + p.Y = stoi(fn.next(",")); + p.Z = stoi(fn.next(",")); + NodeMetadata *meta = m_env.getMap().getNodeMetadata(p); + if(meta && meta->typeId() == CONTENT_LOCKABLE_CHEST) { + LockingChestNodeMetadata *lcm = (LockingChestNodeMetadata*)meta; + if (lcm->getOwner() != player->getName()) + return; + } + } + } } if(disable_action == false) |