]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_sao.cpp
Remove no virtual dtor warnings, make MapgenParams contain actual NoiseParams
[minetest.git] / src / content_sao.cpp
index 8916b492617462e9ca1129b885421355cd80c9a0..24a9186f77c0e1e0a8d6d0589f3f873ce36ba830 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -31,7 +31,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "genericobject.h"
 #include "util/serialize.h"
 
-core::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
+std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
 
 /*
        DummyLoadSAO
@@ -64,6 +64,10 @@ class DummyLoadSAO : public ServerActiveObject
                infostream<<"DummyLoadSAO step"<<std::endl;
        }
 
+       bool getCollisionBox(aabb3f *toset) {
+               return false;
+       }
+
 private:
 };
 
@@ -132,6 +136,10 @@ class TestSAO : public ServerActiveObject
                }
        }
 
+       bool getCollisionBox(aabb3f *toset) {
+               return false;
+       }
+
 private:
        float m_timer1;
        float m_age;
@@ -208,8 +216,7 @@ class ItemSAO : public ServerActiveObject
                v3f pos_f_old = pos_f;
                v3f accel_f = v3f(0,0,0);
                f32 stepheight = 0;
-               IGameDef *gamedef = m_env->getGameDef();
-               moveresult = collisionMoveSimple(&m_env->getMap(), gamedef,
+               moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
                                pos_max_d, box, stepheight, dtime,
                                pos_f, m_speed_f, accel_f);
                
@@ -314,6 +321,10 @@ class ItemSAO : public ServerActiveObject
                return 0;
        }
 
+       bool getCollisionBox(aabb3f *toset) {
+               return false;
+       }
+
 
 private:
        std::string m_itemstring;
@@ -356,8 +367,11 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
        m_last_sent_position_timer(0),
        m_last_sent_move_precision(0),
        m_armor_groups_sent(false),
+       m_animation_speed(0),
+       m_animation_blend(0),
        m_animation_sent(false),
        m_bone_position_sent(false),
+       m_attachment_parent_id(0),
        m_attachment_sent(false)
 {
        // Only register type if no environment supplied
@@ -367,8 +381,7 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
        }
        
        // Initialize something to armor groups
-       m_armor_groups["fleshy"] = 3;
-       m_armor_groups["snappy"] = 2;
+       m_armor_groups["fleshy"] = 100;
 }
 
 LuaEntitySAO::~LuaEntitySAO()
@@ -487,10 +500,9 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                        v3f p_pos = m_base_position;
                        v3f p_velocity = m_velocity;
                        v3f p_acceleration = m_acceleration;
-                       IGameDef *gamedef = m_env->getGameDef();
-                       moveresult = collisionMoveSimple(&m_env->getMap(), gamedef,
+                       moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
                                        pos_max_d, box, stepheight, dtime,
-                                       p_pos, p_velocity, p_acceleration);
+                                       p_pos, p_velocity, p_acceleration,this);
                        // Apply results
                        m_base_position = p_pos;
                        m_velocity = p_velocity;
@@ -877,6 +889,22 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
        m_messages_out.push_back(aom);
 }
 
+bool LuaEntitySAO::getCollisionBox(aabb3f *toset) {
+       if (m_prop.physical)
+       {
+               //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;
+       }
+
+       return false;
+}
+
 /*
        PlayerSAO
 */
@@ -907,14 +935,17 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_moved(false),
        m_inventory_not_sent(false),
        m_hp_not_sent(false),
-       m_wielded_item_not_sent(false)
+       m_wielded_item_not_sent(false),
+       m_physics_override_speed(1),
+       m_physics_override_jump(1),
+       m_physics_override_gravity(1),
+       m_physics_override_sent(false)
 {
        assert(m_player);
        assert(m_peer_id != 0);
        setBasePosition(m_player->getPosition());
        m_inventory = &m_player->inventory;
-       m_armor_groups["choppy"] = 2;
-       m_armor_groups["fleshy"] = 3;
+       m_armor_groups["fleshy"] = 100;
 
        m_prop.hp_max = PLAYER_MAX_HP;
        m_prop.physical = false;
@@ -992,7 +1023,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
                writeF1000(os, m_player->getYaw());
                writeS16(os, getHP());
 
-               writeU8(os, 4 + m_bone_position.size()); // number of messages stuffed in here
+               writeU8(os, 5 + m_bone_position.size()); // number of messages stuffed in here
                os<<serializeLongString(getPropertyPacket()); // message 1
                os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
                os<<serializeLongString(gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend)); // 3
@@ -1000,6 +1031,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
                        os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
                }
                os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
+               os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed, m_physics_override_jump, m_physics_override_gravity)); // 5
        }
        else
        {
@@ -1169,6 +1201,14 @@ void PlayerSAO::step(float dtime, bool send_recommended)
                m_messages_out.push_back(aom);
        }
 
+       if(m_physics_override_sent == false){
+               m_physics_override_sent = true;
+               std::string str = gob_cmd_update_physics_override(m_physics_override_speed, m_physics_override_jump, m_physics_override_gravity);
+               // create message and add to list
+               ActiveObjectMessage aom(getId(), true, str);
+               m_messages_out.push_back(aom);
+       }
+
        if(m_animation_sent == false){
                m_animation_sent = true;
                std::string str = gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend);
@@ -1227,6 +1267,20 @@ void PlayerSAO::moveTo(v3f pos, bool continuous)
        m_moved = true;
 }
 
+void PlayerSAO::setYaw(float yaw)
+{
+       m_player->setYaw(yaw);
+       // Force change on client
+       m_moved = true;
+}
+
+void PlayerSAO::setPitch(float pitch)
+{
+       m_player->setPitch(pitch);
+       // Force change on client
+       m_moved = true;
+}
+
 int PlayerSAO::punch(v3f dir,
        const ToolCapabilities *toolcap,
        ServerActiveObject *puncher,
@@ -1417,3 +1471,12 @@ std::string PlayerSAO::getPropertyPacket()
        return gob_cmd_set_properties(m_prop);
 }
 
+bool PlayerSAO::getCollisionBox(aabb3f *toset) {
+       //update collision box
+       *toset = m_player->getCollisionbox();
+
+       toset->MinEdge += m_base_position;
+       toset->MaxEdge += m_base_position;
+
+       return true;
+}