Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Implement unloading of static_save=false objects according to existin…
- Loading branch information
|
@@ -42,6 +42,7 @@ class LuaEntitySAO : public UnitSAO |
|
|
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, |
|
|
|
@@ -83,6 +83,7 @@ class PlayerSAO : public UnitSAO |
|
|
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); |
|
|
|
@@ -125,13 +125,22 @@ class ServerActiveObject : public ActiveObject |
|
|
assert(isStaticAllowed()); |
|
|
*result = ""; |
|
|
} |
|
|
|
|
|
/* |
|
|
Return false in here to never save and instead remove object |
|
|
on unload. getStaticData() will not be called in that case. |
|
|
*/ |
|
|
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, |
|
|
|
@@ -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(): " |
|
|