From 83f779c52dcd64ecd55a590b2a06baf5da9a9814 Mon Sep 17 00:00:00 2001 From: sfence <sfence.software@gmail.com> Date: Sun, 4 Feb 2024 21:24:08 +0100 Subject: [PATCH] Fix active object adding to not generated block (#14311) --- doc/lua_api.md | 3 +++ src/serverenvironment.cpp | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/doc/lua_api.md b/doc/lua_api.md index 469292a72..14ca7e835 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -5948,8 +5948,11 @@ Environment access * `minetest.add_entity(pos, name, [staticdata])`: Spawn Lua-defined entity at position. * Returns `ObjectRef`, or `nil` if failed + * Entities with `static_save = true` can be added also + to unloaded and non-generated blocks. * `minetest.add_item(pos, item)`: Spawn item * Returns `ObjectRef`, or `nil` if failed + * Items can be added also to unloaded and non-generated blocks. * `minetest.get_player_by_name(name)`: Get an `ObjectRef` to a player * `minetest.get_objects_inside_radius(pos, radius)`: returns a list of ObjectRefs. diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 7b188f60f..753899fb8 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1044,7 +1044,8 @@ void ServerEnvironment::activateBlock(MapBlock *block, u32 additional_dtime) <<stamp<<", game time: "<<m_game_time<<std::endl;*/ // Remove stored static objects if clearObjects was called since block's timestamp - if (stamp == BLOCK_TIMESTAMP_UNDEFINED || stamp < m_last_clear_objects_time) { + // Note that non-generated blocks may still have stored static objects + if (stamp != BLOCK_TIMESTAMP_UNDEFINED && stamp < m_last_clear_objects_time) { block->m_static_objects.clearStored(); // do not set changed flag to avoid unnecessary mapblock writes } @@ -1892,11 +1893,6 @@ u16 ServerEnvironment::addActiveObjectRaw(std::unique_ptr<ServerActiveObject> ob return 0; } - // Register reference in scripting api (must be done before post-init) - m_script->addObjectReference(object); - // Post-initialize object - object->addedToEnvironment(dtime_s); - // Add static data to block if (object->isStaticAllowed()) { // Add static object to active static list of the block @@ -1915,12 +1911,20 @@ u16 ServerEnvironment::addActiveObjectRaw(std::unique_ptr<ServerActiveObject> ob MOD_REASON_ADD_ACTIVE_OBJECT_RAW); } else { v3s16 p = floatToInt(objectpos, BS); - errorstream<<"ServerEnvironment::addActiveObjectRaw(): " - <<"could not emerge block for storing id="<<object->getId() - <<" statically (pos="<<p<<")"<<std::endl; + errorstream << "ServerEnvironment::addActiveObjectRaw(): " + << "could not emerge block " << p << " for storing id=" + << object->getId() << " statically" << std::endl; + // clean in case of error + m_ao_manager.removeObject(object->getId()); + return 0; } } + // Register reference in scripting api (must be done before post-init) + m_script->addObjectReference(object); + // Post-initialize object + object->addedToEnvironment(dtime_s); + return object->getId(); }