1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Add on_deactivate callback for luaentities (#10723)

This commit is contained in:
hecks 2021-01-02 15:14:29 +01:00 committed by GitHub
parent ad58fb2206
commit dd5a732fa9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 106 additions and 27 deletions

View file

@ -1164,7 +1164,7 @@ void ServerEnvironment::clearObjects(ClearObjectsMode mode)
// If known by some client, don't delete immediately
if (obj->m_known_by_count > 0) {
obj->m_pending_removal = true;
obj->markForRemoval();
return false;
}
@ -1792,7 +1792,7 @@ void ServerEnvironment::removeRemovedObjects()
/*
Delete static data from block if removed
*/
if (obj->m_pending_removal)
if (obj->isPendingRemoval())
deleteStaticFromBlock(obj, id, MOD_REASON_REMOVE_OBJECTS_REMOVE, false);
// If still known by clients, don't actually remove. On some future
@ -1803,7 +1803,7 @@ void ServerEnvironment::removeRemovedObjects()
/*
Move static data from active to stored if deactivated
*/
if (!obj->m_pending_removal && obj->m_static_exists) {
if (!obj->isPendingRemoval() && obj->m_static_exists) {
MapBlock *block = m_map->emergeBlock(obj->m_static_block, false);
if (block) {
const auto i = block->m_static_objects.m_active.find(id);
@ -1991,6 +1991,7 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
if (!force_delete && obj->m_static_exists &&
!m_active_blocks.contains(obj->m_static_block) &&
m_active_blocks.contains(blockpos_o)) {
// Delete from block where object was located
deleteStaticFromBlock(obj, id, MOD_REASON_STATIC_DATA_REMOVED, false);
@ -2068,6 +2069,10 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
force_delete = true;
}
// Regardless of what happens to the object at this point, deactivate it first.
// This ensures that LuaEntity on_deactivate is always called.
obj->markForDeactivation();
/*
If known by some client, set pending deactivation.
Otherwise delete it immediately.
@ -2077,7 +2082,6 @@ void ServerEnvironment::deactivateFarObjects(bool _force_delete)
<< "object id=" << id << " is known by clients"
<< "; not deleting yet" << std::endl;
obj->m_pending_deactivation = true;
return false;
}