Make blocks to be loaded from disk when the active block area reaches them
parent
ec4f58741b
commit
5c1cb01936
|
@ -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:
|
||||||
/*
|
/*
|
||||||
|
@ -483,6 +484,8 @@ public:
|
||||||
// Envlock and conlock should be locked when calling this
|
// Envlock and conlock should be locked when calling this
|
||||||
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; }
|
||||||
|
|
Loading…
Reference in New Issue