diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 22:50:31 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-04-10 22:50:31 +0300 |
commit | b0b5c432542ea5f9292f428bb59e2670c0d7c53d (patch) | |
tree | 60b280856a266c0bebef81a79cd5c2e72dcb50af | |
parent | 3d25fe42f34589bd10a92929c442c2cd7f607309 (diff) | |
download | minetest-b0b5c432542ea5f9292f428bb59e2670c0d7c53d.tar.gz minetest-b0b5c432542ea5f9292f428bb59e2670c0d7c53d.tar.bz2 minetest-b0b5c432542ea5f9292f428bb59e2670c0d7c53d.zip |
better support for old maps
-rw-r--r-- | src/map.cpp | 72 | ||||
-rw-r--r-- | src/map.h | 32 | ||||
-rw-r--r-- | src/server.cpp | 12 | ||||
-rw-r--r-- | src/serverobject.cpp | 15 | ||||
-rw-r--r-- | src/serverobject.h | 35 | ||||
-rw-r--r-- | src/utility.h | 29 |
6 files changed, 145 insertions, 50 deletions
diff --git a/src/map.cpp b/src/map.cpp index c258d157b..7fe58dc11 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1801,7 +1801,6 @@ ServerMap::ServerMap(std::string savedir): //m_chunksize = 4; //m_chunksize = 2; - // TODO: Save to and load from a file m_seed = (((u64)(myrand()%0xffff)<<0) + ((u64)(myrand()%0xffff)<<16) + ((u64)(myrand()%0xffff)<<32) @@ -1838,8 +1837,16 @@ ServerMap::ServerMap(std::string savedir): // Load map metadata (seed, chunksize) loadMapMeta(); - // Load chunk metadata - loadChunkMeta(); + try{ + // Load chunk metadata + loadChunkMeta(); + } + catch(FileNotGoodException &e){ + dstream<<DTIME<<"WARNING: Server: Could not load " + <<"chunk metafile. Disabling chunk-based " + <<"generation."<<std::endl; + m_chunksize = 0; + } /*// Load sector (0,0) and throw and exception on fail if(loadSectorFull(v2s16(0,0)) == false) @@ -2173,6 +2180,9 @@ void addRandomObjects(MapBlock *block) void makeChunk(ChunkMakeData *data) { + if(data->no_op) + return; + s16 y_nodes_min = data->y_blocks_min * MAP_BLOCKSIZE; s16 y_nodes_max = data->y_blocks_max * MAP_BLOCKSIZE + MAP_BLOCKSIZE - 1; s16 h_blocks = data->y_blocks_max - data->y_blocks_min + 1; @@ -2938,8 +2948,8 @@ void makeChunk(ChunkMakeData *data) // Add to transforming liquid queue (in case it'd // start flowing) - /*v3s16 p = v3s16(p2d.X, y, p2d.Y); - m_transforming_liquid.push_back(p);*/ + v3s16 p = v3s16(p2d.X, y, p2d.Y); + data->transforming_liquid.push_back(p); } // Next one @@ -3419,6 +3429,14 @@ void makeChunk(ChunkMakeData *data) void ServerMap::initChunkMake(ChunkMakeData &data, v2s16 chunkpos) { + if(m_chunksize == 0) + { + data.no_op = true; + return; + } + + data.no_op = false; + // The distance how far into the neighbors the generator is allowed to go. s16 max_spread_amount_sectors = 2; assert(max_spread_amount_sectors <= m_chunksize); @@ -3449,7 +3467,7 @@ void ServerMap::initChunkMake(ChunkMakeData &data, v2s16 chunkpos) Create the whole area of this and the neighboring chunks */ { - TimeTaker timer("generateChunkRaw() create area"); + TimeTaker timer("initChunkMake() create area"); for(s16 x=0; x<sectorpos_bigbase_size; x++) for(s16 z=0; z<sectorpos_bigbase_size; z++) @@ -3503,7 +3521,7 @@ void ServerMap::initChunkMake(ChunkMakeData &data, v2s16 chunkpos) data.vmanip.setMap(this); // Add the area { - TimeTaker timer("generateChunkRaw() initialEmerge"); + TimeTaker timer("initChunkMake() initialEmerge"); data.vmanip.initialEmerge(bigarea_blocks_min, bigarea_blocks_max); } @@ -3512,6 +3530,9 @@ void ServerMap::initChunkMake(ChunkMakeData &data, v2s16 chunkpos) MapChunk* ServerMap::finishChunkMake(ChunkMakeData &data, core::map<v3s16, MapBlock*> &changed_blocks) { + if(data.no_op) + return NULL; + /* Blit generated stuff to map */ @@ -3534,6 +3555,15 @@ MapChunk* ServerMap::finishChunkMake(ChunkMakeData &data, } /* + Copy transforming liquid information + */ + while(data.transforming_liquid.size() > 0) + { + v3s16 p = data.transforming_liquid.pop_front(); + m_transforming_liquid.push_back(p); + } + + /* Add random objects to blocks */ { @@ -3590,6 +3620,7 @@ MapChunk* ServerMap::finishChunkMake(ChunkMakeData &data, return chunk; } +#if 0 // NOTE: Deprecated MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, core::map<v3s16, MapBlock*> &changed_blocks, @@ -3661,6 +3692,7 @@ MapChunk* ServerMap::generateChunk(v2s16 chunkpos1, MapChunk *chunk = getChunk(chunkpos1); return chunk; } +#endif ServerMapSector * ServerMap::createSector(v2s16 p2d) { @@ -3715,6 +3747,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) return sector; } +#if 0 MapSector * ServerMap::emergeSector(v2s16 p2d, core::map<v3s16, MapBlock*> &changed_blocks) { @@ -3801,6 +3834,7 @@ MapSector * ServerMap::emergeSector(v2s16 p2d, */ //return generateSector(); } +#endif /* NOTE: This is not used for main map generation, only for blocks @@ -3817,6 +3851,14 @@ MapBlock * ServerMap::generateBlock( DSTACK("%s: p=(%d,%d,%d)", __FUNCTION_NAME, p.X, p.Y, p.Z); + + // If chunks are disabled + /*if(m_chunksize == 0) + { + dstream<<"ServerMap::generateBlock(): Chunks disabled -> " + <<"not generating."<<std::endl; + return NULL; + }*/ /*dstream<<"generateBlock(): " <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" @@ -3869,6 +3911,9 @@ MapBlock * ServerMap::generateBlock( s16 surface_y = base_rock_level_2d(m_seed, p2d_nodes+v2s16(x0,z0)) + AVERAGE_MUD_AMOUNT; + // If chunks are disabled + if(m_chunksize == 0) + surface_y = WATER_LEVEL + 1; if(surface_y < lowest_ground_y) lowest_ground_y = surface_y; @@ -4735,7 +4780,12 @@ void ServerMap::save(bool only_changed) <<std::endl; saveMapMeta(); - saveChunkMeta(); + + // Disable saving chunk metadata file if chunks are disabled + if(m_chunksize != 0) + { + saveChunkMeta(); + } u32 sector_meta_count = 0; u32 block_count = 0; @@ -4789,6 +4839,8 @@ void ServerMap::save(bool only_changed) } } +#if 0 +// NOTE: Doing this is insane. Deprecated and probably broken. void ServerMap::loadAll() { DSTACK(__FUNCTION_NAME); @@ -4849,6 +4901,7 @@ void ServerMap::loadAll() } dstream<<DTIME<<"ServerMap: Map loaded."<<std::endl; } +#endif #if 0 void ServerMap::saveMasterHeightmap() @@ -4952,6 +5005,9 @@ void ServerMap::loadMapMeta() void ServerMap::saveChunkMeta() { DSTACK(__FUNCTION_NAME); + + // This should not be called if chunks are disabled. + assert(m_chunksize != 0); u32 count = m_chunks.size(); @@ -341,6 +341,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); @@ -350,6 +352,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 @@ -378,6 +382,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; @@ -393,6 +400,9 @@ public: return true; } + /* + Chunks are generated by using these and makeChunk(). + */ void initChunkMake(ChunkMakeData &data, v2s16 chunkpos); MapChunk* finishChunkMake(ChunkMakeData &data, core::map<v3s16, MapBlock*> &changed_blocks); @@ -402,16 +412,16 @@ public: 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. @@ -434,14 +444,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, @@ -516,7 +526,7 @@ public: 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(); @@ -557,6 +567,7 @@ 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; @@ -754,6 +765,7 @@ protected: struct ChunkMakeData { + bool no_op; ManualMapVoxelManipulator vmanip; u64 seed; v2s16 chunkpos; @@ -764,8 +776,10 @@ struct ChunkMakeData v2s16 sectorpos_bigbase; s16 sectorpos_bigbase_size; s16 max_spread_amount; + UniqueQueue<v3s16> transforming_liquid; ChunkMakeData(): + no_op(false), vmanip(NULL) {} }; diff --git a/src/server.cpp b/src/server.cpp index 63d8e31db..925b2e0d7 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -201,10 +201,20 @@ void * EmergeThread::Thread() } else { + // Get, load or create sector ServerMapSector *sector = - (ServerMapSector*)map.getSectorNoGenerateNoEx(p2d); + (ServerMapSector*)map.createSector(p2d); + // Generate block block = map.generateBlock(p, block, sector, changed_blocks, lighting_invalidated_blocks); + if(block == NULL) + got_block = false; + } + } + else + { + if(block->getLightingExpired()){ + lighting_invalidated_blocks[block->getPos()] = block; } } diff --git a/src/serverobject.cpp b/src/serverobject.cpp index a58ca524d..b6015a477 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -170,6 +170,12 @@ void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, bool send_recommended) { assert(m_env); + + const float interval = 0.2; + if(m_move_interval.step(dtime, interval)) + return; + dtime = interval; + core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.); collisionMoveResult moveresult; // Apply gravity @@ -270,6 +276,7 @@ RatSAO proto_RatSAO(NULL, 0, v3f(0,0,0)); RatSAO::RatSAO(ServerEnvironment *env, u16 id, v3f pos): ServerActiveObject(env, id, pos), + m_is_active(false), m_speed_f(0,0,0) { //dstream<<"Server: RatSAO created"<<std::endl; @@ -303,6 +310,12 @@ void RatSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, { assert(m_env); + if(m_is_active == false) + { + if(m_inactive_interval.step(dtime, 0.5)) + return; + } + /* The AI */ @@ -336,6 +349,8 @@ void RatSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, break; } } + + m_is_active = player_is_close; if(player_is_close == false) { diff --git a/src/serverobject.h b/src/serverobject.h index 76f7d01d6..2889d0c39 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -40,38 +40,6 @@ Some planning */ -#if 0 -class IntervalLimiter -{ -public: - IntervalLimiter(): - m_accumulator(0) - { - } - /* - dtime: time from last call to this method - wanted_interval: interval wanted - return value: - true: action should be skipped - false: action should be done and dtime has been set - */ - bool step(float &dtime, float wanted_interval) - { - accumulator += dtime; - if(accumulator < wanted_interval) - { - dtime = 0; - return true; - } - accumulator -= wanted-interval; - dtime = wanted_interval; - return false; - } -protected: - float m_accumulator; -}; -#endif - class ServerEnvironment; class InventoryItem; @@ -204,6 +172,7 @@ private: std::string m_inventorystring; v3f m_speed_f; v3f m_last_sent_position; + IntervalLimiter m_move_interval; }; class RatSAO : public ServerActiveObject @@ -220,6 +189,8 @@ public: std::string getStaticData(); InventoryItem* createPickedUpItem(); private: + bool m_is_active; + IntervalLimiter m_inactive_interval; v3f m_speed_f; v3f m_oldpos; v3f m_last_sent_position; diff --git a/src/utility.h b/src/utility.h index f2f3018df..19946354c 100644 --- a/src/utility.h +++ b/src/utility.h @@ -2015,6 +2015,35 @@ inline core::aabbox3d<f32> getNodeBox(v3s16 p, float d) ); } +class IntervalLimiter +{ +public: + IntervalLimiter(): + m_accumulator(0) + { + } + /* + dtime: time from last call to this method + wanted_interval: interval wanted + return value: + true: action should be skipped + false: action should be done + */ + bool step(float dtime, float wanted_interval) + { + m_accumulator += dtime; + if(m_accumulator < wanted_interval) + { + dtime = 0; + return true; + } + m_accumulator -= wanted_interval; + return false; + } +protected: + float m_accumulator; +}; + #endif |