From 5c1cb01936093fc7e57d4b6d7a170dff9a18cd7d Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Sun, 27 Nov 2011 12:50:35 +0200
Subject: [PATCH] Make blocks to be loaded from disk when the active block area
 reaches them

---
 src/environment.cpp |  9 +++++++--
 src/environment.h   | 11 ++++++++++-
 src/server.cpp      | 11 ++++++++++-
 src/server.h        |  5 ++++-
 4 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/environment.cpp b/src/environment.cpp
index 39ecf423c..94c88d57c 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -273,10 +273,11 @@ void ActiveBlockList::update(core::list<v3s16> &active_positions,
 */
 
 ServerEnvironment::ServerEnvironment(ServerMap *map, lua_State *L,
-		IGameDef *gamedef):
+		IGameDef *gamedef, IBackgroundBlockEmerger *emerger):
 	m_map(map),
 	m_lua(L),
 	m_gamedef(gamedef),
+	m_emerger(emerger),
 	m_random_spawn_timer(3),
 	m_send_recommended_timer(0),
 	m_game_time(0),
@@ -891,8 +892,12 @@ void ServerEnvironment::step(float dtime)
 					<<") became active"<<std::endl;*/
 
 			MapBlock *block = m_map->getBlockNoCreateNoEx(p);
-			if(block==NULL)
+			if(block==NULL){
+				// Block needs to be fetched first
+				m_emerger->queueBlockEmerge(p, false);
+				m_active_blocks.m_list.remove(p);
 				continue;
+			}
 
 			activateBlock(block);
 		}
diff --git a/src/environment.h b/src/environment.h
index 1abf73867..48e9cfa75 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -120,6 +120,12 @@ class ActiveBlockList
 private:
 };
 
+class IBackgroundBlockEmerger
+{
+public:
+	virtual void queueBlockEmerge(v3s16 blockpos, bool allow_generate)=0;
+};
+
 /*
 	The server-side environment.
 
@@ -129,7 +135,8 @@ class ActiveBlockList
 class ServerEnvironment : public Environment
 {
 public:
-	ServerEnvironment(ServerMap *map, lua_State *L, IGameDef *gamedef);
+	ServerEnvironment(ServerMap *map, lua_State *L, IGameDef *gamedef,
+			IBackgroundBlockEmerger *emerger);
 	~ServerEnvironment();
 
 	Map & getMap()
@@ -279,6 +286,8 @@ class ServerEnvironment : public Environment
 	lua_State *m_lua;
 	// Game definition
 	IGameDef *m_gamedef;
+	// Background block emerger (the server, in practice)
+	IBackgroundBlockEmerger *m_emerger;
 	// Active object list
 	core::map<u16, ServerActiveObject*> m_active_objects;
 	// Outgoing network message buffer for active objects
diff --git a/src/server.cpp b/src/server.cpp
index 7229bec36..58611bed1 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1078,7 +1078,8 @@ Server::Server(
 	
 	// Initialize Environment
 	
-	m_env = new ServerEnvironment(new ServerMap(mapsavedir, this), m_lua, this);
+	m_env = new ServerEnvironment(new ServerMap(mapsavedir, this), m_lua,
+			this, this);
 
 	// Give environment reference to scripting api
 	scriptapi_add_environment(m_lua, m_env);
@@ -4590,6 +4591,14 @@ void Server::notifyPlayers(const std::wstring msg)
 	BroadcastChatMessage(msg);
 }
 
+void Server::queueBlockEmerge(v3s16 blockpos, bool allow_generate)
+{
+	u8 flags = 0;
+	if(!allow_generate)
+		flags |= BLOCK_EMERGE_FLAG_FROMDISK;
+	m_emerge_queue.addBlock(PEER_ID_INEXISTENT, blockpos, flags);
+}
+
 // IGameDef interface
 // Under envlock
 IToolDefManager* Server::getToolDefManager()
diff --git a/src/server.h b/src/server.h
index 7620f5341..673458882 100644
--- a/src/server.h
+++ b/src/server.h
@@ -366,7 +366,8 @@ class RemoteClient
 };
 
 class Server : public con::PeerHandler, public MapEventReceiver,
-		public InventoryManager, public IGameDef
+		public InventoryManager, public IGameDef,
+		public IBackgroundBlockEmerger
 {
 public:
 	/*
@@ -483,6 +484,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	// Envlock and conlock should be locked when calling this
 	void notifyPlayer(const char *name, const std::wstring msg);
 	void notifyPlayers(const std::wstring msg);
+
+	void queueBlockEmerge(v3s16 blockpos, bool allow_generate);
 	
 	// Envlock and conlock should be locked when using Lua
 	lua_State *getLua(){ return m_lua; }
-- 
GitLab