2020-10-27 15:37:25 +00:00
|
|
|
function mcl_enchanting.get_enchantments(itemstack)
|
|
|
|
return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {}
|
|
|
|
end
|
|
|
|
|
2020-10-27 18:53:49 +00:00
|
|
|
function mcl_enchanting.set_enchantments(itemstack, enchantments)
|
2020-11-01 14:15:44 +00:00
|
|
|
itemstack:get_meta():set_string("mcl_enchanting:enchantments", minetest.serialize(enchantments))
|
|
|
|
local itemdef = itemstack:get_definition()
|
|
|
|
for enchantment, level in pairs(enchantments) do
|
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
|
|
|
if enchantment_def.on_enchant then
|
|
|
|
enchantment_def.on_enchant(itemstack, level, itemdef)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
tt.reload_itemstack_description(itemstack)
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
2020-11-01 12:44:05 +00:00
|
|
|
function mcl_enchanting.get_enchantment(itemstack, enchantment)
|
|
|
|
return mcl_enchanting.get_enchantments(itemstack)[enchantment] or 0
|
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_enchanting.has_enchantment(itemstack, enchantment)
|
|
|
|
return mcl_enchanting.get_enchantment(itemstack, enchantment) > 0
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_enchanting.get_enchantment_description(enchantment, level)
|
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
2020-10-27 17:19:49 +00:00
|
|
|
return enchantment_def.name .. (enchantment_def.max_level == 1 and "" or " " .. mcl_enchanting.roman_numerals.toRoman(level))
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
2020-11-01 12:44:05 +00:00
|
|
|
function mcl_enchanting.get_colorized_enchantment_description(enchantment, level)
|
|
|
|
return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and "#FC5454" or "#A8A8A8", mcl_enchanting.get_enchantment_description(enchantment, level))
|
|
|
|
end
|
|
|
|
|
2020-10-27 15:37:25 +00:00
|
|
|
function mcl_enchanting.get_enchanted_itemstring(itemname)
|
2020-11-01 12:44:05 +00:00
|
|
|
local def = minetest.registered_items[itemname]
|
2020-10-27 17:19:49 +00:00
|
|
|
return def and def._mcl_enchanting_enchanted_tool
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
2020-11-01 12:44:05 +00:00
|
|
|
function mcl_enchanting.is_enchanted_def(itemname)
|
|
|
|
return minetest.get_item_group(itemname, "enchanted") > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_enchanting.is_enchanted(itemstack)
|
|
|
|
return mcl_enchanting.is_enchanted_def(itemstack:get_name())
|
|
|
|
end
|
|
|
|
|
2020-10-27 17:19:49 +00:00
|
|
|
function mcl_enchanting.item_supports_enchantment(itemname, enchantment, early)
|
|
|
|
if not early and not mcl_enchanting.get_enchanted_itemstring(itemname) then
|
2020-10-27 15:37:25 +00:00
|
|
|
return false
|
|
|
|
end
|
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
2020-11-01 14:15:44 +00:00
|
|
|
local itemdef = minetest.registered_items[itemname]
|
|
|
|
if itemdef.type ~= "tool" and enchantment_def.requires_tool then
|
2020-11-01 12:44:05 +00:00
|
|
|
return false
|
|
|
|
end
|
2020-10-27 15:37:25 +00:00
|
|
|
for disallow in pairs(enchantment_def.disallow) do
|
|
|
|
if minetest.get_item_group(itemname, disallow) > 0 then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for group in pairs(enchantment_def.all) do
|
2020-10-27 17:19:49 +00:00
|
|
|
if minetest.get_item_group(itemname, group) > 0 then
|
2020-10-27 15:37:25 +00:00
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
|
|
|
if not enchantment_def then
|
|
|
|
return false, "enchantment invalid"
|
|
|
|
end
|
|
|
|
if itemstack:get_name() == "" then
|
|
|
|
return false, "item missing"
|
|
|
|
end
|
2020-10-27 17:19:49 +00:00
|
|
|
if not mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment) then
|
2020-10-27 15:37:25 +00:00
|
|
|
return false, "item not supported"
|
|
|
|
end
|
|
|
|
if not level then
|
|
|
|
return false, "level invalid"
|
|
|
|
end
|
|
|
|
if level > enchantment_def.max_level then
|
|
|
|
return false, "level too high", enchantment_def.max_level
|
|
|
|
elseif level < 1 then
|
|
|
|
return false, "level too small", 1
|
|
|
|
end
|
|
|
|
local item_enchantments = mcl_enchanting.get_enchantments(itemstack)
|
|
|
|
local enchantment_level = item_enchantments[enchantment]
|
|
|
|
if enchantment_level then
|
|
|
|
return false, "incompatible", mcl_enchanting.get_enchantment_description(enchantment, enchantment_level)
|
|
|
|
end
|
|
|
|
for incompatible in pairs(enchantment_def.incompatible) do
|
|
|
|
local incompatible_level = item_enchantments[incompatible]
|
|
|
|
if incompatible_level then
|
|
|
|
return false, "incompatible", mcl_enchanting.get_enchantment_description(incompatible, incompatible_level)
|
|
|
|
end
|
|
|
|
end
|
2020-10-27 17:19:49 +00:00
|
|
|
return true
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_enchanting.enchant(itemstack, enchantment, level)
|
2020-10-27 18:53:49 +00:00
|
|
|
itemstack:set_name(mcl_enchanting.get_enchanted_itemstring(itemstack:get_name()))
|
|
|
|
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
2020-10-27 15:37:25 +00:00
|
|
|
enchantments[enchantment] = level
|
2020-10-27 18:53:49 +00:00
|
|
|
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
|
|
|
return itemstack
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
|
|
|
|
2020-11-01 14:15:44 +00:00
|
|
|
function mcl_enchanting.combine(itemstack, combine_with)
|
|
|
|
local itemname = itemstack:get_name()
|
|
|
|
local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname)
|
|
|
|
if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_with:get_name()) then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
|
|
|
for enchantment, combine_level in pairs(mcl_enchanting.get_enchantments(combine_with)) do
|
2020-11-01 12:44:05 +00:00
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
2020-11-01 14:15:44 +00:00
|
|
|
local enchantment_level = enchantments[combine_enchantment]
|
|
|
|
if enchantment_level then
|
|
|
|
if enchantment_level == combine_level then
|
|
|
|
enchantment_level = math.min(enchantment_level + 1, enchantment_def.max_level)
|
|
|
|
end
|
|
|
|
elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then
|
|
|
|
local supported = true
|
|
|
|
for incompatible in pairs(enchantment_def.incompatible) do
|
|
|
|
if enchantments[incompatible] then
|
|
|
|
supported = false
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if supported then
|
|
|
|
enchantment_level = combine_level
|
|
|
|
end
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
2020-11-01 14:15:44 +00:00
|
|
|
enchantments[enchantment] = enchantment_level
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
2020-11-01 14:15:44 +00:00
|
|
|
local any_enchantment = false
|
|
|
|
for enchantment, enchantment_level in pairs(enchantments) do
|
|
|
|
if enchantment_level > 0 then
|
|
|
|
any_enchantment = true
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if any_enchantment then
|
|
|
|
itemstack:set_name(enchanted_itemname)
|
|
|
|
end
|
|
|
|
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
|
|
|
return true
|
2020-10-27 15:37:25 +00:00
|
|
|
end
|
2020-11-01 12:44:05 +00:00
|
|
|
|
|
|
|
function mcl_enchanting.initialize()
|
|
|
|
local tool_list = {}
|
|
|
|
local item_list = {}
|
|
|
|
for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do
|
|
|
|
local all_item_groups = {}
|
|
|
|
for primary in pairs(enchantment_def.primary) do
|
|
|
|
all_item_groups[primary] = true
|
|
|
|
mcl_enchanting.all_item_groups[primary] = true
|
|
|
|
end
|
|
|
|
for secondary in pairs(enchantment_def.secondary) do
|
|
|
|
all_item_groups[secondary] = true
|
|
|
|
mcl_enchanting.all_item_groups[secondary] = true
|
|
|
|
end
|
|
|
|
enchantment_def.all = all_item_groups
|
|
|
|
mcl_enchanting.total_weight = mcl_enchanting.total_weight + enchantment_def.weight
|
|
|
|
end
|
|
|
|
for itemname, itemdef in pairs(minetest.registered_items) do
|
|
|
|
if itemdef.groups.enchanted then
|
|
|
|
break
|
|
|
|
end
|
|
|
|
local quick_test = false
|
|
|
|
for group, groupv in pairs(itemdef.groups) do
|
|
|
|
if groupv > 0 and mcl_enchanting.all_item_groups[group] then
|
|
|
|
quick_test = true
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if quick_test then
|
|
|
|
if mcl_enchanting.debug then
|
|
|
|
print(itemname)
|
|
|
|
end
|
|
|
|
local expensive_test = false
|
|
|
|
for enchantment in pairs(mcl_enchanting.enchantments) do
|
|
|
|
if mcl_enchanting.item_supports_enchantment(itemname, enchantment, true) then
|
|
|
|
expensive_test = true
|
|
|
|
if mcl_enchanting.debug then
|
|
|
|
print("\tSupports " .. enchantment)
|
|
|
|
else
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if expensive_test then
|
|
|
|
local new_name = itemname .. "_enchanted"
|
|
|
|
minetest.override_item(itemname, {_mcl_enchanting_enchanted_tool = new_name})
|
|
|
|
local new_def = table.copy(itemdef)
|
|
|
|
new_def.inventory_image = itemdef.inventory_image .. "^[colorize:purple:50"
|
|
|
|
new_def.groups.not_in_creative_inventory = 1
|
|
|
|
new_def.groups.enchanted = 1
|
|
|
|
new_def.texture = itemdef.texture or itemname:gsub("%:", "_")
|
|
|
|
new_def._mcl_enchanting_enchanted_tool = new_name
|
|
|
|
local register_list = item_list
|
2020-11-01 14:15:44 +00:00
|
|
|
if itemdef.type == "tool" then
|
2020-11-01 12:44:05 +00:00
|
|
|
register_list = tool_list
|
|
|
|
end
|
|
|
|
register_list[":" .. new_name] = new_def
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
for new_name, new_def in pairs(item_list) do
|
|
|
|
minetest.register_craftitem(new_name, new_def)
|
|
|
|
end
|
|
|
|
for new_name, new_def in pairs(tool_list) do
|
|
|
|
minetest.register_tool(new_name, new_def)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--[[
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
|
|
for toolname, tooldef in pairs(minetest.registered_tools) do
|
|
|
|
for _, material in pairs(tooldef.materials) do
|
|
|
|
local full_name = toolname .. ((material == "") and "" or "_" .. material)
|
|
|
|
local old_def = minetest.registered_tools[full_name]
|
|
|
|
if not old_def then break end
|
|
|
|
mcl_enchanting.all_tools[full_name] = toolname
|
|
|
|
for _, enchantment in pairs(tooldef.enchantments) do
|
|
|
|
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
|
|
|
for lvl = 1, enchantment_def.max_level do
|
|
|
|
local new_def = table.copy(old_def)
|
|
|
|
new_def.description = minetest.colorize("#54FCFC", old_def.description) .. "\n" .. mcl_enchanting.get_enchantment_description(enchantment, lvl)
|
|
|
|
new_def.inventory_image = old_def.inventory_image .. "^[colorize:violet:50"
|
|
|
|
new_def.groups.not_in_creative_inventory = 1
|
|
|
|
new_def.texture = old_def.texture or full_name:gsub("%:", "_")
|
|
|
|
new_def._original_tool = full_name
|
|
|
|
enchantment_def.create_itemdef(new_def, lvl)
|
|
|
|
minetest.register_tool(":" .. full_name .. "_enchanted_" .. enchantment .. "_" .. lvl, new_def)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
--]]
|