X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcontent_cao.cpp;h=02622f5b48b113754be2bb9225fe12bb934c3968;hb=e5b4748bb44a12fd09a92f7d36986b4bda86e6bf;hp=aa999b3af5fbc0d7f948ffe87d8b227eac18f929;hpb=f383766dbf636c47d5d115b3f6e9aa3bcb54cfa4;p=oweals%2Fminetest.git diff --git a/src/content_cao.cpp b/src/content_cao.cpp index aa999b3af..02622f5b4 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -670,6 +670,7 @@ GenericCAO::~GenericCAO() { m_env->removePlayerName(m_name.c_str()); } + removeFromScene(true); } core::aabbox3d* GenericCAO::getSelectionBox() @@ -735,7 +736,8 @@ ClientActiveObject* GenericCAO::getParent() void GenericCAO::removeFromScene(bool permanent) { - if(permanent) // Should be true when removing the object permanently and false when refreshing (eg: updating visuals) + // Should be true when removing the object permanently and false when refreshing (eg: updating visuals) + if((m_env != NULL) && (permanent)) { for(std::vector::iterator ci = m_children.begin(); ci != m_children.end(); ci++) @@ -746,11 +748,18 @@ void GenericCAO::removeFromScene(bool permanent) } m_env->m_attachements[getId()] = 0; + + LocalPlayer* player = m_env->getLocalPlayer(); + if (this == player->parent) { + player->parent = NULL; + player->isAttached = false; + } } if(m_meshnode) { m_meshnode->remove(); + m_meshnode->drop(); m_meshnode = NULL; } if(m_animated_meshnode) @@ -762,8 +771,15 @@ void GenericCAO::removeFromScene(bool permanent) if(m_spritenode) { m_spritenode->remove(); + m_spritenode->drop(); m_spritenode = NULL; } + if (m_textnode) + { + m_textnode->remove(); + m_textnode->drop(); + m_textnode = NULL; + } } void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, @@ -787,6 +803,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, infostream<<"GenericCAO::addToScene(): single_sprite"<addBillboardSceneNode( NULL, v2f(1, 1), v3f(0,0,0), -1); + m_spritenode->grab(); m_spritenode->setMaterialTexture(0, tsrc->getTexture("unknown_node.png")); m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false); @@ -852,6 +869,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, buf->drop(); } m_meshnode = smgr->addMeshSceneNode(mesh, NULL); + m_meshnode->grab(); mesh->drop(); // Set it to use the materials of the meshbuffers directly. // This is needed for changing the texture in the future @@ -861,6 +879,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, infostream<<"GenericCAO::addToScene(): cube"<addMeshSceneNode(mesh, NULL); + m_meshnode->grab(); mesh->drop(); m_meshnode->setScale(v3f(m_prop.visual_size.X, @@ -912,6 +931,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh); m_meshnode = smgr->addMeshSceneNode(mesh, NULL); + m_meshnode->grab(); mesh->drop(); m_meshnode->setScale(v3f(m_prop.visual_size.X/2, @@ -939,6 +959,7 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, std::wstring wname = narrow_to_wide(m_name); m_textnode = smgr->addTextSceneNode(gui->getBuiltInFont(), wname.c_str(), video::SColor(255,255,255,255), node); + m_textnode->grab(); m_textnode->setPosition(v3f(0, BS*1.1, 0)); }