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 &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"<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 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; }