summaryrefslogtreecommitdiff
path: root/src/map.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.h')
-rw-r--r--src/map.h104
1 files changed, 61 insertions, 43 deletions
diff --git a/src/map.h b/src/map.h
index fe580b20f..6bc2aaaee 100644
--- a/src/map.h
+++ b/src/map.h
@@ -54,10 +54,6 @@ struct BlockMakeData;
MapEditEvent
*/
-#define MAPTYPE_BASE 0
-#define MAPTYPE_SERVER 1
-#define MAPTYPE_CLIENT 2
-
enum MapEditEventType{
// Node added (changed from air or something else to something)
MEET_ADDNODE,
@@ -127,11 +123,6 @@ public:
virtual ~Map();
DISABLE_CLASS_COPY(Map);
- virtual s32 mapType() const
- {
- return MAPTYPE_BASE;
- }
-
/*
Drop (client) or delete (server) the map.
*/
@@ -180,7 +171,7 @@ public:
/*
These handle lighting but not faces.
*/
- void addNodeAndUpdate(v3s16 p, MapNode n,
+ virtual void addNodeAndUpdate(v3s16 p, MapNode n,
std::map<v3s16, MapBlock*> &modified_blocks,
bool remove_metadata = true);
void removeNodeAndUpdate(v3s16 p,
@@ -200,6 +191,11 @@ public:
virtual void save(ModifiedState save_level) { FATAL_ERROR("FIXME"); }
+ /*
+ Return true unless the map definitely cannot save blocks.
+ */
+ virtual bool maySaveBlocks() { return true; }
+
// Server implements these.
// Client leaves them as no-op.
virtual bool saveBlock(MapBlock *block) { return false; }
@@ -207,14 +203,14 @@ public:
/*
Updates usage timers and unloads unused blocks and sectors.
- Saves modified blocks before unloading on MAPTYPE_SERVER.
+ Saves modified blocks before unloading if possible.
*/
- void timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks,
+ void timerUpdate(float dtime, float unload_timeout, s32 max_loaded_blocks,
std::vector<v3s16> *unloaded_blocks=NULL);
/*
Unloads all blocks with a zero refCount().
- Saves modified blocks before unloading on MAPTYPE_SERVER.
+ Saves modified blocks before unloading if possible.
*/
void unloadUnreferencedBlocks(std::vector<v3s16> *unloaded_blocks=NULL);
@@ -226,9 +222,6 @@ public:
// For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: "
virtual void PrintInfo(std::ostream &out);
- void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
- ServerEnvironment *env);
-
/*
Node metadata
These are basically coordinate wrappers to MapBlock
@@ -267,39 +260,29 @@ public:
Variables
*/
- void transforming_liquid_add(v3s16 p);
-
bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes);
protected:
- friend class LuaVoxelManip;
-
IGameDef *m_gamedef;
std::set<MapEventReceiver*> m_event_receivers;
- std::map<v2s16, MapSector*> m_sectors;
+ std::unordered_map<v2s16, MapSector*> m_sectors;
// Be sure to set this to NULL when the cached sector is deleted
MapSector *m_sector_cache = nullptr;
v2s16 m_sector_cache_p;
- // Queued transforming water nodes
- UniqueQueue<v3s16> m_transforming_liquid;
-
// This stores the properties of the nodes on the map.
const NodeDefManager *m_nodedef;
+ // Can be implemented by child class
+ virtual void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) {}
+
bool determineAdditionalOcclusionCheck(const v3s16 &pos_camera,
const core::aabbox3d<s16> &block_bounds, v3s16 &check);
bool isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target,
float step, float stepfac, float start_offset, float end_offset,
u32 needed_count);
-
-private:
- f32 m_transforming_liquid_loop_count_multiplier = 1.0f;
- u32 m_unprocessed_count = 0;
- u64 m_inc_trending_up_start_time = 0; // milliseconds
- bool m_queue_size_timer_started = false;
};
/*
@@ -317,11 +300,6 @@ public:
ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb);
~ServerMap();
- s32 mapType() const
- {
- return MAPTYPE_SERVER;
- }
-
/*
Get a sector from somewhere.
- Check memory
@@ -352,7 +330,7 @@ public:
- Create blank filled with CONTENT_IGNORE
*/
- MapBlock *emergeBlock(v3s16 p, bool create_blank=true);
+ MapBlock *emergeBlock(v3s16 p, bool create_blank=true) override;
/*
Try to get a block.
@@ -364,33 +342,37 @@ public:
bool isBlockInQueue(v3s16 pos);
+ void addNodeAndUpdate(v3s16 p, MapNode n,
+ std::map<v3s16, MapBlock*> &modified_blocks,
+ bool remove_metadata) override;
+
/*
Database functions
*/
static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf);
// Call these before and after saving of blocks
- void beginSave();
- void endSave();
+ void beginSave() override;
+ void endSave() override;
- void save(ModifiedState save_level);
+ void save(ModifiedState save_level) override;
void listAllLoadableBlocks(std::vector<v3s16> &dst);
void listAllLoadedBlocks(std::vector<v3s16> &dst);
MapgenParams *getMapgenParams();
- bool saveBlock(MapBlock *block);
+ bool saveBlock(MapBlock *block) override;
static bool saveBlock(MapBlock *block, MapDatabase *db, int compression_level = -1);
MapBlock* loadBlock(v3s16 p);
// Database version
void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false);
- bool deleteBlock(v3s16 blockpos);
+ bool deleteBlock(v3s16 blockpos) override;
void updateVManip(v3s16 pos);
// For debug printing
- virtual void PrintInfo(std::ostream &out);
+ void PrintInfo(std::ostream &out) override;
bool isSavingEnabled(){ return m_map_saving_enabled; }
@@ -406,9 +388,20 @@ public:
bool repairBlockLight(v3s16 blockpos,
std::map<v3s16, MapBlock *> *modified_blocks);
+ void transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks,
+ ServerEnvironment *env);
+
+ void transforming_liquid_add(v3s16 p);
+
MapSettingsManager settings_mgr;
+protected:
+
+ void reportMetrics(u64 save_time_us, u32 saved_blocks, u32 all_blocks) override;
+
private:
+ friend class LuaVoxelManip;
+
// Emerge manager
EmergeManager *m_emerge;
@@ -419,6 +412,13 @@ private:
std::set<v3s16> m_chunks_in_progress;
+ // Queued transforming water nodes
+ UniqueQueue<v3s16> m_transforming_liquid;
+ f32 m_transforming_liquid_loop_count_multiplier = 1.0f;
+ u32 m_unprocessed_count = 0;
+ u64 m_inc_trending_up_start_time = 0; // milliseconds
+ bool m_queue_size_timer_started = false;
+
/*
Metadata is re-written on disk only if this is true.
This is reset to false when written on disk.
@@ -427,7 +427,10 @@ private:
MapDatabase *dbase = nullptr;
MapDatabase *dbase_ro = nullptr;
+ // Map metrics
+ MetricGaugePtr m_loaded_blocks_gauge;
MetricCounterPtr m_save_time_counter;
+ MetricCounterPtr m_save_count_counter;
};
@@ -453,10 +456,25 @@ public:
void blitBackAll(std::map<v3s16, MapBlock*> * modified_blocks,
bool overwrite_generated = true);
+ /*
+ Creates a copy of this VManip including contents, the copy will not be
+ associated with a Map.
+ */
+ MMVManip *clone() const;
+
+ // Reassociates a copied VManip to a map
+ void reparent(Map *map);
+
+ // Is it impossible to call initialEmerge / blitBackAll?
+ inline bool isOrphan() const { return !m_map; }
+
bool m_is_dirty = false;
protected:
- Map *m_map;
+ MMVManip() {};
+
+ // may be null
+ Map *m_map = nullptr;
/*
key = blockpos
value = flags describing the block