summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/serverenvironment.cpp47
-rw-r--r--src/serverenvironment.h13
-rw-r--r--src/staticobject.cpp9
-rw-r--r--src/staticobject.h9
4 files changed, 48 insertions, 30 deletions
diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp
index ae0f397ee..8a26c0272 100644
--- a/src/serverenvironment.cpp
+++ b/src/serverenvironment.cpp
@@ -1416,26 +1416,34 @@ ServerActiveObject* ServerEnvironment::getActiveObject(u16 id)
return (n != m_active_objects.end() ? n->second : NULL);
}
-bool isFreeServerActiveObjectId(u16 id, ServerActiveObjectMap &objects)
+/**
+ * Verify if id is a free active object id
+ * @param id
+ * @return true if slot is free
+ */
+bool ServerEnvironment::isFreeServerActiveObjectId(u16 id) const
{
if (id == 0)
return false;
- return objects.find(id) == objects.end();
+ return m_active_objects.find(id) == m_active_objects.end();
}
-u16 getFreeServerActiveObjectId(ServerActiveObjectMap &objects)
+/**
+ * Retrieve the next free activeobject ID
+ * @return free activeobject ID or zero if not free ID found
+ */
+u16 ServerEnvironment::getFreeServerActiveObjectId()
{
- //try to reuse id's as late as possible
+ // try to reuse id's as late as possible
static u16 last_used_id = 0;
u16 startid = last_used_id;
- for(;;)
- {
- last_used_id ++;
- if(isFreeServerActiveObjectId(last_used_id, objects))
+ for (;;) {
+ last_used_id++;
+ if (isFreeServerActiveObjectId(last_used_id))
return last_used_id;
- if(last_used_id == startid)
+ if (last_used_id == startid)
return 0;
}
}
@@ -1623,7 +1631,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
{
assert(object); // Pre-condition
if(object->getId() == 0){
- u16 new_id = getFreeServerActiveObjectId(m_active_objects);
+ u16 new_id = getFreeServerActiveObjectId();
if(new_id == 0)
{
errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
@@ -1639,7 +1647,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
<<"supplied with id "<<object->getId()<<std::endl;
}
- if(!isFreeServerActiveObjectId(object->getId(), m_active_objects)) {
+ if(!isFreeServerActiveObjectId(object->getId())) {
errorstream<<"ServerEnvironment::addActiveObjectRaw(): "
<<"id is not free ("<<object->getId()<<")"<<std::endl;
if(object->environmentDeletes())
@@ -1677,9 +1685,7 @@ u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
{
// Add static object to active static list of the block
v3f objectpos = object->getBasePosition();
- std::string staticdata;
- object->getStaticData(&staticdata);
- StaticObject s_obj(object->getType(), objectpos, staticdata);
+ StaticObject s_obj(object, objectpos);
// Add to the block where the object is located in
v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
MapBlock *block = m_map->emergeBlock(blockpos);
@@ -1929,9 +1935,7 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
// Delete from block where object was located
deleteStaticFromBlock(obj, id, MOD_REASON_STATIC_DATA_REMOVED, false);
- std::string staticdata_new;
- obj->getStaticData(&staticdata_new);
- StaticObject s_obj(obj->getType(), objectpos, staticdata_new);
+ StaticObject s_obj(obj, objectpos);
// Save to block where object is located
saveStaticToBlock(blockpos_o, id, obj, s_obj, MOD_REASON_STATIC_DATA_ADDED);
@@ -1952,12 +1956,9 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
/*
Update the static data
*/
- if(obj->isStaticAllowed())
- {
+ if (obj->isStaticAllowed()) {
// Create new static object
- std::string staticdata_new;
- obj->getStaticData(&staticdata_new);
- StaticObject s_obj(obj->getType(), objectpos, staticdata_new);
+ StaticObject s_obj(obj, objectpos);
bool stays_in_same_block = false;
bool data_changed = true;
@@ -1977,7 +1978,7 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
float save_movem = obj->getMinimumSavedMovement();
- if (static_old.data == staticdata_new &&
+ if (static_old.data == s_obj.data &&
(static_old.pos - objectpos).getLength() < save_movem)
data_changed = false;
} else {
diff --git a/src/serverenvironment.h b/src/serverenvironment.h
index d51658330..ee5e8d857 100644
--- a/src/serverenvironment.h
+++ b/src/serverenvironment.h
@@ -257,6 +257,19 @@ public:
*/
u16 addActiveObject(ServerActiveObject *object);
+ /**
+ * Verify if id is a free active object id
+ * @param id
+ * @return true if slot is free
+ */
+ bool isFreeServerActiveObjectId(u16 id) const;
+
+ /**
+ * Retrieve the next free activeobject ID
+ * @return free activeobject ID or zero if not free ID found
+ */
+ u16 getFreeServerActiveObjectId();
+
/*
Add an active object as a static object to the corresponding
MapBlock.
diff --git a/src/staticobject.cpp b/src/staticobject.cpp
index 6ad2e1f94..b331ac2f2 100644
--- a/src/staticobject.cpp
+++ b/src/staticobject.cpp
@@ -19,7 +19,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "staticobject.h"
#include "util/serialize.h"
-#include "log.h"
+#include "content_sao.h"
+
+StaticObject::StaticObject(const ServerActiveObject *s_obj, const v3f &pos_):
+ type(s_obj->getType()),
+ pos(pos_)
+{
+ s_obj->getStaticData(&data);
+}
void StaticObject::serialize(std::ostream &os)
{
diff --git a/src/staticobject.h b/src/staticobject.h
index 43f542632..6fb486193 100644
--- a/src/staticobject.h
+++ b/src/staticobject.h
@@ -26,6 +26,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <map>
#include "debug.h"
+class ServerActiveObject;
+
struct StaticObject
{
u8 type = 0;
@@ -33,12 +35,7 @@ struct StaticObject
std::string data;
StaticObject() = default;
- StaticObject(u8 type_, const v3f &pos_, const std::string &data_):
- type(type_),
- pos(pos_),
- data(data_)
- {
- }
+ StaticObject(const ServerActiveObject *s_obj, const v3f &pos_);
void serialize(std::ostream &os);
void deSerialize(std::istream &is, u8 version);