Mod_Magic/functions/enchantments.lua
2017-03-16 16:14:20 +01:00

182 lines
4.4 KiB
Lua

-----------------------------------------------------------------
-- ENCHANTMENTS LOGIC -------------------------------------------
-----------------------------------------------------------------
function minetest.handle_node_drops(pos, drops, digger)
magic.use_tool(pos, drops, digger)
end
function magic.use_tool(pos, drops, digger)
if not digger or digger:get_wielded_item():to_string() == "" then return end
local item = digger:get_wielded_item()
local meta = item:get_meta()
local actions = {}
local nodeinfo = {drop={}}
for i in ipairs(drops) do
nodeinfo.drop[i] = drops[i]
--minetest.chat_send_all(drops[d])
end
for e_id, enchantment in pairs(magic.enchants) do
if enchantment.type == "on_dig" then
local value = meta:get_string(e_id)
if value ~= "" then
actions[#actions + 1] = {val = tonumber(value), action = enchantment.action}
end
end
end
if #actions == 0 then
for d in pairs(nodeinfo.drop) do
minetest.add_item(pos, nodeinfo.drop[d])
end
return
end
for i in ipairs(actions) do
nodeinfo.drop = actions[i].action(actions[i].val, pos, digger, nodeinfo)
end
for d in pairs(nodeinfo.drop) do
minetest.add_item(pos, nodeinfo.drop[d])
end
end
function magic.register_on_dig_enchant(enchant_id, enchant_type, value_max, action_function, ingredient, enchantables)
magic.enchants[enchant_id] =
{
type = enchant_type,
max = value_max,
action = action_function
}
if #enchantables == 0 then
return
end
for i in ipairs(enchantables) do
magic.register_ritual(enchant_id .. "_" .. enchantables[i],
{
{name = enchantables[i], val = 1},
{name = ingredient, val = 1},
},
function(node, player)
for _,object in ipairs(minetest.env:get_objects_inside_radius(node.under, 1)) do
if not object:is_player() and object:get_luaentity() and
object:get_luaentity().name == "__builtin:item" then
if object:get_luaentity().itemstring == enchantables[i] then
local item = ItemStack(object:get_luaentity().itemstring)
local meta = item:get_meta()
local def = minetest.registered_items[item:get_name()]
meta:set_string("description", def.description .. " (" .. enchant_id .. ")")
meta:set_string("inventory_image", def.inventory_image.."^[colorize:#551A8B:120")
meta:set_string(enchant_id, "3")
object:remove()
minetest.env:add_item(node.under, item)
else
object:remove()
end
end
end
end
)
end
end
-----------------------------------------------------------------
-- ENCHANTMENTS -------------------------------------------------
-----------------------------------------------------------------
magic.register_on_dig_enchant("luck", "on_dig", 3,
function(luck_value, pos, digger, nodeinfo)
local drop_count = math.random(2, luck_value + 1) + 1
for i in ipairs(nodeinfo.drop) do
nodeinfo.drop[i] = nodeinfo.drop[i].." "..drop_count
end
return nodeinfo.drop
end,
"default:cobble",
{
"default:pick_diamond",
"default:shovel_diamond",
"default:axe_diamond",
"default:pick_steel",
"default:shovel_steel",
"default:axe_steel",
"default:pick_stone",
"default:shovel_stone",
"default:axe_stone",
"default:pick_wood",
"default:shovel_wood",
"default:axe_wood"
}
)
magic.register_on_dig_enchant("silk_touch", "on_dig", 3,
function(luck_value, pos, digger, nodeinfo)
nodeinfo.drop = {minetest.get_node(pos).name};
return nodeinfo.drop
end,
"default:wood",
{
"default:pick_diamond",
"default:shovel_diamond",
"default:axe_diamond",
"default:pick_steel",
"default:shovel_steel",
"default:axe_steel",
"default:pick_stone",
"default:shovel_stone",
"default:axe_stone",
"default:pick_wood",
"default:shovel_wood",
"default:axe_wood"
}
)
magic.register_on_dig_enchant("cook", "on_dig", 3,
function(luck_value, pos, digger, nodeinfo)
local tdrop
local ltdrop = {}
for i in ipairs(nodeinfo.drop) do
tdrop = minetest.get_craft_result({ method = "cooking", width = 1, items = {nodeinfo.drop[i]}})
ltdrop[#ltdrop + 1] = tdrop.item:to_table().name
end
return ltdrop
end,
"default:coal_lump",
{
"default:pick_diamond",
"default:shovel_diamond",
"default:axe_diamond",
"default:pick_steel",
"default:shovel_steel",
"default:axe_steel",
"default:pick_stone",
"default:shovel_stone",
"default:axe_stone",
"default:pick_wood",
"default:shovel_wood",
"default:axe_wood"
}
)