Make blocks to be loaded from disk when the active block area reaches them

This commit is contained in:
Perttu Ahola 2011-11-27 12:50:35 +02:00
parent ec4f58741b
commit 5c1cb01936
4 changed files with 31 additions and 5 deletions

@ -273,10 +273,11 @@ void ActiveBlockList::update(core::list<v3s16> &active_positions,
*/ */
ServerEnvironment::ServerEnvironment(ServerMap *map, lua_State *L, ServerEnvironment::ServerEnvironment(ServerMap *map, lua_State *L,
IGameDef *gamedef): IGameDef *gamedef, IBackgroundBlockEmerger *emerger):
m_map(map), m_map(map),
m_lua(L), m_lua(L),
m_gamedef(gamedef), m_gamedef(gamedef),
m_emerger(emerger),
m_random_spawn_timer(3), m_random_spawn_timer(3),
m_send_recommended_timer(0), m_send_recommended_timer(0),
m_game_time(0), m_game_time(0),
@ -891,8 +892,12 @@ void ServerEnvironment::step(float dtime)
<<") became active"<<std::endl;*/ <<") became active"<<std::endl;*/
MapBlock *block = m_map->getBlockNoCreateNoEx(p); 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; continue;
}
activateBlock(block); activateBlock(block);
} }

@ -120,6 +120,12 @@ public:
private: private:
}; };
class IBackgroundBlockEmerger
{
public:
virtual void queueBlockEmerge(v3s16 blockpos, bool allow_generate)=0;
};
/* /*
The server-side environment. The server-side environment.
@ -129,7 +135,8 @@ private:
class ServerEnvironment : public Environment class ServerEnvironment : public Environment
{ {
public: public:
ServerEnvironment(ServerMap *map, lua_State *L, IGameDef *gamedef); ServerEnvironment(ServerMap *map, lua_State *L, IGameDef *gamedef,
IBackgroundBlockEmerger *emerger);
~ServerEnvironment(); ~ServerEnvironment();
Map & getMap() Map & getMap()
@ -279,6 +286,8 @@ private:
lua_State *m_lua; lua_State *m_lua;
// Game definition // Game definition
IGameDef *m_gamedef; IGameDef *m_gamedef;
// Background block emerger (the server, in practice)
IBackgroundBlockEmerger *m_emerger;
// Active object list // Active object list
core::map<u16, ServerActiveObject*> m_active_objects; core::map<u16, ServerActiveObject*> m_active_objects;
// Outgoing network message buffer for active objects // Outgoing network message buffer for active objects

@ -1078,7 +1078,8 @@ Server::Server(
// Initialize Environment // 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 // Give environment reference to scripting api
scriptapi_add_environment(m_lua, m_env); scriptapi_add_environment(m_lua, m_env);
@ -4590,6 +4591,14 @@ void Server::notifyPlayers(const std::wstring msg)
BroadcastChatMessage(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 // IGameDef interface
// Under envlock // Under envlock
IToolDefManager* Server::getToolDefManager() IToolDefManager* Server::getToolDefManager()

@ -366,7 +366,8 @@ private:
}; };
class Server : public con::PeerHandler, public MapEventReceiver, class Server : public con::PeerHandler, public MapEventReceiver,
public InventoryManager, public IGameDef public InventoryManager, public IGameDef,
public IBackgroundBlockEmerger
{ {
public: public:
/* /*
@ -484,6 +485,8 @@ public:
void notifyPlayer(const char *name, const std::wstring msg); void notifyPlayer(const char *name, const std::wstring msg);
void notifyPlayers(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 // Envlock and conlock should be locked when using Lua
lua_State *getLua(){ return m_lua; } lua_State *getLua(){ return m_lua; }