]> git.lizzy.rs Git - minetest.git/blobdiff - src/script/lua_api/l_object.cpp
Fix visual slide issue with set_detach, fixes #5620
[minetest.git] / src / script / lua_api / l_object.cpp
index d5681b809576f0fe4ab1f485e4e05228ffd54f45..a5b6e3941f58e68df011dd0c4b7e2df9051ee1bf 100644 (file)
@@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "content_sao.h"
 #include "server.h"
 #include "hud.h"
-#include "serverscripting.h"
+#include "scripting_server.h"
 
 struct EnumString es_HudElementType[] =
 {
@@ -401,7 +401,7 @@ int ObjectRef::l_get_armor_groups(lua_State *L)
 }
 
 // set_physics_override(self, physics_override_speed, physics_override_jump,
-//                      physics_override_gravity, sneak, sneak_glitch)
+//                      physics_override_gravity, sneak, sneak_glitch, new_move)
 int ObjectRef::l_set_physics_override(lua_State *L)
 {
        NO_MAP_LOCK_REQUIRED;
@@ -410,11 +410,18 @@ int ObjectRef::l_set_physics_override(lua_State *L)
        if (co == NULL) return 0;
        // Do it
        if (lua_istable(L, 2)) {
-               co->m_physics_override_speed = getfloatfield_default(L, 2, "speed", co->m_physics_override_speed);
-               co->m_physics_override_jump = getfloatfield_default(L, 2, "jump", co->m_physics_override_jump);
-               co->m_physics_override_gravity = getfloatfield_default(L, 2, "gravity", co->m_physics_override_gravity);
-               co->m_physics_override_sneak = getboolfield_default(L, 2, "sneak", co->m_physics_override_sneak);
-               co->m_physics_override_sneak_glitch = getboolfield_default(L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch);
+               co->m_physics_override_speed = getfloatfield_default(
+                               L, 2, "speed", co->m_physics_override_speed);
+               co->m_physics_override_jump = getfloatfield_default(
+                               L, 2, "jump", co->m_physics_override_jump);
+               co->m_physics_override_gravity = getfloatfield_default(
+                               L, 2, "gravity", co->m_physics_override_gravity);
+               co->m_physics_override_sneak = getboolfield_default(
+                               L, 2, "sneak", co->m_physics_override_sneak);
+               co->m_physics_override_sneak_glitch = getboolfield_default(
+                               L, 2, "sneak_glitch", co->m_physics_override_sneak_glitch);
+               co->m_physics_override_new_move = getboolfield_default(
+                               L, 2, "new_move", co->m_physics_override_new_move);
                co->m_physics_override_sent = false;
        } else {
                // old, non-table format
@@ -454,6 +461,8 @@ int ObjectRef::l_get_physics_override(lua_State *L)
        lua_setfield(L, -2, "sneak");
        lua_pushboolean(L, co->m_physics_override_sneak_glitch);
        lua_setfield(L, -2, "sneak_glitch");
+       lua_pushboolean(L, co->m_physics_override_new_move);
+       lua_setfield(L, -2, "new_move");
        return 1;
 }
 
@@ -717,11 +726,13 @@ int ObjectRef::l_set_detach(lua_State *L)
        v3f rotation;
        co->getAttachment(&parent_id, &bone, &position, &rotation);
        ServerActiveObject *parent = NULL;
-       if (parent_id)
+       if (parent_id) {
                parent = env->getActiveObject(parent_id);
-
+               co->setAttachment(0, "", position, rotation);
+       } else {
+               co->setAttachment(0, "", v3f(0, 0, 0), v3f(0, 0, 0));
+       }
        // Do it
-       co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0));
        if (parent != NULL)
                parent->removeAttachmentChild(co->getId());
        return 0;
@@ -737,7 +748,7 @@ int ObjectRef::l_set_properties(lua_State *L)
        ObjectProperties *prop = co->accessObjectProperties();
        if (!prop)
                return 0;
-       read_object_properties(L, 2, prop);
+       read_object_properties(L, 2, prop, getServer(L)->idef());
        co->notifyObjectPropertiesModified();
        return 0;
 }
@@ -1823,7 +1834,7 @@ void ObjectRef::Register(lua_State *L)
 }
 
 const char ObjectRef::className[] = "ObjectRef";
-const luaL_reg ObjectRef::methods[] = {
+const luaL_Reg ObjectRef::methods[] = {
        // ServerActiveObject
        luamethod(ObjectRef, remove),
        luamethod_aliased(ObjectRef, get_pos, getpos),