diff options
Diffstat (limited to 'src/map.h')
-rw-r--r-- | src/map.h | 246 |
1 files changed, 48 insertions, 198 deletions
@@ -41,13 +41,27 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapchunk.h" #include "nodemetadata.h" +namespace mapgen{ + 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, + // Node removed (changed to air) MEET_REMOVENODE, + // Node metadata of block changed (not knowing which node exactly) + // p stores block coordinate + MEET_BLOCK_NODE_METADATA_CHANGED, + // Anything else MEET_OTHER }; @@ -122,7 +136,7 @@ public: // On failure returns NULL MapSector * getSectorNoGenerateNoExNoLock(v2s16 p2d); - // On failure returns NULL + // Same as the above (there exists no lock anymore) MapSector * getSectorNoGenerateNoEx(v2s16 p2d); // On failure throws InvalidPositionException MapSector * getSectorNoGenerate(v2s16 p2d); @@ -258,6 +272,9 @@ public: //bool updateChangedVisibleArea(); virtual void save(bool only_changed){assert(0);}; + + // Server implements this + virtual void saveBlock(MapBlock *block){}; /* Updates usage timers @@ -269,7 +286,7 @@ public: void deleteSectors(core::list<v2s16> &list, bool only_blocks); // Returns count of deleted sectors - u32 deleteUnusedSectors(float timeout, bool only_blocks=false, + u32 unloadUnusedData(float timeout, bool only_blocks=false, core::list<v3s16> *deleted_blocks=NULL); // For debug printing @@ -320,8 +337,6 @@ protected: This is the only map class that is able to generate map. */ -struct ChunkMakeData; - class ServerMap : public Map { public: @@ -337,159 +352,24 @@ public: } /* - Map generation - */ - - // Returns the position of the chunk where the sector is in - v2s16 sector_to_chunk(v2s16 sectorpos) - { - if(m_chunksize == 0) - return v2s16(0,0); - sectorpos.X += m_chunksize / 2; - sectorpos.Y += m_chunksize / 2; - v2s16 chunkpos = getContainerPos(sectorpos, m_chunksize); - return chunkpos; - } - - // Returns the position of the (0,0) sector of the chunk - v2s16 chunk_to_sector(v2s16 chunkpos) - { - if(m_chunksize == 0) - return v2s16(0,0); - v2s16 sectorpos( - chunkpos.X * m_chunksize, - chunkpos.Y * m_chunksize - ); - sectorpos.X -= m_chunksize / 2; - sectorpos.Y -= m_chunksize / 2; - return sectorpos; - } - - /* - Get a chunk. - */ - MapChunk *getChunk(v2s16 chunkpos) - { - core::map<v2s16, MapChunk*>::Node *n; - n = m_chunks.find(chunkpos); - if(n == NULL) - return NULL; - return n->getValue(); - } - - /* - True if the chunk and its neighbors are fully generated. - It means the chunk will not be touched in the future by the - generator. If false, generateChunk will make it true. - */ - bool chunkNonVolatile(v2s16 chunkpos) - { - if(m_chunksize == 0) - return true; - - /*for(s16 x=-1; x<=1; x++) - for(s16 y=-1; y<=1; y++)*/ - s16 x=0; - s16 y=0; - { - v2s16 chunkpos0 = chunkpos + v2s16(x,y); - MapChunk *chunk = getChunk(chunkpos); - if(chunk == NULL) - return false; - if(chunk->getGenLevel() != GENERATED_FULLY) - return false; - } - return true; - } - - /* - Returns true if any chunk is marked as modified - */ - bool anyChunkModified() - { - for(core::map<v2s16, MapChunk*>::Iterator - i = m_chunks.getIterator(); - i.atEnd()==false; i++) - { - v2s16 p = i.getNode()->getKey(); - MapChunk *chunk = i.getNode()->getValue(); - if(chunk->isModified()) - return true; - } - return false; - } - - void setChunksNonModified() - { - for(core::map<v2s16, MapChunk*>::Iterator - i = m_chunks.getIterator(); - i.atEnd()==false; i++) - { - v2s16 p = i.getNode()->getKey(); - MapChunk *chunk = i.getNode()->getValue(); - chunk->setModified(false); - } - } - - /* - Chunks are generated by using these and makeChunk(). - */ - void initChunkMake(ChunkMakeData &data, v2s16 chunkpos); - MapChunk* finishChunkMake(ChunkMakeData &data, - core::map<v3s16, MapBlock*> &changed_blocks); - - /* - Generate a chunk. - - All chunks touching this one can be altered also. - */ - /*MapChunk* generateChunkRaw(v2s16 chunkpos, - core::map<v3s16, MapBlock*> &changed_blocks, - bool force=false);*/ - - /* - Generate a chunk and its neighbors so that it won't be touched - anymore. - */ - /*MapChunk* generateChunk(v2s16 chunkpos, - core::map<v3s16, MapBlock*> &changed_blocks);*/ - - /* - Generate a sector. - - This is mainly called by generateChunkRaw. - */ - //ServerMapSector * generateSector(v2s16 p); - - /* Get a sector from somewhere. - Check memory - - Check disk (loads blocks also) + - Check disk (doesn't load blocks) - Create blank one */ ServerMapSector * createSector(v2s16 p); /* - Get a sector from somewhere. - - Check memory - - Check disk (loads blocks also) - - Generate chunk + Blocks are generated by using these and makeBlock(). */ - /*MapSector * emergeSector(v2s16 p, - core::map<v3s16, MapBlock*> &changed_blocks);*/ + void initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos); + MapBlock* finishBlockMake(mapgen::BlockMakeData *data, + core::map<v3s16, MapBlock*> &changed_blocks); - /*MapSector * emergeSector(v2s16 p) - { - core::map<v3s16, MapBlock*> changed_blocks; - return emergeSector(p, changed_blocks); - }*/ - + // A non-threaded wrapper to the above MapBlock * generateBlock( v3s16 p, - MapBlock *original_dummy, - ServerMapSector *sector, - core::map<v3s16, MapBlock*> &changed_blocks, - core::map<v3s16, MapBlock*> &lighting_invalidated_blocks + core::map<v3s16, MapBlock*> &modified_blocks ); /* @@ -498,37 +378,17 @@ public: - Create blank */ MapBlock * createBlock(v3s16 p); - - /* - only_from_disk, changed_blocks and lighting_invalidated_blocks - are not properly used by the new map generator. - */ - MapBlock * emergeBlock( - v3s16 p, - bool only_from_disk, - core::map<v3s16, MapBlock*> &changed_blocks, - core::map<v3s16, MapBlock*> &lighting_invalidated_blocks - ); #if 0 /* + NOTE: This comment might be outdated + Forcefully get a block from somewhere. - Exceptions: - - InvalidPositionException: possible if only_from_disk==true + InvalidPositionException possible if only_from_disk==true - changed_blocks: - - All already existing blocks that were modified are added. - - If found on disk, nothing will be added. - - If generated, the new block will not be included. - - lighting_invalidated_blocks: - - All blocks that have heavy-to-calculate lighting changes - are added. - - updateLighting() should be called for these. - - - A block that is in changed_blocks may not be in - lighting_invalidated_blocks. + Parameters: + changed_blocks: Blocks that have been modified */ MapBlock * emergeBlock( v3s16 p, @@ -551,6 +411,7 @@ public: // dirname: final directory name v2s16 getSectorPos(std::string dirname); v3s16 getBlockPos(std::string sectordir, std::string blockfile); + static std::string getBlockFilename(v3s16 p); void save(bool only_changed); //void loadAll(); @@ -559,8 +420,8 @@ public: void saveMapMeta(); void loadMapMeta(); - void saveChunkMeta(); - void loadChunkMeta(); + /*void saveChunkMeta(); + void loadChunkMeta();*/ // The sector mutex should be locked when calling most of these @@ -569,6 +430,7 @@ public: // DEPRECATED? Sectors have no metadata anymore. void saveSectorMeta(ServerMapSector *sector); MapSector* loadSectorMeta(std::string dirname, bool save_after_load); + bool loadSectorMeta(v2s16 p2d); // Full load of a sector including all blocks. // returns true on success, false on failure. @@ -580,12 +442,15 @@ public: void saveBlock(MapBlock *block); // 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); // For debug printing virtual void PrintInfo(std::ostream &out); bool isSavingEnabled(){ return m_map_saving_enabled; } + u64 getSeed(){ return m_seed; } + private: // Seed used for all kinds of randomness u64 m_seed; @@ -593,11 +458,13 @@ private: 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 /* Metadata is re-written on disk only if this is true. @@ -732,6 +599,12 @@ public: // For debug printing virtual void PrintInfo(std::ostream &out); + // Check if sector was drawn on last render() + bool sectorWasDrawn(v2s16 p) + { + return (m_last_drawn_sectors.find(p) != NULL); + } + private: Client *m_client; @@ -746,7 +619,8 @@ private: v3f m_camera_position; v3f m_camera_direction; JMutex m_camera_mutex; - + + core::map<v2s16, bool> m_last_drawn_sectors; }; #endif @@ -796,29 +670,5 @@ protected: bool m_create_area; }; -struct ChunkMakeData -{ - bool no_op; - ManualMapVoxelManipulator vmanip; - u64 seed; - v2s16 chunkpos; - s16 y_blocks_min; - s16 y_blocks_max; - v2s16 sectorpos_base; - s16 sectorpos_base_size; - v2s16 sectorpos_bigbase; - s16 sectorpos_bigbase_size; - s16 max_spread_amount; - UniqueQueue<v3s16> transforming_liquid; - - ChunkMakeData(): - no_op(false), - vmanip(NULL), - seed(0) - {} -}; - -void makeChunk(ChunkMakeData *data); - #endif |