mirror of
https://github.com/minetest/minetest.git
synced 2024-11-11 10:13:45 +01:00
52fcb0b4b9
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
71 lines
1.7 KiB
C++
71 lines
1.7 KiB
C++
/*
|
|
Minetest-c55
|
|
Copyright (C) 2010-2011 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.
|
|
*/
|
|
|
|
#include "clientobject.h"
|
|
#include "debug.h"
|
|
#include "porting.h"
|
|
#include "constants.h"
|
|
|
|
/*
|
|
ClientActiveObject
|
|
*/
|
|
|
|
ClientActiveObject::ClientActiveObject(u16 id, IGameDef *gamedef,
|
|
ClientEnvironment *env):
|
|
ActiveObject(id),
|
|
m_gamedef(gamedef),
|
|
m_env(env)
|
|
{
|
|
}
|
|
|
|
ClientActiveObject::~ClientActiveObject()
|
|
{
|
|
removeFromScene(true);
|
|
}
|
|
|
|
ClientActiveObject* ClientActiveObject::create(u8 type, IGameDef *gamedef,
|
|
ClientEnvironment *env)
|
|
{
|
|
// Find factory function
|
|
core::map<u16, Factory>::Node *n;
|
|
n = m_types.find(type);
|
|
if(n == NULL)
|
|
{
|
|
// If factory is not found, just return.
|
|
dstream<<"WARNING: ClientActiveObject: No factory for type="
|
|
<<(int)type<<std::endl;
|
|
return NULL;
|
|
}
|
|
|
|
Factory f = n->getValue();
|
|
ClientActiveObject *object = (*f)(gamedef, env);
|
|
return object;
|
|
}
|
|
|
|
void ClientActiveObject::registerType(u16 type, Factory f)
|
|
{
|
|
core::map<u16, Factory>::Node *n;
|
|
n = m_types.find(type);
|
|
if(n)
|
|
return;
|
|
m_types.insert(type, f);
|
|
}
|
|
|
|
|