summaryrefslogtreecommitdiff
path: root/src/script
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2017-09-15 12:19:01 +0200
committerSmallJoker <mk939@ymail.com>2018-06-03 17:31:59 +0200
commitc2a0333901a696f7dcb67356aeb0206b89be14e6 (patch)
tree11d378e7426f53797e94e6f0d103164ffe1356cf /src/script
parent5b2461c713889b9832f5b99c85abf87e5d494242 (diff)
downloadminetest-c2a0333901a696f7dcb67356aeb0206b89be14e6.tar.gz
minetest-c2a0333901a696f7dcb67356aeb0206b89be14e6.tar.bz2
minetest-c2a0333901a696f7dcb67356aeb0206b89be14e6.zip
ServerEnv: Clean up object lifecycle handling (#6414)
* ServerEnv: Clean up object lifecycle handling
Diffstat (limited to 'src/script')
-rw-r--r--src/script/cpp_api/s_base.cpp4
-rw-r--r--src/script/lua_api/l_env.cpp8
-rw-r--r--src/script/lua_api/l_object.cpp11
3 files changed, 14 insertions, 9 deletions
diff --git a/src/script/cpp_api/s_base.cpp b/src/script/cpp_api/s_base.cpp
index 4d7461c5b..2537d895f 100644
--- a/src/script/cpp_api/s_base.cpp
+++ b/src/script/cpp_api/s_base.cpp
@@ -322,6 +322,10 @@ void ScriptApiBase::objectrefGetOrCreate(lua_State *L,
ObjectRef::create(L, cobj);
} else {
push_objectRef(L, cobj->getId());
+ if (cobj->isGone())
+ warningstream << "ScriptApiBase::objectrefGetOrCreate(): "
+ << "Pushing ObjectRef to removed/deactivated object"
+ << ", this is probably a bug." << std::endl;
}
}
diff --git a/src/script/lua_api/l_env.cpp b/src/script/lua_api/l_env.cpp
index e7284b035..393c4ed5f 100644
--- a/src/script/lua_api/l_env.cpp
+++ b/src/script/lua_api/l_env.cpp
@@ -537,9 +537,11 @@ int ModApiEnvMod::l_get_objects_inside_radius(lua_State *L)
std::vector<u16>::const_iterator iter = ids.begin();
for(u32 i = 0; iter != ids.end(); ++iter) {
ServerActiveObject *obj = env->getActiveObject(*iter);
- // Insert object reference into table
- script->objectrefGetOrCreate(L, obj);
- lua_rawseti(L, -2, ++i);
+ if (!obj->isGone()) {
+ // Insert object reference into table
+ script->objectrefGetOrCreate(L, obj);
+ lua_rawseti(L, -2, ++i);
+ }
}
return 1;
}
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index aaab0d98e..0195dc399 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -137,16 +137,15 @@ int ObjectRef::l_remove(lua_State *L)
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
return 0;
- const UNORDERED_SET<int> &child_ids = co->getAttachmentChildIds();
- UNORDERED_SET<int>::const_iterator it;
- for (it = child_ids.begin(); it != child_ids.end(); ++it) {
+ const std::unordered_set<int> &child_ids = co->getAttachmentChildIds();
+ for (int child_id : child_ids) {
// Child can be NULL if it was deleted earlier
- if (ServerActiveObject *child = env->getActiveObject(*it))
+ if (ServerActiveObject *child = env->getActiveObject(child_id))
child->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
}
- verbosestream<<"ObjectRef::l_remove(): id="<<co->getId()<<std::endl;
- co->m_removed = true;
+ verbosestream << "ObjectRef::l_remove(): id=" << co->getId() << std::endl;
+ co->m_pending_removal = true;
return 0;
}