Added Enchanting Table
parent
a3cf6b0e5d
commit
ed738da016
|
@ -1,5 +0,0 @@
|
|||
Enchanting for MineClone2
|
||||
--------------------------
|
||||
|
||||
This is a rewrite of the mtg enchanting mod. Beta Version, more features coming soon.
|
||||
The textures look absolutely shit, but as far as I know I have to use the textures from Pixel Perfection so I dont get trouble with Mocrisoft. There is a version with original textures and sounds, but I can't publish that one. If you'd like to advice me how I can somehow do that anyway, please open an issue or contact me via email (eliasfleckenstein@web.de).
|
|
@ -1,9 +0,0 @@
|
|||
minetest.register_craftitem("mcl_enchanting:book_enchanted", {
|
||||
description = "Enchanted Book",
|
||||
inventory_image = "mcl_enchanting_book_enchanted.png^[colorize:purple:50",
|
||||
groups = {enchanted = 1, not_in_creative_inventory = 1},
|
||||
_mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted",
|
||||
stack_max = 1,
|
||||
})
|
||||
|
||||
minetest.registered_items["mcl_books:book"]._mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted"
|
|
@ -1,41 +0,0 @@
|
|||
minetest.register_chatcommand("enchant", {
|
||||
description = "Enchant an item.",
|
||||
params = "<player> <enchantment> [<level>]",
|
||||
privs = {give = true},
|
||||
func = function(_, param)
|
||||
local sparam = param:split(" ")
|
||||
local target_name = sparam[1]
|
||||
local enchantment = sparam[2]
|
||||
local level_str = sparam[3]
|
||||
local level = tonumber(level_str or "1")
|
||||
if not target_name or not enchantment then
|
||||
return false, "Usage: /enchant <player> <enchantment> [<level>]"
|
||||
end
|
||||
local target = minetest.get_player_by_name(target_name)
|
||||
if not target then
|
||||
return false, "Player '" .. target_name .. "' cannot be found"
|
||||
end
|
||||
local itemstack = target:get_wielded_item()
|
||||
local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
||||
if not can_enchant then
|
||||
if errorstring == "enchantment invalid" then
|
||||
return false, "There is no such enchantment '" .. enchantment .. "'"
|
||||
elseif errorstring == "item missing" then
|
||||
return false, "The target doesn't hold an item"
|
||||
elseif errorstring == "item not supported" then
|
||||
return false, "The selected enchantment can't be added to the target item"
|
||||
elseif errorstring == "level invalid" then
|
||||
return false, "'" .. level_str .. "' is not a valid number"
|
||||
elseif errorstring == "level too high" then
|
||||
return false, "The number you have entered (" .. level_str .. ") is too big, it must be at most " .. extra_info
|
||||
elseif errorstring == "level too small" then
|
||||
return false, "The number you have entered (" .. level_str .. ") is too small, it must be at least " .. extra_info
|
||||
elseif errorstring == "incompatible" then
|
||||
return false, mcl_enchanting.get_enchantment_description(enchantment, level) .. " can't be combined with " .. extra_info
|
||||
end
|
||||
else
|
||||
target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level))
|
||||
return true, "Enchanting succeded"
|
||||
end
|
||||
end
|
||||
})
|
|
@ -21,6 +21,8 @@ end
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 41}},
|
||||
}]]--
|
||||
|
||||
-- implemented via on_enchant and additions in mobs_mc; Slowness IV part unimplemented
|
||||
|
@ -36,6 +38,8 @@ mcl_enchanting.enchantments.bane_of_arthropods = {
|
|||
curse = false,
|
||||
on_enchant = increase_damage("anthropod", 2.5),
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 25}, {13, 33}, {21, 41}, {29, 49}, {37, 57}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -51,8 +55,27 @@ mcl_enchanting.enchantments.blast_protection = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 13}, {13, 21}, {21, 29}, {29, 37}},
|
||||
}
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.channeling = {
|
||||
name = "Channeling",
|
||||
max_level = 1,
|
||||
primary = {trident = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {riptide = true},
|
||||
weight = 1,
|
||||
description = "Trident \"channels\" a bolt of lightning toward a hit entity. Functions only during thunderstorms and if target is unobstructed with opaque blocks.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{25, 50}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_armor
|
||||
mcl_enchanting.enchantments.curse_of_binding = {
|
||||
name = "Curse of Binding",
|
||||
|
@ -66,6 +89,8 @@ mcl_enchanting.enchantments.curse_of_binding = {
|
|||
curse = true,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = true,
|
||||
power_range_table = {{25, 50}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_death_drop
|
||||
|
@ -74,17 +99,19 @@ mcl_enchanting.enchantments.curse_of_vanishing = {
|
|||
max_level = 1,
|
||||
primary = {},
|
||||
secondary = {armor_head = true, armor_torso = true, armor_legs = true, armor_feet = true, tool = true, weapon = true},
|
||||
disallow = {clock = true},
|
||||
disallow = {},
|
||||
incompatible = {},
|
||||
weight = 1,
|
||||
description = "Item destroyed on death.",
|
||||
curse = true,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = true,
|
||||
power_range_table = {{25, 50}},
|
||||
}
|
||||
|
||||
-- unimplemented
|
||||
mcl_enchanting.enchantments.depth_strider = {
|
||||
--[[mcl_enchanting.enchantments.depth_strider = {
|
||||
name = "Depth Strider",
|
||||
max_level = 3,
|
||||
primary = {},
|
||||
|
@ -96,7 +123,9 @@ mcl_enchanting.enchantments.depth_strider = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
}
|
||||
treasure = false,
|
||||
power_range_table = {{10, 25}, {20, 35}, {30, 45}},
|
||||
}]]--
|
||||
|
||||
-- implemented via on_enchant
|
||||
mcl_enchanting.enchantments.efficiency = {
|
||||
|
@ -121,6 +150,8 @@ mcl_enchanting.enchantments.efficiency = {
|
|||
itemstack:get_meta():set_tool_capabilities(tool_capabilities)
|
||||
end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 61}, {11, 71}, {21, 81}, {31, 91}, {41, 101}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -135,6 +166,8 @@ mcl_enchanting.enchantments.feather_falling = {
|
|||
description = "Reduces fall damage.",curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 11}, {11, 17}, {17, 23}, {23, 29}},
|
||||
}
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
|
@ -150,6 +183,8 @@ mcl_enchanting.enchantments.feather_falling = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{10, 61}, {30, 71}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -165,6 +200,8 @@ mcl_enchanting.enchantments.fire_protection = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{10, 18}, {18, 26}, {26, 34}, {34, 42}},
|
||||
}
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
|
@ -180,12 +217,14 @@ mcl_enchanting.enchantments.fire_protection = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{20, 50}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_item_entity
|
||||
mcl_enchanting.enchantments.fortune = {
|
||||
name = "Fortune",
|
||||
max_level = 4,
|
||||
max_level = 3,
|
||||
primary = {pickaxe = true, shovel = true, axe = true, hoe = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
|
@ -195,6 +234,8 @@ mcl_enchanting.enchantments.fortune = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{15, 61}, {24, 71}, {33, 81}},
|
||||
}
|
||||
|
||||
-- implemented via walkover.register_global
|
||||
|
@ -210,6 +251,8 @@ mcl_enchanting.enchantments.frost_walker = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = true,
|
||||
power_range_table = {{10, 25}, {20, 35}},
|
||||
}
|
||||
|
||||
walkover.register_global(function(pos, _, player)
|
||||
|
@ -229,6 +272,23 @@ walkover.register_global(function(pos, _, player)
|
|||
end
|
||||
end)
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.impaling = {
|
||||
name = "Impaling",
|
||||
max_level = 5,
|
||||
primary = {trident = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {},
|
||||
weight = 2,
|
||||
description = "Trident deals additional damage to mobs that spawn naturally in the ocean.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 21}, {9, 29}, {17, 37}, {25, 45}, {33, 53}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_bows
|
||||
mcl_enchanting.enchantments.infinity = {
|
||||
name = "Infinity",
|
||||
|
@ -242,6 +302,8 @@ mcl_enchanting.enchantments.infinity = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{20, 50}},
|
||||
}
|
||||
|
||||
-- implemented via minetest.calculate_knockback
|
||||
|
@ -257,6 +319,8 @@ mcl_enchanting.enchantments.knockback = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 61}, {25, 71}},
|
||||
}
|
||||
|
||||
local old_calculate_knockback = minetest.calculate_knockback
|
||||
|
@ -276,7 +340,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool
|
|||
end
|
||||
|
||||
-- unimplemented
|
||||
mcl_enchanting.enchantments.looting = {
|
||||
--[[mcl_enchanting.enchantments.looting = {
|
||||
name = "Looting",
|
||||
max_level = 3,
|
||||
primary = {sword = true},
|
||||
|
@ -288,10 +352,29 @@ mcl_enchanting.enchantments.looting = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
}
|
||||
treasure = false,
|
||||
power_range_table = {{15, 61}, {24, 71}, {33, 81}},
|
||||
}]]--
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.loyalty = {
|
||||
name = "Loyalty",
|
||||
max_level = 3,
|
||||
primary = {trident = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {riptide = true},
|
||||
weight = 5,
|
||||
description = "Trident returns after being thrown. Higher levels reduce return time.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{12, 50}, {19, 50}, {26, 50}},
|
||||
}]]--
|
||||
|
||||
-- unimplemented
|
||||
mcl_enchanting.enchantments.luck_of_the_sea = {
|
||||
--[[mcl_enchanting.enchantments.luck_of_the_sea = {
|
||||
name = "Luck of the Sea",
|
||||
max_level = 3,
|
||||
primary = {fishing_rod = true},
|
||||
|
@ -303,7 +386,9 @@ mcl_enchanting.enchantments.luck_of_the_sea = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
}
|
||||
treasure = false,
|
||||
power_range_table = {{15, 61}, {24, 71}, {33, 81}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_fishing
|
||||
mcl_enchanting.enchantments.lure = {
|
||||
|
@ -318,10 +403,12 @@ mcl_enchanting.enchantments.lure = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{15, 61}, {24, 71}, {33, 81}},
|
||||
}
|
||||
|
||||
-- unimplemented
|
||||
mcl_enchanting.enchantments.mending = {
|
||||
--[[mcl_enchanting.enchantments.mending = {
|
||||
name = "Mending",
|
||||
max_level = 1,
|
||||
primary = {},
|
||||
|
@ -333,14 +420,50 @@ mcl_enchanting.enchantments.mending = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = true,
|
||||
}
|
||||
treasure = true,
|
||||
power_range_table = {{25, 75}},
|
||||
}]]--
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.multishot = {
|
||||
name = "Multishot",
|
||||
max_level = 1,
|
||||
primary = {crossbow = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {piercing = true},
|
||||
weight = 2,
|
||||
description = "Shoot 3 arrows at the cost of one.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{20, 50}},
|
||||
}]]--
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.piercing = {
|
||||
name = "Piercing",
|
||||
max_level = 4,
|
||||
primary = {crossbow = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {multishot = true},
|
||||
weight = 10,
|
||||
description = "Arrows pass through multiple entities.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 50}, {11, 50}, {21, 50}, {31, 50}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_bows
|
||||
mcl_enchanting.enchantments.power = {
|
||||
name = "Power",
|
||||
max_level = 5,
|
||||
primary = {},
|
||||
secondary = {bow = true},
|
||||
primary = {bow = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {},
|
||||
weight = 10,
|
||||
|
@ -348,6 +471,8 @@ mcl_enchanting.enchantments.power = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -363,6 +488,8 @@ mcl_enchanting.enchantments.projectile_protection = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 16}, {11, 26}, {21, 36}, {31, 46}, {41, 56}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -378,6 +505,8 @@ mcl_enchanting.enchantments.protection = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 12}, {12, 23}, {23, 34}, {34, 45}},
|
||||
}
|
||||
|
||||
-- implemented via minetest.calculate_knockback (together with the Knockback enchantment) and mcl_bows
|
||||
|
@ -393,10 +522,29 @@ mcl_enchanting.enchantments.punch = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{12, 37}, {32, 57}},
|
||||
}
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.quick_charge = {
|
||||
name = "Quick Charge",
|
||||
max_level = 3,
|
||||
primary = {crossbow = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {},
|
||||
weight = 5,
|
||||
description = "Decreases crossbow charging time.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{12, 50}, {32, 50}, {52, 50}},
|
||||
}]]--
|
||||
|
||||
-- unimplemented
|
||||
mcl_enchanting.enchantments.respiration = {
|
||||
--[[mcl_enchanting.enchantments.respiration = {
|
||||
name = "Respiration",
|
||||
max_level = 3,
|
||||
primary = {armor_head = true},
|
||||
|
@ -408,7 +556,26 @@ mcl_enchanting.enchantments.respiration = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
}
|
||||
treasure = false,
|
||||
power_range_table = {{10, 40}, {20, 50}, {30, 60}},
|
||||
}]]--
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
--[[mcl_enchanting.enchantments.riptide = {
|
||||
name = "Riptide",
|
||||
max_level = 3,
|
||||
primary = {trident = true},
|
||||
secondary = {},
|
||||
disallow = {},
|
||||
incompatible = {channeling = true, loyalty = true},
|
||||
weight = 2,
|
||||
description = "Trident launches player with itself when thrown. Functions only in water or rain.",
|
||||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{17, 50}, {24, 50}, {31, 50}},
|
||||
}]]--
|
||||
|
||||
-- implemented via on_enchant
|
||||
mcl_enchanting.enchantments.sharpness = {
|
||||
|
@ -423,6 +590,8 @@ mcl_enchanting.enchantments.sharpness = {
|
|||
curse = false,
|
||||
on_enchant = increase_damage("fleshy", 0.5),
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{1, 21}, {12, 32}, {23, 43}, {34, 54}, {45, 65}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_item_entity
|
||||
|
@ -438,6 +607,8 @@ mcl_enchanting.enchantments.silk_touch = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{15, 61}},
|
||||
}
|
||||
|
||||
-- implemented via on_enchant and additions in mobs_mc
|
||||
|
@ -453,6 +624,8 @@ mcl_enchanting.enchantments.smite = {
|
|||
curse = false,
|
||||
on_enchant = increase_damage("undead", 2.5),
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 25}, {13, 33}, {21, 41}, {29, 49}, {37, 57}},
|
||||
}
|
||||
|
||||
-- implemented in mcl_playerplus
|
||||
|
@ -468,6 +641,8 @@ mcl_enchanting.enchantments.soul_speed = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = true,
|
||||
power_range_table = {{10, 25}, {20, 35}, {30, 45}},
|
||||
}
|
||||
|
||||
-- requires missing MineClone2 feature
|
||||
|
@ -483,6 +658,8 @@ mcl_enchanting.enchantments.soul_speed = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 20}, {14, 29}, {23, 38}},
|
||||
}]]--
|
||||
|
||||
-- implemented in mcl_armor
|
||||
|
@ -498,6 +675,8 @@ mcl_enchanting.enchantments.thorns = {
|
|||
curse = false,
|
||||
on_enchant = function() end,
|
||||
requires_tool = false,
|
||||
treasure = false,
|
||||
power_range_table = {{10, 61}, {30, 71}, {50, 81}},
|
||||
}
|
||||
|
||||
-- for tools & weapons implemented via on_enchant; for bows implemented in mcl_bows; for armor implemented in mcl_armor and mcl_tt; for fishing rods implemented in mcl_fishing
|
||||
|
@ -520,4 +699,6 @@ mcl_enchanting.enchantments.unbreaking = {
|
|||
itemstack:get_meta():set_tool_capabilities(tool_capabilities)
|
||||
end,
|
||||
requires_tool = true,
|
||||
treasure = false,
|
||||
power_range_table = {{5, 61}, {13, 71}, {21, 81}},
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
function mcl_enchanting.is_book(itemname)
|
||||
return itemname == "mcl_books:book" or itemname == "mcl_enchanting:book_enchanted"
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_enchantments(itemstack)
|
||||
return minetest.deserialize(itemstack:get_meta():get_string("mcl_enchanting:enchantments")) or {}
|
||||
end
|
||||
|
@ -5,7 +9,7 @@ end
|
|||
function mcl_enchanting.set_enchantments(itemstack, enchantments)
|
||||
itemstack:get_meta():set_string("mcl_enchanting:enchantments", minetest.serialize(enchantments))
|
||||
local itemdef = itemstack:get_definition()
|
||||
if itemstack:get_name() ~= "mcl_enchanting:book_enchanted" then
|
||||
if not mcl_enchanting.is_book(itemstack:get_name()) then
|
||||
if itemdef.tool_capabilities then
|
||||
itemstack:get_meta():set_tool_capabilities(itemdef.tool_capabilities)
|
||||
end
|
||||
|
@ -20,9 +24,6 @@ function mcl_enchanting.set_enchantments(itemstack, enchantments)
|
|||
end
|
||||
|
||||
function mcl_enchanting.get_enchantment(itemstack, enchantment)
|
||||
if itemstack:get_name() == "mcl_enchanting:book_enchanted" then
|
||||
return 0
|
||||
end
|
||||
return mcl_enchanting.get_enchantments(itemstack)[enchantment] or 0
|
||||
end
|
||||
|
||||
|
@ -44,22 +45,34 @@ function mcl_enchanting.get_enchanted_itemstring(itemname)
|
|||
return def and def._mcl_enchanting_enchanted_tool
|
||||
end
|
||||
|
||||
function mcl_enchanting.is_enchanted_def(itemname)
|
||||
function mcl_enchanting.set_enchanted_itemstring(itemstack)
|
||||
itemstack:set_name(mcl_enchanting.get_enchanted_itemstring(itemstack:get_name()))
|
||||
end
|
||||
|
||||
function mcl_enchanting.is_enchanted(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())
|
||||
function mcl_enchanting.is_enchantable(itemname)
|
||||
return mcl_enchanting.get_enchantability(itemname) > 0
|
||||
end
|
||||
|
||||
function mcl_enchanting.can_enchant_freshly(itemname)
|
||||
return mcl_enchanting.is_enchantable(itemname) and not mcl_enchanting.is_enchanted(itemname)
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_enchantability(itemname)
|
||||
return minetest.get_item_group(itemname, "enchantability")
|
||||
end
|
||||
|
||||
function mcl_enchanting.item_supports_enchantment(itemname, enchantment, early)
|
||||
if itemname == "mcl_enchanting:book_enchanted" then
|
||||
return true, true
|
||||
end
|
||||
if not early and not mcl_enchanting.get_enchanted_itemstring(itemname) then
|
||||
if not mcl_enchanting.is_enchantable(itemname) then
|
||||
return false
|
||||
end
|
||||
local enchantment_def = mcl_enchanting.enchantments[enchantment]
|
||||
if mcl_enchanting.is_book(itemname) then
|
||||
return true, (not enchantment_def.treasure)
|
||||
end
|
||||
local itemdef = minetest.registered_items[itemname]
|
||||
if itemdef.type ~= "tool" and enchantment_def.requires_tool then
|
||||
return false
|
||||
|
@ -91,7 +104,8 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
|||
if itemname == "" then
|
||||
return false, "item missing"
|
||||
end
|
||||
if not mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment) then
|
||||
local supported, primary = mcl_enchanting.item_supports_enchantment(itemstack:get_name(), enchantment)
|
||||
if not supported then
|
||||
return false, "item not supported"
|
||||
end
|
||||
if not level then
|
||||
|
@ -107,7 +121,7 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
|||
if enchantment_level then
|
||||
return false, "incompatible", mcl_enchanting.get_enchantment_description(enchantment, enchantment_level)
|
||||
end
|
||||
if itemname ~= "mcl_enchanting:book_enchanted" then
|
||||
if not mcl_enchanting.is_book(itemname) then
|
||||
for incompatible in pairs(enchantment_def.incompatible) do
|
||||
local incompatible_level = item_enchantments[incompatible]
|
||||
if incompatible_level then
|
||||
|
@ -115,11 +129,11 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
|||
end
|
||||
end
|
||||
end
|
||||
return true
|
||||
return true, nil, nil, primary
|
||||
end
|
||||
|
||||
function mcl_enchanting.enchant(itemstack, enchantment, level)
|
||||
itemstack:set_name(mcl_enchanting.get_enchanted_itemstring(itemstack:get_name()))
|
||||
mcl_enchanting.set_enchanted_itemstring(itemstack)
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
enchantments[enchantment] = level
|
||||
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
||||
|
@ -130,7 +144,7 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
|||
local itemname = itemstack:get_name()
|
||||
local combine_name = combine_with:get_name()
|
||||
local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname)
|
||||
if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and combine_name ~= "mcl_enchanting:book_enchanted" then
|
||||
if enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(itemname) then
|
||||
return false
|
||||
end
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
|
@ -173,68 +187,44 @@ function mcl_enchanting.combine(itemstack, combine_with)
|
|||
return true
|
||||
end
|
||||
|
||||
function mcl_enchanting.initialize()
|
||||
local all_groups = {}
|
||||
local weighted = {}
|
||||
local accum_weight = 0
|
||||
for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do
|
||||
accum_weight = accum_weight + enchantment_def.weight
|
||||
weighted[#weighted + 1] = {enchantment = enchantment, weight = accum_weight}
|
||||
for primary in pairs(enchantment_def.primary) do
|
||||
all_groups[primary] = true
|
||||
end
|
||||
for secondary in pairs(enchantment_def.secondary) do
|
||||
all_groups[secondary] = true
|
||||
end
|
||||
function mcl_enchanting.enchantments_snippet(_, _, itemstack)
|
||||
if not itemstack then
|
||||
return
|
||||
end
|
||||
mcl_enchanting.accumulated_weight = accum_weight
|
||||
mcl_enchanting.accumulated_weight = weighted
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
local text = ""
|
||||
for enchantment, level in pairs(enchantments) do
|
||||
text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n"
|
||||
end
|
||||
if text ~= "" then
|
||||
if not itemstack:get_definition()._tt_original_description then
|
||||
text = text:sub(1, text:len() - 1)
|
||||
end
|
||||
return text, false
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.initialize()
|
||||
local register_tool_list = {}
|
||||
local register_item_list = {}
|
||||
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 all_groups[group] then
|
||||
quick_test = true
|
||||
break
|
||||
if mcl_enchanting.can_enchant_freshly(itemname) 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 .. mcl_enchanting.overlay
|
||||
if new_def.wield_image then
|
||||
new_def.wield_image = new_def.wield_image .. mcl_enchanting.overlay
|
||||
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:white:50^[colorize:purple:50"
|
||||
if new_def.wield_image then
|
||||
new_def.wield_image = new_def.wield_image .. "^[colorize:white:50^[colorize:purple:50"
|
||||
end
|
||||
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 = register_item_list
|
||||
if itemdef.type == "tool" then
|
||||
register_list = register_tool_list
|
||||
end
|
||||
register_list[":" .. new_name] = new_def
|
||||
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 = register_item_list
|
||||
if itemdef.type == "tool" then
|
||||
register_list = register_tool_list
|
||||
end
|
||||
register_list[":" .. new_name] = new_def
|
||||
end
|
||||
end
|
||||
for new_name, new_def in pairs(register_item_list) do
|
||||
|
@ -244,3 +234,366 @@ function mcl_enchanting.initialize()
|
|||
minetest.register_tool(new_name, new_def)
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure)
|
||||
local possible_enchantments, weights, accum_weight = {}, {}, 0
|
||||
for enchantment, enchantment_def in pairs(mcl_enchanting.enchantments) do
|
||||
local supported, _, _, primary = mcl_enchanting.can_enchant(itemstack, enchantment, 1)
|
||||
if primary or treasure then
|
||||
table.insert(possible_enchantments, enchantment)
|
||||
accum_weight = accum_weight + enchantment_def.weight
|
||||
weights[enchantment] = accum_weight
|
||||
end
|
||||
end
|
||||
return possible_enchantments, weights, accum_weight
|
||||
end
|
||||
|
||||
function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance)
|
||||
local itemname = itemstack:get_name()
|
||||
if not mcl_enchanting.can_enchant_freshly(itemname) then
|
||||
return
|
||||
end
|
||||
itemstack = ItemStack(itemstack)
|
||||
local enchantability = minetest.get_item_group(itemname, "enchantability")
|
||||
enchantability = 1 + math.random(0, math.floor(enchantability / 4)) + math.random(0, math.floor(enchantability / 4))
|
||||
enchantment_level = enchantment_level + enchantability
|
||||
enchantment_level = enchantment_level + enchantment_level * (math.random() + math.random() - 1) * 0.15
|
||||
enchantment_level = math.max(math.floor(enchantment_level + 0.5), 1)
|
||||
local enchantments = {}
|
||||
local description
|
||||
enchantment_level = enchantment_level * 2
|
||||
repeat
|
||||
enchantment_level = math.floor(enchantment_level / 2)
|
||||
if enchantment_level == 0 then
|
||||
break
|
||||
end
|
||||
local possible, weights, accum_weight = mcl_enchanting.get_possible_enchantments(itemstack, enchantment_level, treasure)
|
||||
local selected_enchantment, enchantment_power
|
||||
if #possible > 0 then
|
||||
local r = math.random(accum_weight)
|
||||
for _, enchantment in ipairs(possible) do
|
||||
if weights[enchantment] >= r then
|
||||
selected_enchantment = enchantment
|
||||
break
|
||||
end
|
||||
end
|
||||
local enchantment_def = mcl_enchanting.enchantments[selected_enchantment]
|
||||
local power_range_table = enchantment_def.power_range_table
|
||||
for i = enchantment_def.max_level, 1, -1 do
|
||||
local power_range = power_range_table[i]
|
||||
if enchantment_level >= power_range[1] and enchantment_level <= power_range[2] then
|
||||
enchantment_power = i
|
||||
break
|
||||
end
|
||||
end
|
||||
if not description then
|
||||
if not enchantment_power then
|
||||
return
|
||||
end
|
||||
description = mcl_enchanting.get_enchantment_description(selected_enchantment, enchantment_power)
|
||||
end
|
||||
if enchantment_power then
|
||||
enchantments[selected_enchantment] = enchantment_power
|
||||
mcl_enchanting.enchant(itemstack, selected_enchantment, enchantment_power)
|
||||
end
|
||||
else
|
||||
break
|
||||
end
|
||||
until not no_reduced_bonus_chance and math.random() >= (enchantment_level + 1) / 50
|
||||
return enchantments, description
|
||||
end
|
||||
|
||||
function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance)
|
||||
local enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance)
|
||||
if enchantments then
|
||||
mcl_enchanting.set_enchanted_itemstring(itemstack)
|
||||
mcl_enchanting.set_enchantments(itemstack, enchantments)
|
||||
end
|
||||
return itemstack
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_randomly_enchanted_book(enchantment_level, treasure, no_reduced_bonus_chance)
|
||||
return mcl_enchanting.enchant_randomly(enchantment_level, treasure, no_reduced_bonus_chance)
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_random_glyph_row()
|
||||
local glyphs = ""
|
||||
local x = 1.3
|
||||
for i = 1, 9 do
|
||||
glyphs = glyphs .. "image[".. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]"
|
||||
x = x + 0.6
|
||||
end
|
||||
return glyphs
|
||||
end
|
||||
|
||||
function mcl_enchanting.generate_random_table_slots(itemstack, num_bookshelves)
|
||||
local base = math.random(8) + math.floor(num_bookshelves / 2) + math.random(0, num_bookshelves)
|
||||
local required_levels = {
|
||||
math.max(base / 3, 1),
|
||||
(base * 2) / 3 + 1,
|
||||
math.max(base, num_bookshelves * 2)
|
||||
}
|
||||
local slots = {}
|
||||
for i, enchantment_level in ipairs(required_levels) do
|
||||
local slot = false
|
||||
local enchantments, description = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level)
|
||||
if enchantments then
|
||||
slot = {
|
||||
enchantments = enchantments,
|
||||
description = description,
|
||||
glyphs = mcl_enchanting.get_random_glyph_row(),
|
||||
level_requirement = math.max(i, math.floor(enchantment_level)),
|
||||
}
|
||||
end
|
||||
slots[i] = slot
|
||||
end
|
||||
return slots
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves)
|
||||
if not mcl_enchanting.can_enchant_freshly(itemstack:get_name()) then
|
||||
return {false, false, false}
|
||||
end
|
||||
local itemname = itemstack:get_name()
|
||||
local meta = player:get_meta()
|
||||
local player_slots = minetest.deserialize(meta:get_string("mcl_enchanting:slots")) or {}
|
||||
local player_bookshelves_slots = player_slots[num_bookshelves] or {}
|
||||
local player_bookshelves_item_slots = player_bookshelves_slots[itemname]
|
||||
if player_bookshelves_item_slots then
|
||||
return player_bookshelves_item_slots
|
||||
else
|
||||
player_bookshelves_item_slots = mcl_enchanting.generate_random_table_slots(itemstack, num_bookshelves)
|
||||
if player_bookshelves_item_slots then
|
||||
player_bookshelves_slots[itemname] = player_bookshelves_item_slots
|
||||
player_slots[num_bookshelves] = player_bookshelves_slots
|
||||
meta:set_string("mcl_enchanting:slots", minetest.serialize(player_slots))
|
||||
return player_bookshelves_item_slots
|
||||
else
|
||||
return {false, false, false}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.reset_table_slots(player)
|
||||
player:get_meta():set_string("mcl_enchanting:slots", "")
|
||||
end
|
||||
|
||||
function mcl_enchanting.show_enchanting_formspec(player)
|
||||
local C = minetest.get_color_escape_sequence
|
||||
local name = player:get_player_name()
|
||||
local meta = player:get_meta()
|
||||
local inv = player:get_inventory()
|
||||
local num_bookshelves = meta:get_int("mcl_enchanting:num_bookshelves")
|
||||
local table_name = meta:get_string("mcl_enchanting:table_name")
|
||||
local formspec = ""
|
||||
.. "size[9.07,8.6;]"
|
||||
.. "formspec_version[3]"
|
||||
.. "label[0,0;" .. C("#313131") .. table_name .. "]"
|
||||
.. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1)
|
||||
.. "list[detached:" .. name .. "_enchanting;enchanting;0.2,2.4;1,1;1]"
|
||||
.. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1)
|
||||
.. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]"
|
||||
.. "list[detached:" .. name .. "_enchanting;enchanting;1.1,2.4;1,1;2]"
|
||||
.. "label[0,4;" .. C("#313131") .. "Inventory]"
|
||||
.. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3)
|
||||
.. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1)
|
||||
.. "list[current_player;main;0,4.5;9,3;9]"
|
||||
.. "listring[detached:" .. name .. "_enchanting;enchanting]"
|
||||
.. "listring[current_player;main]"
|
||||
.. "list[current_player;main;0,7.74;9,1;]"
|
||||
.. "real_coordinates[true]"
|
||||
.. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]"
|
||||
local itemstack = inv:get_stack("enchanting_item", 1)
|
||||
local player_levels = mcl_experience.get_player_xp_level(player)
|
||||
local y = 0.65
|
||||
local any_enchantment = false
|
||||
local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves)
|
||||
for i, slot in ipairs(table_slots) do
|
||||
any_enchantment = any_enchantment or slot
|
||||
local enough_lapis = inv:contains_item("enchanting_lapis", ItemStack({name = "mcl_dye:blue", count = i}))
|
||||
local enough_levels = slot and slot.level_requirement <= player_levels
|
||||
local can_enchant = (slot and enough_lapis and enough_levels)
|
||||
local ending = (can_enchant and "" or "_off")
|
||||
local hover_ending = (can_enchant and "_hovered" or "_off")
|
||||
formspec = formspec
|
||||
.. "container[3.2," .. y .. "]"
|
||||
.. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. slot.description .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. i .. " Lapis Lazuli\n" .. C("#818181") .. i .. " Enchantment Levels" or C("#FC5454") .. "Level Requirement: " .. slot.level_requirement) .. "]" or "")
|
||||
.. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]"
|
||||
.. "button[0,0;7.5,1.3;button_" .. i .. ";]"
|
||||
.. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "")
|
||||
.. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "")
|
||||
.. (slot and slot.glyphs or "")
|
||||
.. "container_end[]"
|
||||
y = y + 1.35
|
||||
end
|
||||
formspec = formspec
|
||||
.. "image[" .. (any_enchantment and 0.58 or 1.15) .. ",1.2;" .. (any_enchantment and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]"
|
||||
minetest.show_formspec(name, "mcl_enchanting:table", formspec)
|
||||
end
|
||||
|
||||
function mcl_enchanting.handle_formspec_fields(player, formname, fields)
|
||||
if formname == "mcl_enchanting:table" then
|
||||
local button_pressed
|
||||
for i = 1, 3 do
|
||||
if fields["button_" .. i] then
|
||||
button_pressed = i
|
||||
end
|
||||
end
|
||||
if not button_pressed then return end
|
||||
local name = player:get_player_name()
|
||||
local inv = player:get_inventory()
|
||||
local meta = player:get_meta()
|
||||
local num_bookshelfes = meta:get_int("mcl_enchanting:num_bookshelves")
|
||||
local itemstack = inv:get_stack("enchanting_item", 1)
|
||||
local cost = ItemStack({name = "mcl_dye:blue", count = button_pressed})
|
||||
if not inv:contains_item("enchanting_lapis", cost) then
|
||||
return
|
||||
end
|
||||
local slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelfes)
|
||||
local slot = slots[button_pressed]
|
||||
if not slot then
|
||||
return
|
||||
end
|
||||
local player_level = mcl_experience.get_player_xp_level(player)
|
||||
if player_level < slot.level_requirement then
|
||||
return
|
||||
end
|
||||
mcl_experience.set_player_xp_level(player, player_level - button_pressed)
|
||||
inv:remove_item("enchanting_lapis", cost)
|
||||
mcl_enchanting.set_enchanted_itemstring(itemstack)
|
||||
mcl_enchanting.set_enchantments(itemstack, slot.enchantments)
|
||||
inv:set_stack("enchanting_item", 1, itemstack)
|
||||
minetest.sound_play("mcl_enchanting_enchant", {to_player = name, gain = 5.0})
|
||||
mcl_enchanting.reset_table_slots(player)
|
||||
mcl_enchanting.reload_inventory(player)
|
||||
mcl_enchanting.show_enchanting_formspec(player)
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.initialize_player(player)
|
||||
local player_inv = player:get_inventory()
|
||||
player_inv:set_size("enchanting_lapis", 1)
|
||||
player_inv:set_size("enchanting_item", 1)
|
||||
local name = player:get_player_name()
|
||||
local detached_inv = minetest.create_detached_inventory(name .. "_enchanting", {
|
||||
allow_put = function(inv, listname, index, stack, player)
|
||||
if player:get_player_name() ~= name then
|
||||
return 0
|
||||
end
|
||||
if stack:get_name() == "mcl_dye:blue" and index ~= 2 then
|
||||
return math.min(inv:get_stack(listname, 3):get_free_space(), stack:get_count())
|
||||
elseif index ~= 3 and inv:get_stack(listname, 2):get_count() == 0 then
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
end
|
||||
end,
|
||||
allow_take = function(inv, listname, index, stack, player)
|
||||
if player:get_player_name() ~= name or index == 1 then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end,
|
||||
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
|
||||
return 0
|
||||
end,
|
||||
on_put = function(inv, listname, index, stack, player)
|
||||
local result_list
|
||||
if index == 1 then
|
||||
if stack:get_name() == "mcl_dye:blue" then
|
||||
result_list = "lapis"
|
||||
stack:add_item(inv:get_stack(listname, 3))
|
||||
inv:set_stack(listname, 1, nil)
|
||||
inv:set_stack(listname, 3, stack)
|
||||
else
|
||||
result_list = "item"
|
||||
inv:set_stack(listname, 1, nil)
|
||||
inv:set_stack(listname, 2, stack)
|
||||
end
|
||||
elseif index == 2 then
|
||||
result_list = "item"
|
||||
elseif index == 3 then
|
||||
result_list = "lapis"
|
||||
stack = inv:get_stack(listname, 3)
|
||||
end
|
||||
player:get_inventory():set_stack("enchanting_" .. result_list, 1, stack)
|
||||
mcl_enchanting.show_enchanting_formspec(player)
|
||||
end,
|
||||
on_take = function(inv, listname, index, stack, player)
|
||||
local result_list
|
||||
if index == 2 then
|
||||
result_list = "item"
|
||||
elseif index == 3 then
|
||||
result_list = "lapis"
|
||||
end
|
||||
player:get_inventory():set_stack("enchanting_" .. result_list, 1, nil)
|
||||
mcl_enchanting.show_enchanting_formspec(player)
|
||||
end
|
||||
}, name)
|
||||
detached_inv:set_size("enchanting", 3)
|
||||
mcl_enchanting.reload_inventory(player)
|
||||
end
|
||||
|
||||
function mcl_enchanting.reload_inventory(player)
|
||||
local player_inv = player:get_inventory()
|
||||
local detached_inv = minetest.get_inventory({type = "detached", name = player:get_player_name() .. "_enchanting"})
|
||||
detached_inv:set_stack("enchanting", 2, player_inv:get_stack("enchanting_item", 1))
|
||||
detached_inv:set_stack("enchanting", 3, player_inv:get_stack("enchanting_lapis", 1))
|
||||
end
|
||||
|
||||
function mcl_enchanting.schedule_book_animation(self, anim)
|
||||
self.scheduled_anim = {timer = self.anim_length, anim = anim}
|
||||
end
|
||||
|
||||
function mcl_enchanting.set_book_animation(self, anim)
|
||||
local anim_index = mcl_enchanting.book_animations[anim]
|
||||
local start, stop = mcl_enchanting.book_animation_steps[anim_index], mcl_enchanting.book_animation_steps[anim_index + 1]
|
||||
self.object:set_animation({x = start, y = stop}, mcl_enchanting.book_animation_speed)
|
||||
self.scheduled_anim = nil
|
||||
self.anim_length = (stop - start) / 40
|
||||
end
|
||||
|
||||
function mcl_enchanting.check_animation_schedule(self, dtime)
|
||||
local schedanim = self.scheduled_anim
|
||||
if schedanim then
|
||||
schedanim.timer = schedanim.timer - dtime
|
||||
if schedanim.timer <= 0 then
|
||||
mcl_enchanting.set_book_animation(self, schedanim.anim)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.look_at(self, pos2)
|
||||
local pos1 = self.object:get_pos()
|
||||
local vec = vector.subtract(pos1, pos2)
|
||||
local yaw = math.atan(vec.z / vec.x) - math.pi/2
|
||||
yaw = yaw + (pos1.x >= pos2.x and math.pi or 0)
|
||||
self.object:set_yaw(yaw + math.pi)
|
||||
end
|
||||
|
||||
function mcl_enchanting.check_book(pos)
|
||||
local obj_pos = vector.add(pos, mcl_enchanting.book_offset)
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(obj_pos, 0.1)) do
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity and luaentity.name == "mcl_enchanting:book" then
|
||||
if minetest.get_node(pos).name ~= "mcl_enchanting:table" then
|
||||
obj:remove()
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
minetest.add_entity(obj_pos, "mcl_enchanting:book")
|
||||
end
|
||||
|
||||
function mcl_enchanting.get_bookshelves(pos)
|
||||
local absolute, relative = {}, {}
|
||||
for i, rp in ipairs(mcl_enchanting.bookshelf_positions) do
|
||||
local airp = vector.add(pos, mcl_enchanting.air_positions[i])
|
||||
local ap = vector.add(pos, rp)
|
||||
if minetest.get_node(ap).name == "mcl_books:bookshelf" and minetest.get_node(airp).name == "air" then
|
||||
table.insert(absolute, ap)
|
||||
table.insert(relative, rp)
|
||||
end
|
||||
end
|
||||
return absolute, relative
|
||||
end
|
||||
|
|
|
@ -2,21 +2,265 @@ local modpath = minetest.get_modpath("mcl_enchanting")
|
|||
|
||||
mcl_enchanting = {
|
||||
book_offset = vector.new(0, 0.75, 0),
|
||||
book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4},
|
||||
book_animation_steps = {0, 640, 680, 700, 740},
|
||||
book_animation_speed = 40,
|
||||
roman_numerals = dofile(modpath .. "/roman_numerals.lua"), -- https://exercism.io/tracks/lua/exercises/roman-numerals/solutions/73c2fb7521e347209312d115f872fa49
|
||||
enchantments = {},
|
||||
weighted_enchantments = {},
|
||||
accumulated_weight = 0,
|
||||
debug = false,
|
||||
overlay = "^[colorize:white:50^[colorize:purple:50",
|
||||
bookshelf_positions = {
|
||||
{x = -2, y = 0, z = -2}, {x = -2, y = 1, z = -2},
|
||||
{x = -1, y = 0, z = -2}, {x = -1, y = 1, z = -2},
|
||||
{x = 0, y = 0, z = -2}, {x = 0, y = 1, z = -2},
|
||||
{x = 1, y = 0, z = -2}, {x = 1, y = 1, z = -2},
|
||||
{x = 2, y = 0, z = -2}, {x = 2, y = 1, z = -2},
|
||||
{x = -2, y = 0, z = 2}, {x = -2, y = 1, z = 2},
|
||||
{x = -1, y = 0, z = 2}, {x = -1, y = 1, z = 2},
|
||||
{x = 0, y = 0, z = 2}, {x = 0, y = 1, z = 2},
|
||||
{x = 1, y = 0, z = 2}, {x = 1, y = 1, z = 2},
|
||||
{x = 2, y = 0, z = 2}, {x = 2, y = 1, z = 2},
|
||||
-- {x = -2, y = 0, z = -2}, {x = -2, y = 1, z = -2},
|
||||
{x = -2, y = 0, z = -1}, {x = -2, y = 1, z = -1},
|
||||
{x = -2, y = 0, z = 0}, {x = -2, y = 1, z = 0},
|
||||
{x = -2, y = 0, z = 1}, {x = -2, y = 1, z = 1},
|
||||
{x = -2, y = 0, z = 2}, {x = -2, y = 1, z = 2},
|
||||
{x = 2, y = 0, z = -2}, {x = 2, y = 1, z = -2},
|
||||
{x = 2, y = 0, z = -1}, {x = 2, y = 1, z = -1},
|
||||
{x = 2, y = 0, z = 0}, {x = 2, y = 1, z = 0},
|
||||
{x = 2, y = 0, z = 1}, {x = 2, y = 1, z = 1},
|
||||
-- {x = 2, y = 0, z = 2}, {x = 2, y = 1, z = 2},
|
||||
},
|
||||
air_positions = {
|
||||
{x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1},
|
||||
{x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1},
|
||||
{x = 0, y = 0, z = -1}, {x = 0, y = 1, z = -1},
|
||||
{x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1},
|
||||
{x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1},
|
||||
{x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1},
|
||||
{x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1},
|
||||
{x = 0, y = 0, z = 1}, {x = 0, y = 1, z = 1},
|
||||
{x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1},
|
||||
{x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1},
|
||||
-- {x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1},
|
||||
{x = -1, y = 0, z = -1}, {x = -1, y = 1, z = -1},
|
||||
{x = -1, y = 0, z = 0}, {x = -1, y = 1, z = 0},
|
||||
{x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1},
|
||||
{x = -1, y = 0, z = 1}, {x = -1, y = 1, z = 1},
|
||||
{x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1},
|
||||
{x = 1, y = 0, z = -1}, {x = 1, y = 1, z = -1},
|
||||
{x = 1, y = 0, z = 0}, {x = 1, y = 1, z = 0},
|
||||
{x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1},
|
||||
-- {x = 1, y = 0, z = 1}, {x = 1, y = 1, z = 1},
|
||||
},
|
||||
}
|
||||
|
||||
dofile(modpath .. "/engine.lua")
|
||||
dofile(modpath .. "/enchantments.lua")
|
||||
dofile(modpath .. "/command.lua")
|
||||
dofile(modpath .. "/tt.lua")
|
||||
dofile(modpath .. "/book.lua")
|
||||
-- dofile(modpath .. "/ui.lua")
|
||||
-- dofile(modpath .. "/fx.lua")
|
||||
-- dofile(modpath .. "/book.lua")
|
||||
-- dofile(modpath .. "/table.lua")
|
||||
|
||||
minetest.register_chatcommand("enchant", {
|
||||
description = "Enchant an item.",
|
||||
params = "<player> <enchantment> [<level>]",
|
||||
privs = {give = true},
|
||||
func = function(_, param)
|
||||
local sparam = param:split(" ")
|
||||
local target_name = sparam[1]
|
||||
local enchantment = sparam[2]
|
||||
local level_str = sparam[3]
|
||||
local level = tonumber(level_str or "1")
|
||||
if not target_name or not enchantment then
|
||||
return false, "Usage: /enchant <player> <enchantment> [<level>]"
|
||||
end
|
||||
local target = minetest.get_player_by_name(target_name)
|
||||
if not target then
|
||||
return false, "Player '" .. target_name .. "' cannot be found"
|
||||
end
|
||||
local itemstack = target:get_wielded_item()
|
||||
local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
||||
if not can_enchant then
|
||||
if errorstring == "enchantment invalid" then
|
||||
return false, "There is no such enchantment '" .. enchantment .. "'"
|
||||
elseif errorstring == "item missing" then
|
||||
return false, "The target doesn't hold an item"
|
||||
elseif errorstring == "item not supported" then
|
||||
return false, "The selected enchantment can't be added to the target item"
|
||||
elseif errorstring == "level invalid" then
|
||||
return false, "'" .. level_str .. "' is not a valid number"
|
||||
elseif errorstring == "level too high" then
|
||||
return false, "The number you have entered (" .. level_str .. ") is too big, it must be at most " .. extra_info
|
||||
elseif errorstring == "level too small" then
|
||||
return false, "The number you have entered (" .. level_str .. ") is too small, it must be at least " .. extra_info
|
||||
elseif errorstring == "incompatible" then
|
||||
return false, mcl_enchanting.get_enchantment_description(enchantment, level) .. " can't be combined with " .. extra_info
|
||||
end
|
||||
else
|
||||
target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level))
|
||||
return true, "Enchanting succeded"
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("forceenchant", {
|
||||
description = "Forcefully enchant an item.",
|
||||
params = "<player> <enchantment> [<level>]",
|
||||
func = function(_, param)
|
||||
local sparam = param:split(" ")
|
||||
local target_name = sparam[1]
|
||||
local enchantment = sparam[2]
|
||||
local level_str = sparam[3]
|
||||
local level = tonumber(level_str or "1")
|
||||
if not target_name or not enchantment then
|
||||
return false, "Usage: /forceenchant <player> <enchantment> [<level>]"
|
||||
end
|
||||
local target = minetest.get_player_by_name(target_name)
|
||||
if not target then
|
||||
return false, "Player '" .. target_name .. "' cannot be found"
|
||||
end
|
||||
local itemstack = target:get_wielded_item()
|
||||
local can_enchant, errorstring, extra_info = mcl_enchanting.can_enchant(itemstack, enchantment, level)
|
||||
if errorstring == "enchantment invalid" then
|
||||
return false, "There is no such enchantment '" .. enchantment .. "'"
|
||||
elseif errorstring == "item missing" then
|
||||
return false, "The target doesn't hold an item"
|
||||
elseif errorstring == "item not supported" and not mcl_enchanting.is_enchantable(itemstack:get_name()) then
|
||||
return false, "The target item is not enchantable"
|
||||
elseif errorstring == "level invalid" then
|
||||
return false, "'" .. level_str .. "' is not a valid number"
|
||||
else
|
||||
target:set_wielded_item(mcl_enchanting.enchant(itemstack, enchantment, level))
|
||||
return true, "Enchanting succeded"
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craftitem("mcl_enchanting:book_enchanted", {
|
||||
description = "Enchanted Book",
|
||||
inventory_image = "mcl_enchanting_book_enchanted.png" .. mcl_enchanting.overlay,
|
||||
groups = {enchanted = 1, not_in_creative_inventory = 1, enchantability = 1},
|
||||
_mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted",
|
||||
stack_max = 1,
|
||||
})
|
||||
|
||||
minetest.register_entity("mcl_enchanting:book", {
|
||||
initial_properties = {
|
||||
visual = "mesh",
|
||||
mesh = "mcl_enchanting_book.b3d",
|
||||
visual_size = {x = 12.5, y = 12.5},
|
||||
collisionbox = {0, 0, 0},
|
||||
physical = false,
|
||||
textures = {"mcl_enchanting_book_entity.png"},
|
||||
},
|
||||
player_near = false,
|
||||
on_activate = function(self)
|
||||
self.object:set_armor_groups({immortal = 1})
|
||||
mcl_enchanting.set_book_animation(self, "close")
|
||||
mcl_enchanting.check_book(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset))
|
||||
end,
|
||||
on_step = function(self, dtime)
|
||||
local old_player_near = self.player_near
|
||||
local player_near = false
|
||||
local player
|
||||
for _, obj in ipairs(minetest.get_objects_inside_radius(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset), 2.5)) do
|
||||
if obj:is_player() then
|
||||
player_near = true
|
||||
player = obj
|
||||
end
|
||||
end
|
||||
if player_near and not old_player_near then
|
||||
mcl_enchanting.set_book_animation(self, "opening")
|
||||
mcl_enchanting.schedule_book_animation(self, "open")
|
||||
elseif old_player_near and not player_near then
|
||||
mcl_enchanting.set_book_animation(self, "closing")
|
||||
mcl_enchanting.schedule_book_animation(self, "close")
|
||||
end
|
||||
if player then
|
||||
mcl_enchanting.look_at(self, player:get_pos())
|
||||
end
|
||||
self.player_near = player_near
|
||||
mcl_enchanting.check_animation_schedule(self, dtime)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_enchanting:table", {
|
||||
description = "Enchanting Table",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"mcl_enchanting_table_top.png", "mcl_enchanting_table_bottom.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png"},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0.25, 0.5},
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
groups = {pickaxey = 2},
|
||||
on_rotate = (rawget(_G, "screwdriver") or {}).rotate_simple,
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
local player_meta = clicker:get_meta()
|
||||
local table_meta = minetest.get_meta(pos)
|
||||
local num_bookshelves = table_meta:get_int("mcl_enchanting:num_bookshelves")
|
||||
local table_name = table_meta:get_string("name")
|
||||
if table_name == "" then
|
||||
table_name = "Enchant"
|
||||
end
|
||||
player_meta:set_int("mcl_enchanting:num_bookshelves", num_bookshelves)
|
||||
player_meta:set_string("mcl_enchanting:table_name", table_name)
|
||||
mcl_enchanting.show_enchanting_formspec(clicker)
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book")
|
||||
end,
|
||||
on_destruct = function(pos)
|
||||
local itemstack = ItemStack("mcl_enchanting:table")
|
||||
local meta = minetest.get_meta(pos)
|
||||
local itemmeta = itemstack:get_meta()
|
||||
itemmeta:set_string("name", meta:get_string("name"))
|
||||
itemmeta:set_string("description", meta:get_string("description"))
|
||||
minetest.add_item(pos, itemstack)
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local itemmeta = itemstack:get_meta()
|
||||
meta:set_string("name", itemmeta:get_string("name"))
|
||||
meta:set_string("description", itemmeta:get_string("description"))
|
||||
end,
|
||||
after_destruct = mcl_enchanting.check_table,
|
||||
drop = "",
|
||||
_mcl_blast_resistance = 1200,
|
||||
_mcl_hardness = 5,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_enchanting:table",
|
||||
recipe = {
|
||||
{"", "mcl_books:book", ""},
|
||||
{"mcl_core:diamond", "mcl_core:obsidian", "mcl_core:diamond"},
|
||||
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
name = "Enchanting table bookshelf particles",
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
nodenames = "mcl_enchanting:table",
|
||||
action = function(pos)
|
||||
mcl_enchanting.check_book(pos)
|
||||
local absolute, relative = mcl_enchanting.get_bookshelves(pos)
|
||||
for i, ap in ipairs(absolute) do
|
||||
if math.random(10) == 1 then
|
||||
local rp = relative[i]
|
||||
minetest.add_particle({
|
||||
pos = ap,
|
||||
velocity = vector.subtract(vector.new(0, 5, 0), rp),
|
||||
acceleration = {x = 0, y = -9.81, z = 0},
|
||||
expirationtime = 2,
|
||||
size = 2,
|
||||
texture = "mcl_enchanting_glyph_" .. math.random(18) .. ".png"
|
||||
})
|
||||
end
|
||||
end
|
||||
minetest.get_meta(pos):set_int("mcl_enchanting:num_bookshelves", math.min(15, #absolute))
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_on_mods_loaded(mcl_enchanting.initialize)
|
||||
minetest.register_on_joinplayer(mcl_enchanting.initialize_player)
|
||||
minetest.register_on_player_receive_fields(mcl_enchanting.handle_formspec_fields)
|
||||
table.insert(tt.registered_snippets, 1, mcl_enchanting.enchantments_snippet)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name = mcl_enchanting
|
||||
description = The rewrite of the Enchanting mod for MineClone2
|
||||
depends = mcl_formspec, tt, mcl_books, walkover
|
||||
description = Enchanting for MineClone2
|
||||
depends = tt, walkover, mcl_sounds
|
||||
optional_depends = screwdriver
|
||||
author = Fleckenstein
|
||||
|
|
|
@ -1,189 +0,0 @@
|
|||
local enchanting_table_formspec = ""
|
||||
.. "size[9.07,8.6;]"
|
||||
.. "formspec_version[3]"
|
||||
.. "label[0,0;" .. minetest.formspec_escape(minetest.colorize("#313131", "Enchant")) .. "]"
|
||||
.. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1)
|
||||
.. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]"
|
||||
.. "list[context;lapis;1.1,2.4;1,1;]"
|
||||
.. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1)
|
||||
.. "list[context;tool;0.2,2.4;1,1;]"
|
||||
.. "label[0,4;" .. minetest.formspec_escape(minetest.colorize("#313131", "Inventory")) .. "]"
|
||||
.. mcl_formspec.get_itemslot_bg(0,4.5,9,3)
|
||||
.. mcl_formspec.get_itemslot_bg(0,7.74,9,1)
|
||||
.. "list[current_player;main;0,4.5;9,3;9]"
|
||||
.. "listring[]"
|
||||
.. "list[current_player;main;0,7.74;9,1;]"
|
||||
.. "real_coordinates[true]"
|
||||
.. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]"
|
||||
|
||||
local bookshelf_positions = {{x = 1}, {x = -1}, {z = 1}, {z = -1}}
|
||||
|
||||
for _, p in pairs(bookshelf_positions) do
|
||||
for _, d in pairs({"x", "y", "z"}) do
|
||||
p[d] = p[d] or 0
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_abm({
|
||||
name = "Enchanting table bookshelf particles",
|
||||
interval = 0.1,
|
||||
chance = 1,
|
||||
nodenames = "mcl_books:bookshelf",
|
||||
action = function(pos)
|
||||
for _, relative_pos in pairs(bookshelf_positions) do
|
||||
if minetest.get_node(vector.add(pos, vector.multiply(relative_pos, 2))).name == "mcl_enchanting:table" and minetest.get_node(vector.add(pos, relative_pos, 2)).name == "air" then
|
||||
minetest.add_particle({
|
||||
pos = pos,
|
||||
velocity = vector.subtract(relative_pos, vector.new(0, -2, 0)),
|
||||
acceleration = {x = 0, y = -2, z = 0},
|
||||
expirationtime = 2,
|
||||
size = 2,
|
||||
texture = "mcl_enchanting_glyph_" .. math.random(18) .. ".png"
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
|
||||
function mcl_enchanting.update_formspec(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local full_tool_name = inv:get_stack("tool", 1):get_name()
|
||||
local shortened_tool_name = mcl_enchanting.all_tools[full_tool_name]
|
||||
local supported_enchantments = (shortened_tool_name and mcl_enchanting.tools[shortened_tool_name].enchantments or {})
|
||||
local sup_ench = false
|
||||
local formspec = enchanting_table_formspec
|
||||
local e_list = minetest.deserialize(meta:get_string("enchantments"))
|
||||
local y = 0.65
|
||||
for i, e in pairs(e_list) do
|
||||
local enchantment_supported = table.indexof(supported_enchantments, e.enchantment) ~= -1
|
||||
sup_ench = sup_ench or enchantment_supported
|
||||
local enough_lapis = inv:contains_item("lapis", ItemStack(mcl_enchanting.lapis_itemstring .. " " .. e.cost))
|
||||
local ending = (enough_lapis and enchantment_supported and "" or "_off")
|
||||
local hover_ending = (enough_lapis and enchantment_supported and "_hovered" or "_off")
|
||||
formspec = formspec
|
||||
.. "container[3.2," .. y .. "]"
|
||||
.. (enchantment_supported and "tooltip[button_" .. i .. ";" .. C("#818181") .. mcl_enchanting.get_enchantment_description(e.enchantment, e.level) .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. C(enough_lapis and "#818181" or "#FC5454") .. e.cost .. " Lapis Lazuli" .. "]" or "")
|
||||
.. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]"
|
||||
.. "button[0,0;7.5,1.3;button_" .. i .. ";]"
|
||||
.. (enchantment_supported and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "")
|
||||
.. (enchantment_supported and e.glyphs or "")
|
||||
.. "container_end[]"
|
||||
y = y + 1.35
|
||||
end
|
||||
formspec = formspec
|
||||
.. "image[" .. (sup_ench and 0.58 or 1.15) .. ",1.2;" .. (sup_ench and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (sup_ench and "open" or "closed") .. ".png]"
|
||||
meta:set_string("formspec", formspec)
|
||||
end
|
||||
|
||||
function mcl_enchanting.progress_formspec_input(pos, _, fields, player)
|
||||
if fields.quit then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local e_list = minetest.deserialize(meta:get_string("enchantments"))
|
||||
local button_pressed
|
||||
for i = 1, 3 do
|
||||
if fields["button_" .. i] then
|
||||
button_pressed = i
|
||||
end
|
||||
end
|
||||
if not button_pressed then return end
|
||||
local e = e_list[button_pressed]
|
||||
local lapis_cost = ItemStack(mcl_enchanting.lapis_itemstring .. " " .. e.cost)
|
||||
if not inv:contains_item("lapis", lapis_cost) then return end
|
||||
local tool_stack = inv:get_stack("tool", 1)
|
||||
local full_tool_name = tool_stack:get_name()
|
||||
local shortened_tool_name = mcl_enchanting.all_tools[full_tool_name]
|
||||
if not shortened_tool_name then return end
|
||||
if table.indexof(mcl_enchanting.tools[shortened_tool_name].enchantments, e.enchantment) == -1 then return end
|
||||
local wear = tool_stack:get_wear()
|
||||
inv:remove_item("lapis", lapis_cost)
|
||||
local enchanted_tool_stack = ItemStack(full_tool_name .. "_enchanted_" .. e.enchantment .. "_" .. e.level)
|
||||
enchanted_tool_stack:add_wear(tool_stack:get_wear())
|
||||
inv:set_stack("tool", 1, enchanted_tool_stack)
|
||||
minetest.sound_play("mcl_enchanting_enchant", {to_player = player:get_player_name(), gain = 5.0})
|
||||
mcl_enchanting.add_enchantments(pos)
|
||||
end
|
||||
|
||||
|
||||
function mcl_enchanting.drop_inventory(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
for _, listname in ipairs({"tool", "lapis"}) do
|
||||
local stack = inv:get_stack(listname, 1)
|
||||
if not stack:is_empty() then
|
||||
minetest.add_item(vector.add(pos, {x = math.random(0, 10) / 10 - 0.5, y = 0, z = math.random(0, 10) / 10 - 0.5}), stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.init_table(pos)
|
||||
local inv = minetest.get_meta(pos):get_inventory()
|
||||
inv:set_size("tool", 1)
|
||||
inv:set_size("lapis", 1)
|
||||
mcl_enchanting.add_enchantments(pos)
|
||||
minetest.add_entity(vector.add(pos, mcl_enchanting.book_offset), "mcl_enchanting:book")
|
||||
end
|
||||
|
||||
function mcl_enchanting.add_enchantments_to_table(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local e_list = {}
|
||||
for i = 1, 3 do
|
||||
local e = {}
|
||||
e.cost = math.random(mcl_enchanting.max_cost)
|
||||
e.enchantment = mcl_enchanting.enchantment_name_list[math.random(#mcl_enchanting.enchantment_name_list)]
|
||||
local max_level = mcl_enchanting.enchantments[e.enchantment].max_level
|
||||
e.level = max_level + 1 - math.ceil(math.pow(math.random(math.pow(max_level, mcl_enchanting.level_rarity_grade)), 1 / mcl_enchanting.level_rarity_grade))
|
||||
e.glyphs = ""
|
||||
local x = 1.3
|
||||
for i = 1, 9 do
|
||||
e.glyphs = e.glyphs .. "image[".. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]"
|
||||
x = x + 0.6
|
||||
end
|
||||
e_list[i] = e
|
||||
end
|
||||
meta:set_string("enchantments", minetest.serialize(e_list))
|
||||
mcl_enchanting.update_formspec(pos)
|
||||
end
|
||||
|
||||
minetest.register_node("mcl_enchanting:table", {
|
||||
description = "Enchanting Table",
|
||||
drawtype = "nodebox",
|
||||
tiles = {"mcl_enchanting_table_top.png", "mcl_enchanting_table_bottom.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png", "mcl_enchanting_table_side.png"},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {-0.5, -0.5, -0.5, 0.5, 0.25, 0.5},
|
||||
},
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
groups = {pickaxey = 2},
|
||||
_mcl_blast_resistance = 1200,
|
||||
_mcl_hardness = 5,
|
||||
on_rotate = (screwdriver or {}).rotate_simple,
|
||||
on_construct = mcl_enchanting.init_table,
|
||||
on_destruct = mcl_enchanting.drop_inventory,
|
||||
after_destruct = mcl_enchanting.check_book,
|
||||
on_receive_fields = mcl_enchanting.progress_formspec_input,
|
||||
on_metadata_inventory_put = mcl_enchanting.update_formspec,
|
||||
on_metadata_inventory_take = mcl_enchanting.update_formspec,
|
||||
allow_metadata_inventory_put = function(_, listname, _, stack)
|
||||
if listname == "lapis" then
|
||||
return (stack:get_name() == mcl_enchanting.lapis_itemstring) and stack:get_count() or 0
|
||||
end
|
||||
return 1
|
||||
end,
|
||||
allow_metadata_inventory_move = function()
|
||||
return 0
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_enchanting:table",
|
||||
recipe = {
|
||||
{"", "mcl_books:book", ""},
|
||||
{"mcl_core:diamond", "mcl_core:obsidian", "mcl_core:diamond"},
|
||||
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}
|
||||
}
|
||||
})
|
|
@ -1,87 +0,0 @@
|
|||
local book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4}
|
||||
local book_animation_steps = {0, 640, 680, 700, 740}
|
||||
local book_animation_speed = 40
|
||||
|
||||
function mcl_enchanting.schedule_book_animation(self, anim)
|
||||
self.scheduled_anim = {timer = self.anim_length, anim = anim}
|
||||
end
|
||||
|
||||
function mcl_enchanting.set_book_animation(self, anim)
|
||||
local anim_index = book_animations[anim]
|
||||
local start, stop = book_animation_steps[anim_index], book_animation_steps[anim_index + 1]
|
||||
self.object:set_animation({x = start, y = stop}, book_animation_speed)
|
||||
self.scheduled_anim = nil
|
||||
self.anim_length = (stop - start) / 40
|
||||
end
|
||||
|
||||
function mcl_enchanting.check_animation_schedule(self, dtime)
|
||||
local schedanim = self.scheduled_anim
|
||||
if schedanim then
|
||||
schedanim.timer = schedanim.timer - dtime
|
||||
if schedanim.timer <= 0 then
|
||||
mcl_enchanting.set_book_animation(self, schedanim.anim)local pos1=self.object:get_pos()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function mcl_enchanting.look_at(self, pos2)
|
||||
local pos1 = self.object:get_pos()
|
||||
local vec = vector.subtract(pos1, pos2)
|
||||
local yaw = math.atan(vec.z / vec.x) - math.pi/2
|
||||
yaw = yaw + (pos1.x >= pos2.x and math.pi or 0)
|
||||
self.object:set_yaw(yaw + math.pi)
|
||||
end
|
||||
|
||||
function mcl_enchanting.check_book(pos)
|
||||
local obj_pos = vector.add(pos, mcl_enchanting.book_offset)
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(obj_pos, 0.1)) do
|
||||
local luaentity = obj:get_luaentity()
|
||||
if luaentity and luaentity.name == "mcl_enchanting:book" then
|
||||
if minetest.get_node(pos).name ~= "mcl_enchanting:table" then
|
||||
obj:remove()
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
minetest.add_entity(obj_pos, "mcl_enchanting:book")
|
||||
end
|
||||
|
||||
minetest.register_entity("mcl_enchanting:book", {
|
||||
initial_properties = {
|
||||
visual = "mesh",
|
||||
mesh = "mcl_enchanting_book.b3d",
|
||||
visual_size = {x = 12.5, y = 12.5},
|
||||
collisionbox = {0, 0, 0},
|
||||
physical = false,
|
||||
textures = {"mcl_enchanting_book_entity.png"},
|
||||
},
|
||||
player_near = false,
|
||||
on_activate = function(self)
|
||||
self.object:set_armor_groups({immortal = 1})
|
||||
mcl_enchanting.set_book_animation(self, "close")
|
||||
mcl_enchanting.check_book(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset))
|
||||
end,
|
||||
on_step = function(self, dtime)
|
||||
local old_player_near = self.player_near
|
||||
local player_near = false
|
||||
local player
|
||||
for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 2.5)) do
|
||||
if obj:is_player() then
|
||||
player_near = true
|
||||
player = obj
|
||||
end
|
||||
end
|
||||
if player_near and not old_player_near then
|
||||
mcl_enchanting.set_book_animation(self, "opening")
|
||||
mcl_enchanting.schedule_book_animation(self, "open")
|
||||
elseif old_player_near and not player_near then
|
||||
mcl_enchanting.set_book_animation(self, "closing")
|
||||
mcl_enchanting.schedule_book_animation(self, "close")
|
||||
end
|
||||
if player then
|
||||
mcl_enchanting.look_at(self, player:get_pos())
|
||||
end
|
||||
self.player_near = player_near
|
||||
mcl_enchanting.check_animation_schedule(self, dtime)
|
||||
end,
|
||||
})
|
|
@ -1,18 +0,0 @@
|
|||
function mcl_enchanting.enchantments_snippet(_, _, itemstack)
|
||||
if not itemstack then
|
||||
return
|
||||
end
|
||||
local enchantments = mcl_enchanting.get_enchantments(itemstack)
|
||||
local text = ""
|
||||
for enchantment, level in pairs(enchantments) do
|
||||
text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n"
|
||||
end
|
||||
if text ~= "" then
|
||||
if not itemstack:get_definition()._tt_original_description then
|
||||
text = text:sub(1, text:len() - 1)
|
||||
end
|
||||
return text, false
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(tt.registered_snippets, 1, mcl_enchanting.enchantments_snippet)
|
|
@ -14,22 +14,6 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/snippets.lua")
|
|||
|
||||
-- Apply item description updates
|
||||
|
||||
local function equals(t1, t2)
|
||||
for k, v in pairs(t1) do
|
||||
local equal
|
||||
local v2 = rawget(t2, k)
|
||||
if type(v) == "table" then
|
||||
equal = equals(v, v2)
|
||||
else
|
||||
equal = (v == v2)
|
||||
end
|
||||
if not equal then
|
||||
return false
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local function apply_snippets(desc, itemstring, toolcaps, itemstack)
|
||||
local first = true
|
||||
-- Apply snippets
|
||||
|
@ -80,10 +64,9 @@ tt.reload_itemstack_description = function(itemstack)
|
|||
if def and def._mcl_generate_description then
|
||||
def._mcl_generate_description(itemstack)
|
||||
elseif should_change(itemstring, def) and meta:get_string("name") == "" then
|
||||
local toolcaps = itemstack:get_tool_capabilities()
|
||||
local hand_toolcaps = ItemStack(""):get_tool_capabilities()
|
||||
if equals(toolcaps, hand_toolcaps) then
|
||||
toolcaps = nil
|
||||
local toolcaps
|
||||
if def.tool_capabilities then
|
||||
toolcaps = itemstack:get_tool_capabilities()
|
||||
end
|
||||
local orig_desc = def._tt_original_description or def.description
|
||||
local desc = apply_snippets(orig_desc, itemstring, toolcaps or def.tool_capabilities, itemstack)
|
||||
|
|
|
@ -5,3 +5,4 @@ _mcl_autogroup?
|
|||
mcl_armor?
|
||||
mcl_brewing?
|
||||
mcl_potions?
|
||||
mcl_enchanting
|
||||
|
|
|
@ -8,7 +8,7 @@ local mod_player = minetest.get_modpath("mcl_player") ~= nil
|
|||
local mod_craftguide = minetest.get_modpath("mcl_craftguide") ~= nil
|
||||
|
||||
-- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left
|
||||
local function return_item(itemstack, dropper, pos, inv)
|
||||
function return_item(itemstack, dropper, pos, inv)
|
||||
if dropper:is_player() then
|
||||
-- Return to main inventory
|
||||
if inv:room_for_item("main", itemstack) then
|
||||
|
@ -36,9 +36,11 @@ local function return_item(itemstack, dropper, pos, inv)
|
|||
end
|
||||
|
||||
-- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left
|
||||
local function return_fields(player, name)
|
||||
function return_fields(player, name)
|
||||
local inv = player:get_inventory()
|
||||
for i,stack in ipairs(inv:get_list(name)) do
|
||||
local list = inv:get_list(name)
|
||||
if not list then return end
|
||||
for i,stack in ipairs(list) do
|
||||
return_item(stack, player, player:get_pos(), inv)
|
||||
stack:clear()
|
||||
inv:set_stack(name, i, stack)
|
||||
|
@ -137,6 +139,9 @@ end
|
|||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
if fields.quit then
|
||||
return_fields(player,"craft")
|
||||
return_fields(player,"enchanting_lapis")
|
||||
return_fields(player,"enchanting_item")
|
||||
mcl_enchanting.reload_inventory(player)
|
||||
if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then
|
||||
set_inventory(player)
|
||||
end
|
||||
|
@ -152,6 +157,8 @@ end
|
|||
-- Drop crafting grid items on leaving
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
return_fields(player, "craft")
|
||||
return_fields(player, "enchanting_lapis")
|
||||
return_fields(player, "enchanting_item")
|
||||
end)
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
|
@ -189,6 +196,8 @@ minetest.register_on_joinplayer(function(player)
|
|||
when the server has been shutdown and the server didn't clean up the player
|
||||
inventories. ]]
|
||||
return_fields(player, "craft")
|
||||
return_fields(player, "enchanting_item")
|
||||
return_fields(player, "enchanting_lapis")
|
||||
end)
|
||||
|
||||
if minetest.is_creative_enabled("") then
|
||||
|
|
|
@ -137,7 +137,7 @@ armor.set_player_armor = function(self, player)
|
|||
local level = def.groups["armor_"..k]
|
||||
if level then
|
||||
local texture = def.texture or item:gsub("%:", "_")
|
||||
local enchanted_addition = (mcl_enchanting.is_enchanted_def(item) and "^[colorize:white:50^[colorize:purple:50" or "")
|
||||
local enchanted_addition = (mcl_enchanting.is_enchanted(item) and mcl_enchanting.overlay or "")
|
||||
table.insert(textures, "("..texture..".png"..enchanted_addition..")")
|
||||
preview = "(player.png^[opacity:0^"..texture.."_preview.png"..enchanted_addition..")"..(preview and "^"..preview or "")
|
||||
armor_level = armor_level + level
|
||||
|
|
|
@ -13,7 +13,7 @@ minetest.register_tool("mcl_armor:helmet_leather", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_helmet_leather.png",
|
||||
groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56},
|
||||
groups = {armor_head=1, mcl_armor_points=1, mcl_armor_uses=56, enchantability=15},
|
||||
_repair_material = "mcl_mobitems:leather",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_leather",
|
||||
|
@ -28,7 +28,7 @@ minetest.register_tool("mcl_armor:helmet_iron", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_helmet_iron.png",
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166},
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=9 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -44,7 +44,7 @@ minetest.register_tool("mcl_armor:helmet_gold", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_helmet_gold.png",
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78},
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=78, enchantability=25 },
|
||||
_repair_material = "mcl_core:gold_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -59,7 +59,7 @@ minetest.register_tool("mcl_armor:helmet_diamond",{
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_helmet_diamond.png",
|
||||
groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2},
|
||||
groups = {armor_head=1, mcl_armor_points=3, mcl_armor_uses=364, mcl_armor_toughness=2, enchantability=10 },
|
||||
_repair_material = "mcl_core:diamond",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_diamond",
|
||||
|
@ -74,7 +74,7 @@ minetest.register_tool("mcl_armor:helmet_chain", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_helmet_chain.png",
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166},
|
||||
groups = {armor_head=1, mcl_armor_points=2, mcl_armor_uses=166, enchantability=12 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_chainmail",
|
||||
|
@ -91,7 +91,7 @@ minetest.register_tool("mcl_armor:chestplate_leather", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_chestplate_leather.png",
|
||||
groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81},
|
||||
groups = {armor_torso=1, mcl_armor_points=3, mcl_armor_uses=81, enchantability=15 },
|
||||
_repair_material = "mcl_mobitems:leather",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_leather",
|
||||
|
@ -106,7 +106,7 @@ minetest.register_tool("mcl_armor:chestplate_iron", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_chestplate_iron.png",
|
||||
groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241},
|
||||
groups = {armor_torso=1, mcl_armor_points=6, mcl_armor_uses=241, enchantability=9 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -121,7 +121,7 @@ minetest.register_tool("mcl_armor:chestplate_gold", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_chestplate_gold.png",
|
||||
groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113},
|
||||
groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=113, enchantability=25 },
|
||||
_repair_material = "mcl_core:gold_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -136,7 +136,7 @@ minetest.register_tool("mcl_armor:chestplate_diamond",{
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_chestplate_diamond.png",
|
||||
groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2},
|
||||
groups = {armor_torso=1, mcl_armor_points=8, mcl_armor_uses=529, mcl_armor_toughness=2, enchantability=10 },
|
||||
_repair_material = "mcl_core:diamond",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_diamond",
|
||||
|
@ -151,7 +151,7 @@ minetest.register_tool("mcl_armor:chestplate_chain", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_chestplate_chain.png",
|
||||
groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241},
|
||||
groups = {armor_torso=1, mcl_armor_points=5, mcl_armor_uses=241, enchantability=12 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_chainmail",
|
||||
|
@ -168,7 +168,7 @@ minetest.register_tool("mcl_armor:leggings_leather", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_leggings_leather.png",
|
||||
groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76},
|
||||
groups = {armor_legs=1, mcl_armor_points=2, mcl_armor_uses=76, enchantability=15 },
|
||||
_repair_material = "mcl_mobitems:leather",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_leather",
|
||||
|
@ -183,7 +183,7 @@ minetest.register_tool("mcl_armor:leggings_iron", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_leggings_iron.png",
|
||||
groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226},
|
||||
groups = {armor_legs=1, mcl_armor_points=5, mcl_armor_uses=226, enchantability=9 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -198,7 +198,7 @@ minetest.register_tool("mcl_armor:leggings_gold", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_leggings_gold.png",
|
||||
groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106},
|
||||
groups = {armor_legs=1, mcl_armor_points=3, mcl_armor_uses=106, enchantability=25 },
|
||||
_repair_material = "mcl_core:gold_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -213,7 +213,7 @@ minetest.register_tool("mcl_armor:leggings_diamond",{
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_leggings_diamond.png",
|
||||
groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2},
|
||||
groups = {armor_legs=1, mcl_armor_points=6, mcl_armor_uses=496, mcl_armor_toughness=2, enchantability=10 },
|
||||
_repair_material = "mcl_core:diamond",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_diamond",
|
||||
|
@ -228,7 +228,7 @@ minetest.register_tool("mcl_armor:leggings_chain", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_leggings_chain.png",
|
||||
groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226},
|
||||
groups = {armor_legs=1, mcl_armor_points=4, mcl_armor_uses=226, enchantability=12 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_chainmail",
|
||||
|
@ -244,7 +244,7 @@ minetest.register_tool("mcl_armor:boots_leather", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_boots_leather.png",
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66},
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=66, enchantability=15 },
|
||||
_repair_material = "mcl_mobitems:leather",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_leather",
|
||||
|
@ -259,7 +259,7 @@ minetest.register_tool("mcl_armor:boots_iron", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_boots_iron.png",
|
||||
groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196},
|
||||
groups = {armor_feet=1, mcl_armor_points=2, mcl_armor_uses=196, enchantability=9 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -274,7 +274,7 @@ minetest.register_tool("mcl_armor:boots_gold", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_boots_gold.png",
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92},
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=92, enchantability=25 },
|
||||
_repair_material = "mcl_core:gold_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_iron",
|
||||
|
@ -289,7 +289,7 @@ minetest.register_tool("mcl_armor:boots_diamond",{
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_boots_diamond.png",
|
||||
groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2},
|
||||
groups = {armor_feet=1, mcl_armor_points=3, mcl_armor_uses=430, mcl_armor_toughness=2, enchantability=10 },
|
||||
_repair_material = "mcl_core:diamond",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_diamond",
|
||||
|
@ -304,7 +304,7 @@ minetest.register_tool("mcl_armor:boots_chain", {
|
|||
_doc_items_longdesc = longdesc,
|
||||
_doc_items_usagehelp = usage,
|
||||
inventory_image = "mcl_armor_inv_boots_chain.png",
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196},
|
||||
groups = {armor_feet=1, mcl_armor_points=1, mcl_armor_uses=196, enchantability=12 },
|
||||
_repair_material = "mcl_core:iron_ingot",
|
||||
sounds = {
|
||||
_mcl_armor_equip = "mcl_armor_equip_chainmail",
|
||||
|
|
|
@ -15,7 +15,8 @@ minetest.register_craftitem("mcl_books:book", {
|
|||
_doc_items_longdesc = S("Books are used to make bookshelves and book and quills."),
|
||||
inventory_image = "default_book.png",
|
||||
stack_max = 64,
|
||||
groups = { book=1, craftitem = 1 },
|
||||
groups = { book=1, craftitem = 1, enchantability = 1 },
|
||||
_mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted",
|
||||
})
|
||||
|
||||
if minetest.get_modpath("mcl_core") and minetest.get_modpath("mcl_mobitems") then
|
||||
|
|
|
@ -133,7 +133,7 @@ S("The speed and damage of the arrow increases the longer you charge. The regula
|
|||
range = 1,
|
||||
-- Trick to disable digging as well
|
||||
on_use = function() end,
|
||||
groups = {weapon=1,weapon_ranged=1,bow=1},
|
||||
groups = {weapon=1,weapon_ranged=1,bow=1,enchantability=1},
|
||||
})
|
||||
|
||||
-- Iterates through player inventory and resets all the bows in "charging" state back to their original stage
|
||||
|
@ -173,10 +173,10 @@ for level=0, 2 do
|
|||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
stack_max = 1,
|
||||
range = 0, -- Pointing range to 0 to prevent punching with bow :D
|
||||
groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1},
|
||||
groups = {not_in_creative_inventory=1, not_in_craft_guide=1, bow=1, enchantability=1},
|
||||
on_drop = function(itemstack, dropper, pos)
|
||||
reset_bow_state(dropper)
|
||||
if mcl_enchanting.is_enchanted(itemstack) then
|
||||
if mcl_enchanting.is_enchanted(itemstack:get_name()) then
|
||||
itemstack:set_name("mcl_bows:bow_enchanted")
|
||||
else
|
||||
itemstack:set_name("mcl_bows:bow")
|
||||
|
@ -201,7 +201,7 @@ controls.register_on_release(function(player, key, time)
|
|||
wielditem:get_name()=="mcl_bows:bow_0_enchanted" or wielditem:get_name()=="mcl_bows:bow_1_enchanted" or wielditem:get_name()=="mcl_bows:bow_2_enchanted") then
|
||||
local has_shot = false
|
||||
|
||||
local enchanted = mcl_enchanting.is_enchanted(wielditem)
|
||||
local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name())
|
||||
local speed, damage
|
||||
local p_load = bow_load[player:get_player_name()]
|
||||
local charge
|
||||
|
@ -269,7 +269,7 @@ controls.register_on_hold(function(player, key, time)
|
|||
local inv = minetest.get_inventory({type="player", name=name})
|
||||
local wielditem = player:get_wielded_item()
|
||||
if bow_load[name] == nil and (wielditem:get_name()=="mcl_bows:bow" or wielditem:get_name()=="mcl_bows:bow_enchanted") and (creative or get_arrow(player)) then
|
||||
local enchanted = mcl_enchanting.is_enchanted(wielditem)
|
||||
local enchanted = mcl_enchanting.is_enchanted(wielditem:get_name())
|
||||
if enchanted then
|
||||
wielditem:set_name("mcl_bows:bow_0_enchanted")
|
||||
else
|
||||
|
|
|
@ -57,7 +57,7 @@ minetest.register_globalstep(function(dtime)
|
|||
if minetest.get_item_group(stack:get_name(), "compass") ~= 0 and
|
||||
minetest.get_item_group(stack:get_name(), "compass")-1 ~= compass_image then
|
||||
local itemname = "mcl_compass:"..compass_image
|
||||
if mcl_enchanting.is_enchanted(stack) then
|
||||
if mcl_enchanting.is_enchanted(stack:get_name()) then
|
||||
itemname = itemname .. "_enchanted"
|
||||
end
|
||||
stack:set_name(itemname)
|
||||
|
@ -98,7 +98,7 @@ for i,img in ipairs(images) do
|
|||
inventory_image = img,
|
||||
wield_image = img,
|
||||
stack_max = 64,
|
||||
groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1}
|
||||
groups = {not_in_creative_inventory=inv, compass=i, tool=1, disable_repair=1, enchantability=1 }
|
||||
})
|
||||
|
||||
-- Help aliases. Makes sure the lookup tool works correctly
|
||||
|
|
|
@ -70,7 +70,7 @@ minetest.register_tool("mcl_farming:hoe_wood", {
|
|||
inventory_image = "farming_tool_woodhoe.png",
|
||||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
on_place = hoe_on_place_function(uses.wood),
|
||||
groups = { tool=1, hoe=1 },
|
||||
groups = { tool=1, hoe=1, enchantability=15 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
damage_groups = { fleshy = 1, },
|
||||
|
@ -109,7 +109,7 @@ minetest.register_tool("mcl_farming:hoe_stone", {
|
|||
inventory_image = "farming_tool_stonehoe.png",
|
||||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
on_place = hoe_on_place_function(uses.stone),
|
||||
groups = { tool=1, hoe=1 },
|
||||
groups = { tool=1, hoe=1, enchantability=5 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.5,
|
||||
damage_groups = { fleshy = 1, },
|
||||
|
@ -143,7 +143,7 @@ minetest.register_tool("mcl_farming:hoe_iron", {
|
|||
inventory_image = "farming_tool_steelhoe.png",
|
||||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
on_place = hoe_on_place_function(uses.iron),
|
||||
groups = { tool=1, hoe=1 },
|
||||
groups = { tool=1, hoe=1, enchantability=14 },
|
||||
tool_capabilities = {
|
||||
-- 1/3
|
||||
full_punch_interval = 0.33333333,
|
||||
|
@ -185,7 +185,7 @@ minetest.register_tool("mcl_farming:hoe_gold", {
|
|||
inventory_image = "farming_tool_goldhoe.png",
|
||||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
on_place = hoe_on_place_function(uses.gold),
|
||||
groups = { tool=1, hoe=1 },
|
||||
groups = { tool=1, hoe=1, enchantability=22 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
damage_groups = { fleshy = 1, },
|
||||
|
@ -228,7 +228,7 @@ minetest.register_tool("mcl_farming:hoe_diamond", {
|
|||
inventory_image = "farming_tool_diamondhoe.png",
|
||||
wield_scale = { x = 1.8, y = 1.8, z = 1 },
|
||||
on_place = hoe_on_place_function(uses.diamond),
|
||||
groups = { tool=1, hoe=1 },
|
||||
groups = { tool=1, hoe=1, enchantability=10 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.25,
|
||||
damage_groups = { fleshy = 1, },
|
||||
|
|
|
@ -112,6 +112,7 @@ pumpkin_face_base_def._doc_items_longdesc = S("A pumpkin can be worn as a helmet
|
|||
pumpkin_face_base_def._doc_items_usagehelp = nil
|
||||
pumpkin_face_base_def.tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face.png"}
|
||||
pumpkin_face_base_def.groups.armor_head=1
|
||||
pumpkin_face_base_def.groups.enchantability=1
|
||||
pumpkin_face_base_def._mcl_armor_mob_range_factor = 0
|
||||
pumpkin_face_base_def._mcl_armor_mob_range_mob = "mobs_mc:enderman"
|
||||
pumpkin_face_base_def.groups.non_combat_armor=1
|
||||
|
|
|
@ -9,7 +9,7 @@ minetest.register_tool("mcl_fire:flint_and_steel", {
|
|||
inventory_image = "mcl_fire_flint_and_steel.png",
|
||||
liquids_pointable = false,
|
||||
stack_max = 1,
|
||||
groups = { tool = 1 },
|
||||
groups = { tool = 1, enchantability = 1 },
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
-- Use pointed node's on_rightclick function first, if present
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
|
|
|
@ -322,7 +322,7 @@ minetest.register_tool("mcl_fishing:fishing_rod", {
|
|||
_tt_help = S("Catches fish in water"),
|
||||
_doc_items_longdesc = S("Fishing rods can be used to catch fish."),
|
||||
_doc_items_usagehelp = S("Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?"),
|
||||
groups = { tool=1, fishing_rod=1 },
|
||||
groups = { tool=1, fishing_rod=1, enchantability=1 },
|
||||
inventory_image = "mcl_fishing_fishing_rod.png",
|
||||
wield_image = "mcl_fishing_fishing_rod.png^[transformR270",
|
||||
wield_scale = { x = 1.5, y = 1.5, z = 1 },
|
||||
|
|
|
@ -42,7 +42,7 @@ local function addhead(name, texture, desc, longdesc, rangemob, rangefactor)
|
|||
{ -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, },
|
||||
},
|
||||
},
|
||||
groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1},
|
||||
groups = {handy=1, armor_head=1,non_combat_armor=1, head=1, deco_block=1, dig_by_piston=1, enchantability=1},
|
||||
-- The head textures are based off the textures of an actual mob.
|
||||
tiles = {
|
||||
-- Note: bottom texture is overlaid over top texture to get rid of possible transparency.
|
||||
|
|
|
@ -81,7 +81,7 @@ minetest.register_tool("mcl_tools:pick_wood", {
|
|||
_doc_items_hidden = false,
|
||||
inventory_image = "default_tool_woodpick.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=2, },
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=2, enchantability=15 },
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.83333333,
|
||||
|
@ -100,7 +100,7 @@ minetest.register_tool("mcl_tools:pick_stone", {
|
|||
_doc_items_longdesc = pickaxe_longdesc,
|
||||
inventory_image = "default_tool_stonepick.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=3, },
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=3, enchantability=5 },
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.83333333,
|
||||
|
@ -119,7 +119,7 @@ minetest.register_tool("mcl_tools:pick_iron", {
|
|||
_doc_items_longdesc = pickaxe_longdesc,
|
||||
inventory_image = "default_tool_steelpick.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=4, },
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=4, enchantability=14 },
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.83333333,
|
||||
|
@ -138,7 +138,7 @@ minetest.register_tool("mcl_tools:pick_gold", {
|
|||
_doc_items_longdesc = pickaxe_longdesc,
|
||||
inventory_image = "default_tool_goldpick.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=6, },
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=6, enchantability=22 },
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.83333333,
|
||||
|
@ -157,7 +157,7 @@ minetest.register_tool("mcl_tools:pick_diamond", {
|
|||
_doc_items_longdesc = pickaxe_longdesc,
|
||||
inventory_image = "default_tool_diamondpick.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=5, },
|
||||
groups = { tool=1, pickaxe=1, dig_speed_class=5, enchantability=10 },
|
||||
tool_capabilities = {
|
||||
-- 1/1.2
|
||||
full_punch_interval = 0.83333333,
|
||||
|
@ -277,7 +277,7 @@ minetest.register_tool("mcl_tools:shovel_wood", {
|
|||
inventory_image = "default_tool_woodshovel.png",
|
||||
wield_image = "default_tool_woodshovel.png^[transformR90",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, shovel=1, dig_speed_class=2, },
|
||||
groups = { tool=1, shovel=1, dig_speed_class=2, enchantability=15 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
max_drop_level=1,
|
||||
|
@ -298,7 +298,7 @@ minetest.register_tool("mcl_tools:shovel_stone", {
|
|||
inventory_image = "default_tool_stoneshovel.png",
|
||||
wield_image = "default_tool_stoneshovel.png^[transformR90",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, shovel=1, dig_speed_class=3, },
|
||||
groups = { tool=1, shovel=1, dig_speed_class=3, enchantability=5 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
max_drop_level=3,
|
||||
|
@ -319,7 +319,7 @@ minetest.register_tool("mcl_tools:shovel_iron", {
|
|||
inventory_image = "default_tool_steelshovel.png",
|
||||
wield_image = "default_tool_steelshovel.png^[transformR90",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, shovel=1, dig_speed_class=4, },
|
||||
groups = { tool=1, shovel=1, dig_speed_class=4, enchantability=14 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
max_drop_level=4,
|
||||
|
@ -361,7 +361,7 @@ minetest.register_tool("mcl_tools:shovel_diamond", {
|
|||
inventory_image = "default_tool_diamondshovel.png",
|
||||
wield_image = "default_tool_diamondshovel.png^[transformR90",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, shovel=1, dig_speed_class=5, },
|
||||
groups = { tool=1, shovel=1, dig_speed_class=5, enchantability=10 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1,
|
||||
max_drop_level=5,
|
||||
|
@ -383,7 +383,7 @@ minetest.register_tool("mcl_tools:axe_wood", {
|
|||
_doc_items_hidden = false,
|
||||
inventory_image = "default_tool_woodaxe.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, axe=1, dig_speed_class=2, },
|
||||
groups = { tool=1, axe=1, dig_speed_class=2, enchantability=15 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1.25,
|
||||
max_drop_level=1,
|
||||
|
@ -401,7 +401,7 @@ minetest.register_tool("mcl_tools:axe_stone", {
|
|||
_doc_items_longdesc = axe_longdesc,
|
||||
inventory_image = "default_tool_stoneaxe.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, axe=1, dig_speed_class=3, },
|
||||
groups = { tool=1, axe=1, dig_speed_class=3, enchantability=5 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1.25,
|
||||
max_drop_level=3,
|
||||
|
@ -419,7 +419,7 @@ minetest.register_tool("mcl_tools:axe_iron", {
|
|||
_doc_items_longdesc = axe_longdesc,
|
||||
inventory_image = "default_tool_steelaxe.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, axe=1, dig_speed_class=4, },
|
||||
groups = { tool=1, axe=1, dig_speed_class=4, enchantability=14 },
|
||||
tool_capabilities = {
|
||||
-- 1/0.9
|
||||
full_punch_interval = 1.11111111,
|
||||
|
@ -438,7 +438,7 @@ minetest.register_tool("mcl_tools:axe_gold", {
|
|||
_doc_items_longdesc = axe_longdesc,
|
||||
inventory_image = "default_tool_goldaxe.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, axe=1, dig_speed_class=6, },
|
||||
groups = { tool=1, axe=1, dig_speed_class=6, enchantability=22 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1.0,
|
||||
max_drop_level=2,
|
||||
|
@ -456,7 +456,7 @@ minetest.register_tool("mcl_tools:axe_diamond", {
|
|||
_doc_items_longdesc = axe_longdesc,
|
||||
inventory_image = "default_tool_diamondaxe.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { tool=1, axe=1, dig_speed_class=5, },
|
||||
groups = { tool=1, axe=1, dig_speed_class=5, enchantability=10 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 1.0,
|
||||
max_drop_level=5,
|
||||
|
@ -477,7 +477,7 @@ minetest.register_tool("mcl_tools:sword_wood", {
|
|||
_doc_items_hidden = false,
|
||||
inventory_image = "default_tool_woodsword.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { weapon=1, sword=1, dig_speed_class=2, },
|
||||
groups = { weapon=1, sword=1, dig_speed_class=2, enchantability=15 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.625,
|
||||
max_drop_level=1,
|
||||
|
@ -496,7 +496,7 @@ minetest.register_tool("mcl_tools:sword_stone", {
|
|||
_doc_items_longdesc = sword_longdesc,
|
||||
inventory_image = "default_tool_stonesword.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { weapon=1, sword=1, dig_speed_class=3, },
|
||||
groups = { weapon=1, sword=1, dig_speed_class=3, enchantability=5 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.625,
|
||||
max_drop_level=3,
|
||||
|
@ -515,7 +515,7 @@ minetest.register_tool("mcl_tools:sword_iron", {
|
|||
_doc_items_longdesc = sword_longdesc,
|
||||
inventory_image = "default_tool_steelsword.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { weapon=1, sword=1, dig_speed_class=4, },
|
||||
groups = { weapon=1, sword=1, dig_speed_class=4, enchantability=14 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.625,
|
||||
max_drop_level=4,
|
||||
|
@ -534,7 +534,7 @@ minetest.register_tool("mcl_tools:sword_gold", {
|
|||
_doc_items_longdesc = sword_longdesc,
|
||||
inventory_image = "default_tool_goldsword.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { weapon=1, sword=1, dig_speed_class=6, },
|
||||
groups = { weapon=1, sword=1, dig_speed_class=6, enchantability=22 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.625,
|
||||
max_drop_level=2,
|
||||
|
@ -553,7 +553,7 @@ minetest.register_tool("mcl_tools:sword_diamond", {
|
|||
_doc_items_longdesc = sword_longdesc,
|
||||
inventory_image = "default_tool_diamondsword.png",
|
||||
wield_scale = wield_scale,
|
||||
groups = { weapon=1, sword=1, dig_speed_class=5, },
|
||||
groups = { weapon=1, sword=1, dig_speed_class=5, enchantability=10 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.625,
|
||||
max_drop_level=5,
|
||||
|
@ -576,7 +576,7 @@ minetest.register_tool("mcl_tools:shears", {
|
|||
inventory_image = "default_tool_shears.png",
|
||||
wield_image = "default_tool_shears.png",
|
||||
stack_max = 1,
|
||||
groups = { tool=1, shears=1, dig_speed_class=4, },
|
||||
groups = { tool=1, shears=1, dig_speed_class=4, enchantability=1 },
|
||||
tool_capabilities = {
|
||||
full_punch_interval = 0.5,
|
||||
max_drop_level=1,
|
||||
|
|
|
@ -176,7 +176,7 @@ minetest.register_tool("screwdriver:screwdriver", {
|
|||
description = S("Screwdriver"),
|
||||
inventory_image = "screwdriver.png",
|
||||
wield_image = "screwdriver.png^[transformFX",
|
||||
groups = { tool = 1, not_in_creative_inventory = 1 },
|
||||
groups = { tool = 1, not_in_creative_inventory = 1, enchantability = 1 },
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200)
|
||||
return itemstack
|
||||
|
|
Loading…
Reference in New Issue