minetest/src/clientobject.h

123 lines
3.6 KiB
C
Raw Normal View History

/*
2013-02-24 18:40:43 +01:00
Minetest
2013-02-24 19:38:45 +01:00
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 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 Lesser General Public License for more details.
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.
*/
#ifndef CLIENTOBJECT_HEADER
#define CLIENTOBJECT_HEADER
2012-06-17 03:00:31 +02:00
#include "irrlichttypes_extrabloated.h"
#include "activeobject.h"
2012-12-20 18:19:49 +01:00
#include <map>
/*
Some planning
-------------
* Client receives a network packet with information of added objects
in it
* Client supplies the information to its ClientEnvironment
* The environment adds the specified objects to itself
*/
2011-04-10 03:15:10 +02:00
class ClientEnvironment;
class ITextureSource;
class IGameDef;
2012-03-05 00:30:55 +01:00
class LocalPlayer;
struct ItemStack;
2011-04-10 03:15:10 +02:00
class ClientActiveObject : public ActiveObject
{
public:
2011-12-01 17:23:58 +01:00
ClientActiveObject(u16 id, IGameDef *gamedef, ClientEnvironment *env);
virtual ~ClientActiveObject();
2011-12-01 17:23:58 +01:00
virtual void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
IrrlichtDevice *irr){}
Send animations, bone overrides and attachments in entity initialization. Clients no longer have to be near an object when an animation or attachment is set to see the changes, and newly connected clients (or a client that simply renders the object for the first time) will get all of those settings. Therefore, the lua script no longer needs to run every X seconds either, just once per entity. Finish fixing the material color code. But it won't work until MineTest has dynamic lighting... another day another feature. Extra checks for the bone positioning / rotation code Many checks and consistency improvements to the client attachment code Make a separate function for checking if a client object is attached. A more in-depth change will be needed here to fix reading of invalid pointers Use a different method of fetching the parent. Fixes the mass segmentation faults when rendering an attachment (some still happen though) Major change to how attachments are handled. Fix the last segmentaton fault, which was due to the parent becoming invalid while being refreshed / removed which would bause the child to remain attached to nothing. Parents remove their children when being deleted themselves and add them back when re-added. Attachments are stored inside a 2D a vector which easily allows both a child to find their parent and a parent to find its children. Remove attachment list entry when an object is being permanently removed. Also avoid duplicate entries in this list when re-attaching the same object The "big code comments" can now go away. Client attachments almost work properly, and I know what else needs to be done
2012-11-04 22:54:50 +01:00
virtual void removeFromScene(bool permanent){}
// 0 <= light_at_pos <= LIGHT_SUN
virtual void updateLight(u8 light_at_pos){}
virtual v3s16 getLightPosition(){return v3s16(0,0,0);}
virtual core::aabbox3d<f32>* getSelectionBox(){return NULL;}
virtual core::aabbox3d<f32>* getCollisionBox(){return NULL;}
virtual bool collideWithObjects(){return false;}
virtual v3f getPosition(){return v3f(0,0,0);}
virtual scene::IMeshSceneNode *getMeshSceneNode(){return NULL;}
virtual scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(){return NULL;}
virtual scene::IBillboardSceneNode *getSpriteSceneNode(){return NULL;}
virtual bool isPlayer(){return false;}
virtual bool isLocalPlayer(){return false;}
virtual void setAttachments(){}
2011-10-15 01:28:57 +02:00
virtual bool doShowSelectionBox(){return true;}
// Step object in time
2011-04-10 03:15:10 +02:00
virtual void step(float dtime, ClientEnvironment *env){}
// Process a message sent by the server side object
virtual void processMessage(const std::string &data){}
2011-04-10 03:15:10 +02:00
virtual std::string infoText() {return "";}
2012-03-09 19:28:55 +01:00
virtual std::string debugInfoText() {return "";}
2011-10-15 11:17:21 +02:00
/*
This takes the return value of
ServerActiveObject::getClientInitializationData
*/
virtual void initialize(const std::string &data){}
// Create a certain type of ClientActiveObject
2011-12-01 17:23:58 +01:00
static ClientActiveObject* create(u8 type, IGameDef *gamedef,
ClientEnvironment *env);
2011-10-15 11:17:21 +02:00
// If returns true, punch will not be sent to the server
2012-03-05 00:30:55 +01:00
virtual bool directReportPunch(v3f dir, const ItemStack *punchitem=NULL,
float time_from_last_punch=1000000)
2011-10-15 11:17:21 +02:00
{ return false; }
protected:
2011-04-10 03:15:10 +02:00
// Used for creating objects based on type
2011-12-01 17:23:58 +01:00
typedef ClientActiveObject* (*Factory)(IGameDef *gamedef, ClientEnvironment *env);
static void registerType(u16 type, Factory f);
IGameDef *m_gamedef;
2011-12-01 17:23:58 +01:00
ClientEnvironment *m_env;
private:
2011-04-10 03:15:10 +02:00
// Used for creating objects based on type
2012-12-20 18:19:49 +01:00
static std::map<u16, Factory> m_types;
};
struct DistanceSortedActiveObject
{
ClientActiveObject *obj;
f32 d;
DistanceSortedActiveObject(ClientActiveObject *a_obj, f32 a_d)
{
obj = a_obj;
d = a_d;
}
2012-12-20 18:19:49 +01:00
bool operator < (const DistanceSortedActiveObject &other) const
{
return d < other.d;
}
};
#endif