152 lines
4.5 KiB
Lua
152 lines
4.5 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local ItemStack, ipairs, minetest, nodecore, pairs, setmetatable,
|
|
string, type, unpack, vector
|
|
= ItemStack, ipairs, minetest, nodecore, pairs, setmetatable,
|
|
string, type, unpack, vector
|
|
local string_format, string_gsub
|
|
= string.format, string.gsub
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local modname = minetest.get_current_modname()
|
|
local dntname = modname .. ":cookcheck"
|
|
|
|
local nevermatch = {}
|
|
local function nomatches(k)
|
|
local stack = ItemStack(k)
|
|
for _, rc in ipairs(nodecore.registered_recipes) do
|
|
if rc.action == "cook" then
|
|
if nodecore.match({stack = stack}, rc.root.match) then return end
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
minetest.after(0, function()
|
|
for k in pairs(minetest.registered_items) do
|
|
if nomatches(k) then nevermatch[k] = true end
|
|
end
|
|
end)
|
|
|
|
nodecore.register_dnt({
|
|
name = dntname,
|
|
time = 1,
|
|
nodenames = {modname .. ":stack"},
|
|
action = function(pos, node)
|
|
local data = nodecore.craft_cooking_data()
|
|
nodecore.craft_check(pos, node, data)
|
|
if not data.progressing then
|
|
return minetest.get_meta(pos):set_string(modname, "")
|
|
else
|
|
return nodecore.dnt_set(pos, dntname)
|
|
end
|
|
end
|
|
})
|
|
|
|
nodecore.register_limited_abm({
|
|
label = "item stack cook",
|
|
nodenames = {modname .. ":stack"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos)
|
|
if nevermatch[nodecore.stack_get(pos):get_name()] then return end
|
|
return nodecore.dnt_set(pos, dntname)
|
|
end
|
|
})
|
|
|
|
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
|
|
if def.type == "node" and def.node_placement_prediction ~= "" then
|
|
nodecore.stack_node_sounds_except[minetest.hash_node_position(above)]
|
|
= placer:get_player_name()
|
|
end
|
|
nodecore.place_stack(above, itemstack:take_item(), placer, pointed_thing)
|
|
end
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
local olddrop = minetest.item_drop
|
|
function minetest.item_drop(item, player, ...)
|
|
local oldadd = minetest.add_item
|
|
local function additem(pos, stack, ...)
|
|
nodecore.log("action", string_format("%s throws item %q at %s",
|
|
player:get_player_name(), nodecore.stack_shortdesc(stack),
|
|
minetest.pos_to_string(pos, 0)))
|
|
return oldadd(pos, stack, ...)
|
|
end
|
|
function minetest.add_item(pos, stack, ...)
|
|
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 additem(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, player)
|
|
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 additem(pos, stack, ...)
|
|
end
|
|
local function helper(...)
|
|
minetest.add_item = oldadd
|
|
return ...
|
|
end
|
|
return helper(olddrop(item, player, ...))
|
|
end
|
|
|
|
local oldlog = minetest.log
|
|
function minetest.log(...)
|
|
local args = {...}
|
|
if args[1] == "action" then
|
|
args[2] = args[2] and type(args[2]) == "string"
|
|
and string_gsub(args[2], "(( digs " .. modname .. ":stack)( at (%(.-%))))",
|
|
function(full, pre, post, pos)
|
|
pos = pos and minetest.string_to_pos(pos)
|
|
local stack = pos and nodecore.stack_get(pos)
|
|
if stack then
|
|
return string_format("%s %q%s", pre,
|
|
nodecore.stack_shortdesc(stack), post)
|
|
end
|
|
return full
|
|
end
|
|
) or args[2]
|
|
end
|
|
return oldlog(unpack(args))
|
|
end
|