utility.h: Change Buffer's interface to be more compatible with SharedBuffer's interf...
[oweals/minetest.git] / src / clientobject.cpp
index 46db389cdc53e696200e18ca66a304adddac971a..ee2ad0b9fcd7cf0aa71fc6ee3ba768761abed0fe 100644 (file)
@@ -21,7 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "debug.h"
 #include "porting.h"
 #include "constants.h"
-#include "utility.h"
+
+/*
+       ClientActiveObject
+*/
 
 ClientActiveObject::ClientActiveObject(u16 id):
        ActiveObject(id)
@@ -35,135 +38,29 @@ ClientActiveObject::~ClientActiveObject()
 
 ClientActiveObject* ClientActiveObject::create(u8 type)
 {
-       if(type == ACTIVEOBJECT_TYPE_INVALID)
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"ACTIVEOBJECT_TYPE_INVALID"<<std::endl;
-               return NULL;
-       }
-       else if(type == ACTIVEOBJECT_TYPE_TEST)
+       // Find factory function
+       core::map<u16, Factory>::Node *n;
+       n = m_types.find(type);
+       if(n == NULL)
        {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"ACTIVEOBJECT_TYPE_TEST"<<std::endl;
-               return new TestCAO(0);
-       }
-       else if(type == ACTIVEOBJECT_TYPE_LUA)
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"ACTIVEOBJECT_TYPE_LUA"<<std::endl;
-               return NULL;
-       }
-       else
-       {
-               dstream<<"ClientActiveObject::create(): passed "
-                               <<"unknown type="<<type<<std::endl;
+               // If factory is not found, just return.
+               dstream<<"WARNING: ClientActiveObject: No factory for type="
+                               <<(int)type<<std::endl;
                return NULL;
        }
-}
-
-/*
-       TestCAO
-*/
-
-TestCAO::TestCAO(u16 id):
-       ClientActiveObject(id),
-       m_node(NULL),
-       m_position(v3f(0,10*BS,0))
-{
-}
-
-TestCAO::~TestCAO()
-{
-}
-
-void TestCAO::addToScene(scene::ISceneManager *smgr)
-{
-       if(m_node != NULL)
-               return;
-       
-       video::IVideoDriver* driver = smgr->getVideoDriver();
-       
-       scene::SMesh *mesh = new scene::SMesh();
-       scene::IMeshBuffer *buf = new scene::SMeshBuffer();
-       video::SColor c(255,255,255,255);
-       video::S3DVertex vertices[4] =
-       {
-               video::S3DVertex(-BS/2,-BS/4,0, 0,0,0, c, 0,1),
-               video::S3DVertex(BS/2,-BS/4,0, 0,0,0, c, 1,1),
-               video::S3DVertex(BS/2,BS/4,0, 0,0,0, c, 1,0),
-               video::S3DVertex(-BS/2,BS/4,0, 0,0,0, c, 0,0),
-       };
-       u16 indices[] = {0,1,2,2,3,0};
-       buf->append(vertices, 4, indices, 6);
-       // Set material
-       buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
-       buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
-       buf->getMaterial().setTexture
-                       (0, driver->getTexture(porting::getDataPath("rat.png").c_str()));
-       buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
-       buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
-       buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
-       // Add to mesh
-       mesh->addMeshBuffer(buf);
-       buf->drop();
-       m_node = smgr->addMeshSceneNode(mesh, NULL);
-       mesh->drop();
-       updateNodePos();
-}
-
-void TestCAO::removeFromScene()
-{
-       if(m_node == NULL)
-               return;
 
-       m_node->remove();
-       m_node = NULL;
-}
-
-void TestCAO::updateLight(u8 light_at_pos)
-{
-}
-
-v3s16 TestCAO::getLightPosition()
-{
-       return floatToInt(m_position, BS);
+       Factory f = n->getValue();
+       ClientActiveObject *object = (*f)();
+       return object;
 }
 
-void TestCAO::updateNodePos()
+void ClientActiveObject::registerType(u16 type, Factory f)
 {
-       if(m_node == NULL)
+       core::map<u16, Factory>::Node *n;
+       n = m_types.find(type);
+       if(n)
                return;
-
-       m_node->setPosition(m_position);
-       //m_node->setRotation(v3f(0, 45, 0));
-}
-
-void TestCAO::step(float dtime)
-{
-       if(m_node)
-       {
-               v3f rot = m_node->getRotation();
-               //dstream<<"dtime="<<dtime<<", rot.Y="<<rot.Y<<std::endl;
-               rot.Y += dtime * 180;
-               m_node->setRotation(rot);
-       }
-}
-
-void TestCAO::processMessage(const std::string &data)
-{
-       //dstream<<"TestCAO: Got data: "<<data<<std::endl;
-       std::istringstream is(data, std::ios::binary);
-       u16 cmd;
-       is>>cmd;
-       if(cmd == 0)
-       {
-               v3f newpos;
-               is>>newpos.X;
-               is>>newpos.Y;
-               is>>newpos.Z;
-               m_position = newpos;
-               updateNodePos();
-       }
+       m_types.insert(type, f);
 }