diff options
Diffstat (limited to 'src/map.h')
-rw-r--r-- | src/map.h | 218 |
1 files changed, 46 insertions, 172 deletions
@@ -132,7 +132,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); @@ -268,6 +268,9 @@ public: //bool updateChangedVisibleArea(); virtual void save(bool only_changed){assert(0);}; + + // Server implements this + virtual void saveBlock(MapBlock *block){}; /* Updates usage timers @@ -279,7 +282,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 @@ -330,7 +333,9 @@ protected: This is the only map class that is able to generate map. */ -struct ChunkMakeData; +//struct ChunkMakeData; + +struct BlockMakeData; class ServerMap : public Map { @@ -347,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(BlockMakeData *data, v3s16 blockpos); + MapBlock* finishBlockMake(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 ); /* @@ -508,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 - - 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. + InvalidPositionException possible if only_from_disk==true - - 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, @@ -561,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(); @@ -569,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 @@ -579,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. @@ -590,6 +442,7 @@ 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); @@ -605,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. @@ -815,6 +670,7 @@ protected: bool m_create_area; }; +#if 0 struct ChunkMakeData { bool no_op; @@ -838,6 +694,24 @@ struct ChunkMakeData }; void makeChunk(ChunkMakeData *data); +#endif + +struct BlockMakeData +{ + bool no_op; + ManualMapVoxelManipulator vmanip; + u64 seed; + v3s16 blockpos; + UniqueQueue<v3s16> transforming_liquid; + + BlockMakeData(): + no_op(false), + vmanip(NULL), + seed(0) + {} +}; + +void makeBlock(BlockMakeData *data); #endif |