diff options
Diffstat (limited to 'src/map.h')
-rw-r--r-- | src/map.h | 139 |
1 files changed, 117 insertions, 22 deletions
@@ -1,6 +1,6 @@ /* Minetest-c55 -Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> +Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -39,14 +39,21 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "voxel.h" #include "mapchunk.h" +#include "nodemetadata.h" #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 }; @@ -277,6 +284,22 @@ public: void transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks); /* + Node metadata + These are basically coordinate wrappers to MapBlock + */ + + NodeMetadata* getNodeMetadata(v3s16 p); + void setNodeMetadata(v3s16 p, NodeMetadata *meta); + void removeNodeMetadata(v3s16 p); + void nodeMetadataStep(float dtime, + core::map<v3s16, MapBlock*> &changed_blocks); + + /* + Misc. + */ + core::map<v2s16, MapSector*> *getSectorsPtr(){return &m_sectors;} + + /* Variables */ @@ -286,16 +309,13 @@ protected: core::map<MapEventReceiver*, bool> m_event_receivers; - // Mutex is important because on client map is accessed asynchronously core::map<v2s16, MapSector*> m_sectors; - JMutex m_sector_mutex; + //JMutex m_sector_mutex; // Be sure to set this to NULL when the cached sector is deleted MapSector *m_sector_cache; v2s16 m_sector_cache_p; - //WrapperHeightmap m_hwrapper; - // Queued transforming water nodes UniqueQueue<v3s16> m_transforming_liquid; }; @@ -306,6 +326,8 @@ protected: This is the only map class that is able to generate map. */ +struct ChunkMakeData; + class ServerMap : public Map { public: @@ -327,6 +349,8 @@ public: // 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); @@ -336,6 +360,8 @@ public: // 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 @@ -364,6 +390,9 @@ public: */ 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; @@ -378,22 +407,58 @@ public: } 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, + /*MapChunk* generateChunkRaw(v2s16 chunkpos, core::map<v3s16, MapBlock*> &changed_blocks, - bool force=false); + 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); + /*MapChunk* generateChunk(v2s16 chunkpos, + core::map<v3s16, MapBlock*> &changed_blocks);*/ /* Generate a sector. @@ -416,14 +481,14 @@ public: - Check disk (loads blocks also) - Generate chunk */ - MapSector * emergeSector(v2s16 p, - core::map<v3s16, MapBlock*> &changed_blocks); + /*MapSector * emergeSector(v2s16 p, + core::map<v3s16, MapBlock*> &changed_blocks);*/ - MapSector * emergeSector(v2s16 p) + /*MapSector * emergeSector(v2s16 p) { core::map<v3s16, MapBlock*> changed_blocks; return emergeSector(p, changed_blocks); - } + }*/ MapBlock * generateBlock( v3s16 p, @@ -486,19 +551,15 @@ public: Misc. helper functions for fiddling with directory and file names when saving */ - void createDir(std::string path); - void createSaveDir(); - // returns something like "xxxxxxxx" - std::string getSectorSubDir(v2s16 pos); + void createDirs(std::string path); // returns something like "map/sectors/xxxxxxxx" - std::string getSectorDir(v2s16 pos); - std::string createSectorDir(v2s16 pos); + std::string getSectorDir(v2s16 pos, int layout = 2); // dirname: final directory name v2s16 getSectorPos(std::string dirname); v3s16 getBlockPos(std::string sectordir, std::string blockfile); void save(bool only_changed); - void loadAll(); + //void loadAll(); // Saves map seed and possibly other stuff void saveMapMeta(); @@ -513,7 +574,7 @@ public: // (no MapBlocks) // DEPRECATED? Sectors have no metadata anymore. void saveSectorMeta(ServerMapSector *sector); - MapSector* loadSectorMeta(std::string dirname); + MapSector* loadSectorMeta(std::string dirname, bool save_after_load); // Full load of a sector including all blocks. // returns true on success, false on failure. @@ -524,7 +585,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); + void loadBlock(std::string sectordir, std::string blockfile, MapSector *sector, bool save_after_load=false); // For debug printing virtual void PrintInfo(std::ostream &out); @@ -539,9 +600,16 @@ private: bool m_map_saving_enabled; // Chunk size in MapSectors + // If 0, chunks are disabled. s16 m_chunksize; // Chunks core::map<v2s16, MapChunk*> m_chunks; + + /* + Metadata is re-written on disk only if this is true. + This is reset to false when written on disk. + */ + bool m_map_metadata_changed; }; /* @@ -719,6 +787,9 @@ class ManualMapVoxelManipulator : public MapVoxelManipulator public: ManualMapVoxelManipulator(Map *map); virtual ~ManualMapVoxelManipulator(); + + void setMap(Map *map) + {m_map = map;} virtual void emerge(VoxelArea a, s32 caller_id=-1); @@ -731,5 +802,29 @@ 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 |