Revert mapgen to best working version (2)
parent
685a635aea
commit
ee89e29ae1
34
src/main.cpp
34
src/main.cpp
|
@ -259,11 +259,11 @@ FEATURE: Erosion simulation at map generation time
|
||||||
- Simulate rock falling from cliffs when water has removed
|
- Simulate rock falling from cliffs when water has removed
|
||||||
enough solid rock from the bottom
|
enough solid rock from the bottom
|
||||||
|
|
||||||
Mapgen v2 (not doing):
|
Mapgen v2:
|
||||||
* only_from_disk might not work anymore - check and fix it.
|
* only_from_disk might not work anymore - check and fix it.
|
||||||
* Make the generator to run in background and not blocking block
|
* Make the generator to run in background and not blocking block
|
||||||
placement and transfer
|
placement and transfer
|
||||||
* Add some kind of erosion and other stuff that now is possible
|
* Possibly add some kind of erosion and other stuff
|
||||||
* Make client to fetch stuff asynchronously
|
* Make client to fetch stuff asynchronously
|
||||||
- Needs method SyncProcessData
|
- Needs method SyncProcessData
|
||||||
* Better water generation (spread it to underwater caverns but don't
|
* Better water generation (spread it to underwater caverns but don't
|
||||||
|
@ -273,28 +273,6 @@ Mapgen v2 (not doing):
|
||||||
the other chunk making nasty straight walls when the other chunk
|
the other chunk making nasty straight walls when the other chunk
|
||||||
is generated. Fix it.
|
is generated. Fix it.
|
||||||
|
|
||||||
Mapgen v4 (not doing):
|
|
||||||
* only_from_disk might not work anymore - check and fix it.
|
|
||||||
* Make the generator to run in background and not blocking block
|
|
||||||
placement and transfer
|
|
||||||
* Make chunks to be tiled vertically too
|
|
||||||
* MAKE IT FASTER
|
|
||||||
|
|
||||||
Mapgen v3 (not doing):
|
|
||||||
* Generate trees better
|
|
||||||
- Add a "trees_added" flag to sector, or something
|
|
||||||
* How 'bout making turbulence controlled so that for a given 2d position
|
|
||||||
it can be completely turned off, and is usually so. This way generation
|
|
||||||
can be sped up a lot.
|
|
||||||
* Add a way to generate a block partly, so that trees are not added, like
|
|
||||||
the chunks in v2
|
|
||||||
* Add mud "discretely", not by guessing from the noise
|
|
||||||
|
|
||||||
Mapgen v4:
|
|
||||||
* This will be the final way.
|
|
||||||
* Generate blocks in the same way as chunks, by copying a VoxelManipulator
|
|
||||||
from the map that is one block larger in all directions.
|
|
||||||
|
|
||||||
Misc. stuff:
|
Misc. stuff:
|
||||||
------------
|
------------
|
||||||
* Make an "environment metafile" to store at least time of day
|
* Make an "environment metafile" to store at least time of day
|
||||||
|
@ -1275,6 +1253,7 @@ void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
video::ITexture *g_map_plot_texture = NULL;
|
video::ITexture *g_map_plot_texture = NULL;
|
||||||
float g_map_plot_texture_scale = 4;
|
float g_map_plot_texture_scale = 4;
|
||||||
|
|
||||||
|
@ -1416,6 +1395,7 @@ void updateMapPlotTexture(v2f centerpos, video::IVideoDriver* driver,
|
||||||
img->drop();
|
img->drop();
|
||||||
assert(g_map_plot_texture);
|
assert(g_map_plot_texture);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Chat data
|
// Chat data
|
||||||
struct ChatLine
|
struct ChatLine
|
||||||
|
@ -3219,7 +3199,7 @@ int main(int argc, char *argv[])
|
||||||
x++;
|
x++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
/*
|
/*
|
||||||
Draw map plot
|
Draw map plot
|
||||||
*/
|
*/
|
||||||
|
@ -3234,7 +3214,7 @@ int main(int argc, char *argv[])
|
||||||
core::rect<s32> source(v2s32(0,0), g_map_plot_texture->getSize());
|
core::rect<s32> source(v2s32(0,0), g_map_plot_texture->getSize());
|
||||||
driver->draw2DImage(g_map_plot_texture, dest, source);
|
driver->draw2DImage(g_map_plot_texture, dest, source);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
Draw crosshair
|
Draw crosshair
|
||||||
*/
|
*/
|
||||||
|
@ -3277,6 +3257,7 @@ int main(int argc, char *argv[])
|
||||||
End of drawing
|
End of drawing
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if 0
|
||||||
/*
|
/*
|
||||||
Refresh map plot if player has moved considerably
|
Refresh map plot if player has moved considerably
|
||||||
*/
|
*/
|
||||||
|
@ -3291,6 +3272,7 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
g_refresh_map_plot = false;
|
g_refresh_map_plot = false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static s16 lastFPS = 0;
|
static s16 lastFPS = 0;
|
||||||
//u16 fps = driver->getFPS();
|
//u16 fps = driver->getFPS();
|
||||||
|
|
2986
src/map.cpp
2986
src/map.cpp
File diff suppressed because it is too large
Load Diff
126
src/map.h
126
src/map.h
|
@ -38,18 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "mapsector.h"
|
#include "mapsector.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "voxel.h"
|
#include "voxel.h"
|
||||||
|
#include "mapchunk.h"
|
||||||
/*
|
|
||||||
Some exposed functions
|
|
||||||
*/
|
|
||||||
|
|
||||||
double base_rock_level_2d(u64 seed, v2f p);
|
|
||||||
bool get_have_sand_coast(u64 seed, v2f p);
|
|
||||||
bool get_have_sand_ground(u64 seed, v2f p);
|
|
||||||
double get_turbulence_factor_2d(u64 seed, v2f p);
|
|
||||||
|
|
||||||
/*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MAPTYPE_BASE 0
|
#define MAPTYPE_BASE 0
|
||||||
#define MAPTYPE_SERVER 1
|
#define MAPTYPE_SERVER 1
|
||||||
|
@ -335,29 +324,81 @@ public:
|
||||||
Map generation
|
Map generation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
// Returns the position of the chunk where the sector is in
|
||||||
True if the block and its neighbors are fully generated.
|
v2s16 sector_to_chunk(v2s16 sectorpos)
|
||||||
It means the block will not be touched in the future by the
|
|
||||||
generator. If false, generateBlock will make it true.
|
|
||||||
*/
|
|
||||||
bool blockNonVolatile(v3s16 blockpos)
|
|
||||||
{
|
{
|
||||||
for(s16 x=-1; x<=1; x++)
|
sectorpos.X += m_chunksize / 2;
|
||||||
for(s16 y=-1; y<=1; y++)
|
sectorpos.Y += m_chunksize / 2;
|
||||||
for(s16 z=-1; z<=1; z++)
|
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)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
/*for(s16 x=-1; x<=1; x++)
|
||||||
|
for(s16 y=-1; y<=1; y++)*/
|
||||||
|
s16 x=0;
|
||||||
|
s16 y=0;
|
||||||
{
|
{
|
||||||
v3s16 blockpos0 = blockpos + v3s16(x,y,z);
|
v2s16 chunkpos0 = chunkpos + v2s16(x,y);
|
||||||
MapBlock *block = getBlockNoCreateNoEx(blockpos);
|
MapChunk *chunk = getChunk(chunkpos);
|
||||||
if(block == NULL)
|
if(chunk == NULL)
|
||||||
return false;
|
return false;
|
||||||
if(block->isFullyGenerated() == false)
|
if(chunk->getGenLevel() != GENERATED_FULLY)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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.
|
Generate a sector.
|
||||||
|
|
||||||
|
This is mainly called by generateChunkRaw.
|
||||||
*/
|
*/
|
||||||
//ServerMapSector * generateSector(v2s16 p);
|
//ServerMapSector * generateSector(v2s16 p);
|
||||||
|
|
||||||
|
@ -384,27 +425,6 @@ public:
|
||||||
return emergeSector(p, changed_blocks);
|
return emergeSector(p, changed_blocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*MapBlock * generateBlock(
|
|
||||||
v3s16 p,
|
|
||||||
MapBlock *original_dummy,
|
|
||||||
ServerMapSector *sector,
|
|
||||||
core::map<v3s16, MapBlock*> &changed_blocks,
|
|
||||||
core::map<v3s16, MapBlock*> &lighting_invalidated_blocks
|
|
||||||
);*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Generate a block.
|
|
||||||
|
|
||||||
All blocks touching this one can be altered also.
|
|
||||||
*/
|
|
||||||
MapBlock* generateBlockRaw(v3s16 blockpos,
|
|
||||||
core::map<v3s16, MapBlock*> &changed_blocks,
|
|
||||||
bool force=false);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Generate a block and its neighbors so that it won't be touched
|
|
||||||
anymore.
|
|
||||||
*/
|
|
||||||
MapBlock * generateBlock(
|
MapBlock * generateBlock(
|
||||||
v3s16 p,
|
v3s16 p,
|
||||||
MapBlock *original_dummy,
|
MapBlock *original_dummy,
|
||||||
|
@ -412,8 +432,6 @@ public:
|
||||||
core::map<v3s16, MapBlock*> &changed_blocks,
|
core::map<v3s16, MapBlock*> &changed_blocks,
|
||||||
core::map<v3s16, MapBlock*> &lighting_invalidated_blocks
|
core::map<v3s16, MapBlock*> &lighting_invalidated_blocks
|
||||||
);
|
);
|
||||||
/*MapBlock* generateBlock(v3s16 blockpos,
|
|
||||||
core::map<v3s16, MapBlock*> &changed_blocks);*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Get a block from somewhere.
|
Get a block from somewhere.
|
||||||
|
@ -486,6 +504,9 @@ public:
|
||||||
void saveMapMeta();
|
void saveMapMeta();
|
||||||
void loadMapMeta();
|
void loadMapMeta();
|
||||||
|
|
||||||
|
void saveChunkMeta();
|
||||||
|
void loadChunkMeta();
|
||||||
|
|
||||||
// The sector mutex should be locked when calling most of these
|
// The sector mutex should be locked when calling most of these
|
||||||
|
|
||||||
// This only saves sector-specific data such as the heightmap
|
// This only saves sector-specific data such as the heightmap
|
||||||
|
@ -510,14 +531,17 @@ public:
|
||||||
|
|
||||||
bool isSavingEnabled(){ return m_map_saving_enabled; }
|
bool isSavingEnabled(){ return m_map_saving_enabled; }
|
||||||
|
|
||||||
u64 getSeed(){ return m_seed; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Seed used for all kinds of randomness
|
// Seed used for all kinds of randomness
|
||||||
u64 m_seed;
|
u64 m_seed;
|
||||||
|
|
||||||
std::string m_savedir;
|
std::string m_savedir;
|
||||||
bool m_map_saving_enabled;
|
bool m_map_saving_enabled;
|
||||||
|
|
||||||
|
// Chunk size in MapSectors
|
||||||
|
s16 m_chunksize;
|
||||||
|
// Chunks
|
||||||
|
core::map<v2s16, MapChunk*> m_chunks;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -641,7 +665,7 @@ public:
|
||||||
void updateMeshes(v3s16 blockpos, u32 daynight_ratio);
|
void updateMeshes(v3s16 blockpos, u32 daynight_ratio);
|
||||||
|
|
||||||
// Update meshes that touch the node
|
// Update meshes that touch the node
|
||||||
void updateNodeMeshes(v3s16 nodepos, u32 daynight_ratio);
|
//void updateNodeMeshes(v3s16 nodepos, u32 daynight_ratio);
|
||||||
|
|
||||||
// For debug printing
|
// For debug printing
|
||||||
virtual void PrintInfo(std::ostream &out);
|
virtual void PrintInfo(std::ostream &out);
|
||||||
|
|
|
@ -36,7 +36,7 @@ MapBlock::MapBlock(NodeContainer *parent, v3s16 pos, bool dummy):
|
||||||
is_underground(false),
|
is_underground(false),
|
||||||
m_lighting_expired(true),
|
m_lighting_expired(true),
|
||||||
m_day_night_differs(false),
|
m_day_night_differs(false),
|
||||||
m_not_fully_generated(false),
|
//m_not_fully_generated(false),
|
||||||
m_objects(this)
|
m_objects(this)
|
||||||
{
|
{
|
||||||
data = NULL;
|
data = NULL;
|
||||||
|
@ -1763,8 +1763,8 @@ void MapBlock::serialize(std::ostream &os, u8 version)
|
||||||
flags |= 0x02;
|
flags |= 0x02;
|
||||||
if(m_lighting_expired)
|
if(m_lighting_expired)
|
||||||
flags |= 0x04;
|
flags |= 0x04;
|
||||||
if(m_not_fully_generated)
|
/*if(m_not_fully_generated)
|
||||||
flags |= 0x08;
|
flags |= 0x08;*/
|
||||||
os.write((char*)&flags, 1);
|
os.write((char*)&flags, 1);
|
||||||
|
|
||||||
u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
|
u32 nodecount = MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE;
|
||||||
|
@ -1887,7 +1887,7 @@ void MapBlock::deSerialize(std::istream &is, u8 version)
|
||||||
is_underground = (flags & 0x01) ? true : false;
|
is_underground = (flags & 0x01) ? true : false;
|
||||||
m_day_night_differs = (flags & 0x02) ? true : false;
|
m_day_night_differs = (flags & 0x02) ? true : false;
|
||||||
m_lighting_expired = (flags & 0x04) ? true : false;
|
m_lighting_expired = (flags & 0x04) ? true : false;
|
||||||
m_not_fully_generated = (flags & 0x08) ? true : false;
|
//m_not_fully_generated = (flags & 0x08) ? true : false;
|
||||||
|
|
||||||
// Uncompress data
|
// Uncompress data
|
||||||
std::ostringstream os(std::ios_base::binary);
|
std::ostringstream os(std::ios_base::binary);
|
||||||
|
|
|
@ -244,16 +244,15 @@ public:
|
||||||
return m_lighting_expired;
|
return m_lighting_expired;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isFullyGenerated()
|
/*bool isFullyGenerated()
|
||||||
{
|
{
|
||||||
return !m_not_fully_generated;
|
return !m_not_fully_generated;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFullyGenerated(bool b)
|
void setFullyGenerated(bool b)
|
||||||
{
|
{
|
||||||
setChangedFlag();
|
setChangedFlag();
|
||||||
m_not_fully_generated = !b;
|
m_not_fully_generated = !b;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
bool isValid()
|
bool isValid()
|
||||||
{
|
{
|
||||||
|
@ -680,7 +679,7 @@ private:
|
||||||
|
|
||||||
TODO: Save in file
|
TODO: Save in file
|
||||||
*/
|
*/
|
||||||
bool m_not_fully_generated;
|
//bool m_not_fully_generated;
|
||||||
|
|
||||||
MapBlockObjectList m_objects;
|
MapBlockObjectList m_objects;
|
||||||
|
|
||||||
|
|
|
@ -544,10 +544,16 @@ void RemoteClient::GetNextBlocks(Server *server, float dtime,
|
||||||
block_is_invalid = true;
|
block_is_invalid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(block->isFullyGenerated() == false)
|
/*if(block->isFullyGenerated() == false)
|
||||||
{
|
{
|
||||||
block_is_invalid = true;
|
block_is_invalid = true;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
v2s16 p2d(p.X, p.Z);
|
||||||
|
ServerMap *map = (ServerMap*)(&server->m_env.getMap());
|
||||||
|
v2s16 chunkpos = map->sector_to_chunk(p2d);
|
||||||
|
if(map->chunkNonVolatile(chunkpos) == false)
|
||||||
|
block_is_invalid = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1711,7 +1717,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
writeU16(&reply[0], TOCLIENT_INIT);
|
writeU16(&reply[0], TOCLIENT_INIT);
|
||||||
writeU8(&reply[2], deployed);
|
writeU8(&reply[2], deployed);
|
||||||
writeV3S16(&reply[2+1], floatToInt(player->getPosition()+v3f(0,BS/2,0), BS));
|
writeV3S16(&reply[2+1], floatToInt(player->getPosition()+v3f(0,BS/2,0), BS));
|
||||||
writeU64(&reply[2+1+6], m_env.getServerMap().getSeed());
|
//writeU64(&reply[2+1+6], m_env.getServerMap().getSeed());
|
||||||
|
|
||||||
// Send as reliable
|
// Send as reliable
|
||||||
m_con.Send(peer_id, 0, reply, true);
|
m_con.Send(peer_id, 0, reply, true);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue