]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/item_entity.lua
Add forceloading
[dragonfireclient.git] / builtin / item_entity.lua
index 2b12764f18dd455fdcd19653fa6feda8bf4a1873..95affe3da0cd083002198b62ec03200aea8cfbec 100644 (file)
@@ -3,7 +3,7 @@
 function minetest.spawn_item(pos, item)
        -- Take item in any format
        local stack = ItemStack(item)
-       local obj = minetest.env:add_entity(pos, "__builtin:item")
+       local obj = minetest.add_entity(pos, "__builtin:item")
        obj:get_luaentity():set_item(stack:to_string())
        return obj
 end
@@ -12,6 +12,7 @@ minetest.register_entity("__builtin:item", {
        initial_properties = {
                hp_max = 1,
                physical = true,
+               collide_with_objects = false,
                collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
                visual = "sprite",
                visual_size = {x=0.5, y=0.5},
@@ -83,9 +84,10 @@ minetest.register_entity("__builtin:item", {
        on_step = function(self, dtime)
                local p = self.object:getpos()
                p.y = p.y - 0.3
-               local nn = minetest.env:get_node(p).name
-               -- If node is not registered or node is walkably solid
-               if not minetest.registered_nodes[nn] or minetest.registered_nodes[nn].walkable then
+               local nn = minetest.get_node(p).name
+               -- 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})
@@ -108,7 +110,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,