83 lines
2.6 KiB
Lua
83 lines
2.6 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local minetest, nodecore, setmetatable, vector
|
|
= minetest, nodecore, setmetatable, vector
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
|
|
nodecore.register_cook_abm({nodenames = {modname .. ":stack"}})
|
|
|
|
function minetest.item_place(itemstack, placer, pointed_thing, param2)
|
|
if not nodecore.interact(placer) then return end
|
|
if pointed_thing.type == "node" and placer and
|
|
not placer:get_player_control().sneak then
|
|
local n = minetest.get_node(pointed_thing.under)
|
|
local nn = n.name
|
|
local nd = minetest.registered_items[nn]
|
|
if nd and nd.on_rightclick then
|
|
return nd.on_rightclick(pointed_thing.under, n,
|
|
placer, itemstack, pointed_thing) or itemstack, false
|
|
end
|
|
end
|
|
local def = itemstack:get_definition()
|
|
if def.type == "node" and not def.place_as_item then
|
|
return minetest.item_place_node(itemstack, placer, pointed_thing, param2)
|
|
end
|
|
if not itemstack:is_empty() then
|
|
local above = minetest.get_pointed_thing_position(pointed_thing, true)
|
|
if above and nodecore.buildable_to(above) then
|
|
nodecore.place_stack(above, itemstack:take_item(), placer, pointed_thing)
|
|
end
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
if minetest.raycast then
|
|
local olddrop = minetest.item_drop
|
|
function minetest.item_drop(item, player, ...)
|
|
local oldadd = minetest.add_item
|
|
function minetest.add_item(pos, stack, ...)
|
|
if not minetest.raycast then
|
|
return oldadd(pos, stack, ...)
|
|
end
|
|
|
|
local start = player:get_pos()
|
|
local eyeheight = player:get_properties().eye_height or 1.625
|
|
start.y = start.y + eyeheight
|
|
local target = vector.add(start, vector.multiply(player:get_look_dir(), 4))
|
|
local pointed = minetest.raycast(start, target, false)()
|
|
if (not pointed) or pointed.type ~= "node" then
|
|
return oldadd(pos, stack, ...)
|
|
end
|
|
|
|
local dummyent = {}
|
|
setmetatable(dummyent, {
|
|
__index = function()
|
|
return function() return {} end
|
|
end
|
|
})
|
|
|
|
local name = stack:get_name()
|
|
local function tryplace(p)
|
|
if nodecore.match(p, {name = name, count = false}) then
|
|
stack = nodecore.stack_add(p, stack)
|
|
if stack:is_empty() then return dummyent end
|
|
end
|
|
if nodecore.buildable_to(p) then
|
|
nodecore.place_stack(p, stack, player)
|
|
return dummyent
|
|
end
|
|
end
|
|
|
|
return tryplace(pointed.under)
|
|
or tryplace(pointed.above)
|
|
or oldadd(pos, stack, ...)
|
|
end
|
|
local function helper(...)
|
|
minetest.add_item = oldadd
|
|
return ...
|
|
end
|
|
return helper(olddrop(item, player, ...))
|
|
end
|
|
end
|