m_dout(dout)
{
m_map = map;
+ m_daynight_ratio = 0.2;
}
Environment::~Environment()
delete (*i);
}
- delete m_map;
+ // The map is removed by the SceneManager
+ m_map->drop();
+ //delete m_map;
}
void Environment::step(float dtime)
i != m_players.end(); i++)
{
Player *player = *i;
+
+ v3f playerpos = player->getPosition();
- // Apply gravity to local player
+ // Apply physics to local player
if(player->isLocal())
{
+ // Apply gravity to local player
v3f speed = player->getSpeed();
speed.Y -= 9.81 * BS * dtime_part * 2;
+
+ /*
+ Apply water resistance
+ */
+ if(player->in_water)
+ {
+ f32 max_down = 1.0*BS;
+ if(speed.Y < -max_down) speed.Y = -max_down;
+
+ f32 max = 2.0*BS;
+ if(speed.getLength() > max)
+ {
+ speed = speed / speed.getLength() * max;
+ }
+ }
+
player->setSpeed(speed);
}
*/
player->move(dtime_part, *m_map);
+ /*
+ Update lighting on remote players on client
+ */
+ u8 light = LIGHT_MAX;
+ try{
+ // Get node at feet
+ v3s16 p = floatToInt(playerpos + v3f(0,BS/4,0));
+ MapNode n = m_map->getNode(p);
+ light = n.getLightBlend(m_daynight_ratio);
+ }
+ catch(InvalidPositionException &e) {}
+ player->updateLight(light);
+
/*
Add footsteps to grass
*/
- //TimeTaker footsteptimer("footstep", g_device);
- // 0ms
- v3f playerpos = player->getPosition();
// Get node that is at BS/4 under player
v3s16 bottompos = floatToInt(playerpos + v3f(0,-BS/4,0));
try{
MapNode n = m_map->getNode(bottompos);
- if(n.d == MATERIAL_GRASS)
+ if(n.d == CONTENT_GRASS)
{
- n.d = MATERIAL_GRASS_FOOTSTEPS;
+ n.d = CONTENT_GRASS_FOOTSTEPS;
m_map->setNode(bottompos, n);
-
+#ifndef SERVER
// Update mesh on client
if(m_map->mapType() == MAPTYPE_CLIENT)
{
v3s16 p_blocks = getNodeBlockPos(bottompos);
MapBlock *b = m_map->getBlockNoCreate(p_blocks);
- b->updateMesh();
+ b->updateMesh(m_daynight_ratio);
}
+#endif
}
}
catch(InvalidPositionException &e)
{
}
- //footsteptimer.stop();
}
}
while(dtime > 0.001);
{
DSTACK(__FUNCTION_NAME);
//Check that only one local player exists and peer_ids are unique
+#ifndef SERVER
assert(player->isLocal() == false || getLocalPlayer() == NULL);
+#endif
assert(getPlayer(player->peer_id) == NULL);
m_players.push_back(player);
}
}
}
+#ifndef SERVER
LocalPlayer * Environment::getLocalPlayer()
{
for(core::list<Player*>::Iterator i = m_players.begin();
}
return NULL;
}
+#endif
Player * Environment::getPlayer(u16 peer_id)
{
}
}
+#ifndef SERVER
+void Environment::updateMeshes(v3s16 blockpos)
+{
+ m_map->updateMeshes(blockpos, m_daynight_ratio);
+}
+
+void Environment::expireMeshes(bool only_daynight_diffed)
+{
+ m_map->expireMeshes(only_daynight_diffed);
+}
+#endif
+
+void Environment::setDayNightRatio(u32 r)
+{
+ m_daynight_ratio = r;
+}
+
+u32 Environment::getDayNightRatio()
+{
+ return m_daynight_ratio;
+}
+