From 4c40e0775ca564296a56f72ff3adce50ba925b0c Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 3 Nov 2017 19:10:53 +0000 Subject: Player eye height: Make this a settable player object property --- src/content_cao.cpp | 1 + src/content_sao.cpp | 3 ++- src/localplayer.cpp | 3 ++- src/localplayer.h | 2 ++ src/object_properties.cpp | 5 ++++- src/object_properties.h | 1 + src/script/common/c_content.cpp | 4 +++- 7 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 8bc9ad88e..861dc83e7 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1260,6 +1260,7 @@ void GenericCAO::processMessage(const std::string &data) collision_box.MaxEdge *= BS; player->setCollisionbox(collision_box); player->setCanZoom(m_prop.can_zoom); + player->setEyeHeight(m_prop.eye_height); } if ((m_is_player && !m_is_local_player) && m_prop.nametag.empty()) diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 819c63ac3..31ee21e58 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -809,6 +809,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p m_prop.colors.clear(); m_prop.colors.emplace_back(255, 255, 255, 255); m_prop.spritediv = v2s16(1,1); + m_prop.eye_height = 1.625f; // end of default appearance m_prop.is_visible = true; m_prop.makes_footstep_sound = true; @@ -834,7 +835,7 @@ void PlayerSAO::finalize(RemotePlayer *player, const std::set &priv v3f PlayerSAO::getEyeOffset() const { - return v3f(0, BS * 1.625f, 0); + return v3f(0, BS * m_prop.eye_height, 0); } std::string PlayerSAO::getDescription() diff --git a/src/localplayer.cpp b/src/localplayer.cpp index eb99d0062..e501fac1b 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -718,7 +718,8 @@ v3s16 LocalPlayer::getLightPosition() const v3f LocalPlayer::getEyeOffset() const { - float eye_height = camera_barely_in_ceiling ? 1.5f : 1.625f; + float eye_height = camera_barely_in_ceiling ? + m_eye_height - 0.125f : m_eye_height; return v3f(0, BS * eye_height, 0); } diff --git a/src/localplayer.h b/src/localplayer.h index a3c97db5d..8e4378dfa 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -138,6 +138,7 @@ public: v3f getPosition() const { return m_position; } v3f getEyePosition() const { return m_position + getEyeOffset(); } v3f getEyeOffset() const; + void setEyeHeight(float eye_height) { m_eye_height = eye_height; } void setCollisionbox(const aabb3f &box) { m_collisionbox = box; } @@ -181,6 +182,7 @@ private: aabb3f m_collisionbox = aabb3f(-BS * 0.30f, 0.0f, -BS * 0.30f, BS * 0.30f, BS * 1.75f, BS * 0.30f); bool m_can_zoom = true; + float m_eye_height = 1.625f; GenericCAO *m_cao = nullptr; Client *m_client; diff --git a/src/object_properties.cpp b/src/object_properties.cpp index ae0305019..ffb1ecb43 100644 --- a/src/object_properties.cpp +++ b/src/object_properties.cpp @@ -67,6 +67,7 @@ std::string ObjectProperties::dump() os << ", pointable=" << pointable; os << ", can_zoom=" << can_zoom; os << ", static_save=" << static_save; + os << ", eye_height=" << eye_height; return os.str(); } @@ -99,7 +100,7 @@ void ObjectProperties::serialize(std::ostream &os) const writeARGB8(os, color); } writeU8(os, collideWithObjects); - writeF1000(os,stepheight); + writeF1000(os, stepheight); writeU8(os, automatic_face_movement_dir); writeF1000(os, automatic_face_movement_dir_offset); writeU8(os, backface_culling); @@ -111,6 +112,7 @@ void ObjectProperties::serialize(std::ostream &os) const writeU8(os, can_zoom); writeS8(os, glow); writeU16(os, breath_max); + writeF1000(os, eye_height); // Add stuff only at the bottom. // Never remove anything, because we don't want new versions of this @@ -162,5 +164,6 @@ void ObjectProperties::deSerialize(std::istream &is) try { glow = readS8(is); breath_max = readU16(is); + eye_height = readF1000(is); } catch (SerializationError &e) {} } diff --git a/src/object_properties.h b/src/object_properties.h index fcf03383c..8ccce589f 100644 --- a/src/object_properties.h +++ b/src/object_properties.h @@ -59,6 +59,7 @@ struct ObjectProperties //! For dropped items, this contains item information. std::string wield_item; bool static_save = true; + float eye_height = 1.625f; ObjectProperties(); std::string dump(); diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index 1bbfac25f..73661a7b6 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -266,6 +266,7 @@ void read_object_properties(lua_State *L, int index, if (getfloatfield(L, -1, "stepheight", prop->stepheight)) prop->stepheight *= BS; getboolfield(L, -1, "can_zoom", prop->can_zoom); + getfloatfield(L, -1, "eye_height", prop->eye_height); getfloatfield(L, -1, "automatic_rotate", prop->automatic_rotate); lua_getfield(L, -1, "automatic_face_movement_dir"); @@ -359,7 +360,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop) lua_setfield(L, -2, "stepheight"); lua_pushboolean(L, prop->can_zoom); lua_setfield(L, -2, "can_zoom"); - + lua_pushnumber(L, prop->eye_height); + lua_setfield(L, -2, "eye_height"); lua_pushnumber(L, prop->automatic_rotate); lua_setfield(L, -2, "automatic_rotate"); if (prop->automatic_face_movement_dir) -- cgit v1.2.3