diff options
-rw-r--r-- | src/environment.cpp | 15 | ||||
-rw-r--r-- | src/map.cpp | 76 | ||||
-rw-r--r-- | src/serverobject.cpp | 7 | ||||
-rw-r--r-- | src/serverobject.h | 6 |
4 files changed, 98 insertions, 6 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 435690bca..eaea6d0b5 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -429,7 +429,7 @@ void ServerEnvironment::step(float dtime) bool send_recommended = false; m_send_recommended_timer += dtime; - if(m_send_recommended_timer > 0.2) + if(m_send_recommended_timer > 0.1) { m_send_recommended_timer = 0; send_recommended = true; @@ -1111,7 +1111,7 @@ void ClientEnvironment::step(float dtime) } /* - Step active objects + Step active objects and update lighting of them */ for(core::map<u16, ClientActiveObject*>::Iterator @@ -1121,6 +1121,17 @@ void ClientEnvironment::step(float dtime) ClientActiveObject* obj = i.getNode()->getValue(); // Step object obj->step(dtime, this); + // Update lighting + //u8 light = LIGHT_MAX; + u8 light = 0; + try{ + // Get node at head + v3s16 p = obj->getLightPosition(); + MapNode n = m_map->getNode(p); + light = n.getLightBlend(m_daynight_ratio); + } + catch(InvalidPositionException &e) {} + obj->updateLight(light); } } diff --git a/src/map.cpp b/src/map.cpp index 59cf937c0..3ba1bda68 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -2109,6 +2109,61 @@ double base_rock_level_2d(u64 seed, v2s16 p) return h; } +/* + Adds random objects to block, depending on the content of the block +*/ +void addRandomObjects(MapBlock *block) +{ + for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++) + for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++) + { + bool last_node_walkable = false; + for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++) + { + v3s16 p(x0,y0,z0); + MapNode n = block->getNodeNoEx(p); + if(n.d == CONTENT_IGNORE) + continue; + if(content_features(n.d).liquid_type != LIQUID_NONE) + continue; + if(content_features(n.d).walkable) + { + last_node_walkable = true; + continue; + } + if(last_node_walkable) + { + // If block contains light information + if(content_features(n.d).param_type == CPT_LIGHT) + { + if(n.getLight(LIGHTBANK_DAY) <= 3) + { + if(myrand() % 300 == 0) + { + v3f pos_f = intToFloat(p+block->getPosRelative(), BS); + pos_f.Y -= BS*0.4; + ServerActiveObject *obj = new RatSAO(NULL, 0, pos_f); + std::string data = obj->getStaticData(); + StaticObject s_obj(obj->getType(), + obj->getBasePosition(), data); + // Add some + block->m_static_objects.insert(0, s_obj); + block->m_static_objects.insert(0, s_obj); + block->m_static_objects.insert(0, s_obj); + block->m_static_objects.insert(0, s_obj); + block->m_static_objects.insert(0, s_obj); + block->m_static_objects.insert(0, s_obj); + delete obj; + } + } + } + } + last_node_walkable = false; + } + } + block->setChangedFlag(); +} + #define VMANIP_FLAG_DUNGEON VOXELFLAG_CHECKED1 /* @@ -3660,7 +3715,26 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos, } } - + /* + Add random objects to blocks + */ + { + for(s16 x=0; x<sectorpos_base_size; x++) + for(s16 z=0; z<sectorpos_base_size; z++) + { + v2s16 sectorpos = sectorpos_base + v2s16(x,z); + ServerMapSector *sector = createSector(sectorpos); + assert(sector); + + for(s16 y=y_blocks_min; y<=y_blocks_max; y++) + { + v3s16 blockpos(sectorpos.X, y, sectorpos.Y); + MapBlock *block = createBlock(blockpos); + addRandomObjects(block); + } + } + } + /* Create chunk metadata */ diff --git a/src/serverobject.cpp b/src/serverobject.cpp index ce7259d67..3174b75a7 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -169,6 +169,7 @@ ServerActiveObject* ItemSAO::create(ServerEnvironment *env, u16 id, v3f pos, void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, bool send_recommended) { + assert(m_env); core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.); collisionMoveResult moveresult; // Apply gravity @@ -300,17 +301,19 @@ ServerActiveObject* RatSAO::create(ServerEnvironment *env, u16 id, v3f pos, void RatSAO::step(float dtime, Queue<ActiveObjectMessage> &messages, bool send_recommended) { + assert(m_env); + /* The AI */ - m_age += dtime; + /*m_age += dtime; if(m_age > 60) { // Die m_removed = true; return; - } + }*/ // Apply gravity m_speed_f.Y -= dtime*9.81*BS; diff --git a/src/serverobject.h b/src/serverobject.h index d3dabdd4d..76f7d01d6 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -78,6 +78,10 @@ class InventoryItem; class ServerActiveObject : public ActiveObject { public: + /* + NOTE: m_env can be NULL, but step() isn't called if it is. + Prototypes are used that way. + */ ServerActiveObject(ServerEnvironment *env, u16 id, v3f pos); virtual ~ServerActiveObject(); @@ -101,7 +105,7 @@ public: Messages added to messages are sent to client over network. send_recommended: - True at around 5 times a second, same for all objects. + True at around 5-10 times a second, same for all objects. This is used to let objects send most of the data at the same time so that the data can be combined in a single packet. |