]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/content_sao.cpp
Add disable_jump and fall_damage_add_percent node groups
[dragonfireclient.git] / src / content_sao.cpp
index c1a3ded5533437d7c351b2e3c486afb2dfbee1a8..843ab29f76b38841dec43e0f9547fec37a710f94 100644 (file)
@@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "player.h"
 #include "scriptapi.h"
 #include "genericobject.h"
+#include "util/serialize.h"
 
 core::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
 
@@ -141,6 +142,9 @@ TestSAO proto_TestSAO(NULL, v3f(0,0,0));
 
 /*
        ItemSAO
+
+       DEPRECATED: New dropped items are implemented in Lua; see
+                   builtin/item_entity.lua.
 */
 
 class ItemSAO : public ServerActiveObject
@@ -202,9 +206,12 @@ class ItemSAO : public ServerActiveObject
                        m_speed_f *= pos_max_d / (m_speed_f.getLength()*dtime);
                v3f pos_f = getBasePosition();
                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,
-                               pos_max_d, box, dtime, pos_f, m_speed_f);
+                               pos_max_d, box, stepheight, dtime,
+                               pos_f, m_speed_f, accel_f);
                
                if(send_recommended == false)
                        return;
@@ -285,13 +292,6 @@ class ItemSAO : public ServerActiveObject
                        ServerActiveObject *puncher,
                        float time_from_last_punch)
        {
-               // Directly delete item in creative mode
-               if(g_settings->getBool("creative_mode") == true)
-               {
-                       m_removed = true;
-                       return 0;
-               }
-               
                // Take item into inventory
                ItemStack item = createItemStack();
                Inventory *inv = puncher->getInventory();
@@ -448,16 +448,18 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                box.MaxEdge *= BS;
                collisionMoveResult moveresult;
                f32 pos_max_d = BS*0.25; // Distance per iteration
-               v3f p_pos = getBasePosition();
+               f32 stepheight = 0; // Maximum climbable step height
+               v3f p_pos = m_base_position;
                v3f p_velocity = m_velocity;
+               v3f p_acceleration = m_acceleration;
                IGameDef *gamedef = m_env->getGameDef();
-               moveresult = collisionMovePrecise(&m_env->getMap(), gamedef,
-                               pos_max_d, box, dtime, p_pos, p_velocity);
+               moveresult = collisionMoveSimple(&m_env->getMap(), gamedef,
+                               pos_max_d, box, stepheight, dtime,
+                               p_pos, p_velocity, p_acceleration);
                // Apply results
-               setBasePosition(p_pos);
+               m_base_position = p_pos;
                m_velocity = p_velocity;
-
-               m_velocity += dtime * m_acceleration;
+               m_acceleration = p_acceleration;
        } else {
                m_base_position += dtime * m_velocity + 0.5 * dtime
                                * dtime * m_acceleration;
@@ -755,6 +757,8 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_last_good_position(0,0,0),
        m_last_good_position_age(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_armor_groups_sent(false),
@@ -865,8 +869,9 @@ void PlayerSAO::step(float dtime, bool send_recommended)
        }
 
        m_time_from_last_punch += dtime;
+       m_nocheat_dig_time += dtime;
        
-       if(m_is_singleplayer)
+       if(m_is_singleplayer || g_settings->getBool("disable_anticheat"))
        {
                m_last_good_position = m_player->getPosition();
                m_last_good_position_age = 0;
@@ -879,7 +884,8 @@ void PlayerSAO::step(float dtime, bool send_recommended)
                        NOTE: Actually the server should handle player physics like the
                        client does and compare player's position to what is calculated
                        on our side. This is required when eg. players fly due to an
-                       explosion.
+                       explosion. Altough a node-based alternative might be possible
+                       too, and much more lightweight.
                */
 
                float player_max_speed = 0;
@@ -1130,16 +1136,6 @@ void PlayerSAO::disconnected()
        }
 }
 
-void PlayerSAO::createCreativeInventory()
-{
-       if(m_inventory != &m_player->inventory)
-               delete m_inventory;
-
-       m_inventory = new Inventory(m_player->inventory);
-       m_inventory->clearContents();
-       scriptapi_get_creative_inventory(m_env->getLua(), this);
-}
-
 std::string PlayerSAO::getPropertyPacket()
 {
        m_prop.is_visible = (getHP() != 0);