Make attached objects visible in 3rd person view
parent
3b65a6a36c
commit
40226e5274
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue