aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/environment.cpp9
-rw-r--r--src/environment.h11
-rw-r--r--src/server.cpp11
-rw-r--r--src/server.h5
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 @@ public:
private:
};
+class IBackgroundBlockEmerger
+{
+public:
+ virtual void queueBlockEmerge(v3s16 blockpos, bool allow_generate)=0;
+};
+
/*
The server-side environment.
@@ -129,7 +135,8 @@ private:
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 @@ private:
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 @@ private:
};
class Server : public con::PeerHandler, public MapEventReceiver,
- public InventoryManager, public IGameDef
+ public InventoryManager, public IGameDef,
+ public IBackgroundBlockEmerger
{
public:
/*
@@ -483,6 +484,8 @@ public:
// 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; }