From 66479394037baa941cb06d75d3afc79ff4c717a2 Mon Sep 17 00:00:00 2001 From: Rogier Date: Tue, 10 Jan 2017 04:39:45 +0900 Subject: Performance fix + SAO factorization Original credits goes to @Rogier-5 * Merge common attributes between LuaEntitySAO & PlayerSAO to UnitSAO * Make some functions const * Improve some lists performance by returning const ref Signed-off-by: Loic Blot --- src/serverobject.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/serverobject.h') diff --git a/src/serverobject.h b/src/serverobject.h index 9884eb0a1..9e8b5a779 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -146,8 +146,8 @@ public: virtual void setArmorGroups(const ItemGroupList &armor_groups) {} - virtual ItemGroupList getArmorGroups() - { return ItemGroupList(); } + virtual const ItemGroupList &getArmorGroups() + { static const ItemGroupList rv; return rv; } virtual void setPhysicsOverride(float physics_override_speed, float physics_override_jump, float physics_override_gravity) {} virtual void setAnimation(v2f frames, float frame_speed, float frame_blend, bool frame_loop) @@ -166,8 +166,8 @@ public: {} virtual void removeAttachmentChild(int child_id) {} - virtual UNORDERED_SET getAttachmentChildIds() - { return UNORDERED_SET(); } + virtual const UNORDERED_SET &getAttachmentChildIds() + { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() { return NULL; } virtual void notifyObjectPropertiesModified() -- cgit v1.2.3 From ef0aa7d5b543b6561e1b7292b2d0a0ac43add55d Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 11 Jan 2017 22:48:14 +0100 Subject: Optimize SAO getStaticData by using std::string pointer instead of return copy Signed-off-by: Loic Blot --- src/content_sao.cpp | 9 ++++----- src/content_sao.h | 4 ++-- src/serverenvironment.cpp | 9 ++++++--- src/serverobject.h | 4 ++-- 4 files changed, 14 insertions(+), 12 deletions(-) (limited to 'src/serverobject.h') diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 852e2d788..bf8282af4 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -521,7 +521,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) return os.str(); } -std::string LuaEntitySAO::getStaticData() const +void LuaEntitySAO::getStaticData(std::string *result) const { verbosestream<getBasePosition(); - std::string staticdata = object->getStaticData(); + std::string staticdata = ""; + object->getStaticData(&staticdata); StaticObject s_obj(object->getType(), objectpos, staticdata); // Add to the block where the object is located in v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS)); @@ -1980,7 +1981,8 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) <getStaticData(); + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); StaticObject s_obj(obj->getType(), objectpos, staticdata_new); block->m_static_objects.insert(id, s_obj); obj->m_static_block = blockpos_o; @@ -2020,7 +2022,8 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) if(obj->isStaticAllowed()) { // Create new static object - std::string staticdata_new = obj->getStaticData(); + std::string staticdata_new = ""; + obj->getStaticData(&staticdata_new); StaticObject s_obj(obj->getType(), objectpos, staticdata_new); bool stays_in_same_block = false; diff --git a/src/serverobject.h b/src/serverobject.h index 9e8b5a779..26c8b062d 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -119,10 +119,10 @@ public: when it is created (converted from static to active - actually the data is the static form) */ - virtual std::string getStaticData() + virtual void getStaticData(std::string *result) { assert(isStaticAllowed()); - return ""; + *result = ""; } /* Return false in here to never save and instead remove object -- cgit v1.2.3 From ee6d8c10ce3f7570a47c6042c36da3c8566364a7 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sat, 14 Jan 2017 12:03:50 +0100 Subject: Fix missing const in ServerActiveObject::getStaticData This fixes #5033 Signed-off-by: Loic Blot --- src/serverobject.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/serverobject.h') diff --git a/src/serverobject.h b/src/serverobject.h index 26c8b062d..38204980e 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -119,7 +119,7 @@ public: when it is created (converted from static to active - actually the data is the static form) */ - virtual void getStaticData(std::string *result) + virtual void getStaticData(std::string *result) const { assert(isStaticAllowed()); *result = ""; -- cgit v1.2.3 From 72535d33281ed4c863013590e5fd032c39f0b781 Mon Sep 17 00:00:00 2001 From: red-001 Date: Sat, 21 Jan 2017 15:11:55 +0000 Subject: Detach the player from entities on death. (#5077) --- src/content_sao.cpp | 10 ++++++++++ src/content_sao.h | 1 + src/script/lua_api/l_object.cpp | 15 +-------------- src/server.cpp | 2 ++ src/serverobject.h | 2 ++ 5 files changed, 16 insertions(+), 14 deletions(-) (limited to 'src/serverobject.h') diff --git a/src/content_sao.cpp b/src/content_sao.cpp index bf8282af4..d6581144f 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -203,6 +203,16 @@ void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, *rotation = m_attachment_rotation; } +void UnitSAO::detachFromParent() +{ + ServerActiveObject *parent = NULL; + if (m_attachment_parent_id) + parent = m_env->getActiveObject(m_attachment_parent_id); + setAttachment(NULL, "", v3f(0, 0, 0), v3f(0, 0, 0)); + if (parent != NULL) + parent->removeAttachmentChild(m_id); +} + void UnitSAO::addAttachmentChild(int child_id) { m_attachment_child_ids.insert(child_id); diff --git a/src/content_sao.h b/src/content_sao.h index 4abe93250..884f0f406 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -49,6 +49,7 @@ public: void setBonePosition(const std::string &bone, v3f position, v3f rotation); void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); + void detachFromParent(); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 59c04f301..f579c0b86 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -710,20 +710,7 @@ int ObjectRef::l_set_detach(lua_State *L) ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; - - int parent_id = 0; - std::string bone = ""; - v3f position; - v3f rotation; - co->getAttachment(&parent_id, &bone, &position, &rotation); - ServerActiveObject *parent = NULL; - if (parent_id) - parent = env->getActiveObject(parent_id); - - // Do it - co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0)); - if (parent != NULL) - parent->removeAttachmentChild(co->getId()); + co->detachFromParent(); return 0; } diff --git a/src/server.cpp b/src/server.cpp index 1656b9f5a..1e5704042 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2560,6 +2560,8 @@ void Server::DiePlayer(u16 peer_id) if (!playersao) return; + playersao->detachFromParent(); + infostream << "Server::DiePlayer(): Player " << playersao->getPlayer()->getName() << " dies" << std::endl; diff --git a/src/serverobject.h b/src/serverobject.h index 38204980e..dfe6312f0 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -166,6 +166,8 @@ public: {} virtual void removeAttachmentChild(int child_id) {} + virtual void detachFromParent() + {} virtual const UNORDERED_SET &getAttachmentChildIds() { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() -- cgit v1.2.3 From bc29e03b597be350fa856b1ae3d8623778a808b3 Mon Sep 17 00:00:00 2001 From: Loïc Blot Date: Sat, 21 Jan 2017 17:30:55 +0100 Subject: Revert "Detach the player from entities on death." (#5087) --- src/content_sao.cpp | 10 ---------- src/content_sao.h | 1 - src/script/lua_api/l_object.cpp | 15 ++++++++++++++- src/server.cpp | 2 -- src/serverobject.h | 2 -- 5 files changed, 14 insertions(+), 16 deletions(-) (limited to 'src/serverobject.h') diff --git a/src/content_sao.cpp b/src/content_sao.cpp index f0973082d..bb62aea7d 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -203,16 +203,6 @@ void UnitSAO::getAttachment(int *parent_id, std::string *bone, v3f *position, *rotation = m_attachment_rotation; } -void UnitSAO::detachFromParent() -{ - ServerActiveObject *parent = NULL; - if (m_attachment_parent_id) - parent = m_env->getActiveObject(m_attachment_parent_id); - setAttachment(NULL, "", v3f(0, 0, 0), v3f(0, 0, 0)); - if (parent != NULL) - parent->removeAttachmentChild(m_id); -} - void UnitSAO::addAttachmentChild(int child_id) { m_attachment_child_ids.insert(child_id); diff --git a/src/content_sao.h b/src/content_sao.h index 56a26fb0d..c3674fa2d 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -49,7 +49,6 @@ public: void setBonePosition(const std::string &bone, v3f position, v3f rotation); void getBonePosition(const std::string &bone, v3f *position, v3f *rotation); void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); - void detachFromParent(); void getAttachment(int *parent_id, std::string *bone, v3f *position, v3f *rotation); void addAttachmentChild(int child_id); void removeAttachmentChild(int child_id); diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 1fa3663ca..be4451704 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -710,7 +710,20 @@ int ObjectRef::l_set_detach(lua_State *L) ServerActiveObject *co = getobject(ref); if (co == NULL) return 0; - co->detachFromParent(); + + int parent_id = 0; + std::string bone = ""; + v3f position; + v3f rotation; + co->getAttachment(&parent_id, &bone, &position, &rotation); + ServerActiveObject *parent = NULL; + if (parent_id) + parent = env->getActiveObject(parent_id); + + // Do it + co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0)); + if (parent != NULL) + parent->removeAttachmentChild(co->getId()); return 0; } diff --git a/src/server.cpp b/src/server.cpp index 1e5704042..1656b9f5a 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2560,8 +2560,6 @@ void Server::DiePlayer(u16 peer_id) if (!playersao) return; - playersao->detachFromParent(); - infostream << "Server::DiePlayer(): Player " << playersao->getPlayer()->getName() << " dies" << std::endl; diff --git a/src/serverobject.h b/src/serverobject.h index dfe6312f0..38204980e 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -166,8 +166,6 @@ public: {} virtual void removeAttachmentChild(int child_id) {} - virtual void detachFromParent() - {} virtual const UNORDERED_SET &getAttachmentChildIds() { static const UNORDERED_SET rv; return rv; } virtual ObjectProperties* accessObjectProperties() -- cgit v1.2.3