Modernize client code (#6250)
[oweals/minetest.git] / src / content_cao.cpp
index aff143bf2ddc95529485dfe73e0b9c7c466cb379..771820cb09c1003cc5c1a61dab10d15b4f4b47bf 100644 (file)
@@ -283,8 +283,14 @@ public:
 
        void initialize(const std::string &data);
 
-       aabb3f *getSelectionBox()
-               {return &m_selection_box;}
+
+       virtual bool getSelectionBox(aabb3f *toset) const
+       {
+               *toset = m_selection_box;
+               return true;
+       }
+
+
        v3f getPosition()
                {return m_position;}
        inline float getYaw() const
@@ -605,11 +611,14 @@ GenericCAO::~GenericCAO()
        removeFromScene(true);
 }
 
-aabb3f *GenericCAO::getSelectionBox()
+bool GenericCAO::getSelectionBox(aabb3f *toset) const
 {
-       if(!m_prop.is_visible || !m_is_visible || m_is_local_player || getParent() != NULL)
-               return NULL;
-       return &m_selection_box;
+       if (!m_prop.is_visible || !m_is_visible || m_is_local_player
+                       || getParent() != NULL){
+               return false;
+       }
+       *toset = m_selection_box;
+       return true;
 }
 
 v3f GenericCAO::getPosition()
@@ -658,7 +667,7 @@ void GenericCAO::setAttachments()
        updateAttachments();
 }
 
-ClientActiveObject* GenericCAO::getParent()
+ClientActiveObject* GenericCAO::getParent() const
 {
        ClientActiveObject *obj = NULL;
 
@@ -886,8 +895,11 @@ void GenericCAO::addToScene(ITextureSource *tsrc)
        scene::ISceneNode *node = getSceneNode();
        if (node && m_prop.nametag != "" && !m_is_local_player) {
                // Add nametag
+               v3f pos;
+               pos.Y = m_prop.collisionbox.MaxEdge.Y + 0.3f;
                m_nametag = m_client->getCamera()->addNametag(node,
-                       m_prop.nametag, m_prop.nametag_color);
+                       m_prop.nametag, m_prop.nametag_color,
+                       pos);
        }
 
        updateNodePos();
@@ -934,7 +946,7 @@ void GenericCAO::updateLightNoCheck(u8 light_at_pos)
 
 v3s16 GenericCAO::getLightPosition()
 {
-       return floatToInt(m_position, BS);
+       return floatToInt(m_position + v3f(0, 0.5 * BS, 0), BS);
 }
 
 void GenericCAO::updateNodePos()
@@ -963,7 +975,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                if (m_is_visible) {
                        int old_anim = player->last_animation;
                        float old_anim_speed = player->last_animation_speed;
-                       m_position = player->getPosition() + v3f(0,BS,0);
+                       m_position = player->getPosition();
                        m_velocity = v3f(0,0,0);
                        m_acceleration = v3f(0,0,0);
                        pos_translator.vect_show = m_position;
@@ -1503,6 +1515,7 @@ void GenericCAO::processMessage(const std::string &data)
                if (m_is_local_player) {
                        LocalPlayer *player = m_env->getLocalPlayer();
                        player->makes_footstep_sound = m_prop.makes_footstep_sound;
+                       player->setCollisionbox(m_selection_box);
                }
 
                if ((m_is_player && !m_is_local_player) && m_prop.nametag == "")
@@ -1690,6 +1703,9 @@ void GenericCAO::processMessage(const std::string &data)
                m_prop.nametag_color = readARGB8(is);
                if (m_nametag != NULL) {
                        m_nametag->nametag_color = m_prop.nametag_color;
+                       v3f pos;
+                       pos.Y = m_prop.collisionbox.MaxEdge.Y + 0.3f;
+                       m_nametag->nametag_pos = pos;
                }
        } else if (cmd == GENERIC_CMD_SPAWN_INFANT) {
                u16 child_id = readU16(is);