310 changes: 130 additions & 180 deletions src/serverenvironment.cpp

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion src/serverenvironment.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class PlayerDatabase;
class PlayerSAO;
class ServerEnvironment;
class ActiveBlockModifier;
struct StaticObject;
class ServerActiveObject;
class Server;
class ServerScripting;
Expand Down Expand Up @@ -368,7 +369,7 @@ class ServerEnvironment : public Environment
u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed, u32 dtime_s);

/*
Remove all objects that satisfy (m_removed && m_known_by_count==0)
Remove all objects that satisfy (isGone() && m_known_by_count==0)
*/
void removeRemovedObjects();

Expand All @@ -388,6 +389,14 @@ class ServerEnvironment : public Environment
*/
void deactivateFarObjects(bool force_delete);

/*
A few helpers used by the three above methods
*/
void deleteStaticFromBlock(
ServerActiveObject *obj, u16 id, u32 mod_reason, bool no_emerge);
bool saveStaticToBlock(v3s16 blockpos, u16 store_id,
ServerActiveObject *obj, const StaticObject &s_obj, u32 mod_reason);

/*
Member variables
*/
Expand Down
24 changes: 14 additions & 10 deletions src/serverobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,23 +212,27 @@ class ServerActiveObject : public ActiveObject
it anymore.
- Removal is delayed to preserve the id for the time during which
it could be confused to some other object by some client.
- This is set to true by the step() method when the object wants
to be deleted.
- This can be set to true by anything else too.
- This is usually set to true by the step() method when the object wants
to be deleted but can be set by anything else too.
*/
bool m_removed = false;
bool m_pending_removal = false;

/*
This is set to true when an object should be removed from the active
object list but couldn't be removed because the id has to be
reserved for some client.
Same purpose as m_pending_removal but for deactivation.
deactvation = save static data in block, remove active object
The environment checks this periodically. If this is true and also
m_known_by_count is true, object is deleted from the active object
list.
If this is set alongside with m_pending_removal, removal takes
priority.
*/
bool m_pending_deactivation = false;

/*
A getter that unifies the above to answer the question:
"Can the environment still interact with this object?"
*/
inline bool isGone() const
{ return m_pending_removal || m_pending_deactivation; }

/*
Whether the object's static data has been stored to a block
*/
Expand Down