]> git.lizzy.rs Git - minetest.git/blobdiff - src/scriptapi.cpp
Update ContentFeatures serialization format now as PROTOCOL_VERSION was changed
[minetest.git] / src / scriptapi.cpp
index 95e2b5d01ad28a9be6b0baa0287376b486da88d3..91100d3115e56f0eaa4766cf19244e0c546f773d 100644 (file)
@@ -936,6 +936,8 @@ static void read_object_properties(lua_State *L, int index,
        lua_pop(L, 1);
 
        getstringfield(L, -1, "visual", prop->visual);
+
+       getstringfield(L, -1, "mesh", prop->mesh);
        
        lua_getfield(L, -1, "visual_size");
        if(lua_istable(L, -1))
@@ -958,6 +960,23 @@ static void read_object_properties(lua_State *L, int index,
                }
        }
        lua_pop(L, 1);
+
+       lua_getfield(L, -1, "colors");
+       if(lua_istable(L, -1)){
+               prop->colors.clear();
+               int table = lua_gettop(L);
+               lua_pushnil(L);
+               while(lua_next(L, table) != 0){
+                       // key at index -2 and value at index -1
+                       if(lua_isstring(L, -1))
+                               prop->colors.push_back(readARGB8(L, -1));
+                       else
+                               prop->colors.push_back(video::SColor(255, 255, 255, 255));
+                       // removes value, keeps key for next iteration
+                       lua_pop(L, 1);
+               }
+       }
+       lua_pop(L, 1);
        
        lua_getfield(L, -1, "spritediv");
        if(lua_istable(L, -1))
@@ -1238,6 +1257,7 @@ static ContentFeatures read_content_features(lua_State *L, int index)
        // the slowest possible
        f.liquid_viscosity = getintfield_default(L, index,
                        "liquid_viscosity", f.liquid_viscosity);
+       getboolfield(L, index, "liquid_renewable", f.liquid_renewable);
        // Amount of light the node emits
        f.light_source = getintfield_default(L, index,
                        "light_source", f.light_source);
@@ -1847,6 +1867,20 @@ class InvRef
                return 1;
        }
 
+       // get_width(self, listname)
+       static int l_get_width(lua_State *L)
+       {
+               InvRef *ref = checkobject(L, 1);
+               const char *listname = luaL_checkstring(L, 2);
+               InventoryList *list = getlist(L, ref, listname);
+               if(list){
+                       lua_pushinteger(L, list->getWidth());
+               } else {
+                       lua_pushinteger(L, 0);
+               }
+               return 1;
+       }
+
        // set_size(self, listname, size)
        static int l_set_size(lua_State *L)
        {
@@ -1869,6 +1903,23 @@ class InvRef
                return 0;
        }
 
+       // set_width(self, listname, size)
+       static int l_set_width(lua_State *L)
+       {
+               InvRef *ref = checkobject(L, 1);
+               const char *listname = luaL_checkstring(L, 2);
+               int newwidth = luaL_checknumber(L, 3);
+               Inventory *inv = getinv(L, ref);
+               InventoryList *list = inv->getList(listname);
+               if(list){
+                       list->setWidth(newwidth);
+               } else {
+                       return 0;
+               }
+               reportInventoryChange(L, ref);
+               return 0;
+       }
+
        // get_stack(self, listname, i) -> itemstack
        static int l_get_stack(lua_State *L)
        {
@@ -2062,6 +2113,8 @@ const luaL_reg InvRef::methods[] = {
        method(InvRef, is_empty),
        method(InvRef, get_size),
        method(InvRef, set_size),
+       method(InvRef, get_width),
+       method(InvRef, set_width),
        method(InvRef, get_stack),
        method(InvRef, set_stack),
        method(InvRef, get_list),
@@ -2509,7 +2562,7 @@ class ObjectRef
                return 0;
        }
 
-       // punch(self, puncher, tool_capabilities, direction, time_from_last_punch)
+       // punch(self, puncher, time_from_last_punch, tool_capabilities, dir)
        static int l_punch(lua_State *L)
        {
                ObjectRef *ref = checkobject(L, 1);
@@ -2518,13 +2571,18 @@ class ObjectRef
                ServerActiveObject *puncher = getobject(puncher_ref);
                if(co == NULL) return 0;
                if(puncher == NULL) return 0;
-               ToolCapabilities toolcap = read_tool_capabilities(L, 3);
-               v3f dir = read_v3f(L, 4);
+               v3f dir;
+               if(lua_type(L, 5) != LUA_TTABLE)
+                       dir = co->getBasePosition() - puncher->getBasePosition();
+               else
+                       dir = read_v3f(L, 5);
                float time_from_last_punch = 1000000;
-               if(lua_isnumber(L, 5))
-                       time_from_last_punch = lua_tonumber(L, 5);
+               if(lua_isnumber(L, 3))
+                       time_from_last_punch = lua_tonumber(L, 3);
+               ToolCapabilities toolcap = read_tool_capabilities(L, 4);
+               dir.normalize();
                // Do it
-               puncher->punch(dir, &toolcap, puncher, time_from_last_punch);
+               co->punch(dir, &toolcap, puncher, time_from_last_punch);
                return 0;
        }
 
@@ -2658,6 +2716,80 @@ class ObjectRef
                return 0;
        }
 
+       // set_animation(self, frame_range, frame_speed, frame_blend)
+       static int l_set_animation(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               ServerActiveObject *co = getobject(ref);
+               if(co == NULL) return 0;
+               // Do it
+               v2f frames = v2f(1, 1);
+               if(!lua_isnil(L, 2))
+                       frames = read_v2f(L, 2);
+               float frame_speed = 15;
+               if(!lua_isnil(L, 3))
+                       frame_speed = lua_tonumber(L, 3);
+               float frame_blend = 0;
+               if(!lua_isnil(L, 4))
+                       frame_blend = lua_tonumber(L, 4);
+               co->setAnimation(frames, frame_speed, frame_blend);
+               return 0;
+       }
+
+       // set_bone_position(self, std::string bone, v3f position, v3f rotation)
+       static int l_set_bone_position(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               ServerActiveObject *co = getobject(ref);
+               if(co == NULL) return 0;
+               // Do it
+               std::string bone = "";
+               if(!lua_isnil(L, 2))
+                       bone = lua_tostring(L, 2);
+               v3f position = v3f(0, 0, 0);
+               if(!lua_isnil(L, 3))
+                       position = read_v3f(L, 3);
+               v3f rotation = v3f(0, 0, 0);
+               if(!lua_isnil(L, 4))
+                       rotation = read_v3f(L, 4);
+               co->setBonePosition(bone, position, rotation);
+               return 0;
+       }
+
+       // set_attach(self, parent, bone, position, rotation)
+       static int l_set_attach(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               ObjectRef *parent_ref = checkobject(L, 2);
+               ServerActiveObject *co = getobject(ref);
+               ServerActiveObject *parent = getobject(parent_ref);
+               if(co == NULL) return 0;
+               if(parent == NULL) return 0;
+               // Do it
+               std::string bone = "";
+               if(!lua_isnil(L, 3))
+                       bone = lua_tostring(L, 3);
+               v3f position = v3f(0, 0, 0);
+               if(!lua_isnil(L, 4))
+                       position = read_v3f(L, 4);
+               v3f rotation = v3f(0, 0, 0);
+               if(!lua_isnil(L, 5))
+                       rotation = read_v3f(L, 5);
+               co->setAttachment(parent->getId(), bone, position, rotation);
+               return 0;
+       }
+
+       // set_detach(self)
+       static int l_set_detach(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               ServerActiveObject *co = getobject(ref);
+               if(co == NULL) return 0;
+               // Do it
+               co->setAttachment(0, "", v3f(0,0,0), v3f(0,0,0));
+               return 0;
+       }
+
        // set_properties(self, properties)
        static int l_set_properties(lua_State *L)
        {
@@ -2893,7 +3025,54 @@ class ObjectRef
                lua_pushlstring(L, formspec.c_str(), formspec.size());
                return 1;
        }
-
+       
+       // get_player_control(self)
+       static int l_get_player_control(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               Player *player = getplayer(ref);
+               if(player == NULL){
+                       lua_pushlstring(L, "", 0);
+                       return 1;
+               }
+               // Do it
+               PlayerControl control = player->getPlayerControl();
+               lua_newtable(L);
+               lua_pushboolean(L, control.up);
+               lua_setfield(L, -2, "up");
+               lua_pushboolean(L, control.down);
+               lua_setfield(L, -2, "down");
+               lua_pushboolean(L, control.left);
+               lua_setfield(L, -2, "left");
+               lua_pushboolean(L, control.right);
+               lua_setfield(L, -2, "right");
+               lua_pushboolean(L, control.jump);
+               lua_setfield(L, -2, "jump");
+               lua_pushboolean(L, control.aux1);
+               lua_setfield(L, -2, "aux1");
+               lua_pushboolean(L, control.sneak);
+               lua_setfield(L, -2, "sneak");
+               lua_pushboolean(L, control.LMB);
+               lua_setfield(L, -2, "LMB");
+               lua_pushboolean(L, control.RMB);
+               lua_setfield(L, -2, "RMB");
+               return 1;
+       }
+       
+       // get_player_control_bits(self)
+       static int l_get_player_control_bits(lua_State *L)
+       {
+               ObjectRef *ref = checkobject(L, 1);
+               Player *player = getplayer(ref);
+               if(player == NULL){
+                       lua_pushlstring(L, "", 0);
+                       return 1;
+               }
+               // Do it        
+               lua_pushnumber(L, player->keyPressed);
+               return 1;
+       }
+       
 public:
        ObjectRef(ServerActiveObject *object):
                m_object(object)
@@ -2972,6 +3151,10 @@ const luaL_reg ObjectRef::methods[] = {
        method(ObjectRef, get_wielded_item),
        method(ObjectRef, set_wielded_item),
        method(ObjectRef, set_armor_groups),
+       method(ObjectRef, set_animation),
+       method(ObjectRef, set_bone_position),
+       method(ObjectRef, set_attach),
+       method(ObjectRef, set_detach),
        method(ObjectRef, set_properties),
        // LuaEntitySAO-only
        method(ObjectRef, setvelocity),
@@ -2992,6 +3175,8 @@ const luaL_reg ObjectRef::methods[] = {
        method(ObjectRef, get_look_yaw),
        method(ObjectRef, set_inventory_formspec),
        method(ObjectRef, get_inventory_formspec),
+       method(ObjectRef, get_player_control),
+       method(ObjectRef, get_player_control_bits),
        {0,0}
 };
 
@@ -6445,7 +6630,7 @@ bool scriptapi_luaentity_add(lua_State *L, u16 id, const char *name)
 }
 
 void scriptapi_luaentity_activate(lua_State *L, u16 id,
-               const std::string &staticdata)
+               const std::string &staticdata, u32 dtime_s)
 {
        realitycheck(L);
        assert(lua_checkstack(L, 20));
@@ -6463,8 +6648,9 @@ void scriptapi_luaentity_activate(lua_State *L, u16 id,
                luaL_checktype(L, -1, LUA_TFUNCTION);
                lua_pushvalue(L, object); // self
                lua_pushlstring(L, staticdata.c_str(), staticdata.size());
-               // Call with 2 arguments, 0 results
-               if(lua_pcall(L, 2, 0, 0))
+               lua_pushinteger(L, dtime_s);
+               // Call with 3 arguments, 0 results
+               if(lua_pcall(L, 3, 0, 0))
                        script_error(L, "error running function on_activate: %s\n",
                                        lua_tostring(L, -1));
        }
@@ -6548,6 +6734,8 @@ void scriptapi_luaentity_get_properties(lua_State *L, u16 id,
        lua_pop(L, 1);
 
        getstringfield(L, -1, "visual", prop->visual);
+
+       getstringfield(L, -1, "mesh", prop->mesh);
        
        // Deprecated: read object properties directly
        read_object_properties(L, -1, prop);