aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/luaentity_sao.h1
-rw-r--r--src/server/player_sao.h1
-rw-r--r--src/server/serveractiveobject.h9
-rw-r--r--src/serverenvironment.cpp9
4 files changed, 17 insertions, 3 deletions
diff --git a/src/server/luaentity_sao.h b/src/server/luaentity_sao.h
index 2520c8f5d..e060aa06d 100644
--- a/src/server/luaentity_sao.h
+++ b/src/server/luaentity_sao.h
@@ -42,6 +42,7 @@ public:
void step(float dtime, bool send_recommended);
std::string getClientInitializationData(u16 protocol_version);
bool isStaticAllowed() const { return m_prop.static_save; }
+ bool shouldUnload() const { return true; }
void getStaticData(std::string *result) const;
u16 punch(v3f dir, const ToolCapabilities *toolcap = nullptr,
ServerActiveObject *puncher = nullptr,
diff --git a/src/server/player_sao.h b/src/server/player_sao.h
index 8571bd4f9..3e178d4fc 100644
--- a/src/server/player_sao.h
+++ b/src/server/player_sao.h
@@ -83,6 +83,7 @@ public:
void addedToEnvironment(u32 dtime_s);
void removingFromEnvironment();
bool isStaticAllowed() const { return false; }
+ bool shouldUnload() const { return false; }
std::string getClientInitializationData(u16 protocol_version);
void getStaticData(std::string *result) const;
void step(float dtime, bool send_recommended);
diff --git a/src/server/serveractiveobject.h b/src/server/serveractiveobject.h
index 927009aef..2764d159e 100644
--- a/src/server/serveractiveobject.h
+++ b/src/server/serveractiveobject.h
@@ -125,6 +125,7 @@ public:
assert(isStaticAllowed());
*result = "";
}
+
/*
Return false in here to never save and instead remove object
on unload. getStaticData() will not be called in that case.
@@ -132,6 +133,14 @@ public:
virtual bool isStaticAllowed() const
{return true;}
+ /*
+ Return false here to never unload the object.
+ isStaticAllowed && shouldUnload -> unload when out of active block range
+ !isStaticAllowed && shouldUnload -> unload when block is unloaded
+ */
+ virtual bool shouldUnload() const
+ { return true; }
+
// Returns tool wear
virtual u16 punch(v3f dir,
const ToolCapabilities *toolcap = nullptr,
diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp
index 6ef56efc8..d044b003d 100644
--- a/src/serverenvironment.cpp
+++ b/src/serverenvironment.cpp
@@ -1972,8 +1972,8 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
// force_delete might be overriden per object
bool force_delete = _force_delete;
- // Do not deactivate if static data creation not allowed
- if (!force_delete && !obj->isStaticAllowed())
+ // Do not deactivate if disallowed
+ if (!force_delete && !obj->shouldUnload())
return false;
// removeRemovedObjects() is responsible for these
@@ -2002,7 +2002,10 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
}
// If block is still active, don't remove
- if (!force_delete && m_active_blocks.contains(blockpos_o))
+ bool still_active = obj->isStaticAllowed() ?
+ m_active_blocks.contains(blockpos_o) :
+ getMap().getBlockNoCreateNoEx(blockpos_o) != nullptr;
+ if (!force_delete && still_active)
return false;
verbosestream << "ServerEnvironment::deactivateFarObjects(): "