{
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;
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)
{
#if 1
// Test something:
// Convert all mud under proper day lighting to grass
- if(n.d == CONTENT_MUD)
+ if(n.getContent() == CONTENT_MUD)
{
if(dtime_s > 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);
}
}
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);
}
}
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++)
Test something:
Convert mud under proper lighting to grass
*/
- if(n.d == CONTENT_MUD)
+ if(n.getContent() == CONTENT_MUD)
{
if(myrand()%20 == 0)
{
- MapNode n_top = block->getNodeNoEx(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);
}
}
/*
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);
+ }
+ }
+ }
}
}
}
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;
+
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)
{
// 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());
}
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)
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);
v3f pos_f = camera_pos;
v3s16 p_nodes = floatToInt(pos_f, BS);
MapNode n = m_map->getNodeNoEx(p_nodes);
- if(n.d == CONTENT_WATER || n.d == CONTENT_WATERSOURCE)
+ if(n.getContent() == CONTENT_WATER || n.getContent() == CONTENT_WATERSOURCE)
{
v2u32 ss = driver->getScreenSize();
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