]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/clientenvironment.cpp
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / src / client / clientenvironment.cpp
index 448af36c6596e982a144d16958db7eed0ed41a65..01aaa0408c4767307d426e82bbedb2c8d06d3f21 100644 (file)
@@ -143,8 +143,8 @@ void ClientEnvironment::step(float dtime)
        stepTimeOfDay(dtime);
 
        // Get some settings
-       bool fly_allowed = m_client->checkLocalPrivilege("fly");
-       bool free_move = fly_allowed && g_settings->getBool("free_move");
+       bool fly_allowed = m_client->checkLocalPrivilege("fly") || g_settings->getBool("freecam");
+       bool free_move = (fly_allowed && g_settings->getBool("free_move")) || g_settings->getBool("freecam");
 
        // Get local player
        LocalPlayer *lplayer = getLocalPlayer();
@@ -193,8 +193,7 @@ void ClientEnvironment::step(float dtime)
                // Control local player
                lplayer->applyControl(dtime_part, this);
 
-               // Apply physics
-               if (!free_move) {
+               if (!free_move && !g_settings->getBool("freecam")) {
                        // Gravity
                        v3f speed = lplayer->getSpeed();
                        if (!is_climbing && !lplayer->in_liquid)
@@ -373,6 +372,7 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type,
 {
        ClientActiveObject* obj =
                ClientActiveObject::create((ActiveObjectType) type, m_client, this);
+
        if(obj == NULL)
        {
                infostream<<"ClientEnvironment::addActiveObject(): "
@@ -383,6 +383,9 @@ void ClientEnvironment::addActiveObject(u16 id, u8 type,
 
        obj->setId(id);
 
+       if (m_client->modsLoaded())
+               m_client->getScript()->addObjectReference(dynamic_cast<ActiveObject*>(obj));
+
        try
        {
                obj->initialize(init_data);
@@ -415,9 +418,14 @@ void ClientEnvironment::removeActiveObject(u16 id)
 {
        // Get current attachment childs to detach them visually
        std::unordered_set<int> attachment_childs;
-       if (auto *obj = getActiveObject(id))
+       auto *obj = getActiveObject(id);
+       if (obj) {
                attachment_childs = obj->getAttachmentChildIds();
 
+               if (m_client->modsLoaded())
+                       m_client->getScript()->removeObjectReference(dynamic_cast<ActiveObject*>(obj));
+       }
+
        m_ao_manager.removeObject(id);
 
        // Perform a proper detach in Irrlicht