aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-04-10 16:20:31 +0300
committerPerttu Ahola <celeron55@gmail.com>2011-04-10 16:20:31 +0300
commit7aa2d4d109cf8a92582a271d505f20a0f348f5a3 (patch)
tree265dc64c7c3abba94e0883907cacb03b0133fea4 /src
parent1a32e5585f542a400c48e6befbbb0aade631e506 (diff)
downloadminetest-7aa2d4d109cf8a92582a271d505f20a0f348f5a3.tar.gz
minetest-7aa2d4d109cf8a92582a271d505f20a0f348f5a3.tar.bz2
minetest-7aa2d4d109cf8a92582a271d505f20a0f348f5a3.zip
new-style rats are now generated in the map
Diffstat (limited to 'src')
-rw-r--r--src/environment.cpp15
-rw-r--r--src/map.cpp76
-rw-r--r--src/serverobject.cpp7
-rw-r--r--src/serverobject.h6
4 files changed, 98 insertions, 6 deletions
diff --git a/src/environment.cpp b/src/environment.cpp
index 435690bca..eaea6d0b5 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -429,7 +429,7 @@ void ServerEnvironment::step(float dtime)
bool send_recommended = false;
m_send_recommended_timer += dtime;
- if(m_send_recommended_timer > 0.2)
+ if(m_send_recommended_timer > 0.1)
{
m_send_recommended_timer = 0;
send_recommended = true;
@@ -1111,7 +1111,7 @@ void ClientEnvironment::step(float dtime)
}
/*
- Step active objects
+ Step active objects and update lighting of them
*/
for(core::map<u16, ClientActiveObject*>::Iterator
@@ -1121,6 +1121,17 @@ 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(m_daynight_ratio);
+ }
+ catch(InvalidPositionException &e) {}
+ obj->updateLight(light);
}
}
diff --git a/src/map.cpp b/src/map.cpp
index 59cf937c0..3ba1bda68 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -2109,6 +2109,61 @@ double base_rock_level_2d(u64 seed, v2s16 p)
return h;
}
+/*
+ Adds random objects to block, depending on the content of the block
+*/
+void addRandomObjects(MapBlock *block)
+{
+ for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
+ for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
+ {
+ bool last_node_walkable = false;
+ for(s16 y0=0; y0<MAP_BLOCKSIZE; y0++)
+ {
+ v3s16 p(x0,y0,z0);
+ MapNode n = block->getNodeNoEx(p);
+ if(n.d == CONTENT_IGNORE)
+ continue;
+ if(content_features(n.d).liquid_type != LIQUID_NONE)
+ continue;
+ if(content_features(n.d).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(n.getLight(LIGHTBANK_DAY) <= 3)
+ {
+ if(myrand() % 300 == 0)
+ {
+ v3f pos_f = intToFloat(p+block->getPosRelative(), BS);
+ pos_f.Y -= BS*0.4;
+ ServerActiveObject *obj = new RatSAO(NULL, 0, pos_f);
+ std::string data = obj->getStaticData();
+ StaticObject s_obj(obj->getType(),
+ obj->getBasePosition(), data);
+ // Add some
+ block->m_static_objects.insert(0, s_obj);
+ block->m_static_objects.insert(0, s_obj);
+ block->m_static_objects.insert(0, s_obj);
+ block->m_static_objects.insert(0, s_obj);
+ block->m_static_objects.insert(0, s_obj);
+ block->m_static_objects.insert(0, s_obj);
+ delete obj;
+ }
+ }
+ }
+ }
+ last_node_walkable = false;
+ }
+ }
+ block->setChangedFlag();
+}
+
#define VMANIP_FLAG_DUNGEON VOXELFLAG_CHECKED1
/*
@@ -3660,7 +3715,26 @@ MapChunk* ServerMap::generateChunkRaw(v2s16 chunkpos,
}
}
-
+ /*
+ Add random objects to blocks
+ */
+ {
+ for(s16 x=0; x<sectorpos_base_size; x++)
+ for(s16 z=0; z<sectorpos_base_size; z++)
+ {
+ v2s16 sectorpos = sectorpos_base + v2s16(x,z);
+ ServerMapSector *sector = createSector(sectorpos);
+ assert(sector);
+
+ for(s16 y=y_blocks_min; y<=y_blocks_max; y++)
+ {
+ v3s16 blockpos(sectorpos.X, y, sectorpos.Y);
+ MapBlock *block = createBlock(blockpos);
+ addRandomObjects(block);
+ }
+ }
+ }
+
/*
Create chunk metadata
*/
diff --git a/src/serverobject.cpp b/src/serverobject.cpp
index ce7259d67..3174b75a7 100644
--- a/src/serverobject.cpp
+++ b/src/serverobject.cpp
@@ -169,6 +169,7 @@ ServerActiveObject* ItemSAO::create(ServerEnvironment *env, u16 id, v3f pos,
void ItemSAO::step(float dtime, Queue<ActiveObjectMessage> &messages,
bool send_recommended)
{
+ assert(m_env);
core::aabbox3d<f32> box(-BS/3.,0.0,-BS/3., BS/3.,BS*2./3.,BS/3.);
collisionMoveResult moveresult;
// Apply gravity
@@ -300,17 +301,19 @@ ServerActiveObject* RatSAO::create(ServerEnvironment *env, u16 id, v3f pos,
void RatSAO::step(float dtime, Queue<ActiveObjectMessage> &messages,
bool send_recommended)
{
+ assert(m_env);
+
/*
The AI
*/
- m_age += dtime;
+ /*m_age += dtime;
if(m_age > 60)
{
// Die
m_removed = true;
return;
- }
+ }*/
// Apply gravity
m_speed_f.Y -= dtime*9.81*BS;
diff --git a/src/serverobject.h b/src/serverobject.h
index d3dabdd4d..76f7d01d6 100644
--- a/src/serverobject.h
+++ b/src/serverobject.h
@@ -78,6 +78,10 @@ class InventoryItem;
class ServerActiveObject : public ActiveObject
{
public:
+ /*
+ NOTE: m_env can be NULL, but step() isn't called if it is.
+ Prototypes are used that way.
+ */
ServerActiveObject(ServerEnvironment *env, u16 id, v3f pos);
virtual ~ServerActiveObject();
@@ -101,7 +105,7 @@ public:
Messages added to messages are sent to client over network.
send_recommended:
- True at around 5 times a second, same for all objects.
+ True at around 5-10 times a second, same for all objects.
This is used to let objects send most of the data at the
same time so that the data can be combined in a single
packet.