summaryrefslogtreecommitdiff
path: root/src/map.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/map.h')
-rw-r--r--src/map.h246
1 files changed, 48 insertions, 198 deletions
diff --git a/src/map.h b/src/map.h
index 09154547c..86b6b6e18 100644
--- a/src/map.h
+++ b/src/map.h
@@ -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