X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fenvironment.cpp;h=e9b94f3fa8928be5ee820442e39a51186f64a7d6;hb=24a662705cb73f8a5630114654c38a0e1328b9ec;hp=e2c704259888323064063c0bf7a4a78b8e7aeab0;hpb=9d09103e481c4979ebb0130a9dee6265d0d6223b;p=dragonfireclient.git diff --git a/src/environment.cpp b/src/environment.cpp index e2c704259..e9b94f3fa 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -22,7 +22,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "porting.h" #include "collision.h" #include "content_mapnode.h" - +#include "mapblock.h" +#include "serverobject.h" +#include "content_sao.h" Environment::Environment(): m_time_of_day(9000) @@ -541,11 +543,11 @@ void spawnRandomObjects(MapBlock *block) { v3s16 p(x0,y0,z0); MapNode n = block->getNodeNoEx(p); - if(n.d == CONTENT_IGNORE) + if(n.getContent() == CONTENT_IGNORE) continue; - if(content_features(n.d).liquid_type != LIQUID_NONE) + if(content_features(n).liquid_type != LIQUID_NONE) continue; - if(content_features(n.d).walkable) + if(content_features(n).walkable) { last_node_walkable = true; continue; @@ -553,7 +555,7 @@ void spawnRandomObjects(MapBlock *block) if(last_node_walkable) { // If block contains light information - if(content_features(n.d).param_type == CPT_LIGHT) + if(content_features(n).param_type == CPT_LIGHT) { if(n.getLight(LIGHTBANK_DAY) <= 5) { @@ -592,7 +594,7 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) block->setTimestamp(m_game_time); //dstream<<"Block is "< 300) { MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0)); - if(content_features(n_top.d).air_equivalent && + if(content_features(n_top).air_equivalent && n_top.getLight(LIGHTBANK_DAY) >= 13) { - n.d = CONTENT_GRASS; + n.setContent(CONTENT_GRASS); m_map->addNodeWithEvent(p, n); } } @@ -658,14 +660,6 @@ void ServerEnvironment::step(float dtime) m_game_time_fraction_counter -= (float)inc_i; } - /* - Let map update it's timers - */ - { - //TimeTaker timer("Server m_map->timerUpdate()"); - m_map->timerUpdate(dtime); - } - /* Handle players */ @@ -692,9 +686,9 @@ void ServerEnvironment::step(float dtime) v3s16 bottompos = floatToInt(playerpos + v3f(0,-BS/4,0), BS); try{ MapNode n = m_map->getNode(bottompos); - if(n.d == CONTENT_GRASS) + if(n.getContent() == CONTENT_GRASS) { - n.d = CONTENT_GRASS_FOOTSTEPS; + n.setContent(CONTENT_GRASS_FOOTSTEPS); m_map->setNode(bottompos, n); } } @@ -754,8 +748,8 @@ void ServerEnvironment::step(float dtime) MapBlock *block = m_map->getBlockNoCreateNoEx(p); if(block==NULL) continue; + // Set current time as timestamp (and let it set ChangedFlag) - block->setTimestamp(m_game_time); } @@ -776,75 +770,7 @@ void ServerEnvironment::step(float dtime) if(block==NULL) continue; - // Get time difference - u32 dtime_s = 0; - u32 stamp = block->getTimestamp(); - if(m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) - dtime_s = m_game_time - block->getTimestamp(); - - // Set current time as timestamp (and let it set ChangedFlag) - block->setTimestamp(m_game_time); - - //dstream<<"Block is "<m_node_metadata.step((float)dtime_s); - if(changed) - { - MapEditEvent event; - event.type = MEET_BLOCK_NODE_METADATA_CHANGED; - event.p = p; - m_map->dispatchEvent(&event); - - block->setChangedFlag(); - } - - // TODO: Do something - // TODO: Implement usage of ActiveBlockModifier - - // Here's a quick demonstration - v3s16 p0; - for(p0.X=0; p0.XgetPosRelative(); - MapNode n = block->getNodeNoEx(p0); - // Test something: - // Convert all mud under proper day lighting to grass - if(n.d == CONTENT_MUD) - { - if(dtime_s > 300) - { - MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0)); - if(content_features(n_top.d).air_equivalent && - n_top.getLight(LIGHTBANK_DAY) >= 13) - { - n.d = CONTENT_GRASS; - m_map->addNodeWithEvent(p, n); - } - } - } - /* - Convert grass into mud if under something else than air - */ - else if(n.d == CONTENT_GRASS) - { - //if(myrand()%20 == 0) - { - MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0)); - if(n_top.d != CONTENT_AIR - && n_top.d != CONTENT_IGNORE) - { - n.d = CONTENT_MUD; - m_map->addNodeWithEvent(p, n); - } - } - } - } + activateBlock(block); } } @@ -867,6 +793,9 @@ void ServerEnvironment::step(float dtime) MapBlock *block = m_map->getBlockNoCreateNoEx(p); if(block==NULL) continue; + + // Reset block usage timer + block->resetUsageTimer(); // Set current time as timestamp block->setTimestampNoChangedFlag(m_game_time); @@ -887,7 +816,7 @@ void ServerEnvironment::step(float dtime) if(m_active_blocks_test_interval.step(dtime, 10.0)) { //float dtime = 10.0; - + for(core::map::Iterator i = m_active_blocks.m_list.getIterator(); i.atEnd()==false; i++) @@ -917,6 +846,21 @@ void ServerEnvironment::step(float dtime) searching loop to keep things fast. */ // TODO: Implement usage of ActiveBlockModifier + + // Find out how many objects the block contains + u32 active_object_count = block->m_static_objects.m_active.size(); + // Find out how many objects this and all the neighbors contain + u32 active_object_count_wider = 0; + for(s16 x=-1; x<=1; x++) + for(s16 y=-1; y<=1; y++) + for(s16 z=-1; z<=1; z++) + { + MapBlock *block = m_map->getBlockNoCreateNoEx(p+v3s16(x,y,z)); + if(block==NULL) + continue; + active_object_count_wider += + block->m_static_objects.m_active.size(); + } v3s16 p0; for(p0.X=0; p0.XgetNodeNoEx(p0+v3s16(0,1,0)); - if(content_features(n_top.d).air_equivalent && + MapNode n_top = m_map->getNodeNoEx(p+v3s16(0,1,0)); + if(content_features(n_top).air_equivalent && n_top.getLightBlend(getDayNightRatio()) >= 13) { - n.d = CONTENT_GRASS; + n.setContent(CONTENT_GRASS); m_map->addNodeWithEvent(p, n); } } @@ -946,19 +890,39 @@ void ServerEnvironment::step(float dtime) /* Convert grass into mud if under something else than air */ - else if(n.d == CONTENT_GRASS) + if(n.getContent() == CONTENT_GRASS) { //if(myrand()%20 == 0) { - MapNode n_top = block->getNodeNoEx(p0+v3s16(0,1,0)); - if(n_top.d != CONTENT_AIR - && n_top.d != CONTENT_IGNORE) + MapNode n_top = m_map->getNodeNoEx(p+v3s16(0,1,0)); + if(content_features(n_top).air_equivalent == false) { - n.d = CONTENT_MUD; + n.setContent(CONTENT_MUD); m_map->addNodeWithEvent(p, n); } + } + } + /* + Rats spawn around regular trees + */ + if(n.getContent() == CONTENT_TREE || + n.getContent() == CONTENT_JUNGLETREE) + { + if(myrand()%200 == 0 && active_object_count_wider == 0) + { + v3s16 p1 = p + v3s16(myrand_range(-2, 2), + 0, myrand_range(-2, 2)); + MapNode n1 = m_map->getNodeNoEx(p1); + MapNode n1b = m_map->getNodeNoEx(p1+v3s16(0,-1,0)); + if(n1b.getContent() == CONTENT_GRASS && + n1.getContent() == CONTENT_AIR) + { + v3f pos = intToFloat(p1, BS); + ServerActiveObject *obj = new RatSAO(this, 0, pos); + addActiveObject(obj); } } + } } } } @@ -986,8 +950,14 @@ void ServerEnvironment::step(float dtime) // Don't step if is to be removed or stored statically if(obj->m_removed || obj->m_pending_deactivation) continue; - // Step object, putting messages directly to the queue - obj->step(dtime, m_active_object_messages, send_recommended); + // Step object + obj->step(dtime, send_recommended); + // Read messages from object + while(obj->m_messages_out.size() > 0) + { + m_active_object_messages.push_back( + obj->m_messages_out.pop_front()); + } } } @@ -1041,7 +1011,8 @@ void ServerEnvironment::step(float dtime) //TestSAO *obj = new TestSAO(this, 0, pos); //ServerActiveObject *obj = new ItemSAO(this, 0, pos, "CraftItem Stick 1"); //ServerActiveObject *obj = new RatSAO(this, 0, pos); - ServerActiveObject *obj = new Oerkki1SAO(this, 0, pos); + //ServerActiveObject *obj = new Oerkki1SAO(this, 0, pos); + ServerActiveObject *obj = new FireflySAO(this, 0, pos); addActiveObject(obj); } #endif @@ -1242,7 +1213,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object, block->setChangedFlag(); } else{ - dstream<<"WARNING: Server: Could not find a block for " + dstream<<"WARNING: ServerEnv: Could not find a block for " <<"storing newly added static active object"<getType(), objectpos, staticdata); // Add to the block where the object is located in v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); - MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + // Get or generate the block + MapBlock *block = m_map->emergeBlock(blockpos); + + /*MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos); + if(block == NULL) + { + // Block not found. Is the old block still ok? + if(oldblock) + block = oldblock; + // Load from disk or generate + else + block = m_map->emergeBlock(blockpos); + }*/ + if(block) { block->m_static_objects.insert(0, s_obj); @@ -1422,17 +1406,9 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) obj->m_static_exists = true; obj->m_static_block = block->getPos(); } - // If not possible, add back to previous block - else if(oldblock) - { - oldblock->m_static_objects.insert(0, s_obj); - oldblock->setChangedFlag(); - obj->m_static_exists = true; - obj->m_static_block = oldblock->getPos(); - } else{ - dstream<<"WARNING: Server: Could not find a block for " - <<"storing static object"<m_static_exists = false; continue; } @@ -1526,11 +1502,6 @@ void ClientEnvironment::step(float dtime) bool free_move = g_settings.getBool("free_move"); bool footprints = g_settings.getBool("footprints"); - { - //TimeTaker timer("Client m_map->timerUpdate()"); - m_map->timerUpdate(dtime); - } - // Get local player LocalPlayer *lplayer = getLocalPlayer(); assert(lplayer); @@ -1697,9 +1668,9 @@ void ClientEnvironment::step(float dtime) v3s16 bottompos = floatToInt(playerpos + v3f(0,-BS/4,0), BS); try{ MapNode n = m_map->getNode(bottompos); - if(n.d == CONTENT_GRASS) + if(n.getContent() == CONTENT_GRASS) { - n.d = CONTENT_GRASS_FOOTSTEPS; + n.setContent(CONTENT_GRASS_FOOTSTEPS); m_map->setNode(bottompos, n); // Update mesh on client if(m_map->mapType() == MAPTYPE_CLIENT) @@ -1728,17 +1699,21 @@ 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(getDayNightRatio()); + + if(m_active_object_light_update_interval.step(dtime, 0.21)) + { + // 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(getDayNightRatio()); + } + catch(InvalidPositionException &e) {} + obj->updateLight(light); } - catch(InvalidPositionException &e) {} - obj->updateLight(light); } } @@ -1926,6 +1901,22 @@ ClientEnvEvent ClientEnvironment::getClientEvent() return m_client_event_queue.pop_front(); } +void ClientEnvironment::drawPostFx(video::IVideoDriver* driver, v3f camera_pos) +{ + /*LocalPlayer *player = getLocalPlayer(); + assert(player); + v3f pos_f = player->getPosition() + v3f(0,BS*1.625,0);*/ + v3f pos_f = camera_pos; + v3s16 p_nodes = floatToInt(pos_f, BS); + MapNode n = m_map->getNodeNoEx(p_nodes); + if(n.getContent() == CONTENT_WATER || n.getContent() == CONTENT_WATERSOURCE) + { + v2u32 ss = driver->getScreenSize(); + core::rect rect(0,0, ss.X, ss.Y); + driver->draw2DRectangle(video::SColor(64, 100, 100, 200), rect); + } +} + #endif // #ifndef SERVER