/*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "debug.h"
#include "porting.h"
#include "constants.h"
-#include "utility.h"
-
-ClientActiveObject::ClientActiveObject(u16 id):
- ActiveObject(id)
-{
-}
-
-ClientActiveObject::~ClientActiveObject()
-{
- removeFromScene();
-}
-
-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)
- {
- dstream<<"ClientActiveObject::create(): passed "
- <<"ACTIVEOBJECT_TYPE_TEST"<<std::endl;
- return new TestCAO(0);
- }
- else
- {
- dstream<<"ClientActiveObject::create(): passed "
- <<"unknown type="<<type<<std::endl;
- return NULL;
- }
-}
/*
- TestCAO
+ ClientActiveObject
*/
-TestCAO::TestCAO(u16 id):
- ClientActiveObject(id),
- m_node(NULL),
- m_position(v3f(0,10*BS,0))
+ClientActiveObject::ClientActiveObject(u16 id, IGameDef *gamedef,
+ ClientEnvironment *env):
+ ActiveObject(id),
+ m_gamedef(gamedef),
+ m_env(env)
{
}
-TestCAO::~TestCAO()
+ClientActiveObject::~ClientActiveObject()
{
+ removeFromScene(true);
}
-void TestCAO::addToScene(scene::ISceneManager *smgr)
+ClientActiveObject* ClientActiveObject::create(u8 type, IGameDef *gamedef,
+ ClientEnvironment *env)
{
- 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] =
+ // Find factory function
+ std::map<u16, Factory>::iterator n;
+ n = m_types.find(type);
+ if(n == m_types.end())
{
- 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)
-{
-}
+ // If factory is not found, just return.
+ dstream<<"WARNING: ClientActiveObject: No factory for type="
+ <<(int)type<<std::endl;
+ return NULL;
+ }
-v3s16 TestCAO::getLightPosition()
-{
- return floatToInt(m_position, BS);
+ Factory f = n->second;
+ ClientActiveObject *object = (*f)(gamedef, env);
+ return object;
}
-void TestCAO::updateNodePos()
+void ClientActiveObject::registerType(u16 type, Factory f)
{
- if(m_node == NULL)
+ std::map<u16, Factory>::iterator n;
+ n = m_types.find(type);
+ if(n != m_types.end())
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[type] = f;
}