#include "voxel.h"
#include "modifiedstate.h"
#include "util/container.h"
+#include "util/metricsbackend.h"
#include "nodetimer.h"
#include "map_settings_manager.h"
#include "debug.h"
class IGameDef;
class IRollbackManager;
class EmergeManager;
+class MetricsBackend;
class ServerEnvironment;
struct BlockMakeData;
MEET_REMOVENODE,
// Node swapped (changed without metadata change)
MEET_SWAPNODE,
- // Node metadata of block changed (not knowing which node exactly)
- // p stores block coordinate
+ // Node metadata changed
MEET_BLOCK_NODE_METADATA_CHANGED,
// Anything else (modified_blocks are set unsent)
MEET_OTHER
v3s16 p;
MapNode n = CONTENT_AIR;
std::set<v3s16> modified_blocks;
- u16 already_known_by_peer = 0;
+ bool is_private_change = false;
MapEditEvent() = default;
- MapEditEvent * clone()
- {
- MapEditEvent *event = new MapEditEvent();
- event->type = type;
- event->p = p;
- event->n = n;
- event->modified_blocks = modified_blocks;
- return event;
- }
-
- VoxelArea getArea()
+ VoxelArea getArea() const
{
switch(type){
case MEET_ADDNODE:
{
public:
// event shall be deleted by caller after the call.
- virtual void onMapEditEvent(MapEditEvent *event) = 0;
+ virtual void onMapEditEvent(const MapEditEvent &event) = 0;
};
class Map /*: public NodeContainer*/
{
public:
- Map(std::ostream &dout, IGameDef *gamedef);
+ Map(IGameDef *gamedef);
virtual ~Map();
DISABLE_CLASS_COPY(Map);
void addEventReceiver(MapEventReceiver *event_receiver);
void removeEventReceiver(MapEventReceiver *event_receiver);
// event shall be deleted by caller after the call.
- void dispatchEvent(MapEditEvent *event);
+ void dispatchEvent(const MapEditEvent &event);
// On failure returns NULL
- MapSector * getSectorNoGenerateNoExNoLock(v2s16 p2d);
+ MapSector * getSectorNoGenerateNoLock(v2s16 p2d);
// Same as the above (there exists no lock anymore)
- MapSector * getSectorNoGenerateNoEx(v2s16 p2d);
- // On failure throws InvalidPositionException
MapSector * getSectorNoGenerate(v2s16 p2d);
- // Gets an existing sector or creates an empty one
- //MapSector * getSectorCreate(v2s16 p2d);
/*
This is overloaded by ClientMap and ServerMap to allow
inline const NodeDefManager * getNodeDefManager() { return m_nodedef; }
- // Returns InvalidPositionException if not found
- bool isNodeUnderground(v3s16 p);
-
bool isValidPosition(v3s16 p);
// throws InvalidPositionException if not found
// Returns a CONTENT_IGNORE node if not found
// If is_valid_position is not NULL then this will be set to true if the
// position is valid, otherwise false
- MapNode getNodeNoEx(v3s16 p, bool *is_valid_position = NULL);
+ MapNode getNode(v3s16 p, bool *is_valid_position = NULL);
/*
These handle lighting but not faces.
void setNodeTimer(const NodeTimer &t);
void removeNodeTimer(v3s16 p);
- /*
- Misc.
- */
- std::map<v2s16, MapSector*> *getSectorsPtr(){return &m_sectors;}
-
/*
Variables
*/
protected:
friend class LuaVoxelManip;
- std::ostream &m_dout; // A bit deprecated, could be removed
-
IGameDef *m_gamedef;
std::set<MapEventReceiver*> m_event_receivers;
// This stores the properties of the nodes on the map.
const NodeDefManager *m_nodedef;
- bool isOccluded(v3s16 p0, v3s16 p1, float step, float stepfac,
- float start_off, float end_off, u32 needed_count);
+ 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;
/*
savedir: directory to which map data should be saved
*/
- ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge);
+ ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, MetricsBackend *mb);
~ServerMap();
s32 mapType() const
*/
MapSector *createSector(v2s16 p);
- bool saoPositionOverLimit(const v3f &p);
-
/*
Blocks are generated by using these and makeBlock().
*/
*/
MapBlock *getBlockOrEmerge(v3s16 p3d);
- // Helper for placing objects on ground level
- s16 findGroundLevel(v2s16 p2d);
-
- /*
- Misc. helper functions for fiddling with directory and file
- names when saving
- */
- void createDirs(std::string path);
- // returns something like "map/sectors/xxxxxxxx"
- std::string getSectorDir(v2s16 pos, int layout = 2);
- // dirname: final directory name
- v2s16 getSectorPos(const std::string &dirname);
- v3s16 getBlockPos(const std::string §ordir, const std::string &blockfile);
- static std::string getBlockFilename(v3s16 p);
+ bool isBlockInQueue(v3s16 pos);
/*
Database functions
*/
static MapDatabase *createDatabase(const std::string &name, const std::string &savedir, Settings &conf);
- // Returns true if the database file does not exist
- bool loadFromFolders();
-
// Call these before and after saving of blocks
void beginSave();
void endSave();
MapgenParams *getMapgenParams();
bool saveBlock(MapBlock *block);
- static bool saveBlock(MapBlock *block, MapDatabase *db);
- // This will generate a sector with getSector if not found.
- void loadBlock(const std::string §ordir, const std::string &blockfile,
- MapSector *sector, bool save_after_load=false);
+ 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 isSavingEnabled(){ return m_map_saving_enabled; }
u64 getSeed();
- s16 getWaterLevel();
/*!
* Fixes lighting in one map block.
std::string m_savedir;
bool m_map_saving_enabled;
-#if 0
- // Chunk size in MapSectors
- // If 0, chunks are disabled.
- s16 m_chunksize;
- // Chunks
- core::map<v2s16, MapChunk*> m_chunks;
-#endif
+ int m_map_compression_level;
+
+ std::set<v3s16> m_chunks_in_progress;
/*
Metadata is re-written on disk only if this is true.
*/
bool m_map_metadata_changed = true;
MapDatabase *dbase = nullptr;
+ MapDatabase *dbase_ro = nullptr;
+
+ MetricCounterPtr m_save_time_counter;
};