Page 1 of 2

Get dropped items on step over (like minecraft)

PostPosted: Mon Apr 09, 2012 02:43
by lkjoel
New version! It fixes the block going high up into the sky

I promised I'd make this, and I finally did. When you walk over a dropped block (usually with the Q key, not to be confused with placing blocks) it adds it like as if you picked it up manually.
Make sure you have the latest GIT version of minetest, and patch builtin/item_entity.lua as so:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
25a26,30
>       dontbugme = true,
>       outercircle = 2.0,
>       innercircle = 0.5,
>       gravity = true,
>       whocaresaboutnodes = false,
58d62
<
75c79
<               if minetest.registered_nodes[nn].walkable then
---
>               if minetest.registered_nodes[nn].walkable and self.whocaresaboutnodes == false then
77c81
<                               self.object:setvelocity({x=0,y=0,z=0})
---
>                               self.object:setvelocity({x=0, y=0, z=0})
82a87
>                               self.dontbugme = false
85,86c90,91
<                       if not self.physical_state then
<                               self.object:setvelocity({x=0,y=0,z=0})
---
>                       if not self.physical_state and self.gravity == true then
>                               self.object:setvelocity({x=0, y=0, z=0})
91a97,111
>                               self.dontbugme = true
>                       end
>               end
>               local pos = p
>               local objs = minetest.env:get_objects_inside_radius(pos, self.innercircle)
>               local objs2 = minetest.env:get_objects_inside_radius(pos, self.outercircle)
>               for k, obj in pairs(objs) do
>                       local objpos=obj:getpos()
>                       if objpos.y>pos.y-1 and objpos.y<pos.y+0.5 then
>                               if obj:get_player_name() ~= nil then
>                                       if self.itemstring ~= '' then
>                                               obj:get_inventory():add_item("main", self.itemstring)
>                                       end
>                                       self.object:remove()
>                               end
92a113,140
>               end
>               local playerfound = false
>               for k, obj in pairs(objs2) do
>                       if obj:get_player_name() ~= nil then
>                               playerfound = true
>                               if self.dontbugme == false then
>                                       local objpos=obj:getpos()
>                                       local fx = objpos.x - pos.x
>                                       local fy = objpos.y - pos.y
>                                       local fz = objpos.z - pos.z
>                                       self.gravity = false
>                                       self.physical_state = false
>                                       self.object:set_properties({
>                                               physical = false
>                                       })
>                                       self.object:setvelocity({x=fx * 5, y=fy * 5, z=fz * 5})
>                                       self.dontbugme = true
>                                       self.whocaresaboutnodes = true
>                               end
>                       end
>               end
>               if playerfound == false then
>                       self.gravity = true
>                       self.physical_state = true
>                       self.object:set_properties({
>                               physical = true
>                       })
>                       self.whocaresaboutnodes = false

And then patch item.lua like so:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
200c200
<               v.y = v.y*2 + 1
---
>               v.y = v.y*2 + 2

This, of course, is based on Jeija's mesecon code.
Here is the full source code (if the patch doesn't work) of item_entity.lua:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
-- Minetest: builtin/item_entity.lua

function minetest.spawn_item(pos, item)
    -- Take item in any format
    local stack = ItemStack(item)
    local obj = minetest.env:add_entity(pos, "__builtin:item")
    obj:get_luaentity():set_item(stack:to_string())
    return obj
end

minetest.register_entity("__builtin:item", {
    initial_properties = {
        hp_max = 1,
        physical = true,
        collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
        visual = "sprite",
        visual_size = {x=0.5, y=0.5},
        textures = {""},
        spritediv = {x=1, y=1},
        initial_sprite_basepos = {x=0, y=0},
        is_visible = false,
    },
   
    itemstring = '',
    physical_state = true,
    dontbugme = true,
    outercircle = 2.0,
    innercircle = 0.5,
    gravity = true,
    whocaresaboutnodes = false,

    set_item = function(self, itemstring)
        self.itemstring = itemstring
        local stack = ItemStack(itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            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
        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
    end,

    on_activate = function(self, staticdata)
        self.itemstring = staticdata
        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})
        self:set_item(self.itemstring)
    end,

    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 minetest.registered_nodes[nn].walkable and self.whocaresaboutnodes == false then
            if self.physical_state then
                self.object:setvelocity({x=0, y=0, z=0})
                self.object:setacceleration({x=0, y=0, z=0})
                self.physical_state = false
                self.object:set_properties({
                    physical = false
                })
                self.dontbugme = false
            end
        else
            if not self.physical_state and self.gravity == true then
                self.object:setvelocity({x=0, y=0, z=0})
                self.object:setacceleration({x=0, y=-10, z=0})
                self.physical_state = true
                self.object:set_properties({
                    physical = true
                })
                self.dontbugme = true
            end
        end
        local pos = p
        local objs = minetest.env:get_objects_inside_radius(pos, self.innercircle)
        local objs2 = minetest.env:get_objects_inside_radius(pos, self.outercircle)
        for k, obj in pairs(objs) do
            local objpos=obj:getpos()
            if objpos.y>pos.y-1 and objpos.y<pos.y+0.5 then
                if obj:get_player_name() ~= nil then
                    if self.itemstring ~= '' then
                        obj:get_inventory():add_item("main", self.itemstring)
                    end
                    self.object:remove()
                end
            end
        end
        local playerfound = false
        for k, obj in pairs(objs2) do
            if obj:get_player_name() ~= nil then
                playerfound = true
                if self.dontbugme == false then
                    local objpos=obj:getpos()
                    local fx = objpos.x - pos.x
                    local fy = objpos.y - pos.y
                    local fz = objpos.z - pos.z
                    self.gravity = false
                    self.physical_state = false
                    self.object:set_properties({
                        physical = false
                    })
                    self.object:setvelocity({x=fx * 5, y=fy * 5, z=fz * 5})
                    self.dontbugme = true
                    self.whocaresaboutnodes = true
                end
            end
        end
        if playerfound == false then
            self.gravity = true
            self.physical_state = true
            self.object:set_properties({
                physical = true
            })
            self.whocaresaboutnodes = false
        end
    end,

    on_punch = function(self, hitter)
        if self.itemstring ~= '' then
            hitter:get_inventory():add_item("main", self.itemstring)
        end
        self.object:remove()
    end,
})

And of item.lua:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
-- Minetest: builtin/item.lua

--
-- Item definition helpers
--

function minetest.inventorycube(img1, img2, img3)
    img2 = img2 or img1
    img3 = img3 or img1
    return "[inventorycube"
            .. "{" .. img1:gsub("%^", "&")
            .. "{" .. img2:gsub("%^", "&")
            .. "{" .. img3:gsub("%^", "&")
end

function minetest.get_pointed_thing_position(pointed_thing, above)
    if pointed_thing.type == "node" then
        if above then
            -- The position where a node would be placed
            return pointed_thing.above
        else
            -- The position where a node would be dug
            return pointed_thing.under
        end
    elseif pointed_thing.type == "object" then
        obj = pointed_thing.ref
        if obj ~= nil then
            return obj:getpos()
        else
            return nil
        end
    else
        return nil
    end
end

function minetest.dir_to_facedir(dir)
    if math.abs(dir.x) > math.abs(dir.z) then
        if dir.x < 0 then
            return 3
        else
            return 1
        end
    else
        if dir.z < 0 then
            return 2
        else
            return 0
        end
    end
end

function minetest.dir_to_wallmounted(dir)
    if math.abs(dir.y) > math.max(math.abs(dir.x), math.abs(dir.z)) then
        if dir.y < 0 then
            return 1
        else
            return 0
        end
    elseif math.abs(dir.x) > math.abs(dir.z) then
        if dir.x < 0 then
            return 3
        else
            return 2
        end
    else
        if dir.z < 0 then
            return 5
        else
            return 4
        end
    end
end

function minetest.get_node_drops(nodename, toolname)
    local drop = ItemStack({name=nodename}):get_definition().drop
    if drop == nil then
        -- default drop
        return {ItemStack({name=nodename})}
    elseif type(drop) == "string" then
        -- itemstring drop
        return {ItemStack(drop)}
    elseif drop.items == nil then
        -- drop = {} to disable default drop
        return {}
    end

    -- Extended drop table
    local got_items = {}
    local got_count = 0
    local _, item, tool
    for _, item in ipairs(drop.items) do
        local good_rarity = true
        local good_tool = true
        if item.rarity ~= nil then
            good_rarity = item.rarity < 1 or math.random(item.rarity) == 1
        end
        if item.tools ~= nil then
            good_tool = false
            for _, tool in ipairs(item.tools) do
                if tool:sub(1, 1) == '~' then
                    good_tool = toolname:find(tool:sub(2)) ~= nil
                else
                    good_tool = toolname == tool
                end
                if good_tool then
                    break
                end
            end
            end
        if good_rarity and good_tool then
            got_count = got_count + 1
            for _, add_item in ipairs(item.items) do
                got_items[#got_items+1] = add_item
            end
            if drop.max_items ~= nil and got_count == drop.max_items then
                break
            end
        end
    end
    return got_items
end

function minetest.item_place_node(itemstack, placer, pointed_thing)
    local item = itemstack:peek_item()
    local def = itemstack:get_definition()
    if def.type == "node" and pointed_thing.type == "node" then
        local pos = pointed_thing.above
        local oldnode = minetest.env:get_node(pos)
        local olddef = ItemStack({name=oldnode.name}):get_definition()

        if not olddef.buildable_to then
            minetest.log("info", placer:get_player_name() .. " tried to place"
                .. " node in invalid position " .. minetest.pos_to_string(pos)
                .. ", replacing " .. oldnode.name)
            return
        end

        minetest.log("action", placer:get_player_name() .. " places node "
            .. def.name .. " at " .. minetest.pos_to_string(pos))

        local newnode = {name = def.name, param1 = 0, param2 = 0}

        -- Calculate direction for wall mounted stuff like torches and signs
        if def.paramtype2 == 'wallmounted' then
            local under = pointed_thing.under
            local above = pointed_thing.above
            local dir = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}
            newnode.param2 = minetest.dir_to_wallmounted(dir)
        -- Calculate the direction for furnaces and chests and stuff
        elseif def.paramtype2 == 'facedir' then
            local playerpos = placer:getpos()
            local dir = {x = pos.x - playerpos.x, y = pos.y - playerpos.y, z = pos.z - playerpos.z}
            newnode.param2 = minetest.dir_to_facedir(dir)
            minetest.log("action", "facedir: " .. newnode.param2)
        end

        -- Add node and update
        minetest.env:add_node(pos, newnode)

        -- Set metadata owner
        if def.metadata_name ~= "" then
            minetest.env:get_meta(pos):set_owner(placer:get_player_name())
        end

        -- Run script hook
        local _, callback
        for _, callback in ipairs(minetest.registered_on_placenodes) do
            callback(pos, newnode, placer)
        end

        itemstack:take_item()
    end
    return itemstack
end

function minetest.item_place_object(itemstack, placer, pointed_thing)
    local pos = minetest.get_pointed_thing_position(pointed_thing, true)
    if pos ~= nil then
        local item = itemstack:take_item()
        minetest.env:add_item(pos, item)
    end
    return itemstack
end

function minetest.item_place(itemstack, placer, pointed_thing)
    if itemstack:get_definition().type == "node" then
        return minetest.item_place_node(itemstack, placer, pointed_thing)
    else
        return minetest.item_place_object(itemstack, placer, pointed_thing)
    end
end

function minetest.item_drop(itemstack, dropper, pos)
    if dropper.get_player_name then
        local v = dropper:get_look_dir()
        local p = {x=pos.x+v.x, y=pos.y+1.5+v.y, z=pos.z+v.z}
        local obj = minetest.env:add_item(p, itemstack)
        v.x = v.x*2
        v.y = v.y*2 + 2
        v.z = v.z*2
        obj:setvelocity(v)
    else
        minetest.env:add_item(pos, itemstack)
    end
    return ""
end

function minetest.item_eat(hp_change, replace_with_item)
    return function(itemstack, user, pointed_thing)  -- closure
        if itemstack:take_item() ~= nil then
            user:set_hp(user:get_hp() + hp_change)
            itemstack:add_item(replace_with_item) -- note: replace_with_item is optional
        end
        return itemstack
    end
end

function minetest.node_punch(pos, node, puncher)
    -- Run script hook
    local _, callback
    for _, callback in ipairs(minetest.registered_on_punchnodes) do
        callback(pos, node, puncher)
    end

end

function minetest.node_dig(pos, node, digger)
    minetest.debug("node_dig")

    local def = ItemStack({name=node.name}):get_definition()
    if not def.diggable then
        minetest.debug("not diggable")
        minetest.log("info", digger:get_player_name() .. " tried to dig "
            .. node.name .. " which is not diggable "
            .. minetest.pos_to_string(pos))
        return
    end

    local meta = minetest.env:get_meta(pos)
    if meta ~= nil and not meta:get_allow_removal() then
        minetest.debug("dig prevented by metadata")
        minetest.log("info", digger:get_player_name() .. " tried to dig "
            .. node.name .. ", but removal is disabled by metadata "
            .. minetest.pos_to_string(pos))
        return
    end

    minetest.log('action', digger:get_player_name() .. " digs "
        .. node.name .. " at " .. minetest.pos_to_string(pos))

    if not minetest.setting_getbool("creative_mode") then
        local wielded = digger:get_wielded_item()
        local drops = minetest.get_node_drops(node.name, wielded:get_name())

        -- Wear out tool
        tp = wielded:get_tool_capabilities()
        dp = minetest.get_dig_params(def.groups, tp)
        wielded:add_wear(dp.wear)
        digger:set_wielded_item(wielded)

        -- Add dropped items
        local _, dropped_item
        for _, dropped_item in ipairs(drops) do
            digger:get_inventory():add_item("main", dropped_item)
        end
    end

    -- Remove node and update
    minetest.env:remove_node(pos)

    -- Run script hook
    local _, callback
    for _, callback in ipairs(minetest.registered_on_dignodes) do
        callback(pos, node, digger)
    end
end

-- This is used to allow mods to redefine minetest.item_place and so on
local function redef_wrapper(table, name)
    return function(...)
        return table[name](...)
    end
end

--
-- Item definition defaults
--

minetest.nodedef_default = {
    -- Item properties
    type="node",
    -- name intentionally not defined here
    description = "",
    groups = {},
    inventory_image = "",
    wield_image = "",
    wield_scale = {x=1,y=1,z=1},
    stack_max = 99,
    usable = false,
    liquids_pointable = false,
    tool_capabilities = nil,

    -- Interaction callbacks
    on_place = redef_wrapper(minetest, 'item_place'), -- minetest.item_place
    on_drop = redef_wrapper(minetest, 'item_drop'), -- minetest.item_drop
    on_use = nil,

    on_punch = redef_wrapper(minetest, 'node_punch'), -- minetest.node_punch
    on_dig = redef_wrapper(minetest, 'node_dig'), -- minetest.node_dig

    -- Node properties
    drawtype = "normal",
    visual_scale = 1.0,
    tile_images = {""},
    special_materials = {
        {image="", backface_culling=true},
        {image="", backface_culling=true},
    },
    alpha = 255,
    post_effect_color = {a=0, r=0, g=0, b=0},
    paramtype = "none",
    paramtype2 = "none",
    is_ground_content = false,
    sunlight_propagates = false,
    walkable = true,
    pointable = true,
    diggable = true,
    climbable = false,
    buildable_to = false,
    metadata_name = "",
    liquidtype = "none",
    liquid_alternative_flowing = "",
    liquid_alternative_source = "",
    liquid_viscosity = 0,
    light_source = 0,
    damage_per_second = 0,
    selection_box = {type="regular"},
    legacy_facedir_simple = false,
    legacy_wallmounted = false,
}

minetest.craftitemdef_default = {
    type="craft",
    -- name intentionally not defined here
    description = "",
    groups = {},
    inventory_image = "",
    wield_image = "",
    wield_scale = {x=1,y=1,z=1},
    stack_max = 99,
    liquids_pointable = false,
    tool_capabilities = nil,

    -- Interaction callbacks
    on_place = redef_wrapper(minetest, 'item_place'), -- minetest.item_place
    on_drop = redef_wrapper(minetest, 'item_drop'), -- minetest.item_drop
    on_use = nil,
}

minetest.tooldef_default = {
    type="tool",
    -- name intentionally not defined here
    description = "",
    groups = {},
    inventory_image = "",
    wield_image = "",
    wield_scale = {x=1,y=1,z=1},
    stack_max = 1,
    liquids_pointable = false,
    tool_capabilities = nil,

    -- Interaction callbacks
    on_place = redef_wrapper(minetest, 'item_place'), -- minetest.item_place
    on_drop = redef_wrapper(minetest, 'item_drop'), -- minetest.item_drop
    on_use = nil,
}

minetest.noneitemdef_default = {  -- This is used for the hand and unknown items
    type="none",
    -- name intentionally not defined here
    description = "",
    groups = {},
    inventory_image = "",
    wield_image = "",
    wield_scale = {x=1,y=1,z=1},
    stack_max = 99,
    liquids_pointable = false,
    tool_capabilities = nil,

    -- Interaction callbacks
    on_place = nil,
    on_drop = nil,
    on_use = nil,
}

PostPosted: Mon Apr 09, 2012 02:47
by Death Dealer
awesome new node drop with 3d rotating cube will work very nicely with the timber mod thanks ikjoel your the man:D

PostPosted: Mon Apr 09, 2012 02:59
by lkjoel
What does the timber mod do? I never really understood it

PostPosted: Mon Apr 09, 2012 03:13
by Death Dealer
drops the blocks from a tree if you cut it in the middle, much like in the real life. basically chopping trees down.

PostPosted: Mon Apr 09, 2012 03:15
by bgsmithjr
theres a function for this , the timber mod
default.register_falling_item("default:tree","default_tree.png")
Something like that.

PostPosted: Mon Apr 09, 2012 03:18
by Death Dealer
bgsmithjr wrote:theres a function for this , the timber mod
default.register_falling_item("default:tree","default_tree.png")
Something like that.

and something like that would enable picking up item by walking over them?

PostPosted: Mon Apr 09, 2012 03:19
by bgsmithjr
Death Dealer wrote:
bgsmithjr wrote:theres a function for this , the timber mod
default.register_falling_item("default:tree","default_tree.png")
Something like that.

and something like that would enable picking up item by walking over them?

No, I said for the timber mod.

PostPosted: Mon Apr 09, 2012 03:22
by Death Dealer
bgsmithjr wrote:
Death Dealer wrote:
bgsmithjr wrote:theres a function for this , the timber mod
default.register_falling_item("default:tree","default_tree.png")
Something like that.

and something like that would enable picking up item by walking over them?

No, I said for the timber mod.

i was describing the timber mod to ikjoel-_- im not sure where your going with this..

PostPosted: Mon Apr 09, 2012 03:24
by bgsmithjr
sorry, but it was just conversation, what the timbermod does can be obtained with a function in the default, so you don't need a mod or programming knowledge you just add one line, but if you would rather have it as a mod, I understand, sorry to spam the topic

PostPosted: Mon Apr 09, 2012 03:27
by Death Dealer
bgsmithjr wrote:sorry, but it was just conversation, what the timbermod does can be obtained with a function in the default, so you don't need a mod or programming knowledge you just add one line, but if you would rather have it as a mod, I understand, sorry to spam the topic

no its ok, i didnt know it could be added so easyly.

PostPosted: Mon Apr 09, 2012 03:49
by lkjoel
Death Dealer wrote:drops the blocks from a tree if you cut it in the middle, much like in the real life. basically chopping trees down.

oh, I get it

PostPosted: Mon Apr 09, 2012 03:55
by lkjoel
does my mod work?

PostPosted: Mon Apr 09, 2012 11:39
by Jordach
So which lines do we put this over???

PostPosted: Mon Apr 09, 2012 12:18
by Jordach
Work out my problem: Minetest returns this:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
unexpected symbol near 'local' line 96.


Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
-- Minetest: builtin/item_entity.lua

function minetest.spawn_item(pos, item)
    -- Take item in any format
    local stack = ItemStack(item)
    local obj = minetest.env:add_entity(pos, "__builtin:item")
    obj:get_luaentity():set_item(stack:to_string())
    return obj
end

minetest.register_entity("__builtin:item", {
    initial_properties = {
        hp_max = 1,
        physical = true,
        collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
        visual = "sprite",
        visual_size = {x=0.5, y=0.5},
        textures = {""},
        spritediv = {x=1, y=1},
        initial_sprite_basepos = {x=0, y=0},
        is_visible = false,
    },
   
    itemstring = '',
    physical_state = true,

    set_item = function(self, itemstring)
        self.itemstring = itemstring
        local stack = ItemStack(itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            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
        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
    end,

    on_activate = function(self, staticdata)
        self.itemstring = staticdata
        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})
        self:set_item(self.itemstring)
    end,

    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 minetest.registered_nodes[nn].walkable then
            if self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=0, z=0})
                self.physical_state = false
                self.object:set_properties({
                    physical = false
                })
            end
        else
            if not self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=-10, z=0})
                self.physical_state = true
                self.object:set_properties({
                    physical = true
                })
            end
        end
    end,

    local pos = p
        local objs = minetest.env:get_objects_inside_radius(pos, 1)
        for k, obj in pairs(objs) do
                local objpos=obj:getpos()
                if objpos.y>pos.y-1 and objpos.y<pos.y+1 then
                        if obj:get_player_name() ~= nil then
                                if self.itemstring ~= '' then
                                        obj:get_inventory():add_item("main", self.itemstring)
                                end
                                self.object:remove()
                        end
                end
        end,
})

PostPosted: Mon Apr 09, 2012 15:06
by Death Dealer
thats the same thin i did jordach with no luck... witch im sure you know.

PostPosted: Mon Apr 09, 2012 15:10
by Jordach
it don't wanna work, even though LATEST MINETEST IS THE NEW BUILD.

PostPosted: Mon Apr 09, 2012 15:19
by Death Dealer
yep ive try several different configuration trying to get this to work. no luck yet.

PostPosted: Mon Apr 09, 2012 17:39
by lkjoel
Jordach wrote:Work out my problem: Minetest returns this:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
unexpected symbol near 'local' line 96.


Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
-- Minetest: builtin/item_entity.lua

function minetest.spawn_item(pos, item)
    -- Take item in any format
    local stack = ItemStack(item)
    local obj = minetest.env:add_entity(pos, "__builtin:item")
    obj:get_luaentity():set_item(stack:to_string())
    return obj
end

minetest.register_entity("__builtin:item", {
    initial_properties = {
        hp_max = 1,
        physical = true,
        collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
        visual = "sprite",
        visual_size = {x=0.5, y=0.5},
        textures = {""},
        spritediv = {x=1, y=1},
        initial_sprite_basepos = {x=0, y=0},
        is_visible = false,
    },
   
    itemstring = '',
    physical_state = true,

    set_item = function(self, itemstring)
        self.itemstring = itemstring
        local stack = ItemStack(itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            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
        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
    end,

    on_activate = function(self, staticdata)
        self.itemstring = staticdata
        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})
        self:set_item(self.itemstring)
    end,

    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 minetest.registered_nodes[nn].walkable then
            if self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=0, z=0})
                self.physical_state = false
                self.object:set_properties({
                    physical = false
                })
            end
        else
            if not self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=-10, z=0})
                self.physical_state = true
                self.object:set_properties({
                    physical = true
                })
            end
        end
    end,

    local pos = p
        local objs = minetest.env:get_objects_inside_radius(pos, 1)
        for k, obj in pairs(objs) do
                local objpos=obj:getpos()
                if objpos.y>pos.y-1 and objpos.y<pos.y+1 then
                        if obj:get_player_name() ~= nil then
                                if self.itemstring ~= '' then
                                        obj:get_inventory():add_item("main", self.itemstring)
                                end
                                self.object:remove()
                        end
                end
        end,
})

that's weird... I have a different version than you do...
Use this code for the file:
Your phone or window isn't wide enough to display the code box. If it's a phone, try rotating it to landscape mode.
Code: Select all
-- Minetest: builtin/item_entity.lua

function minetest.spawn_item(pos, item)
    -- Take item in any format
    local stack = ItemStack(item)
    local obj = minetest.env:add_entity(pos, "__builtin:item")
    obj:get_luaentity():set_item(stack:to_string())
    return obj
end

minetest.register_entity("__builtin:item", {
    initial_properties = {
        hp_max = 1,
        physical = true,
        collisionbox = {-0.17,-0.17,-0.17, 0.17,0.17,0.17},
        visual = "sprite",
        visual_size = {x=0.5, y=0.5},
        textures = {""},
        spritediv = {x=1, y=1},
        initial_sprite_basepos = {x=0, y=0},
        is_visible = false,
    },
   
    itemstring = '',
    physical_state = true,

    set_item = function(self, itemstring)
        self.itemstring = itemstring
        local stack = ItemStack(itemstring)
        local itemtable = stack:to_table()
        local itemname = nil
        if itemtable then
            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
        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
    end,

    on_activate = function(self, staticdata)
        self.itemstring = staticdata
        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})
        self:set_item(self.itemstring)
    end,

    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 minetest.registered_nodes[nn].walkable then
            if self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=0, z=0})
                self.physical_state = false
                self.object:set_properties({
                    physical = false
                })
            end
        else
            if not self.physical_state then
                self.object:setvelocity({x=0,y=0,z=0})
                self.object:setacceleration({x=0, y=-10, z=0})
                self.physical_state = true
                self.object:set_properties({
                    physical = true
                })
            end
        end
        local pos = p
        local objs = minetest.env:get_objects_inside_radius(pos, 1)
        for k, obj in pairs(objs) do
            local objpos=obj:getpos()
            if objpos.y>pos.y-1 and objpos.y<pos.y+1 then
                if obj:get_player_name() ~= nil then
                    if self.itemstring ~= '' then
                        obj:get_inventory():add_item("main", self.itemstring)
                    end
                    self.object:remove()
                end
            end
        end
    end,

    on_punch = function(self, hitter)
        if self.itemstring ~= '' then
            hitter:get_inventory():add_item("main", self.itemstring)
        end
        self.object:remove()
    end,
})

PostPosted: Mon Apr 09, 2012 18:18
by Death Dealer
yep worked like a charm thanks ikjoel:D

PostPosted: Mon Apr 09, 2012 18:47
by z10N30NC1UB10z
Is there any possible way this mod can work with the 1/22 version?

PostPosted: Mon Apr 09, 2012 18:51
by Jordach
Nope, never. Sorry about that.

PostPosted: Mon Apr 09, 2012 18:54
by z10N30NC1UB10z
It's alright, thanks for the quick response Jordach.

PostPosted: Mon Apr 09, 2012 19:31
by sfan5
Nice!I'll use this

PostPosted: Tue Apr 10, 2012 16:32
by jordan4ibanez
https://github.com/jordan4ibanez/minetest
this code and the other one works great! i included it in my git!

PostPosted: Tue Apr 10, 2012 16:38
by Death Dealer
to get all blocks to drop nodes themselves would be pretty simple then?? its off topic i know but its relating.. would it be possible to addapt the timber mod to work with all nodes? maybe not in the same fashion just as far as the 3d cube node drop. ill see what i can figure out here: /

PostPosted: Thu Apr 12, 2012 01:48
by lkjoel
yeah, this is for all drops

PostPosted: Thu Apr 12, 2012 01:52
by lkjoel
NEW VERSION! It adds an "outer circle" that moves the block towards you (like in minecraft)

PostPosted: Thu Apr 12, 2012 09:06
by Jordach
@Lkjoel, the last Win build works with your full source code. 2012/04/08

PostPosted: Thu Apr 12, 2012 18:06
by lkjoel
New version! It fixes the block going high up into the sky

PostPosted: Thu Apr 12, 2012 18:30
by Jordach
Oh god, that bug........