+
+ m_env->attachement_parent_ids[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;
+ } else if (m_animated_meshnode) {
+ m_animated_meshnode->remove();
+ m_animated_meshnode->drop();
+ m_animated_meshnode = NULL;
+ } else if (m_wield_meshnode) {
+ m_wield_meshnode->remove();
+ m_wield_meshnode->drop();
+ m_wield_meshnode = NULL;
+ } else if (m_spritenode) {
+ m_spritenode->remove();
+ m_spritenode->drop();
+ m_spritenode = NULL;
+ }
+
+ if (m_nametag) {
+ m_gamedef->getCamera()->removeNametag(m_nametag);
+ m_nametag = NULL;
+ }
+}
+
+void GenericCAO::addToScene(scene::ISceneManager *smgr,
+ ITextureSource *tsrc, IrrlichtDevice *irr)
+{
+ m_smgr = smgr;
+ m_irr = irr;
+
+ if (getSceneNode() != NULL) {
+ return;
+ }
+
+ m_visuals_expired = false;
+
+ if (!m_prop.is_visible) {
+ return;
+ }
+
+ if (m_prop.visual == "sprite") {
+ infostream<<"GenericCAO::addToScene(): single_sprite"<<std::endl;
+ m_spritenode = smgr->addBillboardSceneNode(
+ NULL, v2f(1, 1), v3f(0,0,0), -1);
+ m_spritenode->grab();
+ m_spritenode->setMaterialTexture(0,
+ tsrc->getTextureForMesh("unknown_node.png"));
+ m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
+ m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
+ m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
+ m_spritenode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
+ u8 li = m_last_light;
+ m_spritenode->setColor(video::SColor(255,li,li,li));
+ m_spritenode->setSize(m_prop.visual_size*BS);