if(block==NULL)
continue;
- // Set current time as timestamp
+ // Set current time as timestamp (and let it set ChangedFlag)
block->setTimestamp(m_game_time);
}
if(m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED)
dtime_s = m_game_time - block->getTimestamp();
- // Set current time as timestamp
+ // Set current time as timestamp (and let it set ChangedFlag)
block->setTimestamp(m_game_time);
//dstream<<"Block is "<<dtime_s<<" seconds old."<<std::endl;
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
event.p = p;
m_map->dispatchEvent(&event);
+
+ block->setChangedFlag();
}
// TODO: Do something
continue;
// Set current time as timestamp
- block->setTimestamp(m_game_time);
+ block->setTimestampNoChangedFlag(m_game_time);
// Run node metadata
bool changed = block->m_node_metadata.step(dtime);
event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
event.p = p;
m_map->dispatchEvent(&event);
+
+ block->setChangedFlag();
}
}
}
continue;
// Set current time as timestamp
- block->setTimestamp(m_game_time);
+ block->setTimestampNoChangedFlag(m_game_time);
/*
Do stuff!
u16 ServerEnvironment::addActiveObject(ServerActiveObject *object)
{
assert(object);
- if(object->getId() == 0)
- {
- u16 new_id = getFreeServerActiveObjectId(m_active_objects);
- if(new_id == 0)
- {
- dstream<<"WARNING: ServerEnvironment::addActiveObject(): "
- <<"no free ids available"<<std::endl;
- delete object;
- return 0;
- }
- object->setId(new_id);
- }
- if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
- {
- dstream<<"WARNING: ServerEnvironment::addActiveObject(): "
- <<"id is not free ("<<object->getId()<<")"<<std::endl;
- delete object;
- return 0;
- }
- /*dstream<<"INGO: ServerEnvironment::addActiveObject(): "
- <<"added (id="<<object->getId()<<")"<<std::endl;*/
-
- m_active_objects.insert(object->getId(), object);
-
- // Add static object to active static list of the block
- v3f objectpos = object->getBasePosition();
- std::string staticdata = object->getStaticData();
- StaticObject s_obj(object->getType(), objectpos, staticdata);
- // Add to the block where the object is located in
- v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
- MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
- if(block)
- {
- block->m_static_objects.m_active.insert(object->getId(), s_obj);
- object->m_static_exists = true;
- object->m_static_block = blockpos;
- }
- else{
- dstream<<"WARNING: Server: Could not find a block for "
- <<"storing newly added static active object"<<std::endl;
- }
-
- return object->getId();
+ u16 id = addActiveObjectRaw(object, true);
+ return id;
}
/*
************ Private methods *************
*/
+u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
+ bool set_changed)
+{
+ assert(object);
+ if(object->getId() == 0)
+ {
+ u16 new_id = getFreeServerActiveObjectId(m_active_objects);
+ if(new_id == 0)
+ {
+ dstream<<"WARNING: ServerEnvironment::addActiveObjectRaw(): "
+ <<"no free ids available"<<std::endl;
+ delete object;
+ return 0;
+ }
+ object->setId(new_id);
+ }
+ if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
+ {
+ dstream<<"WARNING: ServerEnvironment::addActiveObjectRaw(): "
+ <<"id is not free ("<<object->getId()<<")"<<std::endl;
+ delete object;
+ return 0;
+ }
+ /*dstream<<"INGO: ServerEnvironment::addActiveObjectRaw(): "
+ <<"added (id="<<object->getId()<<")"<<std::endl;*/
+
+ m_active_objects.insert(object->getId(), object);
+
+ // Add static object to active static list of the block
+ v3f objectpos = object->getBasePosition();
+ std::string staticdata = object->getStaticData();
+ StaticObject s_obj(object->getType(), objectpos, staticdata);
+ // Add to the block where the object is located in
+ v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
+ MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
+ if(block)
+ {
+ block->m_static_objects.m_active.insert(object->getId(), s_obj);
+ object->m_static_exists = true;
+ object->m_static_block = blockpos;
+
+ if(set_changed)
+ block->setChangedFlag();
+ }
+ else{
+ dstream<<"WARNING: Server: Could not find a block for "
+ <<"storing newly added static active object"<<std::endl;
+ }
+
+ return object->getId();
+}
+
/*
Remove objects that satisfy (m_removed && m_known_by_count==0)
*/
continue;
}
// This will also add the object to the active static list
- addActiveObject(obj);
- //u16 id = addActiveObject(obj);
+ addActiveObjectRaw(obj, false);
+ //u16 id = addActiveObjectRaw(obj, false);
}
// Clear stored list
block->m_static_objects.m_stored.clear();
block->m_static_objects.m_stored.push_back(s_obj);
}
// Block has been modified
- block->setChangedFlag();
+ // NOTE: No it has not really. Save I/O here.
+ //block->setChangedFlag();
}
/*
void loadMeta(const std::string &savedir);
/*
- ActiveObjects
+ External ActiveObject interface
-------------------------------------------
*/
ActiveObjectMessage getActiveObjectMessage();
/*
- ActiveBlockModifiers
+ ActiveBlockModifiers (TODO)
-------------------------------------------
*/
void addActiveBlockModifier(ActiveBlockModifier *abm);
private:
+
+ /*
+ Internal ActiveObject interface
+ -------------------------------------------
+ */
+
+ /*
+ Add an active object to the environment.
+
+ Called by addActiveObject.
+
+ Object may be deleted by environment immediately.
+ If id of object is 0, assigns a free id to it.
+ Returns the id of the object.
+ Returns 0 if not added and thus deleted.
+ */
+ u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed);
+
/*
Remove all objects that satisfy (m_removed && m_known_by_count==0)
*/
SUGG: Try out the notch way of generating maps, that is, make bunches\r
of low-res 3d noise and interpolate linearly.\r
\r
-Mapgen v2:\r
+Mapgen v2 (the current one):\r
* Possibly add some kind of erosion and other stuff\r
* Better water generation (spread it to underwater caverns but don't\r
fill dungeons that don't touch big water masses)\r
the other chunk making nasty straight walls when the other chunk\r
is generated. Fix it. Maybe just a special case if the ground is\r
flat?\r
+* Consider not updating this one and make a good mainly block-based\r
+ generator\r
+\r
+SUGG: Make two "modified states", one that forces the block to be saved at\r
+ the next save event, and one that makes the block to be saved at exit\r
+ time.\r
+\r
+TODO: Add a not_fully_generated flag to MapBlock, which would be set for\r
+ blocks that contain eg. trees from neighboring generations but haven't\r
+ been generated itself. This is required for the future generator.\r
\r
Misc. stuff:\r
------------\r