if(m_active_blocks_test_interval.step(dtime, 10.0))
{
//float dtime = 10.0;
-
+
for(core::map<v3s16, bool>::Iterator
i = m_active_blocks.m_list.getIterator();
i.atEnd()==false; i++)
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.X<MAP_BLOCKSIZE; p0.X++)
/*
Convert grass into mud if under something else than air
*/
- else if(n.getContent() == CONTENT_GRASS)
+ if(n.getContent() == CONTENT_GRASS)
{
//if(myrand()%20 == 0)
{
MapNode n_top = m_map->getNodeNoEx(p+v3s16(0,1,0));
- if(content_features(n_top).air_equivalent == false)
+ if(content_features(n_top).air_equivalent == false)
{
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);
+ }
+ }
+ }
}
}
}
delete object;
return 0;
}
- /*dstream<<"INGO: ServerEnvironment::addActiveObjectRaw(): "
+ /*dstream<<"INFO: ServerEnvironment::addActiveObjectRaw(): "
<<"added (id="<<object->getId()<<")"<<std::endl;*/
m_active_objects.insert(object->getId(), object);
/*
Get the speed the player is going
*/
+ bool is_climbing = lplayer->is_climbing;
+
+ /*
+ Check if the player is frozen (don't apply physics)
+ */
+ bool is_frozen = lplayer->is_frozen;
+
f32 player_speed = 0.001; // just some small value
player_speed = lplayer->getSpeed().getLength();
v3f lplayerpos = lplayer->getPosition();
// Apply physics
- if(free_move == false)
+ if(free_move == false && is_climbing == false && is_frozen == false)
{
// Gravity
v3f speed = lplayer->getSpeed();
}
}
+ /*
+ A quick draft of lava damage
+ */
+ if(m_lava_hurt_interval.step(dtime, 1.0))
+ {
+ v3f pf = lplayer->getPosition();
+
+ // Feet, middle and head
+ v3s16 p1 = floatToInt(pf + v3f(0, BS*0.1, 0), BS);
+ MapNode n1 = m_map->getNodeNoEx(p1);
+ v3s16 p2 = floatToInt(pf + v3f(0, BS*0.8, 0), BS);
+ MapNode n2 = m_map->getNodeNoEx(p2);
+ v3s16 p3 = floatToInt(pf + v3f(0, BS*1.6, 0), BS);
+ MapNode n3 = m_map->getNodeNoEx(p2);
+
+ u32 damage_per_second = 0;
+ damage_per_second = MYMAX(damage_per_second,
+ content_features(n1).damage_per_second);
+ damage_per_second = MYMAX(damage_per_second,
+ content_features(n2).damage_per_second);
+ damage_per_second = MYMAX(damage_per_second,
+ content_features(n3).damage_per_second);
+
+ if(damage_per_second != 0)
+ {
+ ClientEnvEvent event;
+ event.type = CEE_PLAYER_DAMAGE;
+ event.player_damage.amount = damage_per_second;
+ m_client_event_queue.push_back(event);
+ }
+ }
+
/*
Stuff that can be done in an arbitarily large dtime
*/
u8 light = LIGHT_MAX;
try{
// Get node at head
- v3s16 p = floatToInt(playerpos + v3f(0,BS+BS/2,0), BS);
+ v3s16 p = player->getLightPosition();
MapNode n = m_map->getNode(p);
light = n.getLightBlend(getDayNightRatio());
}
delete object;
return 0;
}
- dstream<<"INGO: ClientEnvironment::addActiveObject(): "
+ dstream<<"INFO: ClientEnvironment::addActiveObject(): "
<<"added (id="<<object->getId()<<")"<<std::endl;
m_active_objects.insert(object->getId(), object);
object->addToScene(m_smgr);
core::rect<s32> rect(0,0, ss.X, ss.Y);
driver->draw2DRectangle(video::SColor(64, 100, 100, 200), rect);
}
+ else if(content_features(n).solidness == 2 &&
+ g_settings.getBool("free_move") == false)
+ {
+ v2u32 ss = driver->getScreenSize();
+ core::rect<s32> rect(0,0, ss.X, ss.Y);
+ driver->draw2DRectangle(video::SColor(255, 0, 0, 0), rect);
+ }
}
#endif // #ifndef SERVER