]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_sao.cpp
Switch the license to be LGPLv2/later, with small parts still remaining as GPLv2...
[minetest.git] / src / content_sao.cpp
index 0f3b8829e85821d2dcc93f2889fd6588510b087e..c1a3ded5533437d7c351b2e3c486afb2dfbee1a8 100644 (file)
@@ -3,16 +3,16 @@ Minetest-c55
 Copyright (C) 2010-2011 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 General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
@@ -389,10 +389,9 @@ void LuaEntitySAO::addedToEnvironment()
                scriptapi_luaentity_get_properties(L, m_id, &m_prop);
                // Initialize HP from properties
                m_hp = m_prop.hp_max;
+               // Activate entity, supplying serialized state
+               scriptapi_luaentity_activate(L, m_id, m_init_state.c_str());
        }
-       
-       // Activate entity, supplying serialized state
-       scriptapi_luaentity_activate(L, m_id, m_init_state.c_str());
 }
 
 ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,
@@ -747,7 +746,8 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
 
 // No prototype, PlayerSAO does not need to be deserialized
 
-PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_):
+PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
+               const std::set<std::string> &privs, bool is_singleplayer):
        ServerActiveObject(env_, v3f(0,0,0)),
        m_player(player_),
        m_peer_id(peer_id_),
@@ -759,6 +759,9 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_):
        m_position_not_sent(false),
        m_armor_groups_sent(false),
        m_properties_sent(true),
+       m_privs(privs),
+       m_is_singleplayer(is_singleplayer),
+       // public
        m_teleported(false),
        m_inventory_not_sent(false),
        m_hp_not_sent(false),
@@ -862,42 +865,59 @@ void PlayerSAO::step(float dtime, bool send_recommended)
        }
 
        m_time_from_last_punch += dtime;
-
-       /*
-               Check player movements
-
-               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.
-       */
-
-       //float player_max_speed = BS * 4.0; // Normal speed
-       float player_max_speed = BS * 20; // Fast speed
-       float player_max_speed_up = BS * 20;
-       player_max_speed *= 2.5; // Tolerance
-       player_max_speed_up *= 2.5;
-
-       m_last_good_position_age += dtime;
-       if(m_last_good_position_age >= 1.0){
-               float age = m_last_good_position_age;
-               v3f diff = (m_player->getPosition() - m_last_good_position);
-               float d_vert = diff.Y;
-               diff.Y = 0;
-               float d_horiz = diff.getLength();
-               /*infostream<<m_player->getName()<<"'s horizontal speed is "
-                               <<(d_horiz/age)<<std::endl;*/
-               if(d_horiz <= age * player_max_speed &&
-                               (d_vert < 0 || d_vert < age * player_max_speed_up)){
-                       m_last_good_position = m_player->getPosition();
+       
+       if(m_is_singleplayer)
+       {
+               m_last_good_position = m_player->getPosition();
+               m_last_good_position_age = 0;
+       }
+       else
+       {
+               /*
+                       Check player movements
+
+                       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.
+               */
+
+               float player_max_speed = 0;
+               float player_max_speed_up = 0;
+               if(m_privs.count("fast") != 0){
+                       // Fast speed
+                       player_max_speed = BS * 20;
+                       player_max_speed_up = BS * 20;
                } else {
-                       actionstream<<"Player "<<m_player->getName()
-                                       <<" moved too fast; resetting position"
-                                       <<std::endl;
-                       m_player->setPosition(m_last_good_position);
-                       m_teleported = true;
+                       // Normal speed
+                       player_max_speed = BS * 4.0;
+                       player_max_speed_up = BS * 4.0;
+               }
+               // Tolerance
+               player_max_speed *= 2.5;
+               player_max_speed_up *= 2.5;
+
+               m_last_good_position_age += dtime;
+               if(m_last_good_position_age >= 1.0){
+                       float age = m_last_good_position_age;
+                       v3f diff = (m_player->getPosition() - m_last_good_position);
+                       float d_vert = diff.Y;
+                       diff.Y = 0;
+                       float d_horiz = diff.getLength();
+                       /*infostream<<m_player->getName()<<"'s horizontal speed is "
+                                       <<(d_horiz/age)<<std::endl;*/
+                       if(d_horiz <= age * player_max_speed &&
+                                       (d_vert < 0 || d_vert < age * player_max_speed_up)){
+                               m_last_good_position = m_player->getPosition();
+                       } else {
+                               actionstream<<"Player "<<m_player->getName()
+                                               <<" moved too fast; resetting position"
+                                               <<std::endl;
+                               m_player->setPosition(m_last_good_position);
+                               m_teleported = true;
+                       }
+                       m_last_good_position_age = 0;
                }
-               m_last_good_position_age = 0;
        }
 
        if(send_recommended == false)