Detach the player from entities on death. (#5077)
authorred-001 <red-001@outlook.ie>
Sat, 21 Jan 2017 15:11:55 +0000 (15:11 +0000)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Sat, 21 Jan 2017 15:11:55 +0000 (16:11 +0100)
src/content_sao.cpp
src/content_sao.h
src/script/lua_api/l_object.cpp
src/server.cpp
src/serverobject.h

index bf8282af46aa1ec86dcb02fa15a1357af15486d7..d6581144fc25a47b0c5b6bd72374052950f6f9e2 100644 (file)
@@ -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);
index 4abe932501179015718837ad9f03efff42befa7a..884f0f4069b2db6c92f99ce50fbb42f3cca7f797 100644 (file)
@@ -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);
index 59c04f30155cff071352a46c806d63fd9a8ee9a9..f579c0b861ee5e534609203e52c27f0c990fc6ee 100644 (file)
@@ -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;
 }
 
index 1656b9f5a557c9b2769be576095e1a8d6a2777b8..1e57040421fd4aa991072bc7cd0f9b7620f6b1fb 100644 (file)
@@ -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;
index 38204980e439b57beda6722863a6d16d73166c97..dfe6312f082cde44e8ac6aa336c446d482f76ca1 100644 (file)
@@ -166,6 +166,8 @@ public:
        {}
        virtual void removeAttachmentChild(int child_id)
        {}
+       virtual void detachFromParent()
+       {}
        virtual const UNORDERED_SET<int> &getAttachmentChildIds()
        { static const UNORDERED_SET<int> rv; return rv; }
        virtual ObjectProperties* accessObjectProperties()