LocalPlayer::accelerateHorizontal: cleanups
[oweals/minetest.git] / src / content_sao.cpp
index d59f9727618574c3e6705086de29e413dff29bad..674ab580c389cea7490a9999e0cebbec866dc123 100644 (file)
@@ -91,6 +91,9 @@ public:
        }
 
        bool getCollisionBox(aabb3f *toset) const { return false; }
+
+       virtual bool getSelectionBox(aabb3f *toset) const { return false; }
+
        bool collideWithObjects() const { return false; }
 
 private:
@@ -106,19 +109,7 @@ TestSAO proto_TestSAO(NULL, v3f(0,0,0));
  */
 
 UnitSAO::UnitSAO(ServerEnvironment *env, v3f pos):
-       ServerActiveObject(env, pos),
-       m_hp(-1),
-       m_yaw(0),
-       m_properties_sent(true),
-       m_armor_groups_sent(false),
-       m_animation_range(0,0),
-       m_animation_speed(0),
-       m_animation_blend(0),
-       m_animation_loop(true),
-       m_animation_sent(false),
-       m_bone_position_sent(false),
-       m_attachment_parent_id(0),
-       m_attachment_sent(false)
+       ServerActiveObject(env, pos)
 {
        // Initialize something to armor groups
        m_armor_groups["fleshy"] = 100;
@@ -213,7 +204,7 @@ void UnitSAO::removeAttachmentChild(int child_id)
        m_attachment_child_ids.erase(child_id);
 }
 
-const UNORDERED_SET<int> &UnitSAO::getAttachmentChildIds()
+const std::unordered_set<int> &UnitSAO::getAttachmentChildIds()
 {
        return m_attachment_child_ids;
 }
@@ -239,16 +230,7 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
                const std::string &name, const std::string &state):
        UnitSAO(env, pos),
        m_init_name(name),
-       m_init_state(state),
-       m_registered(false),
-       m_velocity(0,0,0),
-       m_acceleration(0,0,0),
-       m_last_sent_yaw(0),
-       m_last_sent_position(0,0,0),
-       m_last_sent_velocity(0,0,0),
-       m_last_sent_position_timer(0),
-       m_last_sent_move_precision(0),
-       m_current_texture_modifier("")
+       m_init_state(state)
 {
        // Only register type if no environment supplied
        if(env == NULL){
@@ -263,7 +245,7 @@ LuaEntitySAO::~LuaEntitySAO()
                m_env->getScriptIface()->luaentity_Remove(m_id);
        }
 
-       for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+       for (std::unordered_set<u32>::iterator it = m_attached_particle_spawners.begin();
                it != m_attached_particle_spawners.end(); ++it) {
                m_env->deleteParticleSpawner(*it, false);
        }
@@ -406,6 +388,20 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                m_env->getScriptIface()->luaentity_Step(m_id, dtime);
        }
 
+       // Remove LuaEntity beyond terrain edges
+       {
+               ServerMap *map = dynamic_cast<ServerMap *>(&m_env->getMap());
+               assert(map);
+               if (!m_pending_deactivation &&
+                               map->saoPositionOverLimit(m_base_position)) {
+                       infostream << "Remove SAO " << m_id << "(" << m_init_name
+                               << "), outside of limits" << std::endl;
+                       m_pending_deactivation = true;
+                       m_removed = true;
+                       return;
+               }
+       }
+
        if(send_recommended == false)
                return;
 
@@ -447,7 +443,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
 
        if(m_bone_position_sent == false){
                m_bone_position_sent = true;
-               for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+               for (std::unordered_map<std::string, core::vector2d<v3f>>::const_iterator
                                ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
                        std::string str = gob_cmd_update_bone_position((*ii).first,
                                        (*ii).second.X, (*ii).second.Y);
@@ -484,7 +480,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
        msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
        msg_os << serializeLongString(gob_cmd_update_animation(
                m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
-       for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+       for (std::unordered_map<std::string, core::vector2d<v3f>>::const_iterator
                        ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
                msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
                                (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
@@ -492,7 +488,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
        msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
                m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
        int message_count = 4 + m_bone_position.size();
-       for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+       for (std::unordered_set<int>::const_iterator ii = m_attachment_child_ids.begin();
                        (ii != m_attachment_child_ids.end()); ++ii) {
                if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
                        message_count++;
@@ -586,8 +582,10 @@ int LuaEntitySAO::punch(v3f dir,
                }
        }
 
-       if (getHP() == 0)
+       if (getHP() == 0) {
                m_removed = true;
+               m_env->getScriptIface()->luaentity_on_death(m_id, puncher);
+       }
 
 
 
@@ -753,6 +751,18 @@ bool LuaEntitySAO::getCollisionBox(aabb3f *toset) const
        return false;
 }
 
+bool LuaEntitySAO::getSelectionBox(aabb3f *toset) const
+{
+       if (!m_prop.is_visible) {
+               return false;
+       }
+
+       toset->MinEdge = m_prop.collisionbox.MinEdge * BS;
+       toset->MaxEdge = m_prop.collisionbox.MaxEdge * BS;
+
+       return true;
+}
+
 bool LuaEntitySAO::collideWithObjects() const
 {
        return m_prop.collideWithObjects;
@@ -769,36 +779,14 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id
        UnitSAO(env_, v3f(0,0,0)),
        m_player(player_),
        m_peer_id(peer_id_),
-       m_inventory(NULL),
-       m_damage(0),
-       m_last_good_position(0,0,0),
-       m_time_from_last_teleport(0),
-       m_time_from_last_punch(0),
-       m_nocheat_dig_pos(32767, 32767, 32767),
-       m_nocheat_dig_time(0),
-       m_wield_index(0),
-       m_position_not_sent(false),
-       m_is_singleplayer(is_singleplayer),
-       m_breath(PLAYER_MAX_BREATH),
-       m_pitch(0),
-       m_fov(0),
-       m_wanted_range(0),
-       m_extended_attributes_modified(false),
-       // public
-       m_physics_override_speed(1),
-       m_physics_override_jump(1),
-       m_physics_override_gravity(1),
-       m_physics_override_sneak(true),
-       m_physics_override_sneak_glitch(false),
-       m_physics_override_new_move(true),
-       m_physics_override_sent(false)
+       m_is_singleplayer(is_singleplayer)
 {
        assert(m_peer_id != 0); // pre-condition
 
        m_prop.hp_max = PLAYER_MAX_HP;
        m_prop.physical = false;
-       m_prop.weight = PLAYER_DEFAULT_WEIGHT;
-       m_prop.collisionbox = aabb3f(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.);
+       m_prop.weight = 75;
+       m_prop.collisionbox = aabb3f(-0.3f, 0.0f, -0.3f, 0.3f, 1.77f, 0.3f);
        // start of default appearance, this should be overwritten by LUA
        m_prop.visual = "upright_sprite";
        m_prop.visual_size = v2f(1, 2);
@@ -811,7 +799,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id
        // end of default appearance
        m_prop.is_visible = true;
        m_prop.makes_footstep_sound = true;
-       m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT;
+       m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
        m_hp = PLAYER_MAX_HP;
 }
 
@@ -855,7 +843,7 @@ void PlayerSAO::removingFromEnvironment()
        ServerActiveObject::removingFromEnvironment();
        if (m_player->getPlayerSAO() == this) {
                unlinkPlayerSessionAndSave();
-               for (UNORDERED_SET<u32>::iterator it = m_attached_particle_spawners.begin();
+               for (std::unordered_set<u32>::iterator it = m_attached_particle_spawners.begin();
                        it != m_attached_particle_spawners.end(); ++it) {
                        m_env->deleteParticleSpawner(*it, false);
                }
@@ -871,7 +859,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
        os << serializeString(m_player->getName()); // name
        writeU8(os, 1); // is_player
        writeS16(os, getId()); //id
-       writeV3F1000(os, m_base_position + v3f(0,BS*1,0));
+       writeV3F1000(os, m_base_position);
        writeF1000(os, m_yaw);
        writeS16(os, getHP());
 
@@ -880,7 +868,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
        msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
        msg_os << serializeLongString(gob_cmd_update_animation(
                m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
-       for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+       for (std::unordered_map<std::string, core::vector2d<v3f>>::const_iterator
                        ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
                msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
                        (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
@@ -893,7 +881,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
        // (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
        msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6
        int message_count = 6 + m_bone_position.size();
-       for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
+       for (std::unordered_set<int>::const_iterator ii = m_attachment_child_ids.begin();
                        ii != m_attachment_child_ids.end(); ++ii) {
                if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
                        message_count++;
@@ -1024,7 +1012,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
                if(isAttached()) // Just in case we ever do send attachment position too
                        pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
                else
-                       pos = m_base_position + v3f(0,BS*1,0);
+                       pos = m_base_position;
                std::string str = gob_cmd_update_position(
                        pos,
                        v3f(0,0,0),
@@ -1070,7 +1058,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 
        if (!m_bone_position_sent) {
                m_bone_position_sent = true;
-               for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
+               for (std::unordered_map<std::string, core::vector2d<v3f>>::const_iterator
                                ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
                        std::string str = gob_cmd_update_bone_position((*ii).first,
                                        (*ii).second.X, (*ii).second.Y);
@@ -1429,8 +1417,22 @@ bool PlayerSAO::checkMovementCheat()
 
 bool PlayerSAO::getCollisionBox(aabb3f *toset) const
 {
-       *toset = aabb3f(-BS * 0.30, 0.0, -BS * 0.30, BS * 0.30, BS * 1.75, BS * 0.30);
+       //update collision box
+       toset->MinEdge = m_prop.collisionbox.MinEdge * BS;
+       toset->MaxEdge = m_prop.collisionbox.MaxEdge * BS;
+
        toset->MinEdge += m_base_position;
        toset->MaxEdge += m_base_position;
        return true;
 }
+
+bool PlayerSAO::getSelectionBox(aabb3f *toset) const
+{
+       if (!m_prop.is_visible) {
+               return false;
+       }
+
+       getCollisionBox(toset);
+
+       return true;
+}