]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/item_entity.lua
Fix node replacement in not-quite-loaded chunks
[dragonfireclient.git] / builtin / item_entity.lua
index 8468ebedf9193ab5c971a4609e052b83a00c7244..50ce7eafedc3b8212079dfac4e4941796ef0a54a 100644 (file)
@@ -12,7 +12,7 @@ minetest.register_entity("__builtin:item", {
        initial_properties = {
                hp_max = 1,
                physical = true,
-               collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25},
+               collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
                visual = "sprite",
                visual_size = {x=0.5, y=0.5},
                textures = {""},
@@ -33,22 +33,47 @@ minetest.register_entity("__builtin:item", {
                        itemname = stack:to_table().name
                end
                local item_texture = nil
+               local item_type = ""
                if minetest.registered_items[itemname] then
                        item_texture = minetest.registered_items[itemname].inventory_image
+                       item_type = minetest.registered_items[itemname].type
                end
-               item_texture = item_texture or "unknown_item.png"
-               self.object:set_properties({
-                       textures = {item_texture},
+               prop = {
                        is_visible = true,
-               })
+                       visual = "sprite",
+                       textures = {"unknown_item.png"}
+               }
+               if item_texture and item_texture ~= "" then
+                       prop.visual = "sprite"
+                       prop.textures = {item_texture}
+                       prop.visual_size = {x=0.50, y=0.50}
+               else
+                       prop.visual = "wielditem"
+                       prop.textures = {itemname}
+                       prop.visual_size = {x=0.20, y=0.20}
+                       prop.automatic_rotate = math.pi * 0.25
+               end
+               self.object:set_properties(prop)
        end,
 
        get_staticdata = function(self)
-               return self.itemstring
+               --return self.itemstring
+               return minetest.serialize({
+                       itemstring = self.itemstring,
+                       always_collect = self.always_collect,
+               })
        end,
 
        on_activate = function(self, staticdata)
-               self.itemstring = staticdata
+               if string.sub(staticdata, 1, string.len("return")) == "return" then
+                       local data = minetest.deserialize(staticdata)
+                       if data and type(data) == "table" then
+                               self.itemstring = data.itemstring
+                               self.always_collect = data.always_collect
+                       end
+               else
+                       self.itemstring = staticdata
+               end
                self.object:set_armor_groups({immortal=1})
                self.object:setvelocity({x=0, y=2, z=0})
                self.object:setacceleration({x=0, y=-10, z=0})
@@ -59,7 +84,9 @@ minetest.register_entity("__builtin:item", {
                local p = self.object:getpos()
                p.y = p.y - 0.3
                local nn = minetest.env:get_node(p).name
-               if minetest.registered_nodes[nn].walkable then
+               -- If node is not registered or node is walkably solid and resting on nodebox
+               local v = self.object:getvelocity()
+               if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable and v.y == 0 then
                        if self.physical_state then
                                self.object:setvelocity({x=0,y=0,z=0})
                                self.object:setacceleration({x=0, y=0, z=0})
@@ -82,7 +109,11 @@ minetest.register_entity("__builtin:item", {
 
        on_punch = function(self, hitter)
                if self.itemstring ~= '' then
-                       hitter:get_inventory():add_item("main", self.itemstring)
+                       local left = hitter:get_inventory():add_item("main", self.itemstring)
+                       if not left:is_empty() then
+                               self.itemstring = left:to_string()
+                               return
+                       end
                end
                self.object:remove()
        end,