Fix overloaded virtual warnings with get/setAttachment()

master
sfan5 2020-11-10 21:22:02 +01:00
parent 8eb2cbac61
commit c441baa91b
2 changed files with 28 additions and 31 deletions

View File

@ -460,18 +460,20 @@ void GenericCAO::setChildrenVisible(bool toset)
GenericCAO *obj = m_env->getGenericCAO(cao_id); GenericCAO *obj = m_env->getGenericCAO(cao_id);
if (obj) { if (obj) {
// Check if the entity is forced to appear in first person. // Check if the entity is forced to appear in first person.
obj->setVisible(obj->isForcedVisible() ? true : toset); obj->setVisible(obj->m_force_visible ? true : toset);
} }
} }
} }
void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation) void GenericCAO::setAttachment(int parent_id, const std::string &bone,
v3f position, v3f rotation, bool force_visible)
{ {
int old_parent = m_attachment_parent_id; int old_parent = m_attachment_parent_id;
m_attachment_parent_id = parent_id; m_attachment_parent_id = parent_id;
m_attachment_bone = bone; m_attachment_bone = bone;
m_attachment_position = position; m_attachment_position = position;
m_attachment_rotation = rotation; m_attachment_rotation = rotation;
m_force_visible = force_visible;
ClientActiveObject *parent = m_env->getActiveObject(parent_id); ClientActiveObject *parent = m_env->getActiveObject(parent_id);
@ -482,15 +484,30 @@ void GenericCAO::setAttachment(int parent_id, const std::string &bone, v3f posit
parent->addAttachmentChild(m_id); parent->addAttachmentChild(m_id);
} }
updateAttachments(); updateAttachments();
// Forcibly show attachments if required by set_attach
if (m_force_visible) {
m_is_visible = true;
} else if (!m_is_local_player) {
// Objects attached to the local player should be hidden in first person
m_is_visible = !m_attached_to_local ||
m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST;
m_force_visible = false;
} else {
// Local players need to have this set,
// otherwise first person attachments fail.
m_is_visible = true;
}
} }
void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position, void GenericCAO::getAttachment(int *parent_id, std::string *bone, v3f *position,
v3f *rotation) const v3f *rotation, bool *force_visible) const
{ {
*parent_id = m_attachment_parent_id; *parent_id = m_attachment_parent_id;
*bone = m_attachment_bone; *bone = m_attachment_bone;
*position = m_attachment_position; *position = m_attachment_position;
*rotation = m_attachment_rotation; *rotation = m_attachment_rotation;
*force_visible = m_force_visible;
} }
void GenericCAO::clearChildAttachments() void GenericCAO::clearChildAttachments()
@ -509,9 +526,9 @@ void GenericCAO::clearChildAttachments()
void GenericCAO::clearParentAttachment() void GenericCAO::clearParentAttachment()
{ {
if (m_attachment_parent_id) if (m_attachment_parent_id)
setAttachment(0, "", m_attachment_position, m_attachment_rotation); setAttachment(0, "", m_attachment_position, m_attachment_rotation, false);
else else
setAttachment(0, "", v3f(), v3f()); setAttachment(0, "", v3f(), v3f(), false);
} }
void GenericCAO::addAttachmentChild(int child_id) void GenericCAO::addAttachmentChild(int child_id)
@ -1781,25 +1798,9 @@ void GenericCAO::processMessage(const std::string &data)
std::string bone = deSerializeString16(is); std::string bone = deSerializeString16(is);
v3f position = readV3F32(is); v3f position = readV3F32(is);
v3f rotation = readV3F32(is); v3f rotation = readV3F32(is);
m_force_visible = readU8(is); // Returns false for EOF bool force_visible = readU8(is); // Returns false for EOF
setAttachment(parent_id, bone, position, rotation); setAttachment(parent_id, bone, position, rotation, force_visible);
// Forcibly show attachments if required by set_attach
if (m_force_visible)
m_is_visible = true;
// localplayer itself can't be attached to localplayer
else if (!m_is_local_player) {
// Objects attached to the local player should be hidden in first
// person provided the forced boolean isn't set.
m_is_visible = !m_attached_to_local ||
m_client->getCamera()->getCameraMode() != CAMERA_MODE_FIRST;
m_force_visible = false;
} else {
// Local players need to have this set,
// otherwise first person attachments fail.
m_is_visible = true;
}
} else if (cmd == AO_CMD_PUNCHED) { } else if (cmd == AO_CMD_PUNCHED) {
u16 result_hp = readU16(is); u16 result_hp = readU16(is);

View File

@ -111,6 +111,7 @@ private:
v3f m_attachment_position; v3f m_attachment_position;
v3f m_attachment_rotation; v3f m_attachment_rotation;
bool m_attached_to_local = false; bool m_attached_to_local = false;
bool m_force_visible = false;
int m_anim_frame = 0; int m_anim_frame = 0;
int m_anim_num_frames = 1; int m_anim_num_frames = 1;
@ -126,7 +127,6 @@ private:
float m_step_distance_counter = 0.0f; float m_step_distance_counter = 0.0f;
u8 m_last_light = 255; u8 m_last_light = 255;
bool m_is_visible = false; bool m_is_visible = false;
bool m_force_visible = false;
s8 m_glow = 0; s8 m_glow = 0;
// Material // Material
video::E_MATERIAL_TYPE m_material_type; video::E_MATERIAL_TYPE m_material_type;
@ -218,15 +218,11 @@ public:
m_is_visible = toset; m_is_visible = toset;
} }
inline bool isForcedVisible() const
{
return m_force_visible;
}
void setChildrenVisible(bool toset); void setChildrenVisible(bool toset);
void setAttachment(int parent_id, const std::string &bone, v3f position, v3f rotation); void setAttachment(int parent_id, const std::string &bone, v3f position,
v3f rotation, bool force_visible);
void getAttachment(int *parent_id, std::string *bone, v3f *position, void getAttachment(int *parent_id, std::string *bone, v3f *position,
v3f *rotation) const; v3f *rotation, bool *force_visible) const;
void clearChildAttachments(); void clearChildAttachments();
void clearParentAttachment(); void clearParentAttachment();
void addAttachmentChild(int child_id); void addAttachmentChild(int child_id);