summaryrefslogtreecommitdiff
path: root/src/server.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-12-06 15:21:56 +0200
committerPerttu Ahola <celeron55@gmail.com>2012-01-02 01:49:38 +0200
commit103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e (patch)
tree416a253ff37aeb5944781dd1288c5afa7483d799 /src/server.cpp
parent70ed371d0cd532da8efc5acbd41a20e9a373b811 (diff)
downloadminetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.tar.gz
minetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.tar.bz2
minetest-103173fc9b4fcb4c0fded2a93d5cbb8f0bea896e.zip
Add InvRef and InvStack (currently untested and unusable)
Diffstat (limited to 'src/server.cpp')
-rw-r--r--src/server.cpp88
1 files changed, 71 insertions, 17 deletions
diff --git a/src/server.cpp b/src/server.cpp
index 4a0e952a8..3679195f3 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -2458,7 +2458,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
craftresult and immediately moved to the free slot.
*/
do{
- Inventory *inv_to = getInventory(&c, ma->to_inv);
+ Inventory *inv_to = InventoryManager::getInventory(&c, ma->to_inv);
if(!inv_to) break;
InventoryList *list_to = inv_to->getList(ma->to_list);
if(!list_to) break;
@@ -3517,6 +3517,68 @@ void Server::onMapEditEvent(MapEditEvent *event)
m_unsent_map_edit_queue.push_back(e);
}
+Inventory* Server::getInventory(const InventoryLocation &loc)
+{
+ switch(loc.type){
+ case InventoryLocation::UNDEFINED:
+ {}
+ break;
+ case InventoryLocation::PLAYER:
+ {
+ Player *player = m_env->getPlayer(loc.name.c_str());
+ if(!player)
+ return NULL;
+ return &player->inventory;
+ }
+ break;
+ case InventoryLocation::NODEMETA:
+ {
+ NodeMetadata *meta = m_env->getMap().getNodeMetadata(loc.p);
+ if(!meta)
+ return NULL;
+ return meta->getInventory();
+ }
+ break;
+ default:
+ assert(0);
+ }
+ return NULL;
+}
+void Server::setInventoryModified(const InventoryLocation &loc)
+{
+ switch(loc.type){
+ case InventoryLocation::UNDEFINED:
+ {}
+ break;
+ case InventoryLocation::PLAYER:
+ {
+ ServerRemotePlayer *srp = static_cast<ServerRemotePlayer*>
+ (m_env->getPlayer(loc.name.c_str()));
+ if(!srp)
+ return;
+ srp->m_inventory_not_sent = true;
+ }
+ break;
+ case InventoryLocation::NODEMETA:
+ {
+ v3s16 blockpos = getNodeBlockPos(loc.p);
+
+ NodeMetadata *meta = m_env->getMap().getNodeMetadata(loc.p);
+ if(meta)
+ meta->inventoryModified();
+
+ MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos);
+ if(block)
+ block->raiseModified(MOD_STATE_WRITE_NEEDED);
+
+ setBlockNotSent(blockpos);
+ }
+ break;
+ default:
+ assert(0);
+ }
+}
+#if 0
Inventory* Server::getInventory(InventoryContext *c, std::string id)
{
if(id == "current_player")
@@ -3534,12 +3596,10 @@ Inventory* Server::getInventory(InventoryContext *c, std::string id)
p.X = stoi(fn.next(","));
p.Y = stoi(fn.next(","));
p.Z = stoi(fn.next(","));
- NodeMetadata *meta = m_env->getMap().getNodeMetadata(p);
- if(meta)
- return meta->getInventory();
- infostream<<"nodemeta at ("<<p.X<<","<<p.Y<<","<<p.Z<<"): "
- <<"no metadata found"<<std::endl;
- return NULL;
+
+ InventoryLocation loc;
+ loc.setNodeMeta(p);
+ return getInventory(loc);
}
infostream<<__FUNCTION_NAME<<": unknown id "<<id<<std::endl;
@@ -3567,21 +3627,15 @@ void Server::inventoryModified(InventoryContext *c, std::string id)
p.Z = stoi(fn.next(","));
v3s16 blockpos = getNodeBlockPos(p);
- NodeMetadata *meta = m_env->getMap().getNodeMetadata(p);
- if(meta)
- meta->inventoryModified();
-
- MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos);
- if(block)
- block->raiseModified(MOD_STATE_WRITE_NEEDED);
-
- setBlockNotSent(blockpos);
-
+ InventoryLocation loc;
+ loc.setNodeMeta(p);
+ setInventoryModified(loc);
return;
}
infostream<<__FUNCTION_NAME<<": unknown id "<<id<<std::endl;
}
+#endif
core::list<PlayerInfo> Server::getPlayerInfo()
{