Make attached objects visible in 3rd person view

master
est31 2015-06-20 00:30:38 +02:00
parent 3b65a6a36c
commit 40226e5274
5 changed files with 43 additions and 14 deletions

View File

@ -727,6 +727,17 @@ scene::IBillboardSceneNode* GenericCAO::getSpriteSceneNode()
return m_spritenode; return m_spritenode;
} }
void GenericCAO::setChildrenVisible(bool toset)
{
for (std::vector<u16>::iterator ci = m_children.begin();
ci != m_children.end(); ci++) {
GenericCAO *obj = m_env->getGenericCAO(*ci);
if (obj) {
obj->setVisible(toset);
}
}
}
void GenericCAO::setAttachments() void GenericCAO::setAttachments()
{ {
updateAttachments(); updateAttachments();
@ -1489,16 +1500,7 @@ void GenericCAO::updateBonePosition()
void GenericCAO::updateAttachments() void GenericCAO::updateAttachments()
{ {
// localplayer itself can't be attached to localplayer if (getParent() == NULL) { // Detach or don't attach
if (!m_is_local_player)
{
m_attached_to_local = getParent() != NULL && getParent()->isLocalPlayer();
// Objects attached to the local player should always be hidden
m_is_visible = !m_attached_to_local;
}
if(getParent() == NULL || m_attached_to_local) // Detach or don't attach
{
scene::ISceneNode *node = getSceneNode(); scene::ISceneNode *node = getSceneNode();
if (node) { if (node) {
v3f old_position = node->getAbsolutePosition(); v3f old_position = node->getAbsolutePosition();
@ -1667,14 +1669,26 @@ void GenericCAO::processMessage(const std::string &data)
m_bone_position[bone] = core::vector2d<v3f>(position, rotation); m_bone_position[bone] = core::vector2d<v3f>(position, rotation);
updateBonePosition(); updateBonePosition();
} } else if (cmd == GENERIC_CMD_SET_ATTACHMENT) {
else if(cmd == GENERIC_CMD_SET_ATTACHMENT) { u16 parentID = readS16(is);
m_env->m_attachements[getId()] = readS16(is); m_env->m_attachements[getId()] = parentID;
m_children.push_back(m_env->m_attachements[getId()]); GenericCAO *parentobj = m_env->getGenericCAO(parentID);
if (parentobj) {
parentobj->m_children.push_back(getId());
}
m_attachment_bone = deSerializeString(is); m_attachment_bone = deSerializeString(is);
m_attachment_position = readV3F1000(is); m_attachment_position = readV3F1000(is);
m_attachment_rotation = readV3F1000(is); m_attachment_rotation = readV3F1000(is);
// localplayer itself can't be attached to localplayer
if (!m_is_local_player) {
m_attached_to_local = getParent() != NULL && getParent()->isLocalPlayer();
// Objects attached to the local player should be hidden by default
m_is_visible = !m_attached_to_local;
}
updateAttachments(); updateAttachments();
} }
else if(cmd == GENERIC_CMD_PUNCHED) { else if(cmd == GENERIC_CMD_PUNCHED) {

View File

@ -162,6 +162,8 @@ public:
m_is_visible = toset; m_is_visible = toset;
} }
void setChildrenVisible(bool toset);
void setAttachments(); void setAttachments();
void removeFromScene(bool permanent); void removeFromScene(bool permanent);

View File

@ -2400,6 +2400,15 @@ void ClientEnvironment::addSimpleObject(ClientSimpleObject *simple)
m_simple_objects.push_back(simple); m_simple_objects.push_back(simple);
} }
GenericCAO* ClientEnvironment::getGenericCAO(u16 id)
{
ClientActiveObject *obj = getActiveObject(id);
if (obj && obj->getType() == ACTIVEOBJECT_TYPE_GENERIC)
return (GenericCAO*) obj;
else
return NULL;
}
ClientActiveObject* ClientEnvironment::getActiveObject(u16 id) ClientActiveObject* ClientEnvironment::getActiveObject(u16 id)
{ {
std::map<u16, ClientActiveObject*>::iterator n; std::map<u16, ClientActiveObject*>::iterator n;

View File

@ -405,6 +405,8 @@ private:
#ifndef SERVER #ifndef SERVER
#include "clientobject.h" #include "clientobject.h"
#include "content_cao.h"
class ClientSimpleObject; class ClientSimpleObject;
/* /*
@ -467,6 +469,7 @@ public:
ActiveObjects ActiveObjects
*/ */
GenericCAO* getGenericCAO(u16 id);
ClientActiveObject* getActiveObject(u16 id); ClientActiveObject* getActiveObject(u16 id);
/* /*

View File

@ -3298,6 +3298,7 @@ void Game::updateCamera(VolatileRunFlags *flags, u32 busy_time,
camera->toggleCameraMode(); camera->toggleCameraMode();
playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST); playercao->setVisible(camera->getCameraMode() > CAMERA_MODE_FIRST);
playercao->setChildrenVisible(camera->getCameraMode() > CAMERA_MODE_FIRST);
} }
float full_punch_interval = playeritem_toolcap.full_punch_interval; float full_punch_interval = playeritem_toolcap.full_punch_interval;