1 #include "environment.h"
2 #include "main.h" // g_device for timing debug
4 Environment::Environment(Map *map, std::ostream &dout):
10 Environment::~Environment()
13 for(core::list<Player*>::Iterator i = m_players.begin();
14 i != m_players.end(); i++)
22 void Environment::step(float dtime)
24 DSTACK(__FUNCTION_NAME);
28 //TimeTaker maptimerupdatetimer("m_map->timerUpdate()", g_device);
30 m_map->timerUpdate(dtime);
31 //maptimerupdatetimer.stop();
34 Get the highest speed some player is going
36 //TimeTaker playerspeed("playerspeed", g_device);
38 f32 maximum_player_speed = 0.001; // just some small value
39 for(core::list<Player*>::Iterator i = m_players.begin();
40 i != m_players.end(); i++)
42 f32 speed = (*i)->getSpeed().getLength();
43 if(speed > maximum_player_speed)
44 maximum_player_speed = speed;
48 // Maximum time increment (for collision detection etc)
49 // Allow 0.1 blocks per increment
50 // time = distance / speed
51 f32 dtime_max_increment = 0.1*BS / maximum_player_speed;
52 // Maximum time increment is 10ms or lower
53 if(dtime_max_increment > 0.01)
54 dtime_max_increment = 0.01;
56 //TimeTaker playerupdate("playerupdate", g_device);
59 Stuff that has a maximum time increment
61 // Don't allow overly huge dtime
71 if(dtime > dtime_max_increment)
72 dtime_part = dtime_max_increment;
80 for(core::list<Player*>::Iterator i = m_players.begin();
81 i != m_players.end(); i++)
85 // Apply gravity to local player
88 v3f speed = player->getSpeed();
89 speed.Y -= 9.81 * BS * dtime_part * 2;
90 player->setSpeed(speed);
95 For local player, this also calculates collision detection.
97 player->move(dtime_part, *m_map);
100 Add footsteps to grass
102 //TimeTaker footsteptimer("footstep", g_device);
104 v3f playerpos = player->getPosition();
105 // Get node that is at BS/4 under player
106 v3s16 bottompos = floatToInt(playerpos + v3f(0,-BS/4,0));
108 MapNode n = m_map->getNode(bottompos);
109 if(n.d == MATERIAL_GRASS)
111 n.d = MATERIAL_GRASS_FOOTSTEPS;
112 m_map->setNode(bottompos, n);
114 // Update mesh on client
115 if(m_map->mapType() == MAPTYPE_CLIENT)
117 v3s16 p_blocks = getNodeBlockPos(bottompos);
118 MapBlock *b = m_map->getBlockNoCreate(p_blocks);
123 catch(InvalidPositionException &e)
126 //footsteptimer.stop();
129 while(dtime > 0.001);
131 //std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
134 Map & Environment::getMap()
139 void Environment::addPlayer(Player *player)
141 DSTACK(__FUNCTION_NAME);
142 //Check that only one local player exists and peer_ids are unique
143 assert(player->isLocal() == false || getLocalPlayer() == NULL);
144 assert(getPlayer(player->peer_id) == NULL);
145 m_players.push_back(player);
148 void Environment::removePlayer(u16 peer_id)
150 DSTACK(__FUNCTION_NAME);
152 for(core::list<Player*>::Iterator i = m_players.begin();
153 i != m_players.end(); i++)
156 if(player->peer_id != peer_id)
161 // See if there is an another one
162 // (shouldn't be, but just to be sure)
167 LocalPlayer * Environment::getLocalPlayer()
169 for(core::list<Player*>::Iterator i = m_players.begin();
170 i != m_players.end(); i++)
173 if(player->isLocal())
174 return (LocalPlayer*)player;
179 Player * Environment::getPlayer(u16 peer_id)
181 for(core::list<Player*>::Iterator i = m_players.begin();
182 i != m_players.end(); i++)
185 if(player->peer_id == peer_id)
191 core::list<Player*> Environment::getPlayers()
196 void Environment::printPlayers(std::ostream &o)
198 o<<"Players in environment:"<<std::endl;
199 for(core::list<Player*>::Iterator i = m_players.begin();
200 i != m_players.end(); i++)
203 o<<"Player peer_id="<<player->peer_id<<std::endl;