#include <jmutexautolock.h>
#include <jthread.h>
#include <iostream>
+#include <sstream>
#include "common_irrlicht.h"
#include "mapnode.h"
#include "mapblock_nodemod.h"
#include "constants.h"
#include "voxel.h"
+#include "utility.h" // Needed for UniqueQueue, a member of Map
+
+extern "C" {
+ #include "sqlite3.h"
+}
class MapSector;
class ServerMapSector;
class ClientMapSector;
class MapBlock;
class NodeMetadata;
+class IGameDef;
namespace mapgen{
struct BlockMakeData;
{
public:
- Map(std::ostream &dout);
+ Map(std::ostream &dout, IGameDef *gamedef);
virtual ~Map();
/*virtual u16 nodeContainerId() const
// Returns NULL if not found
MapBlock * getBlockNoCreateNoEx(v3s16 p);
+ /* Server overrides */
+ virtual MapBlock * emergeBlock(v3s16 p, bool allow_generate=true)
+ { return getBlockNoCreateNoEx(p); }
+
// Returns InvalidPositionException if not found
bool isNodeUnderground(v3s16 p);
These handle lighting but not faces.
*/
void addNodeAndUpdate(v3s16 p, MapNode n,
- core::map<v3s16, MapBlock*> &modified_blocks);
+ core::map<v3s16, MapBlock*> &modified_blocks, std::string &player_name);
void removeNodeAndUpdate(v3s16 p,
core::map<v3s16, MapBlock*> &modified_blocks);
//core::aabbox3d<s16> getDisplayedBlockArea();
//bool updateChangedVisibleArea();
+
+ // Call these before and after saving of many blocks
+ virtual void beginSave() {return;};
+ virtual void endSave() {return;};
virtual void save(bool only_changed){assert(0);};
protected:
- std::ostream &m_dout;
+ std::ostream &m_dout; // A bit deprecated, could be removed
+
+ IGameDef *m_gamedef;
core::map<MapEventReceiver*, bool> m_event_receivers;
/*
savedir: directory to which map data should be saved
*/
- ServerMap(std::string savedir);
+ ServerMap(std::string savedir, IGameDef *gamedef);
~ServerMap();
s32 mapType() const
v3s16 getBlockPos(std::string sectordir, std::string blockfile);
static std::string getBlockFilename(v3s16 p);
+ /*
+ Database functions
+ */
+ // Create the database structure
+ void createDatabase();
+ // Verify we can read/write to the database
+ void verifyDatabase();
+ // Get an integer suitable for a block
+ static sqlite3_int64 getBlockAsInteger(const v3s16 pos);
+ static v3s16 getIntegerAsBlock(sqlite3_int64 i);
+
+ // Returns true if the database file does not exist
+ bool loadFromFolders();
+
+ // Call these before and after saving of blocks
+ void beginSave();
+ void endSave();
+
void save(bool only_changed);
//void loadAll();
+ void listAllLoadableBlocks(core::list<v3s16> &dst);
+
// Saves map seed and possibly other stuff
void saveMapMeta();
void loadMapMeta();
// This will generate a sector with getSector if not found.
void loadBlock(std::string sectordir, 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);
// For debug printing
virtual void PrintInfo(std::ostream &out);
u64 getSeed(){ return m_seed; }
private:
- // Seed used for all kinds of randomness
+ // Seed used for all kinds of randomness in generation
u64 m_seed;
-
+
std::string m_savedir;
bool m_map_saving_enabled;
This is reset to false when written on disk.
*/
bool m_map_metadata_changed;
+
+ /*
+ SQLite database and statements
+ */
+ sqlite3 *m_database;
+ sqlite3_stmt *m_database_read;
+ sqlite3_stmt *m_database_write;
+ sqlite3_stmt *m_database_list;
};
/*
};
class Client;
+class ITextureSource;
/*
ClientMap
public:
ClientMap(
Client *client,
+ IGameDef *gamedef,
MapDrawControl &control,
scene::ISceneNode* parent,
scene::ISceneManager* mgr,
ISceneNode::drop();
}
- void updateCamera(v3f pos, v3f dir)
+ void updateCamera(v3f pos, v3f dir, f32 fov)
{
JMutexAutoLock lock(m_camera_mutex);
m_camera_position = pos;
m_camera_direction = dir;
+ m_camera_fov = fov;
}
/*
void renderMap(video::IVideoDriver* driver, s32 pass);
+ void renderPostFx();
+
/*
Methods for setting temporary modifications to nodes for
drawing.
/*
Update the faces of the given block and blocks on the
- leading edge.
+ leading edge, without threading. Rarely used.
*/
void updateMeshes(v3s16 blockpos, u32 daynight_ratio);
v3f m_camera_position;
v3f m_camera_direction;
+ f32 m_camera_fov;
JMutex m_camera_mutex;
core::map<v2s16, bool> m_last_drawn_sectors;