#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*/
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);
// 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.
// 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
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);
+ void createDirs(const std::string &path);
/*
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();
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);
MapBlock* loadBlock(v3s16 p);
// Database version
void loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load=false);
*/
bool m_map_metadata_changed = true;
MapDatabase *dbase = nullptr;
+ MapDatabase *dbase_ro = nullptr;
+
+ MetricCounterPtr m_save_time_counter;
};